diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 046826c928..1024e251c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ No pushing to master! New featues must be submitted in a separate branch (one br ## Include Migration Files -Any required migration files **must** be included in the commit, or the pull-request will be rejected. If you change the underlying database schema, make sure you run `make migrate` and commit the migration files before submitting the PR. +Any required migration files **must** be included in the commit, or the pull-request will be rejected. If you change the underlying database schema, make sure you run `invoke migrate` and commit the migration files before submitting the PR. ## Update Translation Files @@ -14,7 +14,7 @@ Any PRs which update translatable strings (i.e. text strings that will appear in *This does not mean that all translations must be provided, but that the translation files must include locations for the translated strings to be written.* -To perform this step, simply run `make_translate` from the top level directory before submitting the PR. +To perform this step, simply run `invoke translate` from the top level directory before submitting the PR. ## Testing @@ -22,9 +22,8 @@ Any new code should be covered by unit tests - a submitted PR may not be accepte ## Documentation -New features or updates to existing features should be accompanied by user documentation. -A PR with associated documentation should link to the matching PR at https://github.com/inventree/InvenTree.github.io +New features or updates to existing features should be accompanied by user documentation. A PR with associated documentation should link to the matching PR at https://github.com/inventree/inventree-docs/ ## Code Style -Sumbitted Python code is automatically checked against PEP style guidelines. Locally you can run `make style` to ensure the style checks will pass, before submitting the PR. +Sumbitted Python code is automatically checked against PEP style guidelines. Locally you can run `invoke style` to ensure the style checks will pass, before submitting the PR. diff --git a/InvenTree/InvenTree/static/script/inventree/tables.js b/InvenTree/InvenTree/static/script/inventree/tables.js index be0e1e6325..cc4320307b 100644 --- a/InvenTree/InvenTree/static/script/inventree/tables.js +++ b/InvenTree/InvenTree/static/script/inventree/tables.js @@ -157,6 +157,11 @@ $.fn.inventreeTable = function(options) { console.log('Could not get list of visible columns!'); } } + + // Optionally, link buttons to the table selection + if (options.buttons) { + linkButtonsToSelection(table, options.buttons); + } } function customGroupSorter(sortName, sortOrder, sortData) { diff --git a/InvenTree/build/templates/build/build_output.html b/InvenTree/build/templates/build/build_output.html index e5a3e77e61..75257f2d5d 100644 --- a/InvenTree/build/templates/build/build_output.html +++ b/InvenTree/build/templates/build/build_output.html @@ -19,7 +19,7 @@ loadStockTable($("#stock-table"), { params: { location_detail: true, - part_details: true, + part_detail: true, build: {{ build.id }}, }, groupByField: 'location', diff --git a/InvenTree/locale/de/LC_MESSAGES/django.mo b/InvenTree/locale/de/LC_MESSAGES/django.mo index 272b16c0d6..6c5d41663c 100644 Binary files a/InvenTree/locale/de/LC_MESSAGES/django.mo and b/InvenTree/locale/de/LC_MESSAGES/django.mo differ diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po index cb39ab36c3..95c8b95fb6 100644 --- a/InvenTree/locale/de/LC_MESSAGES/django.po +++ b/InvenTree/locale/de/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-09-13 10:56+0000\n" +"POT-Creation-Date: 2020-09-28 12:03+0000\n" "PO-Revision-Date: 2020-05-03 11:32+0200\n" "Last-Translator: Christian Schlüter \n" "Language-Team: C \n" @@ -49,35 +49,35 @@ msgstr "" msgid "Apply Theme" msgstr "" -#: InvenTree/helpers.py:336 order/models.py:187 order/models.py:261 +#: InvenTree/helpers.py:337 order/models.py:187 order/models.py:261 msgid "Invalid quantity provided" msgstr "Keine gültige Menge" -#: InvenTree/helpers.py:339 +#: InvenTree/helpers.py:340 msgid "Empty serial number string" msgstr "Keine Seriennummer angegeben" -#: InvenTree/helpers.py:360 +#: InvenTree/helpers.py:361 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "Doppelte Seriennummer: {n}" -#: InvenTree/helpers.py:364 InvenTree/helpers.py:367 InvenTree/helpers.py:370 +#: InvenTree/helpers.py:365 InvenTree/helpers.py:368 InvenTree/helpers.py:371 #, python-brace-format msgid "Invalid group: {g}" msgstr "Ungültige Gruppe: {g}" -#: InvenTree/helpers.py:375 +#: InvenTree/helpers.py:376 #, fuzzy, python-brace-format #| msgid "Duplicate serial: {n}" msgid "Duplicate serial: {g}" msgstr "Doppelte Seriennummer: {n}" -#: InvenTree/helpers.py:383 +#: InvenTree/helpers.py:384 msgid "No serial numbers found" msgstr "Keine Seriennummern gefunden" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:388 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -92,7 +92,7 @@ msgstr "Datei zum Anhängen auswählen" msgid "File comment" msgstr "Datei-Kommentar" -#: InvenTree/models.py:68 templates/js/stock.html:686 +#: InvenTree/models.py:68 templates/js/stock.html:690 msgid "User" msgstr "Benutzer" @@ -124,7 +124,7 @@ msgid "Polish" msgstr "Polnisch" #: InvenTree/status_codes.py:94 InvenTree/status_codes.py:135 -#: InvenTree/status_codes.py:222 +#: InvenTree/status_codes.py:222 templates/js/table_filters.html:135 msgid "Pending" msgstr "Ausstehend" @@ -175,9 +175,9 @@ msgstr "Zerstört" msgid "Rejected" msgstr "" -#: InvenTree/status_codes.py:223 build/templates/build/allocate.html:349 +#: InvenTree/status_codes.py:223 build/templates/build/allocate.html:358 #: order/templates/order/sales_order_detail.html:221 -#: part/templates/part/tabs.html:23 templates/js/build.html:122 +#: part/templates/part/tabs.html:23 templates/js/build.html:126 msgid "Allocated" msgstr "Zugeordnet" @@ -296,18 +296,20 @@ msgstr "Eltern-Bau" msgid "Parent build to which this build is allocated" msgstr "Eltern-Bau, dem dieser Bau zugewiesen ist" -#: build/models.py:90 build/templates/build/allocate.html:320 -#: build/templates/build/auto_allocate.html:18 +#: build/models.py:90 build/templates/build/allocate.html:329 +#: build/templates/build/auto_allocate.html:19 #: build/templates/build/build_base.html:70 #: build/templates/build/detail.html:22 order/models.py:501 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:147 -#: order/templates/order/receive_parts.html:19 part/models.py:239 +#: order/templates/order/receive_parts.html:19 part/models.py:241 #: part/templates/part/part_app_base.html:7 -#: part/templates/part/set_category.html:13 templates/js/barcode.html:336 -#: templates/js/bom.html:124 templates/js/build.html:43 -#: templates/js/company.html:137 templates/js/part.html:215 -#: templates/js/stock.html:429 +#: part/templates/part/set_category.html:13 +#: stock/templates/stock/item_installed.html:60 +#: templates/InvenTree/search.html:123 templates/js/barcode.html:336 +#: templates/js/bom.html:124 templates/js/build.html:47 +#: templates/js/company.html:137 templates/js/part.html:223 +#: templates/js/stock.html:421 msgid "Part" msgstr "Teil" @@ -374,10 +376,11 @@ msgstr "Link zu einer externen URL" #: build/models.py:160 build/templates/build/tabs.html:14 company/models.py:310 #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15 #: order/templates/order/purchase_order_detail.html:202 -#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64 -#: stock/models.py:433 stock/models.py:1279 stock/templates/stock/tabs.html:26 +#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:67 +#: stock/forms.py:281 stock/forms.py:309 stock/models.py:433 +#: stock/models.py:1353 stock/templates/stock/tabs.html:26 #: templates/js/barcode.html:391 templates/js/bom.html:219 -#: templates/js/stock.html:116 templates/js/stock.html:530 +#: templates/js/stock.html:116 templates/js/stock.html:534 msgid "Notes" msgstr "Notizen" @@ -438,124 +441,139 @@ msgstr "Automatisches Zuweisen" msgid "Unallocate" msgstr "Zuweisung aufheben" -#: build/templates/build/allocate.html:78 templates/stock_table.html:8 +#: build/templates/build/allocate.html:87 templates/stock_table.html:8 msgid "New Stock Item" msgstr "Neues Lagerobjekt" -#: build/templates/build/allocate.html:161 +#: build/templates/build/allocate.html:88 stock/views.py:1327 +msgid "Create new Stock Item" +msgstr "Neues Lagerobjekt hinzufügen" + +#: build/templates/build/allocate.html:170 #: order/templates/order/sales_order_detail.html:68 #: order/templates/order/sales_order_detail.html:150 stock/models.py:359 #: stock/templates/stock/item_base.html:148 msgid "Serial Number" msgstr "Seriennummer" -#: build/templates/build/allocate.html:163 -#: build/templates/build/auto_allocate.html:19 +#: build/templates/build/allocate.html:172 +#: build/templates/build/auto_allocate.html:20 #: build/templates/build/build_base.html:75 #: build/templates/build/detail.html:27 -#: company/templates/company/supplier_part_pricing.html:27 +#: company/templates/company/supplier_part_pricing.html:71 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:177 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:152 #: part/templates/part/allocation.html:16 #: part/templates/part/allocation.html:49 +#: part/templates/part/sale_prices.html:80 #: stock/templates/stock/item_base.html:26 #: stock/templates/stock/item_base.html:32 #: stock/templates/stock/item_base.html:154 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338 -#: templates/js/bom.html:162 templates/js/build.html:54 -#: templates/js/stock.html:677 +#: templates/js/bom.html:162 templates/js/build.html:58 +#: templates/js/stock.html:681 msgid "Quantity" msgstr "Anzahl" -#: build/templates/build/allocate.html:177 -#: build/templates/build/auto_allocate.html:20 +#: build/templates/build/allocate.html:186 +#: build/templates/build/auto_allocate.html:21 stock/forms.py:279 #: stock/templates/stock/item_base.html:186 -#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337 +#: stock/templates/stock/stock_adjust.html:17 +#: templates/InvenTree/search.html:173 templates/js/barcode.html:337 #: templates/js/stock.html:512 msgid "Location" msgstr "Standort" -#: build/templates/build/allocate.html:201 -#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:126 +#: build/templates/build/allocate.html:210 +#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:130 msgid "Edit stock allocation" msgstr "Lagerobjekt-Standort bearbeiten" -#: build/templates/build/allocate.html:202 -#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:127 +#: build/templates/build/allocate.html:211 +#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:131 msgid "Delete stock allocation" msgstr "Zuweisung löschen" -#: build/templates/build/allocate.html:229 templates/js/bom.html:330 +#: build/templates/build/allocate.html:238 templates/js/bom.html:330 msgid "No BOM items found" msgstr "Keine BOM-Einträge gefunden" -#: build/templates/build/allocate.html:328 +#: build/templates/build/allocate.html:337 #: company/templates/company/supplier_part_base.html:53 #: company/templates/company/supplier_part_detail.html:27 #: order/templates/order/purchase_order_detail.html:159 #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/js/bom.html:147 templates/js/company.html:56 -#: templates/js/order.html:159 templates/js/order.html:234 -#: templates/js/part.html:120 templates/js/part.html:271 -#: templates/js/part.html:452 templates/js/stock.html:444 -#: templates/js/stock.html:658 +#: stock/templates/stock/item_installed.html:83 +#: templates/InvenTree/search.html:137 templates/js/bom.html:147 +#: templates/js/company.html:56 templates/js/order.html:159 +#: templates/js/order.html:234 templates/js/part.html:120 +#: templates/js/part.html:279 templates/js/part.html:460 +#: templates/js/stock.html:444 templates/js/stock.html:662 msgid "Description" msgstr "Beschreibung" -#: build/templates/build/allocate.html:333 +#: build/templates/build/allocate.html:342 #: order/templates/order/purchase_order_detail.html:172 #: templates/js/bom.html:154 msgid "Reference" msgstr "Referenz" -#: build/templates/build/allocate.html:338 part/models.py:1332 -#: templates/js/part.html:456 templates/js/table_filters.html:100 +#: build/templates/build/allocate.html:347 part/models.py:1348 +#: templates/js/part.html:464 templates/js/table_filters.html:121 msgid "Required" msgstr "benötigt" -#: build/templates/build/allocate.html:347 +#: build/templates/build/allocate.html:356 msgid "Assigned" msgstr "Zugewiesen" -#: build/templates/build/allocate.html:385 +#: build/templates/build/allocate.html:394 #: order/templates/order/sales_order_detail.html:271 msgid "Buy parts" msgstr "Teile kaufen" -#: build/templates/build/allocate.html:389 +#: build/templates/build/allocate.html:398 #: order/templates/order/sales_order_detail.html:275 msgid "Build parts" msgstr "Bauteile" -#: build/templates/build/allocate.html:392 +#: build/templates/build/allocate.html:401 msgid "Allocate stock" msgstr "Lagerbestand zuweisen" -#: build/templates/build/auto_allocate.html:8 +#: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "Lagerbestand automatisch zuweisen" -#: build/templates/build/auto_allocate.html:9 +#: build/templates/build/auto_allocate.html:10 msgid "" "Stock Items are selected for automatic allocation if there is only a single " "stock item available." msgstr "" "Teile werden automatisch zugewiesen, wenn nur ein Lagerobjekt verfügbar ist" -#: build/templates/build/auto_allocate.html:10 +#: build/templates/build/auto_allocate.html:11 msgid "The following stock items will be allocated to the build:" msgstr "Folgende Lagerobjekte werden dem Bau automatisch zugewiesen:" -#: build/templates/build/auto_allocate.html:39 -msgid "No stock items found that can be allocated to this build" +#: build/templates/build/auto_allocate.html:40 +#, fuzzy +#| msgid "No stock items found that can be allocated to this build" +msgid "No stock items found that can be automatically allocated to this build" msgstr "Keine Lagerobjekt gefunden, die diesem Bau zugewiesen werden können" +#: build/templates/build/auto_allocate.html:42 +#, fuzzy +#| msgid "StockItem has been allocated" +msgid "Stock items will have to be manually allocated" +msgstr "Lagerobjekt wurde zugewiesen" + #: build/templates/build/build_base.html:8 #: build/templates/build/build_base.html:34 #: build/templates/build/complete.html:6 -#: stock/templates/stock/item_base.html:211 templates/js/build.html:35 +#: stock/templates/stock/item_base.html:211 templates/js/build.html:39 #: templates/navbar.html:20 msgid "Build" msgstr "Bau" @@ -575,8 +593,10 @@ msgstr "Bau-Status" #: build/templates/build/build_base.html:80 #: build/templates/build/detail.html:42 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:264 templates/js/barcode.html:42 -#: templates/js/build.html:59 templates/js/order.html:164 +#: stock/templates/stock/item_base.html:264 +#: stock/templates/stock/item_installed.html:111 +#: templates/InvenTree/search.html:165 templates/js/barcode.html:42 +#: templates/js/build.html:63 templates/js/order.html:164 #: templates/js/order.html:239 templates/js/stock.html:499 msgid "Status" msgstr "Status" @@ -656,13 +676,15 @@ msgid "Stock can be taken from any available location." msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden." #: build/templates/build/detail.html:48 -#: stock/templates/stock/item_base.html:204 templates/js/stock.html:507 +#: stock/templates/stock/item_base.html:204 +#: stock/templates/stock/item_installed.html:119 templates/js/stock.html:507 +#: templates/js/table_filters.html:34 templates/js/table_filters.html:100 msgid "Batch" msgstr "Los" #: build/templates/build/detail.html:61 #: order/templates/order/order_base.html:93 -#: order/templates/order/sales_order_base.html:92 templates/js/build.html:67 +#: order/templates/order/sales_order_base.html:92 templates/js/build.html:71 msgid "Created" msgstr "Erstellt" @@ -678,7 +700,7 @@ msgstr "Ja" msgid "No" msgstr "Nein" -#: build/templates/build/detail.html:80 templates/js/build.html:72 +#: build/templates/build/detail.html:80 templates/js/build.html:76 msgid "Completed" msgstr "Fertig" @@ -776,7 +798,7 @@ msgstr "Baufertigstellung bestätigen" msgid "Invalid location selected" msgstr "Ungültige Ortsauswahl" -#: build/views.py:296 stock/views.py:1387 +#: build/views.py:296 stock/views.py:1520 #, python-brace-format msgid "The following serial numbers already exist: ({sn})" msgstr "Die folgende Seriennummer existiert bereits: ({sn})" @@ -821,45 +843,45 @@ msgstr "Teilzuordnung bearbeiten" msgid "Updated Build Item" msgstr "Bauobjekt aktualisiert" -#: common/models.py:72 +#: common/models.py:75 msgid "Settings key (must be unique - case insensitive" msgstr "" "Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird " "nicht beachtet)" -#: common/models.py:74 +#: common/models.py:77 msgid "Settings value" msgstr "Einstellungs-Wert" -#: common/models.py:76 +#: common/models.py:79 msgid "Settings description" msgstr "Einstellungs-Beschreibung" -#: common/models.py:89 +#: common/models.py:92 msgid "Key string must be unique" msgstr "Schlüsseltext muss eindeutig sein" -#: common/models.py:110 +#: common/models.py:113 msgid "Currency Symbol e.g. $" msgstr "Währungs-Symbol (z.B. €)" -#: common/models.py:112 +#: common/models.py:115 msgid "Currency Suffix e.g. AUD" msgstr "Währungs-Suffix (z.B. EUR)" -#: common/models.py:114 +#: common/models.py:117 msgid "Currency Description" msgstr "Währungs-Beschreibung" -#: common/models.py:116 +#: common/models.py:119 msgid "Currency Value" msgstr "Währungs-Wert" -#: common/models.py:118 +#: common/models.py:121 msgid "Use this currency as the base currency" msgstr "Benutze diese Währung als Basis-Währung" -#: common/models.py:165 +#: common/models.py:204 #, fuzzy #| msgid "Default Location" msgid "Default" @@ -1047,13 +1069,13 @@ msgstr "Neues Zuliefererteil anlegen" #: company/templates/company/detail_part.html:13 #: order/templates/order/purchase_order_detail.html:67 -#: part/templates/part/supplier.html:13 templates/js/stock.html:784 +#: part/templates/part/supplier.html:13 templates/js/stock.html:788 msgid "New Supplier Part" msgstr "Neues Zulieferer-Teil" #: company/templates/company/detail_part.html:15 #: part/templates/part/category.html:104 part/templates/part/supplier.html:15 -#: templates/stock_table.html:10 +#: stock/templates/stock/item_installed.html:16 templates/stock_table.html:10 msgid "Options" msgstr "Optionen" @@ -1075,7 +1097,7 @@ msgid "Delete Parts" msgstr "Teile löschen" #: company/templates/company/detail_part.html:43 -#: part/templates/part/category.html:102 templates/js/stock.html:778 +#: part/templates/part/category.html:102 templates/js/stock.html:782 msgid "New Part" msgstr "Neues Teil" @@ -1149,7 +1171,7 @@ msgstr "Neue Bestellung" #: company/templates/company/tabs.html:22 #: order/templates/order/sales_orders.html:7 #: order/templates/order/sales_orders.html:12 -#: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:50 +#: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:53 #: templates/navbar.html:33 msgid "Sales Orders" msgstr "Bestellungen" @@ -1217,30 +1239,36 @@ msgstr "Zuliefererbestellungen" msgid "Pricing Information" msgstr "Preisinformationen ansehen" -#: company/templates/company/supplier_part_pricing.html:14 -msgid "Order Multiple" -msgstr "Bestellvielfaches" +#: company/templates/company/supplier_part_pricing.html:15 company/views.py:399 +#: part/templates/part/sale_prices.html:13 part/views.py:2108 +msgid "Add Price Break" +msgstr "Preisstaffel hinzufügen" -#: company/templates/company/supplier_part_pricing.html:16 -msgid "Base Price (Flat Fee)" -msgstr "Grundpreis" +#: company/templates/company/supplier_part_pricing.html:32 +#: part/templates/part/sale_prices.html:41 +#, fuzzy +#| msgid "No company information found" +msgid "No price break information found" +msgstr "Keine Firmeninformation gefunden" -#: company/templates/company/supplier_part_pricing.html:19 -msgid "Price Breaks" -msgstr "Preisstaffelung" - -#: company/templates/company/supplier_part_pricing.html:22 -msgid "New Price Break" -msgstr "Neue Preisstaffelung" - -#: company/templates/company/supplier_part_pricing.html:28 -#: templates/js/bom.html:203 +#: company/templates/company/supplier_part_pricing.html:76 +#: part/templates/part/sale_prices.html:85 templates/js/bom.html:203 msgid "Price" msgstr "Preis" -#: company/templates/company/supplier_part_pricing.html:48 -msgid "No price breaks have been added for this part" -msgstr "Keine Preisstaffelung für dieses Teil" +#: company/templates/company/supplier_part_pricing.html:90 +#: part/templates/part/sale_prices.html:99 +#, fuzzy +#| msgid "Edit Price Break" +msgid "Edit price break" +msgstr "Preisstaffel bearbeiten" + +#: company/templates/company/supplier_part_pricing.html:91 +#: part/templates/part/sale_prices.html:100 +#, fuzzy +#| msgid "Delete Price Break" +msgid "Delete price break" +msgstr "Preisstaffel löschen" #: company/templates/company/supplier_part_stock.html:11 msgid "Supplier Part Stock" @@ -1252,9 +1280,10 @@ msgstr "Bepreisung" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 -#: stock/templates/stock/location.html:12 templates/js/part.html:124 -#: templates/js/part.html:298 templates/js/stock.html:452 -#: templates/navbar.html:19 +#: stock/templates/stock/item_installed.html:91 +#: stock/templates/stock/location.html:12 templates/InvenTree/search.html:145 +#: templates/js/part.html:124 templates/js/part.html:306 +#: templates/js/stock.html:452 templates/navbar.html:19 msgid "Stock" msgstr "Lagerbestand" @@ -1263,7 +1292,7 @@ msgid "Orders" msgstr "Bestellungen" #: company/templates/company/tabs.html:9 -#: order/templates/order/receive_parts.html:14 part/models.py:240 +#: order/templates/order/receive_parts.html:14 part/models.py:242 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:83 #: templates/navbar.html:18 templates/stats.html:8 templates/stats.html:17 msgid "Parts" @@ -1334,7 +1363,7 @@ msgstr "Firma gelöscht" msgid "Edit Supplier Part" msgstr "Zuliefererteil bearbeiten" -#: company/views.py:269 templates/js/stock.html:785 +#: company/views.py:269 templates/js/stock.html:789 msgid "Create new Supplier Part" msgstr "Neues Zuliefererteil anlegen" @@ -1342,15 +1371,17 @@ msgstr "Neues Zuliefererteil anlegen" msgid "Delete Supplier Part" msgstr "Zuliefererteil entfernen" -#: company/views.py:399 -msgid "Add Price Break" +#: company/views.py:404 part/views.py:2112 +#, fuzzy +#| msgid "Add Price Break" +msgid "Added new price break" msgstr "Preisstaffel hinzufügen" -#: company/views.py:441 +#: company/views.py:441 part/views.py:2157 msgid "Edit Price Break" msgstr "Preisstaffel bearbeiten" -#: company/views.py:456 +#: company/views.py:456 part/views.py:2171 msgid "Delete Price Break" msgstr "Preisstaffel löschen" @@ -1378,7 +1409,7 @@ msgstr "" msgid "Label template is enabled" msgstr "" -#: label/models.py:76 report/models.py:153 +#: label/models.py:76 report/models.py:162 msgid "Enabled" msgstr "" @@ -1455,8 +1486,8 @@ msgstr "" msgid "Date order was completed" msgstr "Bestellung als vollständig markieren" -#: order/models.py:185 order/models.py:259 part/views.py:1303 -#: stock/models.py:239 stock/models.py:682 +#: order/models.py:185 order/models.py:259 part/views.py:1304 +#: stock/models.py:239 stock/models.py:754 msgid "Quantity must be greater than zero" msgstr "Anzahl muss größer Null sein" @@ -1625,7 +1656,7 @@ msgid "Purchase Order Attachments" msgstr "Bestellanhänge" #: order/templates/order/po_tabs.html:8 order/templates/order/so_tabs.html:16 -#: part/templates/part/tabs.html:61 stock/templates/stock/tabs.html:32 +#: part/templates/part/tabs.html:64 stock/templates/stock/tabs.html:32 msgid "Attachments" msgstr "Anhänge" @@ -1642,7 +1673,7 @@ msgstr "Bestellpositionen" #: order/templates/order/purchase_order_detail.html:38 #: order/templates/order/purchase_order_detail.html:118 #: part/templates/part/category.html:153 part/templates/part/category.html:194 -#: templates/js/stock.html:790 +#: templates/js/stock.html:794 msgid "New Location" msgstr "Neuer Standort" @@ -1683,7 +1714,7 @@ msgid "Select parts to receive against this order" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:132 templates/js/part.html:314 +#: part/templates/part/part_base.html:132 templates/js/part.html:322 msgid "On Order" msgstr "bestellt" @@ -1781,7 +1812,7 @@ msgstr "Bestellungspositionen" msgid "Add Purchase Order Attachment" msgstr "Bestellanhang hinzufügen" -#: order/views.py:102 order/views.py:149 part/views.py:85 stock/views.py:167 +#: order/views.py:102 order/views.py:149 part/views.py:86 stock/views.py:167 msgid "Added attachment" msgstr "Anhang hinzugefügt" @@ -1943,75 +1974,75 @@ msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)" msgid "Error reading BOM file (incorrect row size)" msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)" -#: part/forms.py:55 stock/forms.py:250 +#: part/forms.py:57 stock/forms.py:250 msgid "File Format" msgstr "Dateiformat" -#: part/forms.py:55 stock/forms.py:250 +#: part/forms.py:57 stock/forms.py:250 msgid "Select output file format" msgstr "Ausgabe-Dateiformat auswählen" -#: part/forms.py:57 +#: part/forms.py:59 msgid "Cascading" msgstr "Kaskadierend" -#: part/forms.py:57 +#: part/forms.py:59 msgid "Download cascading / multi-level BOM" msgstr "Kaskadierende Stückliste herunterladen" -#: part/forms.py:59 +#: part/forms.py:61 msgid "Levels" msgstr "" -#: part/forms.py:59 +#: part/forms.py:61 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:61 +#: part/forms.py:63 #, fuzzy #| msgid "New Parameter" msgid "Include Parameter Data" msgstr "Neuer Parameter" -#: part/forms.py:61 +#: part/forms.py:63 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:63 +#: part/forms.py:65 #, fuzzy #| msgid "Include stock in sublocations" msgid "Include Stock Data" msgstr "Bestand in Unterlagerorten einschließen" -#: part/forms.py:63 +#: part/forms.py:65 #, fuzzy #| msgid "Include parts in subcategories" msgid "Include part stock data in exported BOM" msgstr "Teile in Unterkategorien einschließen" -#: part/forms.py:65 +#: part/forms.py:67 #, fuzzy #| msgid "New Supplier Part" msgid "Include Supplier Data" msgstr "Neues Zulieferer-Teil" -#: part/forms.py:65 +#: part/forms.py:67 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:84 +#: part/forms.py:86 msgid "Confirm that the BOM is correct" msgstr "Bestätigen, dass die Stückliste korrekt ist" -#: part/forms.py:96 +#: part/forms.py:98 msgid "Select BOM file to upload" msgstr "Stücklisten-Datei zum Upload auswählen" -#: part/forms.py:120 +#: part/forms.py:122 msgid "Select part category" msgstr "Teilekategorie wählen" -#: part/forms.py:134 +#: part/forms.py:136 #, fuzzy #| msgid "Perform 'deep copy' which will duplicate all BOM data for this part" msgid "Duplicate all BOM data for this part" @@ -2019,169 +2050,169 @@ msgstr "" "Tiefe Kopie ausführen. Dies wird alle Daten der Stückliste für dieses Teil " "duplizieren" -#: part/forms.py:135 +#: part/forms.py:137 msgid "Copy BOM" msgstr "" -#: part/forms.py:140 +#: part/forms.py:142 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:141 +#: part/forms.py:143 #, fuzzy #| msgid "Parameters" msgid "Copy Parameters" msgstr "Parameter" -#: part/forms.py:146 +#: part/forms.py:148 msgid "Confirm part creation" msgstr "Erstellen des Teils bestätigen" -#: part/forms.py:245 +#: part/forms.py:247 msgid "Input quantity for price calculation" msgstr "Eintragsmenge zur Preisberechnung" -#: part/forms.py:248 +#: part/forms.py:250 msgid "Select currency for price calculation" msgstr "Währung zur Preisberechnung wählen" -#: part/models.py:64 +#: part/models.py:66 msgid "Default location for parts in this category" msgstr "Standard-Standort für Teile dieser Kategorie" -#: part/models.py:67 +#: part/models.py:69 msgid "Default keywords for parts in this category" msgstr "Standard-Stichworte für Teile dieser Kategorie" -#: part/models.py:73 part/templates/part/part_app_base.html:9 +#: part/models.py:75 part/templates/part/part_app_base.html:9 msgid "Part Category" msgstr "Teilkategorie" -#: part/models.py:74 part/templates/part/category.html:13 +#: part/models.py:76 part/templates/part/category.html:13 #: part/templates/part/category.html:78 templates/stats.html:12 msgid "Part Categories" msgstr "Teile-Kategorien" -#: part/models.py:291 part/models.py:301 +#: part/models.py:293 part/models.py:303 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "Teil '{p1}' wird in Stückliste für Teil '{p2}' benutzt (rekursiv)" -#: part/models.py:381 +#: part/models.py:383 #, fuzzy #| msgid "No serial numbers found" msgid "Next available serial numbers are" msgstr "Keine Seriennummern gefunden" -#: part/models.py:385 +#: part/models.py:387 msgid "Next available serial number is" msgstr "" -#: part/models.py:390 +#: part/models.py:392 #, fuzzy #| msgid "Empty serial number string" msgid "Most recent serial number is" msgstr "Keine Seriennummer angegeben" -#: part/models.py:468 +#: part/models.py:470 msgid "Part must be unique for name, IPN and revision" msgstr "Namen, Teile- und Revisionsnummern müssen eindeutig sein" -#: part/models.py:483 part/templates/part/detail.html:19 +#: part/models.py:485 part/templates/part/detail.html:19 msgid "Part name" msgstr "Name des Teils" -#: part/models.py:487 +#: part/models.py:489 msgid "Is this part a template part?" msgstr "Ist dieses Teil eine Vorlage?" -#: part/models.py:496 +#: part/models.py:498 msgid "Is this part a variant of another part?" msgstr "Ist dieses Teil eine Variante eines anderen Teils?" -#: part/models.py:498 +#: part/models.py:500 msgid "Part description" msgstr "Beschreibung des Teils" -#: part/models.py:500 +#: part/models.py:502 msgid "Part keywords to improve visibility in search results" msgstr "Schlüsselworte um die Sichtbarkeit in Suchergebnissen zu verbessern" -#: part/models.py:505 +#: part/models.py:507 msgid "Part category" msgstr "Teile-Kategorie" -#: part/models.py:507 +#: part/models.py:509 msgid "Internal Part Number" msgstr "Interne Teilenummer" -#: part/models.py:509 +#: part/models.py:511 msgid "Part revision or version number" msgstr "Revisions- oder Versionsnummer" -#: part/models.py:511 +#: part/models.py:513 msgid "Link to extenal URL" msgstr "Link zu einer Externen URL" -#: part/models.py:523 +#: part/models.py:525 msgid "Where is this item normally stored?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: part/models.py:567 +#: part/models.py:569 msgid "Default supplier part" msgstr "Standard-Zulieferer?" -#: part/models.py:570 +#: part/models.py:572 msgid "Minimum allowed stock level" msgstr "Minimal zulässiger Lagerbestand" -#: part/models.py:572 +#: part/models.py:574 msgid "Stock keeping units for this part" msgstr "Stock Keeping Units (SKU) für dieses Teil" -#: part/models.py:574 +#: part/models.py:576 msgid "Can this part be built from other parts?" msgstr "Kann dieses Teil aus anderen Teilen angefertigt werden?" -#: part/models.py:576 +#: part/models.py:578 msgid "Can this part be used to build other parts?" msgstr "Kann dieses Teil zum Bau von anderen genutzt werden?" -#: part/models.py:578 +#: part/models.py:580 msgid "Does this part have tracking for unique items?" msgstr "Hat dieses Teil Tracking für einzelne Objekte?" -#: part/models.py:580 +#: part/models.py:582 msgid "Can this part be purchased from external suppliers?" msgstr "Kann dieses Teil von externen Zulieferern gekauft werden?" -#: part/models.py:582 +#: part/models.py:584 msgid "Can this part be sold to customers?" msgstr "Kann dieses Teil an Kunden verkauft werden?" -#: part/models.py:584 +#: part/models.py:586 msgid "Is this part active?" msgstr "Ist dieses Teil aktiv?" -#: part/models.py:586 +#: part/models.py:588 msgid "Is this a virtual part, such as a software product or license?" msgstr "Ist dieses Teil virtuell, wie zum Beispiel eine Software oder Lizenz?" -#: part/models.py:588 +#: part/models.py:590 msgid "Part notes - supports Markdown formatting" msgstr "Bemerkungen - unterstüzt Markdown-Formatierung" -#: part/models.py:590 +#: part/models.py:592 msgid "Stored BOM checksum" msgstr "Prüfsumme der Stückliste gespeichert" -#: part/models.py:1284 +#: part/models.py:1300 #, fuzzy #| msgid "Stock item cannot be created for a template Part" msgid "Test templates can only be created for trackable parts" msgstr "Lagerobjekt kann nicht für Vorlagen-Teile angelegt werden" -#: part/models.py:1301 +#: part/models.py:1317 #, fuzzy #| msgid "" #| "A stock item with this serial number already exists for template part " @@ -2191,114 +2222,114 @@ msgstr "" "Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage " "{part}" -#: part/models.py:1320 templates/js/part.html:447 templates/js/stock.html:92 +#: part/models.py:1336 templates/js/part.html:455 templates/js/stock.html:92 #, fuzzy #| msgid "Instance Name" msgid "Test Name" msgstr "Instanzname" -#: part/models.py:1321 +#: part/models.py:1337 #, fuzzy #| msgid "Serial number for this item" msgid "Enter a name for the test" msgstr "Seriennummer für dieses Teil" -#: part/models.py:1326 +#: part/models.py:1342 #, fuzzy #| msgid "Description" msgid "Test Description" msgstr "Beschreibung" -#: part/models.py:1327 +#: part/models.py:1343 #, fuzzy #| msgid "Brief description of the build" msgid "Enter description for this test" msgstr "Kurze Beschreibung des Baus" -#: part/models.py:1333 +#: part/models.py:1349 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:1338 templates/js/part.html:464 +#: part/models.py:1354 templates/js/part.html:472 #, fuzzy #| msgid "Required Parts" msgid "Requires Value" msgstr "benötigte Teile" -#: part/models.py:1339 +#: part/models.py:1355 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:1344 templates/js/part.html:471 +#: part/models.py:1360 templates/js/part.html:479 #, fuzzy #| msgid "Delete Attachment" msgid "Requires Attachment" msgstr "Anhang löschen" -#: part/models.py:1345 +#: part/models.py:1361 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:1378 +#: part/models.py:1394 msgid "Parameter template name must be unique" msgstr "Vorlagen-Name des Parameters muss eindeutig sein" -#: part/models.py:1383 +#: part/models.py:1399 msgid "Parameter Name" msgstr "Name des Parameters" -#: part/models.py:1385 +#: part/models.py:1401 msgid "Parameter Units" msgstr "Parameter Einheit" -#: part/models.py:1411 +#: part/models.py:1427 msgid "Parent Part" msgstr "Ausgangsteil" -#: part/models.py:1413 +#: part/models.py:1429 msgid "Parameter Template" msgstr "Parameter Vorlage" -#: part/models.py:1415 +#: part/models.py:1431 msgid "Parameter Value" msgstr "Parameter Wert" -#: part/models.py:1451 +#: part/models.py:1467 msgid "Select parent part" msgstr "Ausgangsteil auswählen" -#: part/models.py:1459 +#: part/models.py:1475 msgid "Select part to be used in BOM" msgstr "Teil für die Nutzung in der Stückliste auswählen" -#: part/models.py:1465 +#: part/models.py:1481 msgid "BOM quantity for this BOM item" msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil" -#: part/models.py:1468 +#: part/models.py:1484 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "Geschätzter Ausschuss (absolut oder prozentual)" -#: part/models.py:1471 +#: part/models.py:1487 msgid "BOM item reference" msgstr "Referenz des Objekts auf der Stückliste" -#: part/models.py:1474 +#: part/models.py:1490 msgid "BOM item notes" msgstr "Notizen zum Stücklisten-Objekt" -#: part/models.py:1476 +#: part/models.py:1492 msgid "BOM line checksum" msgstr "Prüfsumme der Stückliste" -#: part/models.py:1540 part/views.py:1309 part/views.py:1361 +#: part/models.py:1556 part/views.py:1310 part/views.py:1362 #: stock/models.py:229 #, fuzzy #| msgid "Overage must be an integer value or a percentage" msgid "Quantity must be integer value for trackable parts" msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein" -#: part/models.py:1549 +#: part/models.py:1565 #, fuzzy #| msgid "New BOM Item" msgid "BOM Item" @@ -2320,8 +2351,8 @@ msgstr "Bestellung" #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:58 #: stock/templates/stock/item_base.html:226 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:108 -#: templates/js/stock.html:647 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112 +#: templates/js/stock.html:651 msgid "Stock Item" msgstr "Lagerobjekt" @@ -2362,7 +2393,7 @@ msgstr "Stückliste bearbeiten" msgid "Validate Bill of Materials" msgstr "Stückliste validieren" -#: part/templates/part/bom.html:46 part/views.py:1596 +#: part/templates/part/bom.html:46 part/views.py:1597 msgid "Export Bill of Materials" msgstr "Stückliste exportieren" @@ -2466,7 +2497,7 @@ msgstr "" msgid "All parts" msgstr "Alle Teile" -#: part/templates/part/category.html:18 part/views.py:1934 +#: part/templates/part/category.html:18 part/views.py:1935 msgid "Create new part category" msgstr "Teilkategorie anlegen" @@ -2510,7 +2541,7 @@ msgstr "Teile (inklusive Unter-Kategorien)" msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:102 part/views.py:490 +#: part/templates/part/category.html:102 part/views.py:491 msgid "Create new part" msgstr "Neues Teil anlegen" @@ -2556,7 +2587,7 @@ msgstr "Teilkategorie anlegen" msgid "Create new Part Category" msgstr "Teilkategorie anlegen" -#: part/templates/part/category.html:195 stock/views.py:1080 +#: part/templates/part/category.html:195 stock/views.py:1213 msgid "Create new Stock Location" msgstr "Neuen Lager-Standort erstellen" @@ -2590,7 +2621,7 @@ msgid "Variant Of" msgstr "Variante von" #: part/templates/part/detail.html:70 part/templates/part/set_category.html:15 -#: templates/js/part.html:285 +#: templates/js/part.html:293 msgid "Category" msgstr "Kategorie" @@ -2631,7 +2662,7 @@ msgid "Part is not a virtual part" msgstr "Teil ist nicht virtuell" #: part/templates/part/detail.html:145 stock/forms.py:244 -#: templates/js/table_filters.html:159 +#: templates/js/table_filters.html:183 msgid "Template" msgstr "Vorlage" @@ -2647,7 +2678,7 @@ msgstr "Teil kann keine Vorlage sein wenn es Variante eines anderen Teils ist" msgid "Part is not a template part" msgstr "Teil ist nicht virtuell" -#: part/templates/part/detail.html:154 templates/js/table_filters.html:171 +#: part/templates/part/detail.html:154 templates/js/table_filters.html:195 msgid "Assembly" msgstr "Baugruppe" @@ -2659,7 +2690,7 @@ msgstr "Teil kann aus anderen Teilen angefertigt werden" msgid "Part cannot be assembled from other parts" msgstr "Teil kann nicht aus anderen Teilen angefertigt werden" -#: part/templates/part/detail.html:163 templates/js/table_filters.html:175 +#: part/templates/part/detail.html:163 templates/js/table_filters.html:199 msgid "Component" msgstr "Komponente" @@ -2671,7 +2702,7 @@ msgstr "Teil kann in Baugruppen benutzt werden" msgid "Part cannot be used in assemblies" msgstr "Teil kann nicht in Baugruppen benutzt werden" -#: part/templates/part/detail.html:172 templates/js/table_filters.html:187 +#: part/templates/part/detail.html:172 templates/js/table_filters.html:211 msgid "Trackable" msgstr "nachverfolgbar" @@ -2691,7 +2722,7 @@ msgstr "Kaufbar" msgid "Part can be purchased from external suppliers" msgstr "Teil kann von externen Zulieferern gekauft werden" -#: part/templates/part/detail.html:190 templates/js/table_filters.html:183 +#: part/templates/part/detail.html:190 templates/js/table_filters.html:207 msgid "Salable" msgstr "Verkäuflich" @@ -2703,7 +2734,7 @@ msgstr "Teil kann an Kunden verkauft werden" msgid "Part cannot be sold to customers" msgstr "Teil kann nicht an Kunden verkauft werden" -#: part/templates/part/detail.html:199 templates/js/table_filters.html:154 +#: part/templates/part/detail.html:199 templates/js/table_filters.html:178 msgid "Active" msgstr "Aktiv" @@ -2739,7 +2770,7 @@ msgstr "Parameter hinzufügen" msgid "New Parameter" msgstr "Neuer Parameter" -#: part/templates/part/params.html:21 stock/models.py:1266 +#: part/templates/part/params.html:21 stock/models.py:1340 #: templates/js/stock.html:112 msgid "Value" msgstr "Wert" @@ -2771,7 +2802,7 @@ msgid "This part is a variant of" msgstr "Dieses Teil ist eine Variante von" #: part/templates/part/part_base.html:33 templates/js/company.html:153 -#: templates/js/part.html:262 +#: templates/js/part.html:270 msgid "Inactive" msgstr "Inaktiv" @@ -2829,7 +2860,7 @@ msgstr "Vorlage bearbeiten" msgid "Delete part" msgstr "Teile löschen" -#: part/templates/part/part_base.html:111 templates/js/table_filters.html:57 +#: part/templates/part/part_base.html:111 templates/js/table_filters.html:65 msgid "In Stock" msgstr "Auf Lager" @@ -2869,6 +2900,12 @@ msgstr "Aus vorhandenen Bildern auswählen" msgid "Upload new image" msgstr "Neues Bild hochladen" +#: part/templates/part/sale_prices.html:9 part/templates/part/tabs.html:50 +#, fuzzy +#| msgid "Price" +msgid "Sale Price" +msgstr "Preis" + #: part/templates/part/sales_orders.html:15 msgid "New sales order" msgstr "Neuer Auftrag" @@ -2890,7 +2927,7 @@ msgid "Part Stock" msgstr "Teilbestand" #: part/templates/part/stock_count.html:7 templates/js/bom.html:193 -#: templates/js/part.html:322 +#: templates/js/part.html:330 msgid "No Stock" msgstr "Kein Bestand" @@ -2938,7 +2975,7 @@ msgstr "Stückliste" msgid "Used In" msgstr "Benutzt in" -#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:270 +#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:270 msgid "Tests" msgstr "" @@ -2972,218 +3009,218 @@ msgstr "Neues Teil hinzufügen" msgid "New Variant" msgstr "Varianten" -#: part/views.py:75 +#: part/views.py:76 msgid "Add part attachment" msgstr "Teilanhang hinzufügen" -#: part/views.py:124 templates/attachment_table.html:30 +#: part/views.py:125 templates/attachment_table.html:30 msgid "Edit attachment" msgstr "Anhang bearbeiten" -#: part/views.py:128 +#: part/views.py:129 msgid "Part attachment updated" msgstr "Teilanhang aktualisiert" -#: part/views.py:143 +#: part/views.py:144 msgid "Delete Part Attachment" msgstr "Teilanhang löschen" -#: part/views.py:149 +#: part/views.py:150 msgid "Deleted part attachment" msgstr "Teilanhang gelöscht" -#: part/views.py:158 +#: part/views.py:159 #, fuzzy #| msgid "Create Part Parameter Template" msgid "Create Test Template" msgstr "Teilparametervorlage anlegen" -#: part/views.py:185 +#: part/views.py:186 #, fuzzy #| msgid "Edit Template" msgid "Edit Test Template" msgstr "Vorlage bearbeiten" -#: part/views.py:199 +#: part/views.py:200 #, fuzzy #| msgid "Delete Template" msgid "Delete Test Template" msgstr "Vorlage löschen" -#: part/views.py:206 +#: part/views.py:207 msgid "Set Part Category" msgstr "Teilkategorie auswählen" -#: part/views.py:254 +#: part/views.py:255 #, python-brace-format msgid "Set category for {n} parts" msgstr "Kategorie für {n} Teile setzen" -#: part/views.py:289 +#: part/views.py:290 msgid "Create Variant" msgstr "Variante anlegen" -#: part/views.py:367 +#: part/views.py:368 msgid "Duplicate Part" msgstr "Teil duplizieren" -#: part/views.py:372 +#: part/views.py:373 msgid "Copied part" msgstr "Teil kopiert" -#: part/views.py:495 +#: part/views.py:496 msgid "Created new part" msgstr "Neues Teil angelegt" -#: part/views.py:706 +#: part/views.py:707 msgid "Part QR Code" msgstr "Teil-QR-Code" -#: part/views.py:723 +#: part/views.py:724 msgid "Upload Part Image" msgstr "Teilbild hochladen" -#: part/views.py:728 part/views.py:763 +#: part/views.py:729 part/views.py:764 msgid "Updated part image" msgstr "Teilbild aktualisiert" -#: part/views.py:737 +#: part/views.py:738 msgid "Select Part Image" msgstr "Teilbild auswählen" -#: part/views.py:766 +#: part/views.py:767 msgid "Part image not found" msgstr "Teilbild nicht gefunden" -#: part/views.py:777 +#: part/views.py:778 msgid "Edit Part Properties" msgstr "Teileigenschaften bearbeiten" -#: part/views.py:799 +#: part/views.py:800 msgid "Validate BOM" msgstr "BOM validieren" -#: part/views.py:962 +#: part/views.py:963 msgid "No BOM file provided" msgstr "Keine Stückliste angegeben" -#: part/views.py:1312 +#: part/views.py:1313 msgid "Enter a valid quantity" msgstr "Bitte eine gültige Anzahl eingeben" -#: part/views.py:1337 part/views.py:1340 +#: part/views.py:1338 part/views.py:1341 msgid "Select valid part" msgstr "Bitte ein gültiges Teil auswählen" -#: part/views.py:1346 +#: part/views.py:1347 msgid "Duplicate part selected" msgstr "Teil doppelt ausgewählt" -#: part/views.py:1384 +#: part/views.py:1385 msgid "Select a part" msgstr "Teil auswählen" -#: part/views.py:1390 +#: part/views.py:1391 #, fuzzy #| msgid "Select part to be used in BOM" msgid "Selected part creates a circular BOM" msgstr "Teil für die Nutzung in der Stückliste auswählen" -#: part/views.py:1394 +#: part/views.py:1395 msgid "Specify quantity" msgstr "Anzahl angeben" -#: part/views.py:1644 +#: part/views.py:1645 msgid "Confirm Part Deletion" msgstr "Löschen des Teils bestätigen" -#: part/views.py:1651 +#: part/views.py:1652 msgid "Part was deleted" msgstr "Teil wurde gelöscht" -#: part/views.py:1660 +#: part/views.py:1661 msgid "Part Pricing" msgstr "Teilbepreisung" -#: part/views.py:1782 +#: part/views.py:1783 msgid "Create Part Parameter Template" msgstr "Teilparametervorlage anlegen" -#: part/views.py:1790 +#: part/views.py:1791 msgid "Edit Part Parameter Template" msgstr "Teilparametervorlage bearbeiten" -#: part/views.py:1797 +#: part/views.py:1798 msgid "Delete Part Parameter Template" msgstr "Teilparametervorlage löschen" -#: part/views.py:1805 +#: part/views.py:1806 msgid "Create Part Parameter" msgstr "Teilparameter anlegen" -#: part/views.py:1855 +#: part/views.py:1856 msgid "Edit Part Parameter" msgstr "Teilparameter bearbeiten" -#: part/views.py:1869 +#: part/views.py:1870 msgid "Delete Part Parameter" msgstr "Teilparameter löschen" -#: part/views.py:1885 +#: part/views.py:1886 msgid "Edit Part Category" msgstr "Teilkategorie bearbeiten" -#: part/views.py:1920 +#: part/views.py:1921 msgid "Delete Part Category" msgstr "Teilkategorie löschen" -#: part/views.py:1926 +#: part/views.py:1927 msgid "Part category was deleted" msgstr "Teilekategorie wurde gelöscht" -#: part/views.py:1985 +#: part/views.py:1986 msgid "Create BOM item" msgstr "BOM-Position anlegen" -#: part/views.py:2051 +#: part/views.py:2052 msgid "Edit BOM item" msgstr "BOM-Position beaarbeiten" -#: part/views.py:2099 +#: part/views.py:2100 msgid "Confim BOM item deletion" msgstr "Löschung von BOM-Position bestätigen" -#: report/models.py:138 +#: report/models.py:147 #, fuzzy #| msgid "Template part" msgid "Template name" msgstr "Vorlagenteil" -#: report/models.py:144 +#: report/models.py:153 msgid "Report template file" msgstr "" -#: report/models.py:148 +#: report/models.py:157 #, fuzzy #| msgid "Supplier part description" msgid "Report template description" msgstr "Zuliefererbeschreibung des Teils" -#: report/models.py:152 +#: report/models.py:161 #, fuzzy #| msgid "Supplier part description" msgid "Report template is enabled" msgstr "Zuliefererbeschreibung des Teils" -#: report/models.py:159 +#: report/models.py:168 msgid "Part query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:218 +#: report/models.py:227 msgid "Report asset file" msgstr "" -#: report/models.py:221 +#: report/models.py:230 #, fuzzy #| msgid "Settings description" msgid "Asset file description" @@ -3203,15 +3240,59 @@ msgstr "Lagerobjekt für Zuordnung auswählen" msgid "Include stock items in sub locations" msgstr "Lagerobjekte in untergeordneten Lagerorten einschließen" -#: stock/forms.py:285 +#: stock/forms.py:279 +#, fuzzy +#| msgid "Does this part have tracking for unique items?" +msgid "Destination location for uninstalled items" +msgstr "Hat dieses Teil Tracking für einzelne Objekte?" + +#: stock/forms.py:281 +#, fuzzy +#| msgid "Description of the company" +msgid "Add transaction note (optional)" +msgstr "Firmenbeschreibung" + +#: stock/forms.py:283 +#, fuzzy +#| msgid "Confirm stock allocation" +msgid "Confirm uninstall" +msgstr "Lagerbestandszuordnung bestätigen" + +#: stock/forms.py:283 +#, fuzzy +#| msgid "Confirm movement of stock items" +msgid "Confirm removal of installed stock items" +msgstr "Bewegung der Lagerobjekte bestätigen" + +#: stock/forms.py:307 +#, fuzzy +#| msgid "Description" +msgid "Destination" +msgstr "Beschreibung" + +#: stock/forms.py:307 msgid "Destination stock location" msgstr "Ziel-Lagerbestand" -#: stock/forms.py:291 +#: stock/forms.py:309 +msgid "Add note (required)" +msgstr "" + +#: stock/forms.py:313 stock/views.py:795 stock/views.py:992 +msgid "Confirm stock adjustment" +msgstr "Bestands-Anpassung bestätigen" + +#: stock/forms.py:313 msgid "Confirm movement of stock items" msgstr "Bewegung der Lagerobjekte bestätigen" -#: stock/forms.py:293 +#: stock/forms.py:315 +#, fuzzy +#| msgid "Default Location" +msgid "Set Default Location" +msgstr "Standard-Lagerort" + +#: stock/forms.py:315 msgid "Set the destination as the default location for selected parts" msgstr "Setze das Ziel als Standard-Ziel für ausgewählte Teile" @@ -3336,105 +3417,117 @@ msgstr "Ist dieses Objekt einem Kunden zugeteilt?" msgid "Returned to location" msgstr "Neuen Lagerort anlegen" -#: stock/models.py:673 +#: stock/models.py:626 +#, fuzzy +#| msgid "Installed in Stock Item" +msgid "Installed in stock item" +msgstr "In Lagerobjekt installiert" + +#: stock/models.py:655 +#, fuzzy +#| msgid "Include sublocations" +msgid "Uninstalled into location" +msgstr "Unterlagerorte einschließen" + +#: stock/models.py:745 #, fuzzy #| msgid "Part is not a virtual part" msgid "Part is not set as trackable" msgstr "Teil ist nicht virtuell" -#: stock/models.py:679 +#: stock/models.py:751 msgid "Quantity must be integer" msgstr "Anzahl muss eine Ganzzahl sein" -#: stock/models.py:685 +#: stock/models.py:757 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})" -#: stock/models.py:688 +#: stock/models.py:760 msgid "Serial numbers must be a list of integers" msgstr "Seriennummern muss eine Liste von Ganzzahlen sein" -#: stock/models.py:691 +#: stock/models.py:763 msgid "Quantity does not match serial numbers" msgstr "Anzahl stimmt nicht mit den Seriennummern überein" -#: stock/models.py:701 +#: stock/models.py:773 msgid "Serial numbers already exist: " msgstr "Seriennummern existieren bereits:" -#: stock/models.py:726 +#: stock/models.py:798 msgid "Add serial number" msgstr "Seriennummer hinzufügen" -#: stock/models.py:729 +#: stock/models.py:801 #, python-brace-format msgid "Serialized {n} items" msgstr "{n} Teile serialisiert" -#: stock/models.py:840 +#: stock/models.py:912 msgid "StockItem cannot be moved as it is not in stock" msgstr "Lagerobjekt kann nicht bewegt werden, da kein Bestand vorhanden ist" -#: stock/models.py:1167 +#: stock/models.py:1241 msgid "Tracking entry title" msgstr "Name des Eintrags-Trackings" -#: stock/models.py:1169 +#: stock/models.py:1243 msgid "Entry notes" msgstr "Eintrags-Notizen" -#: stock/models.py:1171 +#: stock/models.py:1245 msgid "Link to external page for further information" msgstr "Link auf externe Seite für weitere Informationen" -#: stock/models.py:1231 +#: stock/models.py:1305 #, fuzzy #| msgid "Serial number for this item" msgid "Value must be provided for this test" msgstr "Seriennummer für dieses Teil" -#: stock/models.py:1237 +#: stock/models.py:1311 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1254 +#: stock/models.py:1328 msgid "Test" msgstr "" -#: stock/models.py:1255 +#: stock/models.py:1329 #, fuzzy #| msgid "Part name" msgid "Test name" msgstr "Name des Teils" -#: stock/models.py:1260 +#: stock/models.py:1334 #, fuzzy #| msgid "Search Results" msgid "Result" msgstr "Suchergebnisse" -#: stock/models.py:1261 templates/js/table_filters.html:90 +#: stock/models.py:1335 templates/js/table_filters.html:111 msgid "Test result" msgstr "" -#: stock/models.py:1267 +#: stock/models.py:1341 msgid "Test output value" msgstr "" -#: stock/models.py:1273 +#: stock/models.py:1347 #, fuzzy #| msgid "Attachments" msgid "Attachment" msgstr "Anhänge" -#: stock/models.py:1274 +#: stock/models.py:1348 #, fuzzy #| msgid "Delete attachment" msgid "Test result attachment" msgstr "Anhang löschen" -#: stock/models.py:1280 +#: stock/models.py:1354 #, fuzzy #| msgid "Edit notes" msgid "Test notes" @@ -3618,6 +3711,37 @@ msgstr "Dieses Lagerobjekt hat keine Kinder" msgid "Are you sure you want to delete this stock item?" msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?" +#: stock/templates/stock/item_installed.html:10 +#, fuzzy +#| msgid "Installed in Stock Item" +msgid "Installed Stock Items" +msgstr "In Lagerobjekt installiert" + +#: stock/templates/stock/item_installed.html:18 +#, fuzzy +#| msgid "Added stock to {n} items" +msgid "Uninstall selected stock items" +msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt" + +#: stock/templates/stock/item_installed.html:18 +msgid "Uninstall" +msgstr "" + +#: stock/templates/stock/item_installed.html:35 +#, fuzzy +#| msgid "No stock items matching query" +msgid "No stock items installed" +msgstr "Keine zur Anfrage passenden Lagerobjekte" + +#: stock/templates/stock/item_installed.html:48 templates/js/part.html:209 +#: templates/js/stock.html:409 +msgid "Select" +msgstr "Auswählen" + +#: stock/templates/stock/item_installed.html:131 +msgid "Uninstall item" +msgstr "" + #: stock/templates/stock/item_tests.html:10 stock/templates/stock/tabs.html:13 msgid "Test Data" msgstr "" @@ -3681,7 +3805,8 @@ msgid "Sublocations" msgstr "Sub-Standorte" #: stock/templates/stock/location.html:68 -#: stock/templates/stock/location.html:83 templates/stats.html:21 +#: stock/templates/stock/location.html:83 +#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21 #: templates/stats.html:30 msgid "Stock Items" msgstr "Lagerobjekte" @@ -3701,7 +3826,13 @@ msgstr "Lagerobjekt-Standorte" msgid "Are you sure you want to delete this stock location?" msgstr "Sind Sie sicher, dass Sie diesen Anhang löschen wollen?" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1053 +#: stock/templates/stock/stock_uninstall.html:8 +#, fuzzy +#| msgid "The following items will be created" +msgid "The following stock items will be uninstalled" +msgstr "Die folgenden Objekte werden erstellt" + +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1186 #, fuzzy #| msgid "Count Stock Items" msgid "Convert Stock Item" @@ -3733,6 +3864,12 @@ msgstr "Baue" msgid "Children" msgstr "Kinder" +#: stock/templates/stock/tabs.html:44 +#, fuzzy +#| msgid "Installed In" +msgid "Installed Items" +msgstr "Installiert in" + #: stock/views.py:114 msgid "Edit Stock Location" msgstr "Lagerobjekt-Standort bearbeiten" @@ -3841,137 +3978,169 @@ msgstr "Lagerbestandsexportoptionen" msgid "Stock Item QR Code" msgstr "Lagerobjekt-QR-Code" -#: stock/views.py:698 +#: stock/views.py:699 +#, fuzzy +#| msgid "Installed in Stock Item" +msgid "Uninstall Stock Items" +msgstr "In Lagerobjekt installiert" + +#: stock/views.py:806 +#, fuzzy +#| msgid "Installed in Stock Item" +msgid "Uninstalled stock items" +msgstr "In Lagerobjekt installiert" + +#: stock/views.py:831 msgid "Adjust Stock" msgstr "Lagerbestand anpassen" -#: stock/views.py:807 +#: stock/views.py:940 msgid "Move Stock Items" msgstr "Lagerobjekte bewegen" -#: stock/views.py:808 +#: stock/views.py:941 msgid "Count Stock Items" msgstr "Lagerobjekte zählen" -#: stock/views.py:809 +#: stock/views.py:942 msgid "Remove From Stock" msgstr "Aus Lagerbestand entfernen" -#: stock/views.py:810 +#: stock/views.py:943 msgid "Add Stock Items" msgstr "Lagerobjekte hinzufügen" -#: stock/views.py:811 +#: stock/views.py:944 msgid "Delete Stock Items" msgstr "Lagerobjekte löschen" -#: stock/views.py:839 +#: stock/views.py:972 msgid "Must enter integer value" msgstr "Nur Ganzzahl eingeben" -#: stock/views.py:844 +#: stock/views.py:977 msgid "Quantity must be positive" msgstr "Anzahl muss positiv sein" -#: stock/views.py:851 +#: stock/views.py:984 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "Anzahl darf {x} nicht überschreiten" -#: stock/views.py:859 -msgid "Confirm stock adjustment" -msgstr "Bestands-Anpassung bestätigen" - -#: stock/views.py:930 +#: stock/views.py:1063 #, python-brace-format msgid "Added stock to {n} items" msgstr "Vorrat zu {n} Lagerobjekten hinzugefügt" -#: stock/views.py:945 +#: stock/views.py:1078 #, python-brace-format msgid "Removed stock from {n} items" msgstr "Vorrat von {n} Lagerobjekten entfernt" -#: stock/views.py:958 +#: stock/views.py:1091 #, python-brace-format msgid "Counted stock for {n} items" msgstr "Bestand für {n} Objekte erfasst" -#: stock/views.py:986 +#: stock/views.py:1119 msgid "No items were moved" msgstr "Keine Lagerobjekte wurden bewegt" -#: stock/views.py:989 +#: stock/views.py:1122 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "{n} Teile nach {dest} bewegt" -#: stock/views.py:1008 +#: stock/views.py:1141 #, python-brace-format msgid "Deleted {n} stock items" msgstr "{n} Teile im Lager gelöscht" -#: stock/views.py:1020 +#: stock/views.py:1153 msgid "Edit Stock Item" msgstr "Lagerobjekt bearbeiten" -#: stock/views.py:1101 +#: stock/views.py:1234 msgid "Serialize Stock" msgstr "Lagerbestand erfassen" -#: stock/views.py:1194 -msgid "Create new Stock Item" -msgstr "Neues Lagerobjekt hinzufügen" - -#: stock/views.py:1293 +#: stock/views.py:1426 #, fuzzy #| msgid "Count stock items" msgid "Duplicate Stock Item" msgstr "Lagerobjekte zählen" -#: stock/views.py:1359 +#: stock/views.py:1492 msgid "Invalid quantity" msgstr "Ungültige Menge" -#: stock/views.py:1362 +#: stock/views.py:1495 #, fuzzy #| msgid "Quantity must be greater than zero" msgid "Quantity cannot be less than zero" msgstr "Anzahl muss größer Null sein" -#: stock/views.py:1366 +#: stock/views.py:1499 msgid "Invalid part selection" msgstr "Ungültige Teileauswahl" -#: stock/views.py:1415 +#: stock/views.py:1548 #, python-brace-format msgid "Created {n} new stock items" msgstr "{n} neue Lagerobjekte erstellt" -#: stock/views.py:1434 stock/views.py:1450 +#: stock/views.py:1567 stock/views.py:1583 msgid "Created new stock item" msgstr "Neues Lagerobjekt erstellt" -#: stock/views.py:1469 +#: stock/views.py:1602 msgid "Delete Stock Location" msgstr "Standort löschen" -#: stock/views.py:1482 +#: stock/views.py:1615 msgid "Delete Stock Item" msgstr "Lagerobjekt löschen" -#: stock/views.py:1493 +#: stock/views.py:1626 msgid "Delete Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag löschen" -#: stock/views.py:1510 +#: stock/views.py:1643 msgid "Edit Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag bearbeiten" -#: stock/views.py:1519 +#: stock/views.py:1652 msgid "Add Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag hinzufügen" +#: templates/InvenTree/bom_invalid.html:7 +msgid "BOM Waiting Validation" +msgstr "" + +#: templates/InvenTree/build_pending.html:7 +#, fuzzy +#| msgid "Parent Build" +msgid "Pending Builds" +msgstr "Eltern-Bau" + +#: templates/InvenTree/latest_parts.html:7 +#, fuzzy +#| msgid "Parent Part" +msgid "Latest Parts" +msgstr "Ausgangsteil" + +#: templates/InvenTree/po_outstanding.html:7 +#, fuzzy +#| msgid "Edit Purchase Order" +msgid "Outstanding Purchase Orders" +msgstr "Bestellung bearbeiten" + +#: templates/InvenTree/required_stock_build.html:7 +#, fuzzy +#| msgid "Complete Build" +msgid "Require Stock To Complete Build" +msgstr "Bau fertigstellen" + #: templates/InvenTree/search.html:7 templates/InvenTree/search.html:12 msgid "Search Results" msgstr "Suchergebnisse" @@ -3980,6 +4149,22 @@ msgstr "Suchergebnisse" msgid "No results found" msgstr "Keine Ergebnisse gefunden" +#: templates/InvenTree/search.html:181 templates/js/stock.html:521 +#, fuzzy +#| msgid "Item assigned to customer?" +msgid "Shipped to customer" +msgstr "Ist dieses Objekt einem Kunden zugeteilt?" + +#: templates/InvenTree/search.html:184 templates/js/stock.html:528 +msgid "No stock location set" +msgstr "Kein Lagerort gesetzt" + +#: templates/InvenTree/searching.html:3 +#, fuzzy +#| msgid "Search" +msgid "Searching" +msgstr "Suche" + #: templates/InvenTree/settings/part.html:9 #, fuzzy #| msgid "Edit Part Parameter Template" @@ -4008,6 +4193,12 @@ msgid "" "\t" msgstr "" +#: templates/InvenTree/so_outstanding.html:7 +#, fuzzy +#| msgid "Destination Sales Order" +msgid "Outstanding Sales Orders" +msgstr "Zielauftrag" + #: templates/InvenTree/starred_parts.html:7 msgid "Starred Parts" msgstr "Teilfavoriten" @@ -4175,7 +4366,7 @@ msgstr "Neues Lagerobjekt hinzufügen" msgid "Open subassembly" msgstr "Unterbaugruppe öffnen" -#: templates/js/bom.html:184 templates/js/build.html:115 +#: templates/js/bom.html:184 templates/js/build.html:119 msgid "Available" msgstr "verfügbar" @@ -4205,11 +4396,11 @@ msgstr "BOM-Position bearbeiten" msgid "Delete BOM Item" msgstr "BOM-Position löschen" -#: templates/js/build.html:19 +#: templates/js/build.html:23 msgid "No builds matching query" msgstr "Keine Baue passen zur Anfrage" -#: templates/js/build.html:104 +#: templates/js/build.html:108 msgid "No parts allocated for" msgstr "Keine Teile zugeordnet zu" @@ -4233,11 +4424,11 @@ msgstr "Keine Firmeninformation gefunden" msgid "No supplier parts found" msgstr "Keine Zuliefererteile gefunden" -#: templates/js/company.html:145 templates/js/part.html:240 +#: templates/js/company.html:145 templates/js/part.html:248 msgid "Template part" msgstr "Vorlagenteil" -#: templates/js/company.html:149 templates/js/part.html:244 +#: templates/js/company.html:149 templates/js/part.html:252 msgid "Assembled part" msgstr "Baugruppe" @@ -4249,7 +4440,7 @@ msgstr "Link" msgid "No purchase orders found" msgstr "Keine Bestellungen gefunden" -#: templates/js/order.html:172 templates/js/stock.html:629 +#: templates/js/order.html:172 templates/js/stock.html:633 msgid "Date" msgstr "Datum" @@ -4267,61 +4458,57 @@ msgstr "Versanddatum" msgid "No variants found" msgstr "Keine Teile gefunden" -#: templates/js/part.html:201 templates/js/stock.html:409 -msgid "Select" -msgstr "Auswählen" - -#: templates/js/part.html:248 +#: templates/js/part.html:256 msgid "Starred part" msgstr "Favoritenteil" -#: templates/js/part.html:252 +#: templates/js/part.html:260 msgid "Salable part" msgstr "Verkäufliches Teil" -#: templates/js/part.html:291 +#: templates/js/part.html:299 msgid "No category" msgstr "Keine Kategorie" -#: templates/js/part.html:309 templates/js/table_filters.html:167 +#: templates/js/part.html:317 templates/js/table_filters.html:191 msgid "Low stock" msgstr "Bestand niedrig" -#: templates/js/part.html:318 +#: templates/js/part.html:326 msgid "Building" msgstr "Im Bau" -#: templates/js/part.html:337 +#: templates/js/part.html:345 msgid "No parts found" msgstr "Keine Teile gefunden" -#: templates/js/part.html:397 +#: templates/js/part.html:405 msgid "YES" msgstr "" -#: templates/js/part.html:399 +#: templates/js/part.html:407 msgid "NO" msgstr "" -#: templates/js/part.html:433 +#: templates/js/part.html:441 #, fuzzy #| msgid "No stock items matching query" msgid "No test templates matching query" msgstr "Keine zur Anfrage passenden Lagerobjekte" -#: templates/js/part.html:484 templates/js/stock.html:63 +#: templates/js/part.html:492 templates/js/stock.html:63 #, fuzzy #| msgid "Edit Sales Order" msgid "Edit test result" msgstr "Auftrag bearbeiten" -#: templates/js/part.html:485 templates/js/stock.html:64 +#: templates/js/part.html:493 templates/js/stock.html:64 #, fuzzy #| msgid "Delete attachment" msgid "Delete test result" msgstr "Anhang löschen" -#: templates/js/part.html:491 +#: templates/js/part.html:499 msgid "This test is defined for a parent part" msgstr "" @@ -4401,147 +4588,168 @@ msgstr "Lagerobjekt wurde zugewiesen" msgid "Stock item is lost" msgstr "Lagerobjekt verloren" -#: templates/js/stock.html:491 templates/js/table_filters.html:52 +#: templates/js/stock.html:491 templates/js/table_filters.html:60 #, fuzzy #| msgid "Delete" msgid "Depleted" msgstr "Löschen" -#: templates/js/stock.html:520 +#: templates/js/stock.html:516 #, fuzzy -#| msgid "Item assigned to customer?" -msgid "Shipped to customer" -msgstr "Ist dieses Objekt einem Kunden zugeteilt?" +#| msgid "Installed in Stock Item" +msgid "Installed in Stock Item " +msgstr "In Lagerobjekt installiert" -#: templates/js/stock.html:523 -msgid "No stock location set" -msgstr "Kein Lagerort gesetzt" - -#: templates/js/stock.html:695 +#: templates/js/stock.html:699 msgid "No user information" msgstr "Keine Benutzerinformation" -#: templates/js/stock.html:779 +#: templates/js/stock.html:783 msgid "Create New Part" msgstr "Neues Teil anlegen" -#: templates/js/stock.html:791 +#: templates/js/stock.html:795 msgid "Create New Location" msgstr "Neuen Standort anlegen" -#: templates/js/table_filters.html:19 templates/js/table_filters.html:67 +#: templates/js/table_filters.html:19 templates/js/table_filters.html:80 #, fuzzy #| msgid "Serialize Stock" msgid "Is Serialized" msgstr "Lagerbestand erfassen" -#: templates/js/table_filters.html:22 templates/js/table_filters.html:70 +#: templates/js/table_filters.html:22 templates/js/table_filters.html:87 #, fuzzy #| msgid "Serial Number" msgid "Serial number GTE" msgstr "Seriennummer" -#: templates/js/table_filters.html:23 templates/js/table_filters.html:71 +#: templates/js/table_filters.html:23 templates/js/table_filters.html:88 #, fuzzy #| msgid "Serial number for this item" msgid "Serial number greater than or equal to" msgstr "Seriennummer für dieses Teil" -#: templates/js/table_filters.html:26 templates/js/table_filters.html:74 +#: templates/js/table_filters.html:26 templates/js/table_filters.html:91 #, fuzzy #| msgid "Serial Number" msgid "Serial number LTE" msgstr "Seriennummer" -#: templates/js/table_filters.html:27 templates/js/table_filters.html:75 +#: templates/js/table_filters.html:27 templates/js/table_filters.html:92 #, fuzzy #| msgid "Serial numbers already exist: " msgid "Serial number less than or equal to" msgstr "Seriennummern existieren bereits:" -#: templates/js/table_filters.html:37 +#: templates/js/table_filters.html:30 templates/js/table_filters.html:31 +#: templates/js/table_filters.html:83 templates/js/table_filters.html:84 +#, fuzzy +#| msgid "Serial Number" +msgid "Serial number" +msgstr "Seriennummer" + +#: templates/js/table_filters.html:35 templates/js/table_filters.html:101 +#, fuzzy +#| msgid "Batch Code" +msgid "Batch code" +msgstr "Losnummer" + +#: templates/js/table_filters.html:45 msgid "Active parts" msgstr "Aktive Teile" -#: templates/js/table_filters.html:38 +#: templates/js/table_filters.html:46 msgid "Show stock for active parts" msgstr "Bestand aktiver Teile anzeigen" -#: templates/js/table_filters.html:42 +#: templates/js/table_filters.html:50 msgid "Is allocated" msgstr "Ist zugeordnet" -#: templates/js/table_filters.html:43 +#: templates/js/table_filters.html:51 msgid "Item has been alloacted" msgstr "Position wurde zugeordnet" -#: templates/js/table_filters.html:47 +#: templates/js/table_filters.html:55 msgid "Include sublocations" msgstr "Unterlagerorte einschließen" -#: templates/js/table_filters.html:48 +#: templates/js/table_filters.html:56 msgid "Include stock in sublocations" msgstr "Bestand in Unterlagerorten einschließen" -#: templates/js/table_filters.html:53 +#: templates/js/table_filters.html:61 #, fuzzy #| msgid "Delete this Stock Item when stock is depleted" msgid "Show stock items which are depleted" msgstr "Objekt löschen wenn Lagerbestand aufgebraucht" -#: templates/js/table_filters.html:58 +#: templates/js/table_filters.html:66 msgid "Show items which are in stock" msgstr "" -#: templates/js/table_filters.html:62 +#: templates/js/table_filters.html:70 +#, fuzzy +#| msgid "Installed In" +msgid "Installed" +msgstr "Installiert in" + +#: templates/js/table_filters.html:71 +#, fuzzy +#| msgid "Is this item installed in another item?" +msgid "Show stock items which are installed in another item" +msgstr "Ist dieses Teil in einem anderen verbaut?" + +#: templates/js/table_filters.html:75 #, fuzzy #| msgid "Item assigned to customer?" msgid "Sent to customer" msgstr "Ist dieses Objekt einem Kunden zugeteilt?" -#: templates/js/table_filters.html:63 +#: templates/js/table_filters.html:76 msgid "Show items which have been assigned to a customer" msgstr "" -#: templates/js/table_filters.html:79 templates/js/table_filters.html:80 +#: templates/js/table_filters.html:96 templates/js/table_filters.html:97 msgid "Stock status" msgstr "Bestandsstatus" -#: templates/js/table_filters.html:109 +#: templates/js/table_filters.html:130 msgid "Build status" msgstr "Bau-Status" -#: templates/js/table_filters.html:121 templates/js/table_filters.html:134 +#: templates/js/table_filters.html:145 templates/js/table_filters.html:158 msgid "Order status" msgstr "Bestellstatus" -#: templates/js/table_filters.html:126 templates/js/table_filters.html:139 +#: templates/js/table_filters.html:150 templates/js/table_filters.html:163 #, fuzzy #| msgid "Cascading" msgid "Outstanding" msgstr "Kaskadierend" -#: templates/js/table_filters.html:149 +#: templates/js/table_filters.html:173 msgid "Include subcategories" msgstr "Unterkategorien einschließen" -#: templates/js/table_filters.html:150 +#: templates/js/table_filters.html:174 msgid "Include parts in subcategories" msgstr "Teile in Unterkategorien einschließen" -#: templates/js/table_filters.html:155 +#: templates/js/table_filters.html:179 msgid "Show active parts" msgstr "Aktive Teile anzeigen" -#: templates/js/table_filters.html:163 +#: templates/js/table_filters.html:187 msgid "Stock available" msgstr "Bestand verfügbar" -#: templates/js/table_filters.html:179 +#: templates/js/table_filters.html:203 msgid "Starred" msgstr "Favorit" -#: templates/js/table_filters.html:191 +#: templates/js/table_filters.html:215 msgid "Purchasable" msgstr "Käuflich" @@ -4639,6 +4847,21 @@ msgstr "Position löschen" msgid "Delete Stock" msgstr "Bestand löschen" +#~ msgid "Order Multiple" +#~ msgstr "Bestellvielfaches" + +#~ msgid "Base Price (Flat Fee)" +#~ msgstr "Grundpreis" + +#~ msgid "Price Breaks" +#~ msgstr "Preisstaffelung" + +#~ msgid "New Price Break" +#~ msgstr "Neue Preisstaffelung" + +#~ msgid "No price breaks have been added for this part" +#~ msgstr "Keine Preisstaffelung für dieses Teil" + #~ msgid "Part cannot be added to its own Bill of Materials" #~ msgstr "Teil kann nicht zu seiner eigenen Stückliste hinzugefügt werden" @@ -4654,9 +4877,6 @@ msgstr "Bestand löschen" #~ msgid "Used for Build" #~ msgstr "Verwendet für Bau" -#~ msgid "Installed in Stock Item" -#~ msgstr "In Lagerobjekt installiert" - #~ msgid "Count stock items" #~ msgstr "Lagerobjekte zählen" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index bee2462caa..d4a3d7ceb6 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: 2020-09-13 10:56+0000\n" +"POT-Creation-Date: 2020-09-28 12:03+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -46,34 +46,34 @@ msgstr "" msgid "Apply Theme" msgstr "" -#: InvenTree/helpers.py:336 order/models.py:187 order/models.py:261 +#: InvenTree/helpers.py:337 order/models.py:187 order/models.py:261 msgid "Invalid quantity provided" msgstr "" -#: InvenTree/helpers.py:339 +#: InvenTree/helpers.py:340 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:360 +#: InvenTree/helpers.py:361 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:364 InvenTree/helpers.py:367 InvenTree/helpers.py:370 +#: InvenTree/helpers.py:365 InvenTree/helpers.py:368 InvenTree/helpers.py:371 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:375 +#: InvenTree/helpers.py:376 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:383 +#: InvenTree/helpers.py:384 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:388 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -86,7 +86,7 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 templates/js/stock.html:686 +#: InvenTree/models.py:68 templates/js/stock.html:690 msgid "User" msgstr "" @@ -116,7 +116,7 @@ msgid "Polish" msgstr "" #: InvenTree/status_codes.py:94 InvenTree/status_codes.py:135 -#: InvenTree/status_codes.py:222 +#: InvenTree/status_codes.py:222 templates/js/table_filters.html:135 msgid "Pending" msgstr "" @@ -167,9 +167,9 @@ msgstr "" msgid "Rejected" msgstr "" -#: InvenTree/status_codes.py:223 build/templates/build/allocate.html:349 +#: InvenTree/status_codes.py:223 build/templates/build/allocate.html:358 #: order/templates/order/sales_order_detail.html:221 -#: part/templates/part/tabs.html:23 templates/js/build.html:122 +#: part/templates/part/tabs.html:23 templates/js/build.html:126 msgid "Allocated" msgstr "" @@ -278,18 +278,20 @@ msgstr "" msgid "Parent build to which this build is allocated" msgstr "" -#: build/models.py:90 build/templates/build/allocate.html:320 -#: build/templates/build/auto_allocate.html:18 +#: build/models.py:90 build/templates/build/allocate.html:329 +#: build/templates/build/auto_allocate.html:19 #: build/templates/build/build_base.html:70 #: build/templates/build/detail.html:22 order/models.py:501 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:147 -#: order/templates/order/receive_parts.html:19 part/models.py:239 +#: order/templates/order/receive_parts.html:19 part/models.py:241 #: part/templates/part/part_app_base.html:7 -#: part/templates/part/set_category.html:13 templates/js/barcode.html:336 -#: templates/js/bom.html:124 templates/js/build.html:43 -#: templates/js/company.html:137 templates/js/part.html:215 -#: templates/js/stock.html:429 +#: part/templates/part/set_category.html:13 +#: stock/templates/stock/item_installed.html:60 +#: templates/InvenTree/search.html:123 templates/js/barcode.html:336 +#: templates/js/bom.html:124 templates/js/build.html:47 +#: templates/js/company.html:137 templates/js/part.html:223 +#: templates/js/stock.html:421 msgid "Part" msgstr "" @@ -354,10 +356,11 @@ msgstr "" #: build/models.py:160 build/templates/build/tabs.html:14 company/models.py:310 #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15 #: order/templates/order/purchase_order_detail.html:202 -#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64 -#: stock/models.py:433 stock/models.py:1279 stock/templates/stock/tabs.html:26 +#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:67 +#: stock/forms.py:281 stock/forms.py:309 stock/models.py:433 +#: stock/models.py:1353 stock/templates/stock/tabs.html:26 #: templates/js/barcode.html:391 templates/js/bom.html:219 -#: templates/js/stock.html:116 templates/js/stock.html:530 +#: templates/js/stock.html:116 templates/js/stock.html:534 msgid "Notes" msgstr "" @@ -417,123 +420,134 @@ msgstr "" msgid "Unallocate" msgstr "" -#: build/templates/build/allocate.html:78 templates/stock_table.html:8 +#: build/templates/build/allocate.html:87 templates/stock_table.html:8 msgid "New Stock Item" msgstr "" -#: build/templates/build/allocate.html:161 +#: build/templates/build/allocate.html:88 stock/views.py:1327 +msgid "Create new Stock Item" +msgstr "" + +#: build/templates/build/allocate.html:170 #: order/templates/order/sales_order_detail.html:68 #: order/templates/order/sales_order_detail.html:150 stock/models.py:359 #: stock/templates/stock/item_base.html:148 msgid "Serial Number" msgstr "" -#: build/templates/build/allocate.html:163 -#: build/templates/build/auto_allocate.html:19 +#: build/templates/build/allocate.html:172 +#: build/templates/build/auto_allocate.html:20 #: build/templates/build/build_base.html:75 #: build/templates/build/detail.html:27 -#: company/templates/company/supplier_part_pricing.html:27 +#: company/templates/company/supplier_part_pricing.html:71 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:177 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:152 #: part/templates/part/allocation.html:16 #: part/templates/part/allocation.html:49 +#: part/templates/part/sale_prices.html:80 #: stock/templates/stock/item_base.html:26 #: stock/templates/stock/item_base.html:32 #: stock/templates/stock/item_base.html:154 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338 -#: templates/js/bom.html:162 templates/js/build.html:54 -#: templates/js/stock.html:677 +#: templates/js/bom.html:162 templates/js/build.html:58 +#: templates/js/stock.html:681 msgid "Quantity" msgstr "" -#: build/templates/build/allocate.html:177 -#: build/templates/build/auto_allocate.html:20 +#: build/templates/build/allocate.html:186 +#: build/templates/build/auto_allocate.html:21 stock/forms.py:279 #: stock/templates/stock/item_base.html:186 -#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337 +#: stock/templates/stock/stock_adjust.html:17 +#: templates/InvenTree/search.html:173 templates/js/barcode.html:337 #: templates/js/stock.html:512 msgid "Location" msgstr "" -#: build/templates/build/allocate.html:201 -#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:126 +#: build/templates/build/allocate.html:210 +#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:130 msgid "Edit stock allocation" msgstr "" -#: build/templates/build/allocate.html:202 -#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:127 +#: build/templates/build/allocate.html:211 +#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:131 msgid "Delete stock allocation" msgstr "" -#: build/templates/build/allocate.html:229 templates/js/bom.html:330 +#: build/templates/build/allocate.html:238 templates/js/bom.html:330 msgid "No BOM items found" msgstr "" -#: build/templates/build/allocate.html:328 +#: build/templates/build/allocate.html:337 #: company/templates/company/supplier_part_base.html:53 #: company/templates/company/supplier_part_detail.html:27 #: order/templates/order/purchase_order_detail.html:159 #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/js/bom.html:147 templates/js/company.html:56 -#: templates/js/order.html:159 templates/js/order.html:234 -#: templates/js/part.html:120 templates/js/part.html:271 -#: templates/js/part.html:452 templates/js/stock.html:444 -#: templates/js/stock.html:658 +#: stock/templates/stock/item_installed.html:83 +#: templates/InvenTree/search.html:137 templates/js/bom.html:147 +#: templates/js/company.html:56 templates/js/order.html:159 +#: templates/js/order.html:234 templates/js/part.html:120 +#: templates/js/part.html:279 templates/js/part.html:460 +#: templates/js/stock.html:444 templates/js/stock.html:662 msgid "Description" msgstr "" -#: build/templates/build/allocate.html:333 +#: build/templates/build/allocate.html:342 #: order/templates/order/purchase_order_detail.html:172 #: templates/js/bom.html:154 msgid "Reference" msgstr "" -#: build/templates/build/allocate.html:338 part/models.py:1332 -#: templates/js/part.html:456 templates/js/table_filters.html:100 +#: build/templates/build/allocate.html:347 part/models.py:1348 +#: templates/js/part.html:464 templates/js/table_filters.html:121 msgid "Required" msgstr "" -#: build/templates/build/allocate.html:347 +#: build/templates/build/allocate.html:356 msgid "Assigned" msgstr "" -#: build/templates/build/allocate.html:385 +#: build/templates/build/allocate.html:394 #: order/templates/order/sales_order_detail.html:271 msgid "Buy parts" msgstr "" -#: build/templates/build/allocate.html:389 +#: build/templates/build/allocate.html:398 #: order/templates/order/sales_order_detail.html:275 msgid "Build parts" msgstr "" -#: build/templates/build/allocate.html:392 +#: build/templates/build/allocate.html:401 msgid "Allocate stock" msgstr "" -#: build/templates/build/auto_allocate.html:8 +#: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" -#: build/templates/build/auto_allocate.html:9 +#: build/templates/build/auto_allocate.html:10 msgid "" "Stock Items are selected for automatic allocation if there is only a single " "stock item available." msgstr "" -#: build/templates/build/auto_allocate.html:10 +#: build/templates/build/auto_allocate.html:11 msgid "The following stock items will be allocated to the build:" msgstr "" -#: build/templates/build/auto_allocate.html:39 -msgid "No stock items found that can be allocated to this build" +#: build/templates/build/auto_allocate.html:40 +msgid "No stock items found that can be automatically allocated to this build" +msgstr "" + +#: build/templates/build/auto_allocate.html:42 +msgid "Stock items will have to be manually allocated" msgstr "" #: build/templates/build/build_base.html:8 #: build/templates/build/build_base.html:34 #: build/templates/build/complete.html:6 -#: stock/templates/stock/item_base.html:211 templates/js/build.html:35 +#: stock/templates/stock/item_base.html:211 templates/js/build.html:39 #: templates/navbar.html:20 msgid "Build" msgstr "" @@ -553,8 +567,10 @@ msgstr "" #: build/templates/build/build_base.html:80 #: build/templates/build/detail.html:42 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:264 templates/js/barcode.html:42 -#: templates/js/build.html:59 templates/js/order.html:164 +#: stock/templates/stock/item_base.html:264 +#: stock/templates/stock/item_installed.html:111 +#: templates/InvenTree/search.html:165 templates/js/barcode.html:42 +#: templates/js/build.html:63 templates/js/order.html:164 #: templates/js/order.html:239 templates/js/stock.html:499 msgid "Status" msgstr "" @@ -632,13 +648,15 @@ msgid "Stock can be taken from any available location." msgstr "" #: build/templates/build/detail.html:48 -#: stock/templates/stock/item_base.html:204 templates/js/stock.html:507 +#: stock/templates/stock/item_base.html:204 +#: stock/templates/stock/item_installed.html:119 templates/js/stock.html:507 +#: templates/js/table_filters.html:34 templates/js/table_filters.html:100 msgid "Batch" msgstr "" #: build/templates/build/detail.html:61 #: order/templates/order/order_base.html:93 -#: order/templates/order/sales_order_base.html:92 templates/js/build.html:67 +#: order/templates/order/sales_order_base.html:92 templates/js/build.html:71 msgid "Created" msgstr "" @@ -654,7 +672,7 @@ msgstr "" msgid "No" msgstr "" -#: build/templates/build/detail.html:80 templates/js/build.html:72 +#: build/templates/build/detail.html:80 templates/js/build.html:76 msgid "Completed" msgstr "" @@ -751,7 +769,7 @@ msgstr "" msgid "Invalid location selected" msgstr "" -#: build/views.py:296 stock/views.py:1387 +#: build/views.py:296 stock/views.py:1520 #, python-brace-format msgid "The following serial numbers already exist: ({sn})" msgstr "" @@ -796,43 +814,43 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: common/models.py:72 +#: common/models.py:75 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:74 +#: common/models.py:77 msgid "Settings value" msgstr "" -#: common/models.py:76 +#: common/models.py:79 msgid "Settings description" msgstr "" -#: common/models.py:89 +#: common/models.py:92 msgid "Key string must be unique" msgstr "" -#: common/models.py:110 +#: common/models.py:113 msgid "Currency Symbol e.g. $" msgstr "" -#: common/models.py:112 +#: common/models.py:115 msgid "Currency Suffix e.g. AUD" msgstr "" -#: common/models.py:114 +#: common/models.py:117 msgid "Currency Description" msgstr "" -#: common/models.py:116 +#: common/models.py:119 msgid "Currency Value" msgstr "" -#: common/models.py:118 +#: common/models.py:121 msgid "Use this currency as the base currency" msgstr "" -#: common/models.py:165 +#: common/models.py:204 msgid "Default" msgstr "" @@ -1012,13 +1030,13 @@ msgstr "" #: company/templates/company/detail_part.html:13 #: order/templates/order/purchase_order_detail.html:67 -#: part/templates/part/supplier.html:13 templates/js/stock.html:784 +#: part/templates/part/supplier.html:13 templates/js/stock.html:788 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_part.html:15 #: part/templates/part/category.html:104 part/templates/part/supplier.html:15 -#: templates/stock_table.html:10 +#: stock/templates/stock/item_installed.html:16 templates/stock_table.html:10 msgid "Options" msgstr "" @@ -1036,7 +1054,7 @@ msgid "Delete Parts" msgstr "" #: company/templates/company/detail_part.html:43 -#: part/templates/part/category.html:102 templates/js/stock.html:778 +#: part/templates/part/category.html:102 templates/js/stock.html:782 msgid "New Part" msgstr "" @@ -1109,7 +1127,7 @@ msgstr "" #: company/templates/company/tabs.html:22 #: order/templates/order/sales_orders.html:7 #: order/templates/order/sales_orders.html:12 -#: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:50 +#: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:53 #: templates/navbar.html:33 msgid "Sales Orders" msgstr "" @@ -1177,29 +1195,29 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:14 -msgid "Order Multiple" +#: company/templates/company/supplier_part_pricing.html:15 company/views.py:399 +#: part/templates/part/sale_prices.html:13 part/views.py:2108 +msgid "Add Price Break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:16 -msgid "Base Price (Flat Fee)" +#: company/templates/company/supplier_part_pricing.html:32 +#: part/templates/part/sale_prices.html:41 +msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 -msgid "Price Breaks" -msgstr "" - -#: company/templates/company/supplier_part_pricing.html:22 -msgid "New Price Break" -msgstr "" - -#: company/templates/company/supplier_part_pricing.html:28 -#: templates/js/bom.html:203 +#: company/templates/company/supplier_part_pricing.html:76 +#: part/templates/part/sale_prices.html:85 templates/js/bom.html:203 msgid "Price" msgstr "" -#: company/templates/company/supplier_part_pricing.html:48 -msgid "No price breaks have been added for this part" +#: company/templates/company/supplier_part_pricing.html:90 +#: part/templates/part/sale_prices.html:99 +msgid "Edit price break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 +#: part/templates/part/sale_prices.html:100 +msgid "Delete price break" msgstr "" #: company/templates/company/supplier_part_stock.html:11 @@ -1212,9 +1230,10 @@ msgstr "" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 -#: stock/templates/stock/location.html:12 templates/js/part.html:124 -#: templates/js/part.html:298 templates/js/stock.html:452 -#: templates/navbar.html:19 +#: stock/templates/stock/item_installed.html:91 +#: stock/templates/stock/location.html:12 templates/InvenTree/search.html:145 +#: templates/js/part.html:124 templates/js/part.html:306 +#: templates/js/stock.html:452 templates/navbar.html:19 msgid "Stock" msgstr "" @@ -1223,7 +1242,7 @@ msgid "Orders" msgstr "" #: company/templates/company/tabs.html:9 -#: order/templates/order/receive_parts.html:14 part/models.py:240 +#: order/templates/order/receive_parts.html:14 part/models.py:242 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:83 #: templates/navbar.html:18 templates/stats.html:8 templates/stats.html:17 msgid "Parts" @@ -1294,7 +1313,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:269 templates/js/stock.html:785 +#: company/views.py:269 templates/js/stock.html:789 msgid "Create new Supplier Part" msgstr "" @@ -1302,15 +1321,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:399 -msgid "Add Price Break" +#: company/views.py:404 part/views.py:2112 +msgid "Added new price break" msgstr "" -#: company/views.py:441 +#: company/views.py:441 part/views.py:2157 msgid "Edit Price Break" msgstr "" -#: company/views.py:456 +#: company/views.py:456 part/views.py:2171 msgid "Delete Price Break" msgstr "" @@ -1334,7 +1353,7 @@ msgstr "" msgid "Label template is enabled" msgstr "" -#: label/models.py:76 report/models.py:153 +#: label/models.py:76 report/models.py:162 msgid "Enabled" msgstr "" @@ -1403,8 +1422,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:185 order/models.py:259 part/views.py:1303 -#: stock/models.py:239 stock/models.py:682 +#: order/models.py:185 order/models.py:259 part/views.py:1304 +#: stock/models.py:239 stock/models.py:754 msgid "Quantity must be greater than zero" msgstr "" @@ -1572,7 +1591,7 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_tabs.html:8 order/templates/order/so_tabs.html:16 -#: part/templates/part/tabs.html:61 stock/templates/stock/tabs.html:32 +#: part/templates/part/tabs.html:64 stock/templates/stock/tabs.html:32 msgid "Attachments" msgstr "" @@ -1589,7 +1608,7 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:38 #: order/templates/order/purchase_order_detail.html:118 #: part/templates/part/category.html:153 part/templates/part/category.html:194 -#: templates/js/stock.html:790 +#: templates/js/stock.html:794 msgid "New Location" msgstr "" @@ -1630,7 +1649,7 @@ msgid "Select parts to receive against this order" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:132 templates/js/part.html:314 +#: part/templates/part/part_base.html:132 templates/js/part.html:322 msgid "On Order" msgstr "" @@ -1722,7 +1741,7 @@ msgstr "" msgid "Add Purchase Order Attachment" msgstr "" -#: order/views.py:102 order/views.py:149 part/views.py:85 stock/views.py:167 +#: order/views.py:102 order/views.py:149 part/views.py:86 stock/views.py:167 msgid "Added attachment" msgstr "" @@ -1884,322 +1903,322 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:55 stock/forms.py:250 +#: part/forms.py:57 stock/forms.py:250 msgid "File Format" msgstr "" -#: part/forms.py:55 stock/forms.py:250 +#: part/forms.py:57 stock/forms.py:250 msgid "Select output file format" msgstr "" -#: part/forms.py:57 +#: part/forms.py:59 msgid "Cascading" msgstr "" -#: part/forms.py:57 +#: part/forms.py:59 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:59 +#: part/forms.py:61 msgid "Levels" msgstr "" -#: part/forms.py:59 +#: part/forms.py:61 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:61 +#: part/forms.py:63 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:61 +#: part/forms.py:63 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:63 +#: part/forms.py:65 msgid "Include Stock Data" msgstr "" -#: part/forms.py:63 +#: part/forms.py:65 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:65 +#: part/forms.py:67 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:65 +#: part/forms.py:67 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:84 +#: part/forms.py:86 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:96 +#: part/forms.py:98 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:120 +#: part/forms.py:122 msgid "Select part category" msgstr "" -#: part/forms.py:134 +#: part/forms.py:136 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:135 +#: part/forms.py:137 msgid "Copy BOM" msgstr "" -#: part/forms.py:140 +#: part/forms.py:142 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:141 +#: part/forms.py:143 msgid "Copy Parameters" msgstr "" -#: part/forms.py:146 +#: part/forms.py:148 msgid "Confirm part creation" msgstr "" -#: part/forms.py:245 +#: part/forms.py:247 msgid "Input quantity for price calculation" msgstr "" -#: part/forms.py:248 +#: part/forms.py:250 msgid "Select currency for price calculation" msgstr "" -#: part/models.py:64 +#: part/models.py:66 msgid "Default location for parts in this category" msgstr "" -#: part/models.py:67 +#: part/models.py:69 msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:73 part/templates/part/part_app_base.html:9 +#: part/models.py:75 part/templates/part/part_app_base.html:9 msgid "Part Category" msgstr "" -#: part/models.py:74 part/templates/part/category.html:13 +#: part/models.py:76 part/templates/part/category.html:13 #: part/templates/part/category.html:78 templates/stats.html:12 msgid "Part Categories" msgstr "" -#: part/models.py:291 part/models.py:301 +#: part/models.py:293 part/models.py:303 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:381 +#: part/models.py:383 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:385 +#: part/models.py:387 msgid "Next available serial number is" msgstr "" -#: part/models.py:390 +#: part/models.py:392 msgid "Most recent serial number is" msgstr "" -#: part/models.py:468 +#: part/models.py:470 msgid "Part must be unique for name, IPN and revision" msgstr "" -#: part/models.py:483 part/templates/part/detail.html:19 +#: part/models.py:485 part/templates/part/detail.html:19 msgid "Part name" msgstr "" -#: part/models.py:487 +#: part/models.py:489 msgid "Is this part a template part?" msgstr "" -#: part/models.py:496 +#: part/models.py:498 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:498 +#: part/models.py:500 msgid "Part description" msgstr "" -#: part/models.py:500 +#: part/models.py:502 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:505 +#: part/models.py:507 msgid "Part category" msgstr "" -#: part/models.py:507 +#: part/models.py:509 msgid "Internal Part Number" msgstr "" -#: part/models.py:509 +#: part/models.py:511 msgid "Part revision or version number" msgstr "" -#: part/models.py:511 +#: part/models.py:513 msgid "Link to extenal URL" msgstr "" -#: part/models.py:523 +#: part/models.py:525 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:567 +#: part/models.py:569 msgid "Default supplier part" msgstr "" -#: part/models.py:570 +#: part/models.py:572 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:572 +#: part/models.py:574 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:574 +#: part/models.py:576 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:576 +#: part/models.py:578 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:578 +#: part/models.py:580 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:580 +#: part/models.py:582 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:582 +#: part/models.py:584 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:584 +#: part/models.py:586 msgid "Is this part active?" msgstr "" -#: part/models.py:586 +#: part/models.py:588 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:588 +#: part/models.py:590 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:590 +#: part/models.py:592 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:1284 +#: part/models.py:1300 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:1301 +#: part/models.py:1317 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:1320 templates/js/part.html:447 templates/js/stock.html:92 +#: part/models.py:1336 templates/js/part.html:455 templates/js/stock.html:92 msgid "Test Name" msgstr "" -#: part/models.py:1321 +#: part/models.py:1337 msgid "Enter a name for the test" msgstr "" -#: part/models.py:1326 +#: part/models.py:1342 msgid "Test Description" msgstr "" -#: part/models.py:1327 +#: part/models.py:1343 msgid "Enter description for this test" msgstr "" -#: part/models.py:1333 +#: part/models.py:1349 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:1338 templates/js/part.html:464 +#: part/models.py:1354 templates/js/part.html:472 msgid "Requires Value" msgstr "" -#: part/models.py:1339 +#: part/models.py:1355 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:1344 templates/js/part.html:471 +#: part/models.py:1360 templates/js/part.html:479 msgid "Requires Attachment" msgstr "" -#: part/models.py:1345 +#: part/models.py:1361 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:1378 +#: part/models.py:1394 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:1383 +#: part/models.py:1399 msgid "Parameter Name" msgstr "" -#: part/models.py:1385 +#: part/models.py:1401 msgid "Parameter Units" msgstr "" -#: part/models.py:1411 +#: part/models.py:1427 msgid "Parent Part" msgstr "" -#: part/models.py:1413 +#: part/models.py:1429 msgid "Parameter Template" msgstr "" -#: part/models.py:1415 +#: part/models.py:1431 msgid "Parameter Value" msgstr "" -#: part/models.py:1451 +#: part/models.py:1467 msgid "Select parent part" msgstr "" -#: part/models.py:1459 +#: part/models.py:1475 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:1465 +#: part/models.py:1481 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:1468 +#: part/models.py:1484 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:1471 +#: part/models.py:1487 msgid "BOM item reference" msgstr "" -#: part/models.py:1474 +#: part/models.py:1490 msgid "BOM item notes" msgstr "" -#: part/models.py:1476 +#: part/models.py:1492 msgid "BOM line checksum" msgstr "" -#: part/models.py:1540 part/views.py:1309 part/views.py:1361 +#: part/models.py:1556 part/views.py:1310 part/views.py:1362 #: stock/models.py:229 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:1549 +#: part/models.py:1565 msgid "BOM Item" msgstr "" @@ -2219,8 +2238,8 @@ msgstr "" #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:58 #: stock/templates/stock/item_base.html:226 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:108 -#: templates/js/stock.html:647 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112 +#: templates/js/stock.html:651 msgid "Stock Item" msgstr "" @@ -2261,7 +2280,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:46 part/views.py:1596 +#: part/templates/part/bom.html:46 part/views.py:1597 msgid "Export Bill of Materials" msgstr "" @@ -2345,7 +2364,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:18 part/views.py:1934 +#: part/templates/part/category.html:18 part/views.py:1935 msgid "Create new part category" msgstr "" @@ -2385,7 +2404,7 @@ msgstr "" msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:102 part/views.py:490 +#: part/templates/part/category.html:102 part/views.py:491 msgid "Create new part" msgstr "" @@ -2417,7 +2436,7 @@ msgstr "" msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:195 stock/views.py:1080 +#: part/templates/part/category.html:195 stock/views.py:1213 msgid "Create new Stock Location" msgstr "" @@ -2447,7 +2466,7 @@ msgid "Variant Of" msgstr "" #: part/templates/part/detail.html:70 part/templates/part/set_category.html:15 -#: templates/js/part.html:285 +#: templates/js/part.html:293 msgid "Category" msgstr "" @@ -2488,7 +2507,7 @@ msgid "Part is not a virtual part" msgstr "" #: part/templates/part/detail.html:145 stock/forms.py:244 -#: templates/js/table_filters.html:159 +#: templates/js/table_filters.html:183 msgid "Template" msgstr "" @@ -2500,7 +2519,7 @@ msgstr "" msgid "Part is not a template part" msgstr "" -#: part/templates/part/detail.html:154 templates/js/table_filters.html:171 +#: part/templates/part/detail.html:154 templates/js/table_filters.html:195 msgid "Assembly" msgstr "" @@ -2512,7 +2531,7 @@ msgstr "" msgid "Part cannot be assembled from other parts" msgstr "" -#: part/templates/part/detail.html:163 templates/js/table_filters.html:175 +#: part/templates/part/detail.html:163 templates/js/table_filters.html:199 msgid "Component" msgstr "" @@ -2524,7 +2543,7 @@ msgstr "" msgid "Part cannot be used in assemblies" msgstr "" -#: part/templates/part/detail.html:172 templates/js/table_filters.html:187 +#: part/templates/part/detail.html:172 templates/js/table_filters.html:211 msgid "Trackable" msgstr "" @@ -2544,7 +2563,7 @@ msgstr "" msgid "Part can be purchased from external suppliers" msgstr "" -#: part/templates/part/detail.html:190 templates/js/table_filters.html:183 +#: part/templates/part/detail.html:190 templates/js/table_filters.html:207 msgid "Salable" msgstr "" @@ -2556,7 +2575,7 @@ msgstr "" msgid "Part cannot be sold to customers" msgstr "" -#: part/templates/part/detail.html:199 templates/js/table_filters.html:154 +#: part/templates/part/detail.html:199 templates/js/table_filters.html:178 msgid "Active" msgstr "" @@ -2588,7 +2607,7 @@ msgstr "" msgid "New Parameter" msgstr "" -#: part/templates/part/params.html:21 stock/models.py:1266 +#: part/templates/part/params.html:21 stock/models.py:1340 #: templates/js/stock.html:112 msgid "Value" msgstr "" @@ -2618,7 +2637,7 @@ msgid "This part is a variant of" msgstr "" #: part/templates/part/part_base.html:33 templates/js/company.html:153 -#: templates/js/part.html:262 +#: templates/js/part.html:270 msgid "Inactive" msgstr "" @@ -2664,7 +2683,7 @@ msgstr "" msgid "Delete part" msgstr "" -#: part/templates/part/part_base.html:111 templates/js/table_filters.html:57 +#: part/templates/part/part_base.html:111 templates/js/table_filters.html:65 msgid "In Stock" msgstr "" @@ -2700,6 +2719,10 @@ msgstr "" msgid "Upload new image" msgstr "" +#: part/templates/part/sale_prices.html:9 part/templates/part/tabs.html:50 +msgid "Sale Price" +msgstr "" + #: part/templates/part/sales_orders.html:15 msgid "New sales order" msgstr "" @@ -2721,7 +2744,7 @@ msgid "Part Stock" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.html:193 -#: templates/js/part.html:322 +#: templates/js/part.html:330 msgid "No Stock" msgstr "" @@ -2761,7 +2784,7 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:270 +#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:270 msgid "Tests" msgstr "" @@ -2789,204 +2812,204 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/views.py:75 +#: part/views.py:76 msgid "Add part attachment" msgstr "" -#: part/views.py:124 templates/attachment_table.html:30 +#: part/views.py:125 templates/attachment_table.html:30 msgid "Edit attachment" msgstr "" -#: part/views.py:128 +#: part/views.py:129 msgid "Part attachment updated" msgstr "" -#: part/views.py:143 +#: part/views.py:144 msgid "Delete Part Attachment" msgstr "" -#: part/views.py:149 +#: part/views.py:150 msgid "Deleted part attachment" msgstr "" -#: part/views.py:158 +#: part/views.py:159 msgid "Create Test Template" msgstr "" -#: part/views.py:185 +#: part/views.py:186 msgid "Edit Test Template" msgstr "" -#: part/views.py:199 +#: part/views.py:200 msgid "Delete Test Template" msgstr "" -#: part/views.py:206 +#: part/views.py:207 msgid "Set Part Category" msgstr "" -#: part/views.py:254 +#: part/views.py:255 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:289 +#: part/views.py:290 msgid "Create Variant" msgstr "" -#: part/views.py:367 +#: part/views.py:368 msgid "Duplicate Part" msgstr "" -#: part/views.py:372 +#: part/views.py:373 msgid "Copied part" msgstr "" -#: part/views.py:495 +#: part/views.py:496 msgid "Created new part" msgstr "" -#: part/views.py:706 +#: part/views.py:707 msgid "Part QR Code" msgstr "" -#: part/views.py:723 +#: part/views.py:724 msgid "Upload Part Image" msgstr "" -#: part/views.py:728 part/views.py:763 +#: part/views.py:729 part/views.py:764 msgid "Updated part image" msgstr "" -#: part/views.py:737 +#: part/views.py:738 msgid "Select Part Image" msgstr "" -#: part/views.py:766 +#: part/views.py:767 msgid "Part image not found" msgstr "" -#: part/views.py:777 +#: part/views.py:778 msgid "Edit Part Properties" msgstr "" -#: part/views.py:799 +#: part/views.py:800 msgid "Validate BOM" msgstr "" -#: part/views.py:962 +#: part/views.py:963 msgid "No BOM file provided" msgstr "" -#: part/views.py:1312 +#: part/views.py:1313 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1337 part/views.py:1340 +#: part/views.py:1338 part/views.py:1341 msgid "Select valid part" msgstr "" -#: part/views.py:1346 +#: part/views.py:1347 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1384 +#: part/views.py:1385 msgid "Select a part" msgstr "" -#: part/views.py:1390 +#: part/views.py:1391 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1394 +#: part/views.py:1395 msgid "Specify quantity" msgstr "" -#: part/views.py:1644 +#: part/views.py:1645 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:1651 +#: part/views.py:1652 msgid "Part was deleted" msgstr "" -#: part/views.py:1660 +#: part/views.py:1661 msgid "Part Pricing" msgstr "" -#: part/views.py:1782 +#: part/views.py:1783 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:1790 +#: part/views.py:1791 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:1797 +#: part/views.py:1798 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:1805 +#: part/views.py:1806 msgid "Create Part Parameter" msgstr "" -#: part/views.py:1855 +#: part/views.py:1856 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:1869 +#: part/views.py:1870 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:1885 +#: part/views.py:1886 msgid "Edit Part Category" msgstr "" -#: part/views.py:1920 +#: part/views.py:1921 msgid "Delete Part Category" msgstr "" -#: part/views.py:1926 +#: part/views.py:1927 msgid "Part category was deleted" msgstr "" -#: part/views.py:1985 +#: part/views.py:1986 msgid "Create BOM item" msgstr "" -#: part/views.py:2051 +#: part/views.py:2052 msgid "Edit BOM item" msgstr "" -#: part/views.py:2099 +#: part/views.py:2100 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:138 +#: report/models.py:147 msgid "Template name" msgstr "" -#: report/models.py:144 +#: report/models.py:153 msgid "Report template file" msgstr "" -#: report/models.py:148 +#: report/models.py:157 msgid "Report template description" msgstr "" -#: report/models.py:152 +#: report/models.py:161 msgid "Report template is enabled" msgstr "" -#: report/models.py:159 +#: report/models.py:168 msgid "Part query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:218 +#: report/models.py:227 msgid "Report asset file" msgstr "" -#: report/models.py:221 +#: report/models.py:230 msgid "Asset file description" msgstr "" @@ -3002,15 +3025,47 @@ msgstr "" msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:285 +#: stock/forms.py:279 +msgid "Destination location for uninstalled items" +msgstr "" + +#: stock/forms.py:281 +msgid "Add transaction note (optional)" +msgstr "" + +#: stock/forms.py:283 +msgid "Confirm uninstall" +msgstr "" + +#: stock/forms.py:283 +msgid "Confirm removal of installed stock items" +msgstr "" + +#: stock/forms.py:307 +msgid "Destination" +msgstr "" + +#: stock/forms.py:307 msgid "Destination stock location" msgstr "" -#: stock/forms.py:291 +#: stock/forms.py:309 +msgid "Add note (required)" +msgstr "" + +#: stock/forms.py:313 stock/views.py:795 stock/views.py:992 +msgid "Confirm stock adjustment" +msgstr "" + +#: stock/forms.py:313 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:293 +#: stock/forms.py:315 +msgid "Set Default Location" +msgstr "" + +#: stock/forms.py:315 msgid "Set the destination as the default location for selected parts" msgstr "" @@ -3124,93 +3179,101 @@ msgstr "" msgid "Returned to location" msgstr "" -#: stock/models.py:673 +#: stock/models.py:626 +msgid "Installed in stock item" +msgstr "" + +#: stock/models.py:655 +msgid "Uninstalled into location" +msgstr "" + +#: stock/models.py:745 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:679 +#: stock/models.py:751 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:685 +#: stock/models.py:757 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:688 +#: stock/models.py:760 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:691 +#: stock/models.py:763 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:701 +#: stock/models.py:773 msgid "Serial numbers already exist: " msgstr "" -#: stock/models.py:726 +#: stock/models.py:798 msgid "Add serial number" msgstr "" -#: stock/models.py:729 +#: stock/models.py:801 #, python-brace-format msgid "Serialized {n} items" msgstr "" -#: stock/models.py:840 +#: stock/models.py:912 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1167 +#: stock/models.py:1241 msgid "Tracking entry title" msgstr "" -#: stock/models.py:1169 +#: stock/models.py:1243 msgid "Entry notes" msgstr "" -#: stock/models.py:1171 +#: stock/models.py:1245 msgid "Link to external page for further information" msgstr "" -#: stock/models.py:1231 +#: stock/models.py:1305 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1237 +#: stock/models.py:1311 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1254 +#: stock/models.py:1328 msgid "Test" msgstr "" -#: stock/models.py:1255 +#: stock/models.py:1329 msgid "Test name" msgstr "" -#: stock/models.py:1260 +#: stock/models.py:1334 msgid "Result" msgstr "" -#: stock/models.py:1261 templates/js/table_filters.html:90 +#: stock/models.py:1335 templates/js/table_filters.html:111 msgid "Test result" msgstr "" -#: stock/models.py:1267 +#: stock/models.py:1341 msgid "Test output value" msgstr "" -#: stock/models.py:1273 +#: stock/models.py:1347 msgid "Attachment" msgstr "" -#: stock/models.py:1274 +#: stock/models.py:1348 msgid "Test result attachment" msgstr "" -#: stock/models.py:1280 +#: stock/models.py:1354 msgid "Test notes" msgstr "" @@ -3360,6 +3423,31 @@ msgstr "" msgid "Are you sure you want to delete this stock item?" msgstr "" +#: stock/templates/stock/item_installed.html:10 +msgid "Installed Stock Items" +msgstr "" + +#: stock/templates/stock/item_installed.html:18 +msgid "Uninstall selected stock items" +msgstr "" + +#: stock/templates/stock/item_installed.html:18 +msgid "Uninstall" +msgstr "" + +#: stock/templates/stock/item_installed.html:35 +msgid "No stock items installed" +msgstr "" + +#: stock/templates/stock/item_installed.html:48 templates/js/part.html:209 +#: templates/js/stock.html:409 +msgid "Select" +msgstr "" + +#: stock/templates/stock/item_installed.html:131 +msgid "Uninstall item" +msgstr "" + #: stock/templates/stock/item_tests.html:10 stock/templates/stock/tabs.html:13 msgid "Test Data" msgstr "" @@ -3413,7 +3501,8 @@ msgid "Sublocations" msgstr "" #: stock/templates/stock/location.html:68 -#: stock/templates/stock/location.html:83 templates/stats.html:21 +#: stock/templates/stock/location.html:83 +#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21 #: templates/stats.html:30 msgid "Stock Items" msgstr "" @@ -3431,7 +3520,11 @@ msgstr "" msgid "Are you sure you want to delete this stock location?" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1053 +#: stock/templates/stock/stock_uninstall.html:8 +msgid "The following stock items will be uninstalled" +msgstr "" + +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1186 msgid "Convert Stock Item" msgstr "" @@ -3459,6 +3552,10 @@ msgstr "" msgid "Children" msgstr "" +#: stock/templates/stock/tabs.html:44 +msgid "Installed Items" +msgstr "" + #: stock/views.py:114 msgid "Edit Stock Location" msgstr "" @@ -3539,133 +3636,153 @@ msgstr "" msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:698 +#: stock/views.py:699 +msgid "Uninstall Stock Items" +msgstr "" + +#: stock/views.py:806 +msgid "Uninstalled stock items" +msgstr "" + +#: stock/views.py:831 msgid "Adjust Stock" msgstr "" -#: stock/views.py:807 +#: stock/views.py:940 msgid "Move Stock Items" msgstr "" -#: stock/views.py:808 +#: stock/views.py:941 msgid "Count Stock Items" msgstr "" -#: stock/views.py:809 +#: stock/views.py:942 msgid "Remove From Stock" msgstr "" -#: stock/views.py:810 +#: stock/views.py:943 msgid "Add Stock Items" msgstr "" -#: stock/views.py:811 +#: stock/views.py:944 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:839 +#: stock/views.py:972 msgid "Must enter integer value" msgstr "" -#: stock/views.py:844 +#: stock/views.py:977 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:851 +#: stock/views.py:984 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:859 -msgid "Confirm stock adjustment" -msgstr "" - -#: stock/views.py:930 +#: stock/views.py:1063 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:945 +#: stock/views.py:1078 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:958 +#: stock/views.py:1091 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:986 +#: stock/views.py:1119 msgid "No items were moved" msgstr "" -#: stock/views.py:989 +#: stock/views.py:1122 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1008 +#: stock/views.py:1141 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1020 +#: stock/views.py:1153 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1101 +#: stock/views.py:1234 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1194 -msgid "Create new Stock Item" -msgstr "" - -#: stock/views.py:1293 +#: stock/views.py:1426 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1359 +#: stock/views.py:1492 msgid "Invalid quantity" msgstr "" -#: stock/views.py:1362 +#: stock/views.py:1495 msgid "Quantity cannot be less than zero" msgstr "" -#: stock/views.py:1366 +#: stock/views.py:1499 msgid "Invalid part selection" msgstr "" -#: stock/views.py:1415 +#: stock/views.py:1548 #, python-brace-format msgid "Created {n} new stock items" msgstr "" -#: stock/views.py:1434 stock/views.py:1450 +#: stock/views.py:1567 stock/views.py:1583 msgid "Created new stock item" msgstr "" -#: stock/views.py:1469 +#: stock/views.py:1602 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1615 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1493 +#: stock/views.py:1626 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1510 +#: stock/views.py:1643 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1519 +#: stock/views.py:1652 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/InvenTree/bom_invalid.html:7 +msgid "BOM Waiting Validation" +msgstr "" + +#: templates/InvenTree/build_pending.html:7 +msgid "Pending Builds" +msgstr "" + +#: templates/InvenTree/latest_parts.html:7 +msgid "Latest Parts" +msgstr "" + +#: templates/InvenTree/po_outstanding.html:7 +msgid "Outstanding Purchase Orders" +msgstr "" + +#: templates/InvenTree/required_stock_build.html:7 +msgid "Require Stock To Complete Build" +msgstr "" + #: templates/InvenTree/search.html:7 templates/InvenTree/search.html:12 msgid "Search Results" msgstr "" @@ -3674,6 +3791,18 @@ msgstr "" msgid "No results found" msgstr "" +#: templates/InvenTree/search.html:181 templates/js/stock.html:521 +msgid "Shipped to customer" +msgstr "" + +#: templates/InvenTree/search.html:184 templates/js/stock.html:528 +msgid "No stock location set" +msgstr "" + +#: templates/InvenTree/searching.html:3 +msgid "Searching" +msgstr "" + #: templates/InvenTree/settings/part.html:9 msgid "Part Parameter Templates" msgstr "" @@ -3700,6 +3829,10 @@ msgid "" "\t" msgstr "" +#: templates/InvenTree/so_outstanding.html:7 +msgid "Outstanding Sales Orders" +msgstr "" + #: templates/InvenTree/starred_parts.html:7 msgid "Starred Parts" msgstr "" @@ -3841,7 +3974,7 @@ msgstr "" msgid "Open subassembly" msgstr "" -#: templates/js/bom.html:184 templates/js/build.html:115 +#: templates/js/bom.html:184 templates/js/build.html:119 msgid "Available" msgstr "" @@ -3869,11 +4002,11 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/build.html:19 +#: templates/js/build.html:23 msgid "No builds matching query" msgstr "" -#: templates/js/build.html:104 +#: templates/js/build.html:108 msgid "No parts allocated for" msgstr "" @@ -3893,11 +4026,11 @@ msgstr "" msgid "No supplier parts found" msgstr "" -#: templates/js/company.html:145 templates/js/part.html:240 +#: templates/js/company.html:145 templates/js/part.html:248 msgid "Template part" msgstr "" -#: templates/js/company.html:149 templates/js/part.html:244 +#: templates/js/company.html:149 templates/js/part.html:252 msgid "Assembled part" msgstr "" @@ -3909,7 +4042,7 @@ msgstr "" msgid "No purchase orders found" msgstr "" -#: templates/js/order.html:172 templates/js/stock.html:629 +#: templates/js/order.html:172 templates/js/stock.html:633 msgid "Date" msgstr "" @@ -3925,55 +4058,51 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.html:201 templates/js/stock.html:409 -msgid "Select" -msgstr "" - -#: templates/js/part.html:248 +#: templates/js/part.html:256 msgid "Starred part" msgstr "" -#: templates/js/part.html:252 +#: templates/js/part.html:260 msgid "Salable part" msgstr "" -#: templates/js/part.html:291 +#: templates/js/part.html:299 msgid "No category" msgstr "" -#: templates/js/part.html:309 templates/js/table_filters.html:167 +#: templates/js/part.html:317 templates/js/table_filters.html:191 msgid "Low stock" msgstr "" -#: templates/js/part.html:318 +#: templates/js/part.html:326 msgid "Building" msgstr "" -#: templates/js/part.html:337 +#: templates/js/part.html:345 msgid "No parts found" msgstr "" -#: templates/js/part.html:397 +#: templates/js/part.html:405 msgid "YES" msgstr "" -#: templates/js/part.html:399 +#: templates/js/part.html:407 msgid "NO" msgstr "" -#: templates/js/part.html:433 +#: templates/js/part.html:441 msgid "No test templates matching query" msgstr "" -#: templates/js/part.html:484 templates/js/stock.html:63 +#: templates/js/part.html:492 templates/js/stock.html:63 msgid "Edit test result" msgstr "" -#: templates/js/part.html:485 templates/js/stock.html:64 +#: templates/js/part.html:493 templates/js/stock.html:64 msgid "Delete test result" msgstr "" -#: templates/js/part.html:491 +#: templates/js/part.html:499 msgid "This test is defined for a parent part" msgstr "" @@ -4033,127 +4162,140 @@ msgstr "" msgid "Stock item is lost" msgstr "" -#: templates/js/stock.html:491 templates/js/table_filters.html:52 +#: templates/js/stock.html:491 templates/js/table_filters.html:60 msgid "Depleted" msgstr "" -#: templates/js/stock.html:520 -msgid "Shipped to customer" +#: templates/js/stock.html:516 +msgid "Installed in Stock Item " msgstr "" -#: templates/js/stock.html:523 -msgid "No stock location set" -msgstr "" - -#: templates/js/stock.html:695 +#: templates/js/stock.html:699 msgid "No user information" msgstr "" -#: templates/js/stock.html:779 +#: templates/js/stock.html:783 msgid "Create New Part" msgstr "" -#: templates/js/stock.html:791 +#: templates/js/stock.html:795 msgid "Create New Location" msgstr "" -#: templates/js/table_filters.html:19 templates/js/table_filters.html:67 +#: templates/js/table_filters.html:19 templates/js/table_filters.html:80 msgid "Is Serialized" msgstr "" -#: templates/js/table_filters.html:22 templates/js/table_filters.html:70 +#: templates/js/table_filters.html:22 templates/js/table_filters.html:87 msgid "Serial number GTE" msgstr "" -#: templates/js/table_filters.html:23 templates/js/table_filters.html:71 +#: templates/js/table_filters.html:23 templates/js/table_filters.html:88 msgid "Serial number greater than or equal to" msgstr "" -#: templates/js/table_filters.html:26 templates/js/table_filters.html:74 +#: templates/js/table_filters.html:26 templates/js/table_filters.html:91 msgid "Serial number LTE" msgstr "" -#: templates/js/table_filters.html:27 templates/js/table_filters.html:75 +#: templates/js/table_filters.html:27 templates/js/table_filters.html:92 msgid "Serial number less than or equal to" msgstr "" -#: templates/js/table_filters.html:37 +#: templates/js/table_filters.html:30 templates/js/table_filters.html:31 +#: templates/js/table_filters.html:83 templates/js/table_filters.html:84 +msgid "Serial number" +msgstr "" + +#: templates/js/table_filters.html:35 templates/js/table_filters.html:101 +msgid "Batch code" +msgstr "" + +#: templates/js/table_filters.html:45 msgid "Active parts" msgstr "" -#: templates/js/table_filters.html:38 +#: templates/js/table_filters.html:46 msgid "Show stock for active parts" msgstr "" -#: templates/js/table_filters.html:42 +#: templates/js/table_filters.html:50 msgid "Is allocated" msgstr "" -#: templates/js/table_filters.html:43 +#: templates/js/table_filters.html:51 msgid "Item has been alloacted" msgstr "" -#: templates/js/table_filters.html:47 +#: templates/js/table_filters.html:55 msgid "Include sublocations" msgstr "" -#: templates/js/table_filters.html:48 +#: templates/js/table_filters.html:56 msgid "Include stock in sublocations" msgstr "" -#: templates/js/table_filters.html:53 +#: templates/js/table_filters.html:61 msgid "Show stock items which are depleted" msgstr "" -#: templates/js/table_filters.html:58 +#: templates/js/table_filters.html:66 msgid "Show items which are in stock" msgstr "" -#: templates/js/table_filters.html:62 +#: templates/js/table_filters.html:70 +msgid "Installed" +msgstr "" + +#: templates/js/table_filters.html:71 +msgid "Show stock items which are installed in another item" +msgstr "" + +#: templates/js/table_filters.html:75 msgid "Sent to customer" msgstr "" -#: templates/js/table_filters.html:63 +#: templates/js/table_filters.html:76 msgid "Show items which have been assigned to a customer" msgstr "" -#: templates/js/table_filters.html:79 templates/js/table_filters.html:80 +#: templates/js/table_filters.html:96 templates/js/table_filters.html:97 msgid "Stock status" msgstr "" -#: templates/js/table_filters.html:109 +#: templates/js/table_filters.html:130 msgid "Build status" msgstr "" -#: templates/js/table_filters.html:121 templates/js/table_filters.html:134 +#: templates/js/table_filters.html:145 templates/js/table_filters.html:158 msgid "Order status" msgstr "" -#: templates/js/table_filters.html:126 templates/js/table_filters.html:139 +#: templates/js/table_filters.html:150 templates/js/table_filters.html:163 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.html:149 +#: templates/js/table_filters.html:173 msgid "Include subcategories" msgstr "" -#: templates/js/table_filters.html:150 +#: templates/js/table_filters.html:174 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.html:155 +#: templates/js/table_filters.html:179 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.html:163 +#: templates/js/table_filters.html:187 msgid "Stock available" msgstr "" -#: templates/js/table_filters.html:179 +#: templates/js/table_filters.html:203 msgid "Starred" msgstr "" -#: templates/js/table_filters.html:191 +#: templates/js/table_filters.html:215 msgid "Purchasable" msgstr "" diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po index bee2462caa..d4a3d7ceb6 100644 --- a/InvenTree/locale/es/LC_MESSAGES/django.po +++ b/InvenTree/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-09-13 10:56+0000\n" +"POT-Creation-Date: 2020-09-28 12:03+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -46,34 +46,34 @@ msgstr "" msgid "Apply Theme" msgstr "" -#: InvenTree/helpers.py:336 order/models.py:187 order/models.py:261 +#: InvenTree/helpers.py:337 order/models.py:187 order/models.py:261 msgid "Invalid quantity provided" msgstr "" -#: InvenTree/helpers.py:339 +#: InvenTree/helpers.py:340 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:360 +#: InvenTree/helpers.py:361 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:364 InvenTree/helpers.py:367 InvenTree/helpers.py:370 +#: InvenTree/helpers.py:365 InvenTree/helpers.py:368 InvenTree/helpers.py:371 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:375 +#: InvenTree/helpers.py:376 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:383 +#: InvenTree/helpers.py:384 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:388 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" @@ -86,7 +86,7 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 templates/js/stock.html:686 +#: InvenTree/models.py:68 templates/js/stock.html:690 msgid "User" msgstr "" @@ -116,7 +116,7 @@ msgid "Polish" msgstr "" #: InvenTree/status_codes.py:94 InvenTree/status_codes.py:135 -#: InvenTree/status_codes.py:222 +#: InvenTree/status_codes.py:222 templates/js/table_filters.html:135 msgid "Pending" msgstr "" @@ -167,9 +167,9 @@ msgstr "" msgid "Rejected" msgstr "" -#: InvenTree/status_codes.py:223 build/templates/build/allocate.html:349 +#: InvenTree/status_codes.py:223 build/templates/build/allocate.html:358 #: order/templates/order/sales_order_detail.html:221 -#: part/templates/part/tabs.html:23 templates/js/build.html:122 +#: part/templates/part/tabs.html:23 templates/js/build.html:126 msgid "Allocated" msgstr "" @@ -278,18 +278,20 @@ msgstr "" msgid "Parent build to which this build is allocated" msgstr "" -#: build/models.py:90 build/templates/build/allocate.html:320 -#: build/templates/build/auto_allocate.html:18 +#: build/models.py:90 build/templates/build/allocate.html:329 +#: build/templates/build/auto_allocate.html:19 #: build/templates/build/build_base.html:70 #: build/templates/build/detail.html:22 order/models.py:501 #: order/templates/order/order_wizard/select_parts.html:30 #: order/templates/order/purchase_order_detail.html:147 -#: order/templates/order/receive_parts.html:19 part/models.py:239 +#: order/templates/order/receive_parts.html:19 part/models.py:241 #: part/templates/part/part_app_base.html:7 -#: part/templates/part/set_category.html:13 templates/js/barcode.html:336 -#: templates/js/bom.html:124 templates/js/build.html:43 -#: templates/js/company.html:137 templates/js/part.html:215 -#: templates/js/stock.html:429 +#: part/templates/part/set_category.html:13 +#: stock/templates/stock/item_installed.html:60 +#: templates/InvenTree/search.html:123 templates/js/barcode.html:336 +#: templates/js/bom.html:124 templates/js/build.html:47 +#: templates/js/company.html:137 templates/js/part.html:223 +#: templates/js/stock.html:421 msgid "Part" msgstr "" @@ -354,10 +356,11 @@ msgstr "" #: build/models.py:160 build/templates/build/tabs.html:14 company/models.py:310 #: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15 #: order/templates/order/purchase_order_detail.html:202 -#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64 -#: stock/models.py:433 stock/models.py:1279 stock/templates/stock/tabs.html:26 +#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:67 +#: stock/forms.py:281 stock/forms.py:309 stock/models.py:433 +#: stock/models.py:1353 stock/templates/stock/tabs.html:26 #: templates/js/barcode.html:391 templates/js/bom.html:219 -#: templates/js/stock.html:116 templates/js/stock.html:530 +#: templates/js/stock.html:116 templates/js/stock.html:534 msgid "Notes" msgstr "" @@ -417,123 +420,134 @@ msgstr "" msgid "Unallocate" msgstr "" -#: build/templates/build/allocate.html:78 templates/stock_table.html:8 +#: build/templates/build/allocate.html:87 templates/stock_table.html:8 msgid "New Stock Item" msgstr "" -#: build/templates/build/allocate.html:161 +#: build/templates/build/allocate.html:88 stock/views.py:1327 +msgid "Create new Stock Item" +msgstr "" + +#: build/templates/build/allocate.html:170 #: order/templates/order/sales_order_detail.html:68 #: order/templates/order/sales_order_detail.html:150 stock/models.py:359 #: stock/templates/stock/item_base.html:148 msgid "Serial Number" msgstr "" -#: build/templates/build/allocate.html:163 -#: build/templates/build/auto_allocate.html:19 +#: build/templates/build/allocate.html:172 +#: build/templates/build/auto_allocate.html:20 #: build/templates/build/build_base.html:75 #: build/templates/build/detail.html:27 -#: company/templates/company/supplier_part_pricing.html:27 +#: company/templates/company/supplier_part_pricing.html:71 #: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:177 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:152 #: part/templates/part/allocation.html:16 #: part/templates/part/allocation.html:49 +#: part/templates/part/sale_prices.html:80 #: stock/templates/stock/item_base.html:26 #: stock/templates/stock/item_base.html:32 #: stock/templates/stock/item_base.html:154 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338 -#: templates/js/bom.html:162 templates/js/build.html:54 -#: templates/js/stock.html:677 +#: templates/js/bom.html:162 templates/js/build.html:58 +#: templates/js/stock.html:681 msgid "Quantity" msgstr "" -#: build/templates/build/allocate.html:177 -#: build/templates/build/auto_allocate.html:20 +#: build/templates/build/allocate.html:186 +#: build/templates/build/auto_allocate.html:21 stock/forms.py:279 #: stock/templates/stock/item_base.html:186 -#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337 +#: stock/templates/stock/stock_adjust.html:17 +#: templates/InvenTree/search.html:173 templates/js/barcode.html:337 #: templates/js/stock.html:512 msgid "Location" msgstr "" -#: build/templates/build/allocate.html:201 -#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:126 +#: build/templates/build/allocate.html:210 +#: order/templates/order/sales_order_detail.html:92 templates/js/build.html:130 msgid "Edit stock allocation" msgstr "" -#: build/templates/build/allocate.html:202 -#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:127 +#: build/templates/build/allocate.html:211 +#: order/templates/order/sales_order_detail.html:93 templates/js/build.html:131 msgid "Delete stock allocation" msgstr "" -#: build/templates/build/allocate.html:229 templates/js/bom.html:330 +#: build/templates/build/allocate.html:238 templates/js/bom.html:330 msgid "No BOM items found" msgstr "" -#: build/templates/build/allocate.html:328 +#: build/templates/build/allocate.html:337 #: company/templates/company/supplier_part_base.html:53 #: company/templates/company/supplier_part_detail.html:27 #: order/templates/order/purchase_order_detail.html:159 #: part/templates/part/detail.html:51 part/templates/part/set_category.html:14 -#: templates/js/bom.html:147 templates/js/company.html:56 -#: templates/js/order.html:159 templates/js/order.html:234 -#: templates/js/part.html:120 templates/js/part.html:271 -#: templates/js/part.html:452 templates/js/stock.html:444 -#: templates/js/stock.html:658 +#: stock/templates/stock/item_installed.html:83 +#: templates/InvenTree/search.html:137 templates/js/bom.html:147 +#: templates/js/company.html:56 templates/js/order.html:159 +#: templates/js/order.html:234 templates/js/part.html:120 +#: templates/js/part.html:279 templates/js/part.html:460 +#: templates/js/stock.html:444 templates/js/stock.html:662 msgid "Description" msgstr "" -#: build/templates/build/allocate.html:333 +#: build/templates/build/allocate.html:342 #: order/templates/order/purchase_order_detail.html:172 #: templates/js/bom.html:154 msgid "Reference" msgstr "" -#: build/templates/build/allocate.html:338 part/models.py:1332 -#: templates/js/part.html:456 templates/js/table_filters.html:100 +#: build/templates/build/allocate.html:347 part/models.py:1348 +#: templates/js/part.html:464 templates/js/table_filters.html:121 msgid "Required" msgstr "" -#: build/templates/build/allocate.html:347 +#: build/templates/build/allocate.html:356 msgid "Assigned" msgstr "" -#: build/templates/build/allocate.html:385 +#: build/templates/build/allocate.html:394 #: order/templates/order/sales_order_detail.html:271 msgid "Buy parts" msgstr "" -#: build/templates/build/allocate.html:389 +#: build/templates/build/allocate.html:398 #: order/templates/order/sales_order_detail.html:275 msgid "Build parts" msgstr "" -#: build/templates/build/allocate.html:392 +#: build/templates/build/allocate.html:401 msgid "Allocate stock" msgstr "" -#: build/templates/build/auto_allocate.html:8 +#: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" -#: build/templates/build/auto_allocate.html:9 +#: build/templates/build/auto_allocate.html:10 msgid "" "Stock Items are selected for automatic allocation if there is only a single " "stock item available." msgstr "" -#: build/templates/build/auto_allocate.html:10 +#: build/templates/build/auto_allocate.html:11 msgid "The following stock items will be allocated to the build:" msgstr "" -#: build/templates/build/auto_allocate.html:39 -msgid "No stock items found that can be allocated to this build" +#: build/templates/build/auto_allocate.html:40 +msgid "No stock items found that can be automatically allocated to this build" +msgstr "" + +#: build/templates/build/auto_allocate.html:42 +msgid "Stock items will have to be manually allocated" msgstr "" #: build/templates/build/build_base.html:8 #: build/templates/build/build_base.html:34 #: build/templates/build/complete.html:6 -#: stock/templates/stock/item_base.html:211 templates/js/build.html:35 +#: stock/templates/stock/item_base.html:211 templates/js/build.html:39 #: templates/navbar.html:20 msgid "Build" msgstr "" @@ -553,8 +567,10 @@ msgstr "" #: build/templates/build/build_base.html:80 #: build/templates/build/detail.html:42 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:264 templates/js/barcode.html:42 -#: templates/js/build.html:59 templates/js/order.html:164 +#: stock/templates/stock/item_base.html:264 +#: stock/templates/stock/item_installed.html:111 +#: templates/InvenTree/search.html:165 templates/js/barcode.html:42 +#: templates/js/build.html:63 templates/js/order.html:164 #: templates/js/order.html:239 templates/js/stock.html:499 msgid "Status" msgstr "" @@ -632,13 +648,15 @@ msgid "Stock can be taken from any available location." msgstr "" #: build/templates/build/detail.html:48 -#: stock/templates/stock/item_base.html:204 templates/js/stock.html:507 +#: stock/templates/stock/item_base.html:204 +#: stock/templates/stock/item_installed.html:119 templates/js/stock.html:507 +#: templates/js/table_filters.html:34 templates/js/table_filters.html:100 msgid "Batch" msgstr "" #: build/templates/build/detail.html:61 #: order/templates/order/order_base.html:93 -#: order/templates/order/sales_order_base.html:92 templates/js/build.html:67 +#: order/templates/order/sales_order_base.html:92 templates/js/build.html:71 msgid "Created" msgstr "" @@ -654,7 +672,7 @@ msgstr "" msgid "No" msgstr "" -#: build/templates/build/detail.html:80 templates/js/build.html:72 +#: build/templates/build/detail.html:80 templates/js/build.html:76 msgid "Completed" msgstr "" @@ -751,7 +769,7 @@ msgstr "" msgid "Invalid location selected" msgstr "" -#: build/views.py:296 stock/views.py:1387 +#: build/views.py:296 stock/views.py:1520 #, python-brace-format msgid "The following serial numbers already exist: ({sn})" msgstr "" @@ -796,43 +814,43 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: common/models.py:72 +#: common/models.py:75 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:74 +#: common/models.py:77 msgid "Settings value" msgstr "" -#: common/models.py:76 +#: common/models.py:79 msgid "Settings description" msgstr "" -#: common/models.py:89 +#: common/models.py:92 msgid "Key string must be unique" msgstr "" -#: common/models.py:110 +#: common/models.py:113 msgid "Currency Symbol e.g. $" msgstr "" -#: common/models.py:112 +#: common/models.py:115 msgid "Currency Suffix e.g. AUD" msgstr "" -#: common/models.py:114 +#: common/models.py:117 msgid "Currency Description" msgstr "" -#: common/models.py:116 +#: common/models.py:119 msgid "Currency Value" msgstr "" -#: common/models.py:118 +#: common/models.py:121 msgid "Use this currency as the base currency" msgstr "" -#: common/models.py:165 +#: common/models.py:204 msgid "Default" msgstr "" @@ -1012,13 +1030,13 @@ msgstr "" #: company/templates/company/detail_part.html:13 #: order/templates/order/purchase_order_detail.html:67 -#: part/templates/part/supplier.html:13 templates/js/stock.html:784 +#: part/templates/part/supplier.html:13 templates/js/stock.html:788 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_part.html:15 #: part/templates/part/category.html:104 part/templates/part/supplier.html:15 -#: templates/stock_table.html:10 +#: stock/templates/stock/item_installed.html:16 templates/stock_table.html:10 msgid "Options" msgstr "" @@ -1036,7 +1054,7 @@ msgid "Delete Parts" msgstr "" #: company/templates/company/detail_part.html:43 -#: part/templates/part/category.html:102 templates/js/stock.html:778 +#: part/templates/part/category.html:102 templates/js/stock.html:782 msgid "New Part" msgstr "" @@ -1109,7 +1127,7 @@ msgstr "" #: company/templates/company/tabs.html:22 #: order/templates/order/sales_orders.html:7 #: order/templates/order/sales_orders.html:12 -#: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:50 +#: part/templates/part/sales_orders.html:9 part/templates/part/tabs.html:53 #: templates/navbar.html:33 msgid "Sales Orders" msgstr "" @@ -1177,29 +1195,29 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:14 -msgid "Order Multiple" +#: company/templates/company/supplier_part_pricing.html:15 company/views.py:399 +#: part/templates/part/sale_prices.html:13 part/views.py:2108 +msgid "Add Price Break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:16 -msgid "Base Price (Flat Fee)" +#: company/templates/company/supplier_part_pricing.html:32 +#: part/templates/part/sale_prices.html:41 +msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 -msgid "Price Breaks" -msgstr "" - -#: company/templates/company/supplier_part_pricing.html:22 -msgid "New Price Break" -msgstr "" - -#: company/templates/company/supplier_part_pricing.html:28 -#: templates/js/bom.html:203 +#: company/templates/company/supplier_part_pricing.html:76 +#: part/templates/part/sale_prices.html:85 templates/js/bom.html:203 msgid "Price" msgstr "" -#: company/templates/company/supplier_part_pricing.html:48 -msgid "No price breaks have been added for this part" +#: company/templates/company/supplier_part_pricing.html:90 +#: part/templates/part/sale_prices.html:99 +msgid "Edit price break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 +#: part/templates/part/sale_prices.html:100 +msgid "Delete price break" msgstr "" #: company/templates/company/supplier_part_stock.html:11 @@ -1212,9 +1230,10 @@ msgstr "" #: company/templates/company/supplier_part_tabs.html:8 #: company/templates/company/tabs.html:12 part/templates/part/tabs.html:18 -#: stock/templates/stock/location.html:12 templates/js/part.html:124 -#: templates/js/part.html:298 templates/js/stock.html:452 -#: templates/navbar.html:19 +#: stock/templates/stock/item_installed.html:91 +#: stock/templates/stock/location.html:12 templates/InvenTree/search.html:145 +#: templates/js/part.html:124 templates/js/part.html:306 +#: templates/js/stock.html:452 templates/navbar.html:19 msgid "Stock" msgstr "" @@ -1223,7 +1242,7 @@ msgid "Orders" msgstr "" #: company/templates/company/tabs.html:9 -#: order/templates/order/receive_parts.html:14 part/models.py:240 +#: order/templates/order/receive_parts.html:14 part/models.py:242 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:83 #: templates/navbar.html:18 templates/stats.html:8 templates/stats.html:17 msgid "Parts" @@ -1294,7 +1313,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:269 templates/js/stock.html:785 +#: company/views.py:269 templates/js/stock.html:789 msgid "Create new Supplier Part" msgstr "" @@ -1302,15 +1321,15 @@ msgstr "" msgid "Delete Supplier Part" msgstr "" -#: company/views.py:399 -msgid "Add Price Break" +#: company/views.py:404 part/views.py:2112 +msgid "Added new price break" msgstr "" -#: company/views.py:441 +#: company/views.py:441 part/views.py:2157 msgid "Edit Price Break" msgstr "" -#: company/views.py:456 +#: company/views.py:456 part/views.py:2171 msgid "Delete Price Break" msgstr "" @@ -1334,7 +1353,7 @@ msgstr "" msgid "Label template is enabled" msgstr "" -#: label/models.py:76 report/models.py:153 +#: label/models.py:76 report/models.py:162 msgid "Enabled" msgstr "" @@ -1403,8 +1422,8 @@ msgstr "" msgid "Date order was completed" msgstr "" -#: order/models.py:185 order/models.py:259 part/views.py:1303 -#: stock/models.py:239 stock/models.py:682 +#: order/models.py:185 order/models.py:259 part/views.py:1304 +#: stock/models.py:239 stock/models.py:754 msgid "Quantity must be greater than zero" msgstr "" @@ -1572,7 +1591,7 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_tabs.html:8 order/templates/order/so_tabs.html:16 -#: part/templates/part/tabs.html:61 stock/templates/stock/tabs.html:32 +#: part/templates/part/tabs.html:64 stock/templates/stock/tabs.html:32 msgid "Attachments" msgstr "" @@ -1589,7 +1608,7 @@ msgstr "" #: order/templates/order/purchase_order_detail.html:38 #: order/templates/order/purchase_order_detail.html:118 #: part/templates/part/category.html:153 part/templates/part/category.html:194 -#: templates/js/stock.html:790 +#: templates/js/stock.html:794 msgid "New Location" msgstr "" @@ -1630,7 +1649,7 @@ msgid "Select parts to receive against this order" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:132 templates/js/part.html:314 +#: part/templates/part/part_base.html:132 templates/js/part.html:322 msgid "On Order" msgstr "" @@ -1722,7 +1741,7 @@ msgstr "" msgid "Add Purchase Order Attachment" msgstr "" -#: order/views.py:102 order/views.py:149 part/views.py:85 stock/views.py:167 +#: order/views.py:102 order/views.py:149 part/views.py:86 stock/views.py:167 msgid "Added attachment" msgstr "" @@ -1884,322 +1903,322 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:55 stock/forms.py:250 +#: part/forms.py:57 stock/forms.py:250 msgid "File Format" msgstr "" -#: part/forms.py:55 stock/forms.py:250 +#: part/forms.py:57 stock/forms.py:250 msgid "Select output file format" msgstr "" -#: part/forms.py:57 +#: part/forms.py:59 msgid "Cascading" msgstr "" -#: part/forms.py:57 +#: part/forms.py:59 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:59 +#: part/forms.py:61 msgid "Levels" msgstr "" -#: part/forms.py:59 +#: part/forms.py:61 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:61 +#: part/forms.py:63 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:61 +#: part/forms.py:63 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:63 +#: part/forms.py:65 msgid "Include Stock Data" msgstr "" -#: part/forms.py:63 +#: part/forms.py:65 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:65 +#: part/forms.py:67 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:65 +#: part/forms.py:67 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:84 +#: part/forms.py:86 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:96 +#: part/forms.py:98 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:120 +#: part/forms.py:122 msgid "Select part category" msgstr "" -#: part/forms.py:134 +#: part/forms.py:136 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:135 +#: part/forms.py:137 msgid "Copy BOM" msgstr "" -#: part/forms.py:140 +#: part/forms.py:142 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:141 +#: part/forms.py:143 msgid "Copy Parameters" msgstr "" -#: part/forms.py:146 +#: part/forms.py:148 msgid "Confirm part creation" msgstr "" -#: part/forms.py:245 +#: part/forms.py:247 msgid "Input quantity for price calculation" msgstr "" -#: part/forms.py:248 +#: part/forms.py:250 msgid "Select currency for price calculation" msgstr "" -#: part/models.py:64 +#: part/models.py:66 msgid "Default location for parts in this category" msgstr "" -#: part/models.py:67 +#: part/models.py:69 msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:73 part/templates/part/part_app_base.html:9 +#: part/models.py:75 part/templates/part/part_app_base.html:9 msgid "Part Category" msgstr "" -#: part/models.py:74 part/templates/part/category.html:13 +#: part/models.py:76 part/templates/part/category.html:13 #: part/templates/part/category.html:78 templates/stats.html:12 msgid "Part Categories" msgstr "" -#: part/models.py:291 part/models.py:301 +#: part/models.py:293 part/models.py:303 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:381 +#: part/models.py:383 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:385 +#: part/models.py:387 msgid "Next available serial number is" msgstr "" -#: part/models.py:390 +#: part/models.py:392 msgid "Most recent serial number is" msgstr "" -#: part/models.py:468 +#: part/models.py:470 msgid "Part must be unique for name, IPN and revision" msgstr "" -#: part/models.py:483 part/templates/part/detail.html:19 +#: part/models.py:485 part/templates/part/detail.html:19 msgid "Part name" msgstr "" -#: part/models.py:487 +#: part/models.py:489 msgid "Is this part a template part?" msgstr "" -#: part/models.py:496 +#: part/models.py:498 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:498 +#: part/models.py:500 msgid "Part description" msgstr "" -#: part/models.py:500 +#: part/models.py:502 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:505 +#: part/models.py:507 msgid "Part category" msgstr "" -#: part/models.py:507 +#: part/models.py:509 msgid "Internal Part Number" msgstr "" -#: part/models.py:509 +#: part/models.py:511 msgid "Part revision or version number" msgstr "" -#: part/models.py:511 +#: part/models.py:513 msgid "Link to extenal URL" msgstr "" -#: part/models.py:523 +#: part/models.py:525 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:567 +#: part/models.py:569 msgid "Default supplier part" msgstr "" -#: part/models.py:570 +#: part/models.py:572 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:572 +#: part/models.py:574 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:574 +#: part/models.py:576 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:576 +#: part/models.py:578 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:578 +#: part/models.py:580 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:580 +#: part/models.py:582 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:582 +#: part/models.py:584 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:584 +#: part/models.py:586 msgid "Is this part active?" msgstr "" -#: part/models.py:586 +#: part/models.py:588 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:588 +#: part/models.py:590 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:590 +#: part/models.py:592 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:1284 +#: part/models.py:1300 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:1301 +#: part/models.py:1317 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:1320 templates/js/part.html:447 templates/js/stock.html:92 +#: part/models.py:1336 templates/js/part.html:455 templates/js/stock.html:92 msgid "Test Name" msgstr "" -#: part/models.py:1321 +#: part/models.py:1337 msgid "Enter a name for the test" msgstr "" -#: part/models.py:1326 +#: part/models.py:1342 msgid "Test Description" msgstr "" -#: part/models.py:1327 +#: part/models.py:1343 msgid "Enter description for this test" msgstr "" -#: part/models.py:1333 +#: part/models.py:1349 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:1338 templates/js/part.html:464 +#: part/models.py:1354 templates/js/part.html:472 msgid "Requires Value" msgstr "" -#: part/models.py:1339 +#: part/models.py:1355 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:1344 templates/js/part.html:471 +#: part/models.py:1360 templates/js/part.html:479 msgid "Requires Attachment" msgstr "" -#: part/models.py:1345 +#: part/models.py:1361 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:1378 +#: part/models.py:1394 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:1383 +#: part/models.py:1399 msgid "Parameter Name" msgstr "" -#: part/models.py:1385 +#: part/models.py:1401 msgid "Parameter Units" msgstr "" -#: part/models.py:1411 +#: part/models.py:1427 msgid "Parent Part" msgstr "" -#: part/models.py:1413 +#: part/models.py:1429 msgid "Parameter Template" msgstr "" -#: part/models.py:1415 +#: part/models.py:1431 msgid "Parameter Value" msgstr "" -#: part/models.py:1451 +#: part/models.py:1467 msgid "Select parent part" msgstr "" -#: part/models.py:1459 +#: part/models.py:1475 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:1465 +#: part/models.py:1481 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:1468 +#: part/models.py:1484 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:1471 +#: part/models.py:1487 msgid "BOM item reference" msgstr "" -#: part/models.py:1474 +#: part/models.py:1490 msgid "BOM item notes" msgstr "" -#: part/models.py:1476 +#: part/models.py:1492 msgid "BOM line checksum" msgstr "" -#: part/models.py:1540 part/views.py:1309 part/views.py:1361 +#: part/models.py:1556 part/views.py:1310 part/views.py:1362 #: stock/models.py:229 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:1549 +#: part/models.py:1565 msgid "BOM Item" msgstr "" @@ -2219,8 +2238,8 @@ msgstr "" #: stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:58 #: stock/templates/stock/item_base.html:226 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:108 -#: templates/js/stock.html:647 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:112 +#: templates/js/stock.html:651 msgid "Stock Item" msgstr "" @@ -2261,7 +2280,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:46 part/views.py:1596 +#: part/templates/part/bom.html:46 part/views.py:1597 msgid "Export Bill of Materials" msgstr "" @@ -2345,7 +2364,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:18 part/views.py:1934 +#: part/templates/part/category.html:18 part/views.py:1935 msgid "Create new part category" msgstr "" @@ -2385,7 +2404,7 @@ msgstr "" msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:102 part/views.py:490 +#: part/templates/part/category.html:102 part/views.py:491 msgid "Create new part" msgstr "" @@ -2417,7 +2436,7 @@ msgstr "" msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:195 stock/views.py:1080 +#: part/templates/part/category.html:195 stock/views.py:1213 msgid "Create new Stock Location" msgstr "" @@ -2447,7 +2466,7 @@ msgid "Variant Of" msgstr "" #: part/templates/part/detail.html:70 part/templates/part/set_category.html:15 -#: templates/js/part.html:285 +#: templates/js/part.html:293 msgid "Category" msgstr "" @@ -2488,7 +2507,7 @@ msgid "Part is not a virtual part" msgstr "" #: part/templates/part/detail.html:145 stock/forms.py:244 -#: templates/js/table_filters.html:159 +#: templates/js/table_filters.html:183 msgid "Template" msgstr "" @@ -2500,7 +2519,7 @@ msgstr "" msgid "Part is not a template part" msgstr "" -#: part/templates/part/detail.html:154 templates/js/table_filters.html:171 +#: part/templates/part/detail.html:154 templates/js/table_filters.html:195 msgid "Assembly" msgstr "" @@ -2512,7 +2531,7 @@ msgstr "" msgid "Part cannot be assembled from other parts" msgstr "" -#: part/templates/part/detail.html:163 templates/js/table_filters.html:175 +#: part/templates/part/detail.html:163 templates/js/table_filters.html:199 msgid "Component" msgstr "" @@ -2524,7 +2543,7 @@ msgstr "" msgid "Part cannot be used in assemblies" msgstr "" -#: part/templates/part/detail.html:172 templates/js/table_filters.html:187 +#: part/templates/part/detail.html:172 templates/js/table_filters.html:211 msgid "Trackable" msgstr "" @@ -2544,7 +2563,7 @@ msgstr "" msgid "Part can be purchased from external suppliers" msgstr "" -#: part/templates/part/detail.html:190 templates/js/table_filters.html:183 +#: part/templates/part/detail.html:190 templates/js/table_filters.html:207 msgid "Salable" msgstr "" @@ -2556,7 +2575,7 @@ msgstr "" msgid "Part cannot be sold to customers" msgstr "" -#: part/templates/part/detail.html:199 templates/js/table_filters.html:154 +#: part/templates/part/detail.html:199 templates/js/table_filters.html:178 msgid "Active" msgstr "" @@ -2588,7 +2607,7 @@ msgstr "" msgid "New Parameter" msgstr "" -#: part/templates/part/params.html:21 stock/models.py:1266 +#: part/templates/part/params.html:21 stock/models.py:1340 #: templates/js/stock.html:112 msgid "Value" msgstr "" @@ -2618,7 +2637,7 @@ msgid "This part is a variant of" msgstr "" #: part/templates/part/part_base.html:33 templates/js/company.html:153 -#: templates/js/part.html:262 +#: templates/js/part.html:270 msgid "Inactive" msgstr "" @@ -2664,7 +2683,7 @@ msgstr "" msgid "Delete part" msgstr "" -#: part/templates/part/part_base.html:111 templates/js/table_filters.html:57 +#: part/templates/part/part_base.html:111 templates/js/table_filters.html:65 msgid "In Stock" msgstr "" @@ -2700,6 +2719,10 @@ msgstr "" msgid "Upload new image" msgstr "" +#: part/templates/part/sale_prices.html:9 part/templates/part/tabs.html:50 +msgid "Sale Price" +msgstr "" + #: part/templates/part/sales_orders.html:15 msgid "New sales order" msgstr "" @@ -2721,7 +2744,7 @@ msgid "Part Stock" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.html:193 -#: templates/js/part.html:322 +#: templates/js/part.html:330 msgid "No Stock" msgstr "" @@ -2761,7 +2784,7 @@ msgstr "" msgid "Used In" msgstr "" -#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:270 +#: part/templates/part/tabs.html:58 stock/templates/stock/item_base.html:270 msgid "Tests" msgstr "" @@ -2789,204 +2812,204 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/views.py:75 +#: part/views.py:76 msgid "Add part attachment" msgstr "" -#: part/views.py:124 templates/attachment_table.html:30 +#: part/views.py:125 templates/attachment_table.html:30 msgid "Edit attachment" msgstr "" -#: part/views.py:128 +#: part/views.py:129 msgid "Part attachment updated" msgstr "" -#: part/views.py:143 +#: part/views.py:144 msgid "Delete Part Attachment" msgstr "" -#: part/views.py:149 +#: part/views.py:150 msgid "Deleted part attachment" msgstr "" -#: part/views.py:158 +#: part/views.py:159 msgid "Create Test Template" msgstr "" -#: part/views.py:185 +#: part/views.py:186 msgid "Edit Test Template" msgstr "" -#: part/views.py:199 +#: part/views.py:200 msgid "Delete Test Template" msgstr "" -#: part/views.py:206 +#: part/views.py:207 msgid "Set Part Category" msgstr "" -#: part/views.py:254 +#: part/views.py:255 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:289 +#: part/views.py:290 msgid "Create Variant" msgstr "" -#: part/views.py:367 +#: part/views.py:368 msgid "Duplicate Part" msgstr "" -#: part/views.py:372 +#: part/views.py:373 msgid "Copied part" msgstr "" -#: part/views.py:495 +#: part/views.py:496 msgid "Created new part" msgstr "" -#: part/views.py:706 +#: part/views.py:707 msgid "Part QR Code" msgstr "" -#: part/views.py:723 +#: part/views.py:724 msgid "Upload Part Image" msgstr "" -#: part/views.py:728 part/views.py:763 +#: part/views.py:729 part/views.py:764 msgid "Updated part image" msgstr "" -#: part/views.py:737 +#: part/views.py:738 msgid "Select Part Image" msgstr "" -#: part/views.py:766 +#: part/views.py:767 msgid "Part image not found" msgstr "" -#: part/views.py:777 +#: part/views.py:778 msgid "Edit Part Properties" msgstr "" -#: part/views.py:799 +#: part/views.py:800 msgid "Validate BOM" msgstr "" -#: part/views.py:962 +#: part/views.py:963 msgid "No BOM file provided" msgstr "" -#: part/views.py:1312 +#: part/views.py:1313 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1337 part/views.py:1340 +#: part/views.py:1338 part/views.py:1341 msgid "Select valid part" msgstr "" -#: part/views.py:1346 +#: part/views.py:1347 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1384 +#: part/views.py:1385 msgid "Select a part" msgstr "" -#: part/views.py:1390 +#: part/views.py:1391 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1394 +#: part/views.py:1395 msgid "Specify quantity" msgstr "" -#: part/views.py:1644 +#: part/views.py:1645 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:1651 +#: part/views.py:1652 msgid "Part was deleted" msgstr "" -#: part/views.py:1660 +#: part/views.py:1661 msgid "Part Pricing" msgstr "" -#: part/views.py:1782 +#: part/views.py:1783 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:1790 +#: part/views.py:1791 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:1797 +#: part/views.py:1798 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:1805 +#: part/views.py:1806 msgid "Create Part Parameter" msgstr "" -#: part/views.py:1855 +#: part/views.py:1856 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:1869 +#: part/views.py:1870 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:1885 +#: part/views.py:1886 msgid "Edit Part Category" msgstr "" -#: part/views.py:1920 +#: part/views.py:1921 msgid "Delete Part Category" msgstr "" -#: part/views.py:1926 +#: part/views.py:1927 msgid "Part category was deleted" msgstr "" -#: part/views.py:1985 +#: part/views.py:1986 msgid "Create BOM item" msgstr "" -#: part/views.py:2051 +#: part/views.py:2052 msgid "Edit BOM item" msgstr "" -#: part/views.py:2099 +#: part/views.py:2100 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:138 +#: report/models.py:147 msgid "Template name" msgstr "" -#: report/models.py:144 +#: report/models.py:153 msgid "Report template file" msgstr "" -#: report/models.py:148 +#: report/models.py:157 msgid "Report template description" msgstr "" -#: report/models.py:152 +#: report/models.py:161 msgid "Report template is enabled" msgstr "" -#: report/models.py:159 +#: report/models.py:168 msgid "Part query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:218 +#: report/models.py:227 msgid "Report asset file" msgstr "" -#: report/models.py:221 +#: report/models.py:230 msgid "Asset file description" msgstr "" @@ -3002,15 +3025,47 @@ msgstr "" msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:285 +#: stock/forms.py:279 +msgid "Destination location for uninstalled items" +msgstr "" + +#: stock/forms.py:281 +msgid "Add transaction note (optional)" +msgstr "" + +#: stock/forms.py:283 +msgid "Confirm uninstall" +msgstr "" + +#: stock/forms.py:283 +msgid "Confirm removal of installed stock items" +msgstr "" + +#: stock/forms.py:307 +msgid "Destination" +msgstr "" + +#: stock/forms.py:307 msgid "Destination stock location" msgstr "" -#: stock/forms.py:291 +#: stock/forms.py:309 +msgid "Add note (required)" +msgstr "" + +#: stock/forms.py:313 stock/views.py:795 stock/views.py:992 +msgid "Confirm stock adjustment" +msgstr "" + +#: stock/forms.py:313 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:293 +#: stock/forms.py:315 +msgid "Set Default Location" +msgstr "" + +#: stock/forms.py:315 msgid "Set the destination as the default location for selected parts" msgstr "" @@ -3124,93 +3179,101 @@ msgstr "" msgid "Returned to location" msgstr "" -#: stock/models.py:673 +#: stock/models.py:626 +msgid "Installed in stock item" +msgstr "" + +#: stock/models.py:655 +msgid "Uninstalled into location" +msgstr "" + +#: stock/models.py:745 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:679 +#: stock/models.py:751 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:685 +#: stock/models.py:757 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:688 +#: stock/models.py:760 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:691 +#: stock/models.py:763 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:701 +#: stock/models.py:773 msgid "Serial numbers already exist: " msgstr "" -#: stock/models.py:726 +#: stock/models.py:798 msgid "Add serial number" msgstr "" -#: stock/models.py:729 +#: stock/models.py:801 #, python-brace-format msgid "Serialized {n} items" msgstr "" -#: stock/models.py:840 +#: stock/models.py:912 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1167 +#: stock/models.py:1241 msgid "Tracking entry title" msgstr "" -#: stock/models.py:1169 +#: stock/models.py:1243 msgid "Entry notes" msgstr "" -#: stock/models.py:1171 +#: stock/models.py:1245 msgid "Link to external page for further information" msgstr "" -#: stock/models.py:1231 +#: stock/models.py:1305 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1237 +#: stock/models.py:1311 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1254 +#: stock/models.py:1328 msgid "Test" msgstr "" -#: stock/models.py:1255 +#: stock/models.py:1329 msgid "Test name" msgstr "" -#: stock/models.py:1260 +#: stock/models.py:1334 msgid "Result" msgstr "" -#: stock/models.py:1261 templates/js/table_filters.html:90 +#: stock/models.py:1335 templates/js/table_filters.html:111 msgid "Test result" msgstr "" -#: stock/models.py:1267 +#: stock/models.py:1341 msgid "Test output value" msgstr "" -#: stock/models.py:1273 +#: stock/models.py:1347 msgid "Attachment" msgstr "" -#: stock/models.py:1274 +#: stock/models.py:1348 msgid "Test result attachment" msgstr "" -#: stock/models.py:1280 +#: stock/models.py:1354 msgid "Test notes" msgstr "" @@ -3360,6 +3423,31 @@ msgstr "" msgid "Are you sure you want to delete this stock item?" msgstr "" +#: stock/templates/stock/item_installed.html:10 +msgid "Installed Stock Items" +msgstr "" + +#: stock/templates/stock/item_installed.html:18 +msgid "Uninstall selected stock items" +msgstr "" + +#: stock/templates/stock/item_installed.html:18 +msgid "Uninstall" +msgstr "" + +#: stock/templates/stock/item_installed.html:35 +msgid "No stock items installed" +msgstr "" + +#: stock/templates/stock/item_installed.html:48 templates/js/part.html:209 +#: templates/js/stock.html:409 +msgid "Select" +msgstr "" + +#: stock/templates/stock/item_installed.html:131 +msgid "Uninstall item" +msgstr "" + #: stock/templates/stock/item_tests.html:10 stock/templates/stock/tabs.html:13 msgid "Test Data" msgstr "" @@ -3413,7 +3501,8 @@ msgid "Sublocations" msgstr "" #: stock/templates/stock/location.html:68 -#: stock/templates/stock/location.html:83 templates/stats.html:21 +#: stock/templates/stock/location.html:83 +#: templates/InvenTree/search_stock_items.html:6 templates/stats.html:21 #: templates/stats.html:30 msgid "Stock Items" msgstr "" @@ -3431,7 +3520,11 @@ msgstr "" msgid "Are you sure you want to delete this stock location?" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1053 +#: stock/templates/stock/stock_uninstall.html:8 +msgid "The following stock items will be uninstalled" +msgstr "" + +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1186 msgid "Convert Stock Item" msgstr "" @@ -3459,6 +3552,10 @@ msgstr "" msgid "Children" msgstr "" +#: stock/templates/stock/tabs.html:44 +msgid "Installed Items" +msgstr "" + #: stock/views.py:114 msgid "Edit Stock Location" msgstr "" @@ -3539,133 +3636,153 @@ msgstr "" msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:698 +#: stock/views.py:699 +msgid "Uninstall Stock Items" +msgstr "" + +#: stock/views.py:806 +msgid "Uninstalled stock items" +msgstr "" + +#: stock/views.py:831 msgid "Adjust Stock" msgstr "" -#: stock/views.py:807 +#: stock/views.py:940 msgid "Move Stock Items" msgstr "" -#: stock/views.py:808 +#: stock/views.py:941 msgid "Count Stock Items" msgstr "" -#: stock/views.py:809 +#: stock/views.py:942 msgid "Remove From Stock" msgstr "" -#: stock/views.py:810 +#: stock/views.py:943 msgid "Add Stock Items" msgstr "" -#: stock/views.py:811 +#: stock/views.py:944 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:839 +#: stock/views.py:972 msgid "Must enter integer value" msgstr "" -#: stock/views.py:844 +#: stock/views.py:977 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:851 +#: stock/views.py:984 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:859 -msgid "Confirm stock adjustment" -msgstr "" - -#: stock/views.py:930 +#: stock/views.py:1063 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:945 +#: stock/views.py:1078 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:958 +#: stock/views.py:1091 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:986 +#: stock/views.py:1119 msgid "No items were moved" msgstr "" -#: stock/views.py:989 +#: stock/views.py:1122 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1008 +#: stock/views.py:1141 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1020 +#: stock/views.py:1153 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1101 +#: stock/views.py:1234 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1194 -msgid "Create new Stock Item" -msgstr "" - -#: stock/views.py:1293 +#: stock/views.py:1426 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1359 +#: stock/views.py:1492 msgid "Invalid quantity" msgstr "" -#: stock/views.py:1362 +#: stock/views.py:1495 msgid "Quantity cannot be less than zero" msgstr "" -#: stock/views.py:1366 +#: stock/views.py:1499 msgid "Invalid part selection" msgstr "" -#: stock/views.py:1415 +#: stock/views.py:1548 #, python-brace-format msgid "Created {n} new stock items" msgstr "" -#: stock/views.py:1434 stock/views.py:1450 +#: stock/views.py:1567 stock/views.py:1583 msgid "Created new stock item" msgstr "" -#: stock/views.py:1469 +#: stock/views.py:1602 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1615 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1493 +#: stock/views.py:1626 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1510 +#: stock/views.py:1643 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1519 +#: stock/views.py:1652 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/InvenTree/bom_invalid.html:7 +msgid "BOM Waiting Validation" +msgstr "" + +#: templates/InvenTree/build_pending.html:7 +msgid "Pending Builds" +msgstr "" + +#: templates/InvenTree/latest_parts.html:7 +msgid "Latest Parts" +msgstr "" + +#: templates/InvenTree/po_outstanding.html:7 +msgid "Outstanding Purchase Orders" +msgstr "" + +#: templates/InvenTree/required_stock_build.html:7 +msgid "Require Stock To Complete Build" +msgstr "" + #: templates/InvenTree/search.html:7 templates/InvenTree/search.html:12 msgid "Search Results" msgstr "" @@ -3674,6 +3791,18 @@ msgstr "" msgid "No results found" msgstr "" +#: templates/InvenTree/search.html:181 templates/js/stock.html:521 +msgid "Shipped to customer" +msgstr "" + +#: templates/InvenTree/search.html:184 templates/js/stock.html:528 +msgid "No stock location set" +msgstr "" + +#: templates/InvenTree/searching.html:3 +msgid "Searching" +msgstr "" + #: templates/InvenTree/settings/part.html:9 msgid "Part Parameter Templates" msgstr "" @@ -3700,6 +3829,10 @@ msgid "" "\t" msgstr "" +#: templates/InvenTree/so_outstanding.html:7 +msgid "Outstanding Sales Orders" +msgstr "" + #: templates/InvenTree/starred_parts.html:7 msgid "Starred Parts" msgstr "" @@ -3841,7 +3974,7 @@ msgstr "" msgid "Open subassembly" msgstr "" -#: templates/js/bom.html:184 templates/js/build.html:115 +#: templates/js/bom.html:184 templates/js/build.html:119 msgid "Available" msgstr "" @@ -3869,11 +4002,11 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/build.html:19 +#: templates/js/build.html:23 msgid "No builds matching query" msgstr "" -#: templates/js/build.html:104 +#: templates/js/build.html:108 msgid "No parts allocated for" msgstr "" @@ -3893,11 +4026,11 @@ msgstr "" msgid "No supplier parts found" msgstr "" -#: templates/js/company.html:145 templates/js/part.html:240 +#: templates/js/company.html:145 templates/js/part.html:248 msgid "Template part" msgstr "" -#: templates/js/company.html:149 templates/js/part.html:244 +#: templates/js/company.html:149 templates/js/part.html:252 msgid "Assembled part" msgstr "" @@ -3909,7 +4042,7 @@ msgstr "" msgid "No purchase orders found" msgstr "" -#: templates/js/order.html:172 templates/js/stock.html:629 +#: templates/js/order.html:172 templates/js/stock.html:633 msgid "Date" msgstr "" @@ -3925,55 +4058,51 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.html:201 templates/js/stock.html:409 -msgid "Select" -msgstr "" - -#: templates/js/part.html:248 +#: templates/js/part.html:256 msgid "Starred part" msgstr "" -#: templates/js/part.html:252 +#: templates/js/part.html:260 msgid "Salable part" msgstr "" -#: templates/js/part.html:291 +#: templates/js/part.html:299 msgid "No category" msgstr "" -#: templates/js/part.html:309 templates/js/table_filters.html:167 +#: templates/js/part.html:317 templates/js/table_filters.html:191 msgid "Low stock" msgstr "" -#: templates/js/part.html:318 +#: templates/js/part.html:326 msgid "Building" msgstr "" -#: templates/js/part.html:337 +#: templates/js/part.html:345 msgid "No parts found" msgstr "" -#: templates/js/part.html:397 +#: templates/js/part.html:405 msgid "YES" msgstr "" -#: templates/js/part.html:399 +#: templates/js/part.html:407 msgid "NO" msgstr "" -#: templates/js/part.html:433 +#: templates/js/part.html:441 msgid "No test templates matching query" msgstr "" -#: templates/js/part.html:484 templates/js/stock.html:63 +#: templates/js/part.html:492 templates/js/stock.html:63 msgid "Edit test result" msgstr "" -#: templates/js/part.html:485 templates/js/stock.html:64 +#: templates/js/part.html:493 templates/js/stock.html:64 msgid "Delete test result" msgstr "" -#: templates/js/part.html:491 +#: templates/js/part.html:499 msgid "This test is defined for a parent part" msgstr "" @@ -4033,127 +4162,140 @@ msgstr "" msgid "Stock item is lost" msgstr "" -#: templates/js/stock.html:491 templates/js/table_filters.html:52 +#: templates/js/stock.html:491 templates/js/table_filters.html:60 msgid "Depleted" msgstr "" -#: templates/js/stock.html:520 -msgid "Shipped to customer" +#: templates/js/stock.html:516 +msgid "Installed in Stock Item " msgstr "" -#: templates/js/stock.html:523 -msgid "No stock location set" -msgstr "" - -#: templates/js/stock.html:695 +#: templates/js/stock.html:699 msgid "No user information" msgstr "" -#: templates/js/stock.html:779 +#: templates/js/stock.html:783 msgid "Create New Part" msgstr "" -#: templates/js/stock.html:791 +#: templates/js/stock.html:795 msgid "Create New Location" msgstr "" -#: templates/js/table_filters.html:19 templates/js/table_filters.html:67 +#: templates/js/table_filters.html:19 templates/js/table_filters.html:80 msgid "Is Serialized" msgstr "" -#: templates/js/table_filters.html:22 templates/js/table_filters.html:70 +#: templates/js/table_filters.html:22 templates/js/table_filters.html:87 msgid "Serial number GTE" msgstr "" -#: templates/js/table_filters.html:23 templates/js/table_filters.html:71 +#: templates/js/table_filters.html:23 templates/js/table_filters.html:88 msgid "Serial number greater than or equal to" msgstr "" -#: templates/js/table_filters.html:26 templates/js/table_filters.html:74 +#: templates/js/table_filters.html:26 templates/js/table_filters.html:91 msgid "Serial number LTE" msgstr "" -#: templates/js/table_filters.html:27 templates/js/table_filters.html:75 +#: templates/js/table_filters.html:27 templates/js/table_filters.html:92 msgid "Serial number less than or equal to" msgstr "" -#: templates/js/table_filters.html:37 +#: templates/js/table_filters.html:30 templates/js/table_filters.html:31 +#: templates/js/table_filters.html:83 templates/js/table_filters.html:84 +msgid "Serial number" +msgstr "" + +#: templates/js/table_filters.html:35 templates/js/table_filters.html:101 +msgid "Batch code" +msgstr "" + +#: templates/js/table_filters.html:45 msgid "Active parts" msgstr "" -#: templates/js/table_filters.html:38 +#: templates/js/table_filters.html:46 msgid "Show stock for active parts" msgstr "" -#: templates/js/table_filters.html:42 +#: templates/js/table_filters.html:50 msgid "Is allocated" msgstr "" -#: templates/js/table_filters.html:43 +#: templates/js/table_filters.html:51 msgid "Item has been alloacted" msgstr "" -#: templates/js/table_filters.html:47 +#: templates/js/table_filters.html:55 msgid "Include sublocations" msgstr "" -#: templates/js/table_filters.html:48 +#: templates/js/table_filters.html:56 msgid "Include stock in sublocations" msgstr "" -#: templates/js/table_filters.html:53 +#: templates/js/table_filters.html:61 msgid "Show stock items which are depleted" msgstr "" -#: templates/js/table_filters.html:58 +#: templates/js/table_filters.html:66 msgid "Show items which are in stock" msgstr "" -#: templates/js/table_filters.html:62 +#: templates/js/table_filters.html:70 +msgid "Installed" +msgstr "" + +#: templates/js/table_filters.html:71 +msgid "Show stock items which are installed in another item" +msgstr "" + +#: templates/js/table_filters.html:75 msgid "Sent to customer" msgstr "" -#: templates/js/table_filters.html:63 +#: templates/js/table_filters.html:76 msgid "Show items which have been assigned to a customer" msgstr "" -#: templates/js/table_filters.html:79 templates/js/table_filters.html:80 +#: templates/js/table_filters.html:96 templates/js/table_filters.html:97 msgid "Stock status" msgstr "" -#: templates/js/table_filters.html:109 +#: templates/js/table_filters.html:130 msgid "Build status" msgstr "" -#: templates/js/table_filters.html:121 templates/js/table_filters.html:134 +#: templates/js/table_filters.html:145 templates/js/table_filters.html:158 msgid "Order status" msgstr "" -#: templates/js/table_filters.html:126 templates/js/table_filters.html:139 +#: templates/js/table_filters.html:150 templates/js/table_filters.html:163 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.html:149 +#: templates/js/table_filters.html:173 msgid "Include subcategories" msgstr "" -#: templates/js/table_filters.html:150 +#: templates/js/table_filters.html:174 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.html:155 +#: templates/js/table_filters.html:179 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.html:163 +#: templates/js/table_filters.html:187 msgid "Stock available" msgstr "" -#: templates/js/table_filters.html:179 +#: templates/js/table_filters.html:203 msgid "Starred" msgstr "" -#: templates/js/table_filters.html:191 +#: templates/js/table_filters.html:215 msgid "Purchasable" msgstr "" diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 0585c34cd7..5d140fb77c 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -1273,7 +1273,7 @@ class POLineItemEdit(AjaxUpdateView): form = super().get_form() # Prevent user from editing order once line item is assigned - form.fields.pop('order') + form.fields['order'].widget = HiddenInput() return form diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index 72b72f0dae..a98511dc53 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -7,7 +7,7 @@ from __future__ import unicode_literals from django_filters.rest_framework import DjangoFilterBackend from django.http import JsonResponse -from django.db.models import Q, F, Count +from django.db.models import Q, F, Count, Prefetch, Sum from rest_framework import status from rest_framework.response import Response @@ -22,11 +22,14 @@ from .models import PartParameter, PartParameterTemplate from .models import PartAttachment, PartTestTemplate from .models import PartSellPriceBreak +from build.models import Build + from . import serializers as part_serializers from InvenTree.views import TreeSerializer from InvenTree.helpers import str2bool, isNull from InvenTree.api import AttachmentMixin +from InvenTree.status_codes import BuildStatus class PartCategoryTree(TreeSerializer): @@ -531,13 +534,25 @@ class PartList(generics.ListCreateAPIView): if stock_to_build is not None: # Filter only active parts queryset = queryset.filter(active=True) + # Prefetch current active builds + build_active_queryset = Build.objects.filter(status__in=BuildStatus.ACTIVE_CODES) + build_active_prefetch = Prefetch('builds', + queryset=build_active_queryset, + to_attr='current_builds') + parts = queryset.prefetch_related(build_active_prefetch) + + # Store parts with builds needing stock parts_need_stock = [] # Find parts with active builds # where any subpart's stock is lower than quantity being built - for part in queryset: - if part.active_builds and part.can_build < part.quantity_being_built: - parts_need_stock.append(part.pk) + for part in parts: + if part.current_builds: + builds_ids = [build.id for build in part.current_builds] + total_build_quantity = build_active_queryset.filter(pk__in=builds_ids).aggregate(quantity=Sum('quantity'))['quantity'] + + if part.can_build < total_build_quantity: + parts_need_stock.append(part.pk) queryset = queryset.filter(pk__in=parts_need_stock) diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index f7bf65abc0..3eca883aea 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -83,7 +83,7 @@ def inventree_github_url(*args, **kwargs): @register.simple_tag() def inventree_docs_url(*args, **kwargs): """ Return URL for InvenTree documenation site """ - return "https://inventree.github.io" + return "https://inventree.readthedocs.io/" @register.simple_tag() diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index de2edcec98..97330f1ced 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -35,7 +35,7 @@ class TemplateTagTest(TestCase): self.assertIn('github.com', inventree_extras.inventree_github_url()) def test_docs(self): - self.assertIn('inventree.github.io', inventree_extras.inventree_docs_url()) + self.assertIn('inventree.readthedocs.io', inventree_extras.inventree_docs_url()) class PartTest(TestCase): diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 54cb5a62cf..55bc62a44e 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -455,6 +455,12 @@ class StockList(generics.ListCreateAPIView): if belongs_to: queryset = queryset.filter(belongs_to=belongs_to) + # Filter by batch code + batch = params.get('batch', None) + + if batch is not None: + queryset = queryset.filter(batch=batch) + build = params.get('build', None) if build: @@ -470,6 +476,26 @@ class StockList(generics.ListCreateAPIView): if sales_order: queryset = queryset.filter(sales_order=sales_order) + # Filter stock items which are installed in another (specific) stock item + installed_in = params.get('installed_in', None) + + if installed_in: + # Note: The "installed_in" field is called "belongs_to" + queryset = queryset.filter(belongs_to=installed_in) + + # Filter stock items which are installed in another stock item + installed = params.get('installed', None) + + if installed is not None: + installed = str2bool(installed) + + if installed: + # Exclude items which are *not* installed in another item + queryset = queryset.exclude(belongs_to=None) + else: + # Exclude items which are instaled in another item + queryset = queryset.filter(belongs_to=None) + # Filter by customer customer = params.get('customer', None) diff --git a/InvenTree/stock/fixtures/stock_tests.yaml b/InvenTree/stock/fixtures/stock_tests.yaml index 7ee6f3b387..8a99e8b56b 100644 --- a/InvenTree/stock/fixtures/stock_tests.yaml +++ b/InvenTree/stock/fixtures/stock_tests.yaml @@ -62,7 +62,7 @@ pk: 8 fields: stock_item: 522 - test: 'Check that chair is GreEn ' + test: 'Check that chair is GreEn' result: True date: 2020-05-17 diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py index e0b1623a54..a5c689a605 100644 --- a/InvenTree/stock/forms.py +++ b/InvenTree/stock/forms.py @@ -271,6 +271,28 @@ class ExportOptionsForm(HelperForm): self.fields['file_format'].choices = self.get_format_choices() +class UninstallStockForm(forms.ModelForm): + """ + Form for uninstalling a stock item which is installed in another item. + """ + + location = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label=_('Location'), help_text=_('Destination location for uninstalled items')) + + note = forms.CharField(label=_('Notes'), required=False, help_text=_('Add transaction note (optional)')) + + confirm = forms.BooleanField(required=False, initial=False, label=_('Confirm uninstall'), help_text=_('Confirm removal of installed stock items')) + + class Meta: + + model = StockItem + + fields = [ + 'location', + 'note', + 'confirm', + ] + + class AdjustStockForm(forms.ModelForm): """ Form for performing simple stock adjustments. @@ -282,15 +304,15 @@ class AdjustStockForm(forms.ModelForm): This form is used for managing stock adjuments for single or multiple stock items. """ - destination = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label='Destination', required=True, help_text=_('Destination stock location')) + destination = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label=_('Destination'), required=True, help_text=_('Destination stock location')) - note = forms.CharField(label='Notes', required=True, help_text='Add note (required)') + note = forms.CharField(label=_('Notes'), required=True, help_text=_('Add note (required)')) # transaction = forms.BooleanField(required=False, initial=False, label='Create Transaction', help_text='Create a stock transaction for these parts') - confirm = forms.BooleanField(required=False, initial=False, label='Confirm stock adjustment', help_text=_('Confirm movement of stock items')) + confirm = forms.BooleanField(required=False, initial=False, label=_('Confirm stock adjustment'), help_text=_('Confirm movement of stock items')) - set_loc = forms.BooleanField(required=False, initial=False, label='Set Default Location', help_text=_('Set the destination as the default location for selected parts')) + set_loc = forms.BooleanField(required=False, initial=False, label=_('Set Default Location'), help_text=_('Set the destination as the default location for selected parts')) class Meta: model = StockItem diff --git a/InvenTree/stock/migrations/0051_auto_20200928_0928.py b/InvenTree/stock/migrations/0051_auto_20200928_0928.py new file mode 100644 index 0000000000..dd82e6edd0 --- /dev/null +++ b/InvenTree/stock/migrations/0051_auto_20200928_0928.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.7 on 2020-09-28 09:28 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('stock', '0050_auto_20200821_1403'), + ] + + operations = [ + migrations.AlterField( + model_name='stockitem', + name='belongs_to', + field=models.ForeignKey(blank=True, help_text='Is this item installed in another item?', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='installed_parts', to='stock.StockItem', verbose_name='Installed In'), + ), + ] diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index c10295ee6a..df1a628f47 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -341,7 +341,7 @@ class StockItem(MPTTModel): 'self', verbose_name=_('Installed In'), on_delete=models.DO_NOTHING, - related_name='owned_parts', blank=True, null=True, + related_name='installed_parts', blank=True, null=True, help_text=_('Is this item installed in another item?') ) @@ -585,6 +585,78 @@ class StockItem(MPTTModel): return True + def installedItemCount(self): + """ + Return the number of stock items installed inside this one. + """ + + return self.installed_parts.count() + + def hasInstalledItems(self): + """ + Returns true if this stock item has other stock items installed in it. + """ + + return self.installedItemCount() > 0 + + @transaction.atomic + def installIntoStockItem(self, otherItem, user, notes): + """ + Install this stock item into another stock item. + + Args + otherItem: The stock item to install this item into + user: The user performing the operation + notes: Any notes associated with the operation + """ + + # Cannot be already installed in another stock item! + if self.belongs_to is not None: + return False + + # TODO - Are there any other checks that need to be performed at this stage? + + # Mark this stock item as belonging to the other one + self.belongs_to = otherItem + + self.save() + + # Add a transaction note! + self.addTransactionNote( + _('Installed in stock item') + ' ' + str(otherItem.pk), + user, + notes=notes + ) + + @transaction.atomic + def uninstallIntoLocation(self, location, user, notes): + """ + Uninstall this stock item from another item, into a location. + + Args: + location: The stock location where the item will be moved + user: The user performing the operation + notes: Any notes associated with the operation + """ + + # If the stock item is not installed in anything, ignore + if self.belongs_to is None: + return False + + # TODO - Are there any other checks that need to be performed at this stage? + + self.belongs_to = None + self.location = location + + self.save() + + # Add a transaction note! + self.addTransactionNote( + _('Uninstalled into location') + ' ' + str(location), + user, + notes=notes + ) + @property def children(self): """ Return a list of the child items which have been split from this stock item """ @@ -1042,7 +1114,9 @@ class StockItem(MPTTModel): as all named tests are accessible. """ - results = self.getTestResults(**kwargs).order_by('-date') + # Filter results by "date", so that newer results + # will override older ones. + results = self.getTestResults(**kwargs).order_by('date') result_map = {} diff --git a/InvenTree/stock/templates/stock/item_childs.html b/InvenTree/stock/templates/stock/item_childs.html index 1a8febbbea..a271852846 100644 --- a/InvenTree/stock/templates/stock/item_childs.html +++ b/InvenTree/stock/templates/stock/item_childs.html @@ -31,6 +31,7 @@ loadStockTable($("#stock-table"), { part_details: true, ancestor: {{ item.id }}, }, + name: 'item-childs', groupByField: 'location', buttons: [ '#stock-options', diff --git a/InvenTree/stock/templates/stock/item_installed.html b/InvenTree/stock/templates/stock/item_installed.html new file mode 100644 index 0000000000..2d8a8142cf --- /dev/null +++ b/InvenTree/stock/templates/stock/item_installed.html @@ -0,0 +1,184 @@ +{% extends "stock/item_base.html" %} + +{% load static %} +{% load i18n %} + +{% block details %} + +{% include "stock/tabs.html" with tab='installed' %} + +

{% trans "Installed Stock Items" %}

+
+ +
+
+
+ + +
+
+
+ + +
+ +{% endblock %} + +{% block js_ready %} + +{{ block.super }} + +$('#installed-table').inventreeTable({ + formatNoMatches: function() { + return '{% trans "No stock items installed" %}'; + }, + url: "{% url 'api-stock-list' %}", + queryParams: { + installed_in: {{ item.id }}, + part_detail: true, + }, + name: 'stock-item-installed', + url: "{% url 'api-stock-list' %}", + showColumns: true, + columns: [ + { + checkbox: true, + title: '{% trans 'Select' %}', + searchable: false, + switchable: false, + }, + { + field: 'pk', + title: 'ID', + visible: false, + switchable: false, + }, + { + field: 'part_name', + title: '{% trans "Part" %}', + sortable: true, + formatter: function(value, row, index, field) { + + var url = `/stock/item/${row.pk}/`; + var thumb = row.part_detail.thumbnail; + var name = row.part_detail.full_name; + + html = imageHoverIcon(thumb) + renderLink(name, url); + + return html; + } + }, + { + field: 'IPN', + title: 'IPN', + sortable: true, + formatter: function(value, row, index, field) { + return row.part_detail.IPN; + }, + }, + { + field: 'part_description', + title: '{% trans "Description" %}', + sortable: true, + formatter: function(value, row, index, field) { + return row.part_detail.description; + } + }, + { + field: 'quantity', + title: '{% trans "Stock" %}', + sortable: true, + formatter: function(value, row, index, field) { + + var val = parseFloat(value); + + // If there is a single unit with a serial number, use the serial number + if (row.serial && row.quantity == 1) { + val = '# ' + row.serial; + } else { + val = +val.toFixed(5); + } + + var html = renderLink(val, `/stock/item/${row.pk}/`); + + return html; + } + }, + { + field: 'status', + title: '{% trans "Status" %}', + sortable: 'true', + formatter: function(value, row, index, field) { + return stockStatusDisplay(value); + }, + }, + { + field: 'batch', + title: '{% trans "Batch" %}', + sortable: true, + }, + { + field: 'actions', + switchable: false, + title: '', + formatter: function(value, row) { + var pk = row.pk; + + var html = `
`; + + html += makeIconButton('fa-trash-alt icon-red', 'button-uninstall', pk, '{% trans "Uninstall item" %}'); + + html += `
`; + + return html; + } + } + ], + onLoadSuccess: function() { + + var table = $('#installed-table'); + + // Find buttons and associate actions + table.find('.button-uninstall').click(function() { + var pk = $(this).attr('pk'); + + launchModalForm( + "{% url 'stock-item-uninstall' %}", + { + data: { + 'items[]': [pk], + }, + reload: true, + } + ); + }); + }, + buttons: [ + '#stock-options', + ] +}); + +$('#multi-item-uninstall').click(function() { + + var selections = $('#installed-table').bootstrapTable('getSelections'); + + var items = []; + + selections.forEach(function(item) { + items.push(item.pk); + }); + + launchModalForm( + "{% url 'stock-item-uninstall' %}", + { + data: { + 'items[]': items, + }, + reload: true, + } + ); +}); + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/stock/templates/stock/stock_uninstall.html b/InvenTree/stock/templates/stock/stock_uninstall.html new file mode 100644 index 0000000000..2a8d9c7ee4 --- /dev/null +++ b/InvenTree/stock/templates/stock/stock_uninstall.html @@ -0,0 +1,28 @@ +{% extends "modal_form.html" %} +{% load i18n %} +{% load inventree_extras %} + +{% block pre_form_content %} + +
+ {% trans "The following stock items will be uninstalled" %} +
+ +
    + {% for item in stock_items %} +
  • + {% include "hover_image.html" with image=item.part.image hover=False %} + {{ item }} +
  • + {% endfor %} +
+ +{% endblock %} + +{% block form_data %} + +{% for item in stock_items %} + +{% endfor %} + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/stock/templates/stock/tabs.html b/InvenTree/stock/templates/stock/tabs.html index 1e6e9ddb3b..cb4021f34e 100644 --- a/InvenTree/stock/templates/stock/tabs.html +++ b/InvenTree/stock/templates/stock/tabs.html @@ -38,4 +38,12 @@ {% trans "Children" %}{% if item.child_count > 0 %}{{ item.child_count }}{% endif %} {% endif %} - \ No newline at end of file + {% if item.part.assembly or item.installedItemCount > 0 %} +
  • + + {% trans "Installed Items" %} + {% if item.installedItemCount > 0 %}{{ item.installedItemCount }}{% endif %} + +
  • + {% endif %} + diff --git a/InvenTree/stock/tests.py b/InvenTree/stock/tests.py index 1001ed12ea..23cf6b3d02 100644 --- a/InvenTree/stock/tests.py +++ b/InvenTree/stock/tests.py @@ -3,6 +3,8 @@ from django.db.models import Sum from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError +import datetime + from .models import StockLocation, StockItem, StockItemTracking from .models import StockItemTestResult from part.models import Part @@ -439,13 +441,14 @@ class TestResultTest(StockTest): self.assertIn(test, result_map.keys()) def test_test_results(self): + item = StockItem.objects.get(pk=522) status = item.requiredTestStatus() self.assertEqual(status['total'], 5) - self.assertEqual(status['passed'], 3) - self.assertEqual(status['failed'], 1) + self.assertEqual(status['passed'], 2) + self.assertEqual(status['failed'], 2) self.assertFalse(item.passedAllRequiredTests()) @@ -460,6 +463,18 @@ class TestResultTest(StockTest): result=True ) + # Still should be failing at this point, + # as the most recent "apply paint" test was False + self.assertFalse(item.passedAllRequiredTests()) + + # Add a new test result against this required test + StockItemTestResult.objects.create( + stock_item=item, + test='apply paint', + date=datetime.datetime(2022, 12, 12), + result=True + ) + self.assertTrue(item.passedAllRequiredTests()) def test_duplicate_item_tests(self): diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py index 51067b57de..4c86995cda 100644 --- a/InvenTree/stock/urls.py +++ b/InvenTree/stock/urls.py @@ -34,6 +34,7 @@ stock_item_detail_urls = [ url(r'^test/', views.StockItemDetail.as_view(template_name='stock/item_tests.html'), name='stock-item-test-results'), url(r'^children/', views.StockItemDetail.as_view(template_name='stock/item_childs.html'), name='stock-item-children'), url(r'^attachments/', views.StockItemDetail.as_view(template_name='stock/item_attachments.html'), name='stock-item-attachments'), + url(r'^installed/', views.StockItemDetail.as_view(template_name='stock/item_installed.html'), name='stock-item-installed'), url(r'^notes/', views.StockItemNotes.as_view(), name='stock-item-notes'), url('^.*$', views.StockItemDetail.as_view(), name='stock-item-detail'), @@ -59,6 +60,8 @@ stock_urls = [ url(r'^item/new/?', views.StockItemCreate.as_view(), name='stock-item-create'), + url(r'^item/uninstall/', views.StockItemUninstall.as_view(), name='stock-item-uninstall'), + url(r'^item/test-report-download/', views.StockItemTestReportDownload.as_view(), name='stock-item-test-report-download'), url(r'^item/print-stock-labels/', views.StockItemPrintLabels.as_view(), name='stock-item-print-labels'), diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index aadac17c7a..c09c328c66 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -683,6 +683,139 @@ class StockItemQRCode(QRCodeView): return None +class StockItemUninstall(AjaxView, FormMixin): + """ + View for uninstalling one or more StockItems, + which are installed in another stock item. + + Stock items are uninstalled into a location, + defaulting to the location that they were "in" before they were installed. + + If multiple default locations are detected, + leave the final location up to the user. + """ + + ajax_template_name = 'stock/stock_uninstall.html' + ajax_form_title = _('Uninstall Stock Items') + form_class = StockForms.UninstallStockForm + + # List of stock items to uninstall (initially empty) + stock_items = [] + + def get_stock_items(self): + + return self.stock_items + + def get_initial(self): + + initials = super().get_initial().copy() + + # Keep track of the current locations of stock items + current_locations = set() + + # Keep track of the default locations for stock items + default_locations = set() + + for item in self.stock_items: + + if item.location: + current_locations.add(item.location) + + if item.part.default_location: + default_locations.add(item.part.default_location) + + if len(current_locations) == 1: + # If the selected stock items are currently in a single location, + # select that location as the destination. + initials['location'] = next(iter(current_locations)) + elif len(current_locations) == 0: + # There are no current locations set + if len(default_locations) == 1: + # Select the single default location + initials['location'] = next(iter(default_locations)) + + return initials + + def get(self, request, *args, **kwargs): + + """ Extract list of stock items, which are supplied as a list, + e.g. items[]=1,2,3 + """ + + if 'items[]' in request.GET: + self.stock_items = StockItem.objects.filter(id__in=request.GET.getlist('items[]')) + else: + self.stock_items = [] + + return self.renderJsonResponse(request, self.get_form()) + + def post(self, request, *args, **kwargs): + + """ + Extract a list of stock items which are included as hidden inputs in the form data. + """ + + items = [] + + for item in self.request.POST: + if item.startswith('stock-item-'): + pk = item.replace('stock-item-', '') + + try: + stock_item = StockItem.objects.get(pk=pk) + items.append(stock_item) + except (ValueError, StockItem.DoesNotExist): + pass + + self.stock_items = items + + # Assume the form is valid, until it isn't! + valid = True + + confirmed = str2bool(request.POST.get('confirm')) + + note = request.POST.get('note', '') + + location = request.POST.get('location', None) + + if location: + try: + location = StockLocation.objects.get(pk=location) + except (ValueError, StockLocation.DoesNotExist): + location = None + + if not location: + # Location is required! + valid = False + + form = self.get_form() + + if not confirmed: + valid = False + form.errors['confirm'] = [_('Confirm stock adjustment')] + + data = { + 'form_valid': valid, + } + + if valid: + # Ok, now let's actually uninstall the stock items + for item in self.stock_items: + item.uninstallIntoLocation(location, request.user, note) + + data['success'] = _('Uninstalled stock items') + + return self.renderJsonResponse(request, form=form, data=data) + + def get_context_data(self): + + context = super().get_context_data() + + context['stock_items'] = self.get_stock_items() + + return context + + class StockAdjust(AjaxView, FormMixin): """ View for enacting simple stock adjustments: @@ -1037,8 +1170,9 @@ class StockItemEdit(AjaxUpdateView): query = query.filter(part=item.part.id) form.fields['supplier_part'].queryset = query - if not item.part.trackable or not item.serialized: - form.fields.pop('serial') + # Hide the serial number field if it is not required + if not item.part.trackable and not item.serialized: + form.fields['serial'].widget = HiddenInput() return form diff --git a/InvenTree/templates/js/stock.html b/InvenTree/templates/js/stock.html index bb0673c16d..dd99c5b611 100644 --- a/InvenTree/templates/js/stock.html +++ b/InvenTree/templates/js/stock.html @@ -238,7 +238,7 @@ function loadStockTable(table, options) { var filters = {}; - var filterKey = options.filterKey || "stock"; + var filterKey = options.filterKey || options.name || "stock"; if (!options.disableFilters) { filters = loadTableFilters(filterKey); @@ -416,14 +416,6 @@ function loadStockTable(table, options) { visible: false, switchable: false, }, - { - field: 'IPN', - title: 'IPN', - sortable: true, - formatter: function(value, row, index, field) { - return row.part_detail.IPN; - }, - }, { field: 'part_name', title: '{% trans "Part" %}', @@ -439,6 +431,14 @@ function loadStockTable(table, options) { return html; } }, + { + field: 'IPN', + title: 'IPN', + sortable: true, + formatter: function(value, row, index, field) { + return row.part_detail.IPN; + }, + }, { field: 'part_description', title: '{% trans "Description" %}', @@ -512,16 +512,20 @@ function loadStockTable(table, options) { title: '{% trans "Location" %}', sortable: true, formatter: function(value, row, index, field) { - if (value) { + if (row.belongs_to) { + var text = "{% trans 'Installed in Stock Item ' %}" + row.belongs_to; + var url = `/stock/item/${row.belongs_to}/installed/`; + + return renderLink(text, url); + } else if (row.customer) { + var text = "{% trans "Shipped to customer" %}"; + return renderLink(text, `/company/${row.customer}/assigned-stock/`); + } + else if (value) { return renderLink(value, `/stock/location/${row.location}/`); } else { - if (row.customer) { - var text = "{% trans "Shipped to customer" %}"; - return renderLink(text, `/company/${row.customer}/assigned-stock/`); - } else { - return '{% trans "No stock location set" %}'; - } + return '{% trans "No stock location set" %}'; } } }, diff --git a/InvenTree/templates/js/table_filters.html b/InvenTree/templates/js/table_filters.html index bd417882e3..44c4149265 100644 --- a/InvenTree/templates/js/table_filters.html +++ b/InvenTree/templates/js/table_filters.html @@ -30,6 +30,10 @@ function getAvailableTableFilters(tableKey) { title: "{% trans "Serial number" %}", description: "{% trans "Serial number" %}" }, + batch: { + title: '{% trans "Batch" %}', + description: '{% trans "Batch code" %}', + }, }; } @@ -61,6 +65,11 @@ function getAvailableTableFilters(tableKey) { title: '{% trans "In Stock" %}', description: '{% trans "Show items which are in stock" %}', }, + installed: { + type: 'bool', + title: '{% trans "Installed" %}', + description: '{% trans "Show stock items which are installed in another item" %}', + }, sent_to_customer: { type: 'bool', title: '{% trans "Sent to customer" %}', @@ -87,6 +96,10 @@ function getAvailableTableFilters(tableKey) { title: '{% trans "Stock status" %}', description: '{% trans "Stock status" %}', }, + batch: { + title: '{% trans "Batch" %}', + description: '{% trans "Batch code" %}', + } }; } diff --git a/README.md b/README.md index 1ada93e6b9..551f6ce43a 100644 --- a/README.md +++ b/README.md @@ -9,32 +9,28 @@ InvenTree is designed to be lightweight and easy to use for SME or hobbyist appl However, powerful business logic works in the background to ensure that stock tracking history is maintained, and users have ready access to stock level information. +# Documentation + +For InvenTree documentation, refer to the [InvenTree documentation website](https://inventree.readthedocs.io/en/latest/). + ## Getting Started -Refer to the [getting started guide](https://inventree.github.io/docs/start/install) for installation and setup instructions. - -## Documentation - -For InvenTree documentation, refer to the [InvenTree documentation website](https://inventree.github.io). +Refer to the [getting started guide](https://inventree.readthedocs.io/en/latest/start/install/) for installation and setup instructions. ## Integration InvenTree is designed to be extensible, and provides multiple options for integration with external applications or addition of custom plugins: -* [InvenTree API](https://inventree.github.io/docs/extend/api) -* [Python module](https://inventree.github.io/docs/extend/python) -* [Plugin interface](https://inventree.github.io/docs/extend/plugins) -* [Third party](https://inventree.github.io/docs/extend/integrate) +* [InvenTree API](https://inventree.readthedocs.io/en/latest/extend/api/) +* [Python module](https://inventree.readthedocs.io/en/latest/extend/python) +* [Plugin interface](https://inventree.readthedocs.io/en/latest/extend/plugins) +* [Third party](https://inventree.readthedocs.io/en/latest/extend/integrate) -## Developer Documentation +# Contributing -For code documentation, refer to the [developer documentation](http://inventree.readthedocs.io/en/latest/). +Contributions are welcomed and encouraged. Please help to make this project even better! Refer to the [contribution page](https://inventree.readthedocs.io/en/latest/contribute/). -## Contributing - -Contributions are welcomed and encouraged. Please help to make this project even better! Refer to the [contribution page](https://inventree.github.io/pages/contribute). - -## Donate +# Donate If you use InvenTree and find it to be useful, please consider making a donation toward its continued development. diff --git a/tasks.py b/tasks.py index cbf9d1722c..9948b470d1 100644 --- a/tasks.py +++ b/tasks.py @@ -256,4 +256,4 @@ def server(c, address="127.0.0.1:8000"): Note: This is *not* sufficient for a production installation. """ - manage(c, "runserver {address}".format(address=address)) + manage(c, "runserver {address}".format(address=address), pty=True)