mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Merge pull request #909 from SchrodingersGat/bom-import-export
BOM upload: improve generation of "import" template
This commit is contained in:
commit
316dfe5e38
@ -6,7 +6,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2020-08-16 02:11+0000\n"
|
"POT-Creation-Date: 2020-08-18 04:01+0000\n"
|
||||||
"PO-Revision-Date: 2020-05-03 11:32+0200\n"
|
"PO-Revision-Date: 2020-05-03 11:32+0200\n"
|
||||||
"Last-Translator: Christian Schlüter <chschlue@gmail.com>\n"
|
"Last-Translator: Christian Schlüter <chschlue@gmail.com>\n"
|
||||||
"Language-Team: C <kde-i18n-doc@kde.org>\n"
|
"Language-Team: C <kde-i18n-doc@kde.org>\n"
|
||||||
@ -45,30 +45,30 @@ msgstr "Neues Teil anlegen"
|
|||||||
msgid "Confirm new password"
|
msgid "Confirm new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:328 order/models.py:187 order/models.py:261
|
#: InvenTree/helpers.py:336 order/models.py:187 order/models.py:261
|
||||||
msgid "Invalid quantity provided"
|
msgid "Invalid quantity provided"
|
||||||
msgstr "Keine gültige Menge"
|
msgstr "Keine gültige Menge"
|
||||||
|
|
||||||
#: InvenTree/helpers.py:331
|
#: InvenTree/helpers.py:339
|
||||||
msgid "Empty serial number string"
|
msgid "Empty serial number string"
|
||||||
msgstr "Keine Seriennummer angegeben"
|
msgstr "Keine Seriennummer angegeben"
|
||||||
|
|
||||||
#: InvenTree/helpers.py:352 InvenTree/helpers.py:369
|
#: InvenTree/helpers.py:360 InvenTree/helpers.py:377
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Duplicate serial: {n}"
|
msgid "Duplicate serial: {n}"
|
||||||
msgstr "Doppelte Seriennummer: {n}"
|
msgstr "Doppelte Seriennummer: {n}"
|
||||||
|
|
||||||
#: InvenTree/helpers.py:356 InvenTree/helpers.py:359 InvenTree/helpers.py:362
|
#: InvenTree/helpers.py:364 InvenTree/helpers.py:367 InvenTree/helpers.py:370
|
||||||
#: InvenTree/helpers.py:373
|
#: InvenTree/helpers.py:381
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Invalid group: {g}"
|
msgid "Invalid group: {g}"
|
||||||
msgstr "Ungültige Gruppe: {g}"
|
msgstr "Ungültige Gruppe: {g}"
|
||||||
|
|
||||||
#: InvenTree/helpers.py:379
|
#: InvenTree/helpers.py:387
|
||||||
msgid "No serial numbers found"
|
msgid "No serial numbers found"
|
||||||
msgstr "Keine Seriennummern gefunden"
|
msgstr "Keine Seriennummern gefunden"
|
||||||
|
|
||||||
#: InvenTree/helpers.py:383
|
#: InvenTree/helpers.py:391
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Number of unique serial number ({s}) must match quantity ({q})"
|
msgid "Number of unique serial number ({s}) must match quantity ({q})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -341,7 +341,7 @@ msgstr "Bau-Status"
|
|||||||
msgid "Build status code"
|
msgid "Build status code"
|
||||||
msgstr "Bau-Statuscode"
|
msgstr "Bau-Statuscode"
|
||||||
|
|
||||||
#: build/models.py:136 stock/models.py:376
|
#: build/models.py:136 stock/models.py:371
|
||||||
msgid "Batch Code"
|
msgid "Batch Code"
|
||||||
msgstr "Losnummer"
|
msgstr "Losnummer"
|
||||||
|
|
||||||
@ -353,11 +353,11 @@ msgstr "Chargennummer für diese Bau-Ausgabe"
|
|||||||
#: company/templates/company/supplier_part_base.html:60
|
#: company/templates/company/supplier_part_base.html:60
|
||||||
#: company/templates/company/supplier_part_detail.html:24
|
#: company/templates/company/supplier_part_detail.html:24
|
||||||
#: part/templates/part/detail.html:74 part/templates/part/part_base.html:86
|
#: part/templates/part/detail.html:74 part/templates/part/part_base.html:86
|
||||||
#: stock/models.py:370 stock/templates/stock/item_base.html:237
|
#: stock/models.py:365 stock/templates/stock/item_base.html:234
|
||||||
msgid "External Link"
|
msgid "External Link"
|
||||||
msgstr "Externer Link"
|
msgstr "Externer Link"
|
||||||
|
|
||||||
#: build/models.py:156 stock/models.py:372
|
#: build/models.py:156 stock/models.py:367
|
||||||
msgid "Link to external URL"
|
msgid "Link to external URL"
|
||||||
msgstr "Link zu einer externen URL"
|
msgstr "Link zu einer externen URL"
|
||||||
|
|
||||||
@ -365,7 +365,7 @@ msgstr "Link zu einer externen URL"
|
|||||||
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
|
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
|
||||||
#: order/templates/order/purchase_order_detail.html:200
|
#: order/templates/order/purchase_order_detail.html:200
|
||||||
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64
|
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64
|
||||||
#: stock/models.py:438 stock/models.py:1287 stock/templates/stock/tabs.html:26
|
#: stock/models.py:433 stock/models.py:1282 stock/templates/stock/tabs.html:26
|
||||||
#: templates/js/barcode.html:391 templates/js/bom.html:229
|
#: templates/js/barcode.html:391 templates/js/bom.html:229
|
||||||
#: templates/js/stock.html:114 templates/js/stock.html:526
|
#: templates/js/stock.html:114 templates/js/stock.html:526
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
@ -433,8 +433,8 @@ msgstr "Neues Lagerobjekt"
|
|||||||
|
|
||||||
#: build/templates/build/allocate.html:161
|
#: build/templates/build/allocate.html:161
|
||||||
#: order/templates/order/sales_order_detail.html:68
|
#: order/templates/order/sales_order_detail.html:68
|
||||||
#: order/templates/order/sales_order_detail.html:150 stock/models.py:364
|
#: order/templates/order/sales_order_detail.html:150 stock/models.py:359
|
||||||
#: stock/templates/stock/item_base.html:153
|
#: stock/templates/stock/item_base.html:150
|
||||||
msgid "Serial Number"
|
msgid "Serial Number"
|
||||||
msgstr "Seriennummer"
|
msgstr "Seriennummer"
|
||||||
|
|
||||||
@ -451,7 +451,7 @@ msgstr "Seriennummer"
|
|||||||
#: part/templates/part/allocation.html:49
|
#: part/templates/part/allocation.html:49
|
||||||
#: stock/templates/stock/item_base.html:26
|
#: stock/templates/stock/item_base.html:26
|
||||||
#: stock/templates/stock/item_base.html:32
|
#: stock/templates/stock/item_base.html:32
|
||||||
#: stock/templates/stock/item_base.html:159
|
#: stock/templates/stock/item_base.html:156
|
||||||
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
|
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
|
||||||
#: templates/js/bom.html:172 templates/js/build.html:52
|
#: templates/js/bom.html:172 templates/js/build.html:52
|
||||||
#: templates/js/stock.html:673
|
#: templates/js/stock.html:673
|
||||||
@ -460,7 +460,7 @@ msgstr "Anzahl"
|
|||||||
|
|
||||||
#: build/templates/build/allocate.html:177
|
#: build/templates/build/allocate.html:177
|
||||||
#: build/templates/build/auto_allocate.html:20
|
#: build/templates/build/auto_allocate.html:20
|
||||||
#: stock/templates/stock/item_base.html:191
|
#: stock/templates/stock/item_base.html:188
|
||||||
#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337
|
#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337
|
||||||
#: templates/js/stock.html:508
|
#: templates/js/stock.html:508
|
||||||
msgid "Location"
|
msgid "Location"
|
||||||
@ -498,7 +498,7 @@ msgstr "Beschreibung"
|
|||||||
msgid "Reference"
|
msgid "Reference"
|
||||||
msgstr "Referenz"
|
msgstr "Referenz"
|
||||||
|
|
||||||
#: build/templates/build/allocate.html:338 part/models.py:1270
|
#: build/templates/build/allocate.html:338 part/models.py:1271
|
||||||
#: templates/js/part.html:359 templates/js/table_filters.html:100
|
#: templates/js/part.html:359 templates/js/table_filters.html:100
|
||||||
msgid "Required"
|
msgid "Required"
|
||||||
msgstr "benötigt"
|
msgstr "benötigt"
|
||||||
@ -543,7 +543,7 @@ msgstr "Keine Lagerobjekt gefunden, die diesem Bau zugewiesen werden können"
|
|||||||
#: build/templates/build/build_base.html:8
|
#: build/templates/build/build_base.html:8
|
||||||
#: build/templates/build/build_base.html:34
|
#: build/templates/build/build_base.html:34
|
||||||
#: build/templates/build/complete.html:6
|
#: build/templates/build/complete.html:6
|
||||||
#: stock/templates/stock/item_base.html:216 templates/js/build.html:33
|
#: stock/templates/stock/item_base.html:213 templates/js/build.html:33
|
||||||
#: templates/navbar.html:12
|
#: templates/navbar.html:12
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Bau"
|
msgstr "Bau"
|
||||||
@ -563,7 +563,7 @@ msgstr "Bau-Status"
|
|||||||
#: build/templates/build/build_base.html:80
|
#: build/templates/build/build_base.html:80
|
||||||
#: build/templates/build/detail.html:42
|
#: build/templates/build/detail.html:42
|
||||||
#: order/templates/order/receive_parts.html:24
|
#: order/templates/order/receive_parts.html:24
|
||||||
#: stock/templates/stock/item_base.html:269 templates/js/barcode.html:42
|
#: stock/templates/stock/item_base.html:266 templates/js/barcode.html:42
|
||||||
#: templates/js/build.html:57 templates/js/order.html:162
|
#: templates/js/build.html:57 templates/js/order.html:162
|
||||||
#: templates/js/order.html:235 templates/js/stock.html:495
|
#: templates/js/order.html:235 templates/js/stock.html:495
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
@ -575,7 +575,7 @@ msgstr "Status"
|
|||||||
#: order/templates/order/sales_order_notes.html:10
|
#: order/templates/order/sales_order_notes.html:10
|
||||||
#: order/templates/order/sales_order_ship.html:25
|
#: order/templates/order/sales_order_ship.html:25
|
||||||
#: part/templates/part/allocation.html:27
|
#: part/templates/part/allocation.html:27
|
||||||
#: stock/templates/stock/item_base.html:179 templates/js/order.html:209
|
#: stock/templates/stock/item_base.html:176 templates/js/order.html:209
|
||||||
msgid "Sales Order"
|
msgid "Sales Order"
|
||||||
msgstr "Bestellung"
|
msgstr "Bestellung"
|
||||||
|
|
||||||
@ -644,7 +644,7 @@ msgid "Stock can be taken from any available location."
|
|||||||
msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden."
|
msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden."
|
||||||
|
|
||||||
#: build/templates/build/detail.html:48
|
#: build/templates/build/detail.html:48
|
||||||
#: stock/templates/stock/item_base.html:209 templates/js/stock.html:503
|
#: stock/templates/stock/item_base.html:206 templates/js/stock.html:503
|
||||||
msgid "Batch"
|
msgid "Batch"
|
||||||
msgstr "Los"
|
msgstr "Los"
|
||||||
|
|
||||||
@ -942,8 +942,8 @@ msgstr "Kaufen Sie Teile von dieser Firma?"
|
|||||||
msgid "Does this company manufacture parts?"
|
msgid "Does this company manufacture parts?"
|
||||||
msgstr "Produziert diese Firma Teile?"
|
msgstr "Produziert diese Firma Teile?"
|
||||||
|
|
||||||
#: company/models.py:279 stock/models.py:324
|
#: company/models.py:279 stock/models.py:319
|
||||||
#: stock/templates/stock/item_base.html:145
|
#: stock/templates/stock/item_base.html:142
|
||||||
msgid "Base Part"
|
msgid "Base Part"
|
||||||
msgstr "Basisteil"
|
msgstr "Basisteil"
|
||||||
|
|
||||||
@ -1016,14 +1016,14 @@ msgstr "Hersteller"
|
|||||||
#: company/templates/company/supplier_part_detail.html:21 order/models.py:148
|
#: company/templates/company/supplier_part_detail.html:21 order/models.py:148
|
||||||
#: order/templates/order/order_base.html:74
|
#: order/templates/order/order_base.html:74
|
||||||
#: order/templates/order/order_wizard/select_pos.html:30
|
#: order/templates/order/order_wizard/select_pos.html:30
|
||||||
#: stock/templates/stock/item_base.html:244 templates/js/company.html:52
|
#: stock/templates/stock/item_base.html:241 templates/js/company.html:52
|
||||||
#: templates/js/company.html:134 templates/js/order.html:144
|
#: templates/js/company.html:134 templates/js/order.html:144
|
||||||
msgid "Supplier"
|
msgid "Supplier"
|
||||||
msgstr "Zulieferer"
|
msgstr "Zulieferer"
|
||||||
|
|
||||||
#: company/templates/company/detail.html:26 order/models.py:314
|
#: company/templates/company/detail.html:26 order/models.py:314
|
||||||
#: order/templates/order/sales_order_base.html:73 stock/models.py:359
|
#: order/templates/order/sales_order_base.html:73 stock/models.py:354
|
||||||
#: stock/models.py:360 stock/templates/stock/item_base.html:166
|
#: stock/models.py:355 stock/templates/stock/item_base.html:163
|
||||||
#: templates/js/company.html:44 templates/js/order.html:217
|
#: templates/js/company.html:44 templates/js/order.html:217
|
||||||
msgid "Customer"
|
msgid "Customer"
|
||||||
msgstr "Kunde"
|
msgstr "Kunde"
|
||||||
@ -1137,8 +1137,8 @@ msgid "New Sales Order"
|
|||||||
msgstr "Neuer Auftrag"
|
msgstr "Neuer Auftrag"
|
||||||
|
|
||||||
#: company/templates/company/supplier_part_base.html:6
|
#: company/templates/company/supplier_part_base.html:6
|
||||||
#: company/templates/company/supplier_part_base.html:19 stock/models.py:333
|
#: company/templates/company/supplier_part_base.html:19 stock/models.py:328
|
||||||
#: stock/templates/stock/item_base.html:249 templates/js/company.html:150
|
#: stock/templates/stock/item_base.html:246 templates/js/company.html:150
|
||||||
msgid "Supplier Part"
|
msgid "Supplier Part"
|
||||||
msgstr "Zulieferer-Teil"
|
msgstr "Zulieferer-Teil"
|
||||||
|
|
||||||
@ -1410,8 +1410,8 @@ msgstr "Bestell-Notizen"
|
|||||||
msgid "Supplier order reference code"
|
msgid "Supplier order reference code"
|
||||||
msgstr "Bestellreferenz"
|
msgstr "Bestellreferenz"
|
||||||
|
|
||||||
#: order/models.py:185 order/models.py:259 part/views.py:1167
|
#: order/models.py:185 order/models.py:259 part/views.py:1250
|
||||||
#: stock/models.py:238 stock/models.py:687
|
#: stock/models.py:239 stock/models.py:682
|
||||||
msgid "Quantity must be greater than zero"
|
msgid "Quantity must be greater than zero"
|
||||||
msgstr "Anzahl muss größer Null sein"
|
msgstr "Anzahl muss größer Null sein"
|
||||||
|
|
||||||
@ -1445,7 +1445,7 @@ msgstr "Position - Notizen"
|
|||||||
|
|
||||||
#: order/models.py:466 order/templates/order/order_base.html:9
|
#: order/models.py:466 order/templates/order/order_base.html:9
|
||||||
#: order/templates/order/order_base.html:23
|
#: order/templates/order/order_base.html:23
|
||||||
#: stock/templates/stock/item_base.html:223 templates/js/order.html:136
|
#: stock/templates/stock/item_base.html:220 templates/js/order.html:136
|
||||||
msgid "Purchase Order"
|
msgid "Purchase Order"
|
||||||
msgstr "Kaufvertrag"
|
msgstr "Kaufvertrag"
|
||||||
|
|
||||||
@ -1869,16 +1869,16 @@ msgstr "Zuordnung bearbeiten"
|
|||||||
msgid "Remove allocation"
|
msgid "Remove allocation"
|
||||||
msgstr "Zuordnung entfernen"
|
msgstr "Zuordnung entfernen"
|
||||||
|
|
||||||
#: part/bom.py:140
|
#: part/bom.py:144
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Unsupported file format: {f}"
|
msgid "Unsupported file format: {f}"
|
||||||
msgstr "Nicht unterstütztes Dateiformat: {f}"
|
msgstr "Nicht unterstütztes Dateiformat: {f}"
|
||||||
|
|
||||||
#: part/bom.py:145
|
#: part/bom.py:149
|
||||||
msgid "Error reading BOM file (invalid data)"
|
msgid "Error reading BOM file (invalid data)"
|
||||||
msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)"
|
msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)"
|
||||||
|
|
||||||
#: part/bom.py:147
|
#: part/bom.py:151
|
||||||
msgid "Error reading BOM file (incorrect row size)"
|
msgid "Error reading BOM file (incorrect row size)"
|
||||||
msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)"
|
msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)"
|
||||||
|
|
||||||
@ -1898,33 +1898,41 @@ msgstr "Kaskadierend"
|
|||||||
msgid "Download cascading / multi-level BOM"
|
msgid "Download cascading / multi-level BOM"
|
||||||
msgstr "Kaskadierende Stückliste herunterladen"
|
msgstr "Kaskadierende Stückliste herunterladen"
|
||||||
|
|
||||||
#: part/forms.py:76
|
#: part/forms.py:59
|
||||||
|
msgid "Levels"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/forms.py:59
|
||||||
|
msgid "Select maximum number of BOM levels to export (0 = all levels)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/forms.py:78
|
||||||
msgid "Confirm that the BOM is correct"
|
msgid "Confirm that the BOM is correct"
|
||||||
msgstr "Bestätigen, dass die Stückliste korrekt ist"
|
msgstr "Bestätigen, dass die Stückliste korrekt ist"
|
||||||
|
|
||||||
#: part/forms.py:88
|
#: part/forms.py:90
|
||||||
msgid "Select BOM file to upload"
|
msgid "Select BOM file to upload"
|
||||||
msgstr "Stücklisten-Datei zum Upload auswählen"
|
msgstr "Stücklisten-Datei zum Upload auswählen"
|
||||||
|
|
||||||
#: part/forms.py:112
|
#: part/forms.py:114
|
||||||
msgid "Select part category"
|
msgid "Select part category"
|
||||||
msgstr "Teilekategorie wählen"
|
msgstr "Teilekategorie wählen"
|
||||||
|
|
||||||
#: part/forms.py:126
|
#: part/forms.py:128
|
||||||
msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
|
msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Tiefe Kopie ausführen. Dies wird alle Daten der Stückliste für dieses Teil "
|
"Tiefe Kopie ausführen. Dies wird alle Daten der Stückliste für dieses Teil "
|
||||||
"duplizieren"
|
"duplizieren"
|
||||||
|
|
||||||
#: part/forms.py:131
|
#: part/forms.py:133
|
||||||
msgid "Confirm part creation"
|
msgid "Confirm part creation"
|
||||||
msgstr "Erstellen des Teils bestätigen"
|
msgstr "Erstellen des Teils bestätigen"
|
||||||
|
|
||||||
#: part/forms.py:221
|
#: part/forms.py:223
|
||||||
msgid "Input quantity for price calculation"
|
msgid "Input quantity for price calculation"
|
||||||
msgstr "Eintragsmenge zur Preisberechnung"
|
msgstr "Eintragsmenge zur Preisberechnung"
|
||||||
|
|
||||||
#: part/forms.py:224
|
#: part/forms.py:226
|
||||||
msgid "Select currency for price calculation"
|
msgid "Select currency for price calculation"
|
||||||
msgstr "Währung zur Preisberechnung wählen"
|
msgstr "Währung zur Preisberechnung wählen"
|
||||||
|
|
||||||
@ -2037,13 +2045,13 @@ msgstr "Bemerkungen - unterstüzt Markdown-Formatierung"
|
|||||||
msgid "Stored BOM checksum"
|
msgid "Stored BOM checksum"
|
||||||
msgstr "Prüfsumme der Stückliste gespeichert"
|
msgstr "Prüfsumme der Stückliste gespeichert"
|
||||||
|
|
||||||
#: part/models.py:1222
|
#: part/models.py:1223
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Stock item cannot be created for a template Part"
|
#| msgid "Stock item cannot be created for a template Part"
|
||||||
msgid "Test templates can only be created for trackable parts"
|
msgid "Test templates can only be created for trackable parts"
|
||||||
msgstr "Lagerobjekt kann nicht für Vorlagen-Teile angelegt werden"
|
msgstr "Lagerobjekt kann nicht für Vorlagen-Teile angelegt werden"
|
||||||
|
|
||||||
#: part/models.py:1239
|
#: part/models.py:1240
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid ""
|
#| msgid ""
|
||||||
#| "A stock item with this serial number already exists for template part "
|
#| "A stock item with this serial number already exists for template part "
|
||||||
@ -2053,122 +2061,123 @@ msgstr ""
|
|||||||
"Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage "
|
"Ein Teil mit dieser Seriennummer existiert bereits für die Teilevorlage "
|
||||||
"{part}"
|
"{part}"
|
||||||
|
|
||||||
#: part/models.py:1258 templates/js/part.html:350 templates/js/stock.html:90
|
#: part/models.py:1259 templates/js/part.html:350 templates/js/stock.html:90
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Instance Name"
|
#| msgid "Instance Name"
|
||||||
msgid "Test Name"
|
msgid "Test Name"
|
||||||
msgstr "Instanzname"
|
msgstr "Instanzname"
|
||||||
|
|
||||||
#: part/models.py:1259
|
#: part/models.py:1260
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Serial number for this item"
|
#| msgid "Serial number for this item"
|
||||||
msgid "Enter a name for the test"
|
msgid "Enter a name for the test"
|
||||||
msgstr "Seriennummer für dieses Teil"
|
msgstr "Seriennummer für dieses Teil"
|
||||||
|
|
||||||
#: part/models.py:1264
|
#: part/models.py:1265
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Description"
|
#| msgid "Description"
|
||||||
msgid "Test Description"
|
msgid "Test Description"
|
||||||
msgstr "Beschreibung"
|
msgstr "Beschreibung"
|
||||||
|
|
||||||
#: part/models.py:1265
|
#: part/models.py:1266
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Brief description of the build"
|
#| msgid "Brief description of the build"
|
||||||
msgid "Enter description for this test"
|
msgid "Enter description for this test"
|
||||||
msgstr "Kurze Beschreibung des Baus"
|
msgstr "Kurze Beschreibung des Baus"
|
||||||
|
|
||||||
#: part/models.py:1271
|
#: part/models.py:1272
|
||||||
msgid "Is this test required to pass?"
|
msgid "Is this test required to pass?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1276 templates/js/part.html:367
|
#: part/models.py:1277 templates/js/part.html:367
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Required Parts"
|
#| msgid "Required Parts"
|
||||||
msgid "Requires Value"
|
msgid "Requires Value"
|
||||||
msgstr "benötigte Teile"
|
msgstr "benötigte Teile"
|
||||||
|
|
||||||
#: part/models.py:1277
|
#: part/models.py:1278
|
||||||
msgid "Does this test require a value when adding a test result?"
|
msgid "Does this test require a value when adding a test result?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1282 templates/js/part.html:374
|
#: part/models.py:1283 templates/js/part.html:374
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Delete Attachment"
|
#| msgid "Delete Attachment"
|
||||||
msgid "Requires Attachment"
|
msgid "Requires Attachment"
|
||||||
msgstr "Anhang löschen"
|
msgstr "Anhang löschen"
|
||||||
|
|
||||||
#: part/models.py:1283
|
#: part/models.py:1284
|
||||||
msgid "Does this test require a file attachment when adding a test result?"
|
msgid "Does this test require a file attachment when adding a test result?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1316
|
#: part/models.py:1317
|
||||||
msgid "Parameter template name must be unique"
|
msgid "Parameter template name must be unique"
|
||||||
msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
|
msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
|
||||||
|
|
||||||
#: part/models.py:1321
|
#: part/models.py:1322
|
||||||
msgid "Parameter Name"
|
msgid "Parameter Name"
|
||||||
msgstr "Name des Parameters"
|
msgstr "Name des Parameters"
|
||||||
|
|
||||||
#: part/models.py:1323
|
#: part/models.py:1324
|
||||||
msgid "Parameter Units"
|
msgid "Parameter Units"
|
||||||
msgstr "Parameter Einheit"
|
msgstr "Parameter Einheit"
|
||||||
|
|
||||||
#: part/models.py:1349
|
#: part/models.py:1350
|
||||||
msgid "Parent Part"
|
msgid "Parent Part"
|
||||||
msgstr "Ausgangsteil"
|
msgstr "Ausgangsteil"
|
||||||
|
|
||||||
#: part/models.py:1351
|
#: part/models.py:1352
|
||||||
msgid "Parameter Template"
|
msgid "Parameter Template"
|
||||||
msgstr "Parameter Vorlage"
|
msgstr "Parameter Vorlage"
|
||||||
|
|
||||||
#: part/models.py:1353
|
#: part/models.py:1354
|
||||||
msgid "Parameter Value"
|
msgid "Parameter Value"
|
||||||
msgstr "Parameter Wert"
|
msgstr "Parameter Wert"
|
||||||
|
|
||||||
#: part/models.py:1382
|
#: part/models.py:1383
|
||||||
msgid "Select parent part"
|
msgid "Select parent part"
|
||||||
msgstr "Ausgangsteil auswählen"
|
msgstr "Ausgangsteil auswählen"
|
||||||
|
|
||||||
#: part/models.py:1390
|
#: part/models.py:1391
|
||||||
msgid "Select part to be used in BOM"
|
msgid "Select part to be used in BOM"
|
||||||
msgstr "Teil für die Nutzung in der Stückliste auswählen"
|
msgstr "Teil für die Nutzung in der Stückliste auswählen"
|
||||||
|
|
||||||
#: part/models.py:1396
|
#: part/models.py:1397
|
||||||
msgid "BOM quantity for this BOM item"
|
msgid "BOM quantity for this BOM item"
|
||||||
msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
|
msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
|
||||||
|
|
||||||
#: part/models.py:1399
|
#: part/models.py:1400
|
||||||
msgid "Estimated build wastage quantity (absolute or percentage)"
|
msgid "Estimated build wastage quantity (absolute or percentage)"
|
||||||
msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
|
msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
|
||||||
|
|
||||||
#: part/models.py:1402
|
#: part/models.py:1403
|
||||||
msgid "BOM item reference"
|
msgid "BOM item reference"
|
||||||
msgstr "Referenz des Objekts auf der Stückliste"
|
msgstr "Referenz des Objekts auf der Stückliste"
|
||||||
|
|
||||||
#: part/models.py:1405
|
#: part/models.py:1406
|
||||||
msgid "BOM item notes"
|
msgid "BOM item notes"
|
||||||
msgstr "Notizen zum Stücklisten-Objekt"
|
msgstr "Notizen zum Stücklisten-Objekt"
|
||||||
|
|
||||||
#: part/models.py:1407
|
#: part/models.py:1408
|
||||||
msgid "BOM line checksum"
|
msgid "BOM line checksum"
|
||||||
msgstr "Prüfsumme der Stückliste"
|
msgstr "Prüfsumme der Stückliste"
|
||||||
|
|
||||||
#: part/models.py:1471 stock/models.py:228
|
#: part/models.py:1472 part/views.py:1256 part/views.py:1308
|
||||||
|
#: stock/models.py:229
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Overage must be an integer value or a percentage"
|
#| msgid "Overage must be an integer value or a percentage"
|
||||||
msgid "Quantity must be integer value for trackable parts"
|
msgid "Quantity must be integer value for trackable parts"
|
||||||
msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein"
|
msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein"
|
||||||
|
|
||||||
#: part/models.py:1480
|
#: part/models.py:1481
|
||||||
msgid "Part cannot be added to its own Bill of Materials"
|
msgid "Part cannot be added to its own Bill of Materials"
|
||||||
msgstr "Teil kann nicht zu seiner eigenen Stückliste hinzugefügt werden"
|
msgstr "Teil kann nicht zu seiner eigenen Stückliste hinzugefügt werden"
|
||||||
|
|
||||||
#: part/models.py:1487
|
#: part/models.py:1488
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
|
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
|
||||||
msgstr "Teil '{p1}' wird in Stückliste für Teil '{p2}' benutzt (rekursiv)"
|
msgstr "Teil '{p1}' wird in Stückliste für Teil '{p2}' benutzt (rekursiv)"
|
||||||
|
|
||||||
#: part/models.py:1494
|
#: part/models.py:1495
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "New BOM Item"
|
#| msgid "New BOM Item"
|
||||||
msgid "BOM Item"
|
msgid "BOM Item"
|
||||||
@ -2189,14 +2198,14 @@ msgstr "Bestellung"
|
|||||||
#: part/templates/part/allocation.html:45
|
#: part/templates/part/allocation.html:45
|
||||||
#: stock/templates/stock/item_base.html:8
|
#: stock/templates/stock/item_base.html:8
|
||||||
#: stock/templates/stock/item_base.html:58
|
#: stock/templates/stock/item_base.html:58
|
||||||
#: stock/templates/stock/item_base.html:231
|
#: stock/templates/stock/item_base.html:228
|
||||||
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:106
|
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:106
|
||||||
#: templates/js/stock.html:643
|
#: templates/js/stock.html:643
|
||||||
msgid "Stock Item"
|
msgid "Stock Item"
|
||||||
msgstr "Lagerobjekt"
|
msgstr "Lagerobjekt"
|
||||||
|
|
||||||
#: part/templates/part/allocation.html:20
|
#: part/templates/part/allocation.html:20
|
||||||
#: stock/templates/stock/item_base.html:185
|
#: stock/templates/stock/item_base.html:182
|
||||||
msgid "Build Order"
|
msgid "Build Order"
|
||||||
msgstr "Bauauftrag"
|
msgstr "Bauauftrag"
|
||||||
|
|
||||||
@ -2232,10 +2241,94 @@ msgstr "Stückliste bearbeiten"
|
|||||||
msgid "Validate Bill of Materials"
|
msgid "Validate Bill of Materials"
|
||||||
msgstr "Stückliste validieren"
|
msgstr "Stückliste validieren"
|
||||||
|
|
||||||
#: part/templates/part/bom.html:46 part/views.py:1412
|
#: part/templates/part/bom.html:46 part/views.py:1523
|
||||||
msgid "Export Bill of Materials"
|
msgid "Export Bill of Materials"
|
||||||
msgstr "Stückliste exportieren"
|
msgstr "Stückliste exportieren"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:8
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:8
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:10
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Export Bill of Materials"
|
||||||
|
msgid "Upload Bill of Materials"
|
||||||
|
msgstr "Stückliste exportieren"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:10
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Step 1 of 2 - Select Part Suppliers"
|
||||||
|
msgid "Step 2 - Select Fields"
|
||||||
|
msgstr "Schritt 1 von 2 - Zulieferer auswählen"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:15
|
||||||
|
msgid "Missing selections for the following required columns"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:26
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Sublocations"
|
||||||
|
msgid "Submit Selections"
|
||||||
|
msgstr "Sub-Standorte"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:35
|
||||||
|
msgid "File Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:52
|
||||||
|
msgid "Match Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:10
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Step 1 of 2 - Select Part Suppliers"
|
||||||
|
msgid "Step 3 - Select Parts"
|
||||||
|
msgstr "Schritt 1 von 2 - Zulieferer auswählen"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:15
|
||||||
|
msgid "Errors exist in the submitted data"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:21
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Edit BOM"
|
||||||
|
msgid "Submit BOM"
|
||||||
|
msgstr "Stückliste bearbeiten"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:33
|
||||||
|
msgid "Row"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:34
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:63
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Select part"
|
||||||
|
msgid "Select Part"
|
||||||
|
msgstr "Teil auswählen"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:13
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Step 1 of 2 - Select Part Suppliers"
|
||||||
|
msgid "Step 1 - Select BOM File"
|
||||||
|
msgstr "Schritt 1 von 2 - Zulieferer auswählen"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:16
|
||||||
|
msgid "Requirements for BOM upload"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:18
|
||||||
|
msgid ""
|
||||||
|
"The BOM file must contain the required named columns as provided in the "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:18
|
||||||
|
#, fuzzy
|
||||||
|
#| msgid "Upload new image"
|
||||||
|
msgid "BOM Upload Template"
|
||||||
|
msgstr "Neues Bild hochladen"
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:19
|
||||||
|
msgid "Each part must already exist in the database"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/category.html:14
|
#: part/templates/part/category.html:14
|
||||||
msgid "All parts"
|
msgid "All parts"
|
||||||
msgstr "Alle Teile"
|
msgstr "Alle Teile"
|
||||||
@ -2440,7 +2533,7 @@ msgstr "Parameter hinzufügen"
|
|||||||
msgid "New Parameter"
|
msgid "New Parameter"
|
||||||
msgstr "Neuer Parameter"
|
msgstr "Neuer Parameter"
|
||||||
|
|
||||||
#: part/templates/part/params.html:21 stock/models.py:1274
|
#: part/templates/part/params.html:21 stock/models.py:1269
|
||||||
#: templates/js/stock.html:110
|
#: templates/js/stock.html:110
|
||||||
msgid "Value"
|
msgid "Value"
|
||||||
msgstr "Wert"
|
msgstr "Wert"
|
||||||
@ -2647,7 +2740,7 @@ msgstr "Stückliste"
|
|||||||
msgid "Used In"
|
msgid "Used In"
|
||||||
msgstr "Benutzt in"
|
msgstr "Benutzt in"
|
||||||
|
|
||||||
#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:275
|
#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:272
|
||||||
msgid "Tests"
|
msgid "Tests"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2758,91 +2851,91 @@ msgstr "Teileigenschaften bearbeiten"
|
|||||||
msgid "Validate BOM"
|
msgid "Validate BOM"
|
||||||
msgstr "BOM validieren"
|
msgstr "BOM validieren"
|
||||||
|
|
||||||
#: part/views.py:908
|
#: part/views.py:909
|
||||||
msgid "No BOM file provided"
|
msgid "No BOM file provided"
|
||||||
msgstr "Keine Stückliste angegeben"
|
msgstr "Keine Stückliste angegeben"
|
||||||
|
|
||||||
#: part/views.py:1169
|
#: part/views.py:1259
|
||||||
msgid "Enter a valid quantity"
|
msgid "Enter a valid quantity"
|
||||||
msgstr "Bitte eine gültige Anzahl eingeben"
|
msgstr "Bitte eine gültige Anzahl eingeben"
|
||||||
|
|
||||||
#: part/views.py:1193 part/views.py:1196
|
#: part/views.py:1284 part/views.py:1287
|
||||||
msgid "Select valid part"
|
msgid "Select valid part"
|
||||||
msgstr "Bitte ein gültiges Teil auswählen"
|
msgstr "Bitte ein gültiges Teil auswählen"
|
||||||
|
|
||||||
#: part/views.py:1202
|
#: part/views.py:1293
|
||||||
msgid "Duplicate part selected"
|
msgid "Duplicate part selected"
|
||||||
msgstr "Teil doppelt ausgewählt"
|
msgstr "Teil doppelt ausgewählt"
|
||||||
|
|
||||||
#: part/views.py:1230
|
#: part/views.py:1329
|
||||||
msgid "Select a part"
|
msgid "Select a part"
|
||||||
msgstr "Teil auswählen"
|
msgstr "Teil auswählen"
|
||||||
|
|
||||||
#: part/views.py:1234
|
#: part/views.py:1333
|
||||||
msgid "Specify quantity"
|
msgid "Specify quantity"
|
||||||
msgstr "Anzahl angeben"
|
msgstr "Anzahl angeben"
|
||||||
|
|
||||||
#: part/views.py:1450
|
#: part/views.py:1565
|
||||||
msgid "Confirm Part Deletion"
|
msgid "Confirm Part Deletion"
|
||||||
msgstr "Löschen des Teils bestätigen"
|
msgstr "Löschen des Teils bestätigen"
|
||||||
|
|
||||||
#: part/views.py:1457
|
#: part/views.py:1572
|
||||||
msgid "Part was deleted"
|
msgid "Part was deleted"
|
||||||
msgstr "Teil wurde gelöscht"
|
msgstr "Teil wurde gelöscht"
|
||||||
|
|
||||||
#: part/views.py:1466
|
#: part/views.py:1581
|
||||||
msgid "Part Pricing"
|
msgid "Part Pricing"
|
||||||
msgstr "Teilbepreisung"
|
msgstr "Teilbepreisung"
|
||||||
|
|
||||||
#: part/views.py:1588
|
#: part/views.py:1703
|
||||||
msgid "Create Part Parameter Template"
|
msgid "Create Part Parameter Template"
|
||||||
msgstr "Teilparametervorlage anlegen"
|
msgstr "Teilparametervorlage anlegen"
|
||||||
|
|
||||||
#: part/views.py:1596
|
#: part/views.py:1711
|
||||||
msgid "Edit Part Parameter Template"
|
msgid "Edit Part Parameter Template"
|
||||||
msgstr "Teilparametervorlage bearbeiten"
|
msgstr "Teilparametervorlage bearbeiten"
|
||||||
|
|
||||||
#: part/views.py:1603
|
#: part/views.py:1718
|
||||||
msgid "Delete Part Parameter Template"
|
msgid "Delete Part Parameter Template"
|
||||||
msgstr "Teilparametervorlage löschen"
|
msgstr "Teilparametervorlage löschen"
|
||||||
|
|
||||||
#: part/views.py:1611
|
#: part/views.py:1726
|
||||||
msgid "Create Part Parameter"
|
msgid "Create Part Parameter"
|
||||||
msgstr "Teilparameter anlegen"
|
msgstr "Teilparameter anlegen"
|
||||||
|
|
||||||
#: part/views.py:1661
|
#: part/views.py:1776
|
||||||
msgid "Edit Part Parameter"
|
msgid "Edit Part Parameter"
|
||||||
msgstr "Teilparameter bearbeiten"
|
msgstr "Teilparameter bearbeiten"
|
||||||
|
|
||||||
#: part/views.py:1675
|
#: part/views.py:1790
|
||||||
msgid "Delete Part Parameter"
|
msgid "Delete Part Parameter"
|
||||||
msgstr "Teilparameter löschen"
|
msgstr "Teilparameter löschen"
|
||||||
|
|
||||||
#: part/views.py:1691
|
#: part/views.py:1806
|
||||||
msgid "Edit Part Category"
|
msgid "Edit Part Category"
|
||||||
msgstr "Teilkategorie bearbeiten"
|
msgstr "Teilkategorie bearbeiten"
|
||||||
|
|
||||||
#: part/views.py:1726
|
#: part/views.py:1841
|
||||||
msgid "Delete Part Category"
|
msgid "Delete Part Category"
|
||||||
msgstr "Teilkategorie löschen"
|
msgstr "Teilkategorie löschen"
|
||||||
|
|
||||||
#: part/views.py:1732
|
#: part/views.py:1847
|
||||||
msgid "Part category was deleted"
|
msgid "Part category was deleted"
|
||||||
msgstr "Teilekategorie wurde gelöscht"
|
msgstr "Teilekategorie wurde gelöscht"
|
||||||
|
|
||||||
#: part/views.py:1740
|
#: part/views.py:1855
|
||||||
msgid "Create new part category"
|
msgid "Create new part category"
|
||||||
msgstr "Teilkategorie anlegen"
|
msgstr "Teilkategorie anlegen"
|
||||||
|
|
||||||
#: part/views.py:1791
|
#: part/views.py:1906
|
||||||
msgid "Create BOM item"
|
msgid "Create BOM item"
|
||||||
msgstr "BOM-Position anlegen"
|
msgstr "BOM-Position anlegen"
|
||||||
|
|
||||||
#: part/views.py:1857
|
#: part/views.py:1972
|
||||||
msgid "Edit BOM item"
|
msgid "Edit BOM item"
|
||||||
msgstr "BOM-Position beaarbeiten"
|
msgstr "BOM-Position beaarbeiten"
|
||||||
|
|
||||||
#: part/views.py:1905
|
#: part/views.py:2020
|
||||||
msgid "Confim BOM item deletion"
|
msgid "Confim BOM item deletion"
|
||||||
msgstr "Löschung von BOM-Position bestätigen"
|
msgstr "Löschung von BOM-Position bestätigen"
|
||||||
|
|
||||||
@ -2902,226 +2995,226 @@ msgstr "Bewegung der Lagerobjekte bestätigen"
|
|||||||
msgid "Set the destination as the default location for selected parts"
|
msgid "Set the destination as the default location for selected parts"
|
||||||
msgstr "Setze das Ziel als Standard-Ziel für ausgewählte Teile"
|
msgstr "Setze das Ziel als Standard-Ziel für ausgewählte Teile"
|
||||||
|
|
||||||
#: stock/models.py:209
|
#: stock/models.py:210
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "A stock item with this serial number already exists"
|
#| msgid "A stock item with this serial number already exists"
|
||||||
msgid "StockItem with this serial number already exists"
|
msgid "StockItem with this serial number already exists"
|
||||||
msgstr "Ein Teil mit dieser Seriennummer existiert bereits"
|
msgstr "Ein Teil mit dieser Seriennummer existiert bereits"
|
||||||
|
|
||||||
#: stock/models.py:245
|
#: stock/models.py:246
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Part type ('{pf}') must be {pe}"
|
msgid "Part type ('{pf}') must be {pe}"
|
||||||
msgstr "Teile-Typ ('{pf}') muss {pe} sein"
|
msgstr "Teile-Typ ('{pf}') muss {pe} sein"
|
||||||
|
|
||||||
#: stock/models.py:255 stock/models.py:264
|
#: stock/models.py:256 stock/models.py:265
|
||||||
msgid "Quantity must be 1 for item with a serial number"
|
msgid "Quantity must be 1 for item with a serial number"
|
||||||
msgstr "Anzahl muss für Objekte mit Seriennummer \"1\" sein"
|
msgstr "Anzahl muss für Objekte mit Seriennummer \"1\" sein"
|
||||||
|
|
||||||
#: stock/models.py:256
|
#: stock/models.py:257
|
||||||
msgid "Serial number cannot be set if quantity greater than 1"
|
msgid "Serial number cannot be set if quantity greater than 1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Seriennummer kann nicht gesetzt werden wenn die Anzahl größer als \"1\" ist"
|
"Seriennummer kann nicht gesetzt werden wenn die Anzahl größer als \"1\" ist"
|
||||||
|
|
||||||
#: stock/models.py:277
|
#: stock/models.py:278
|
||||||
msgid "Item cannot belong to itself"
|
msgid "Item cannot belong to itself"
|
||||||
msgstr "Teil kann nicht zu sich selbst gehören"
|
msgstr "Teil kann nicht zu sich selbst gehören"
|
||||||
|
|
||||||
#: stock/models.py:316
|
#: stock/models.py:311
|
||||||
msgid "Parent Stock Item"
|
msgid "Parent Stock Item"
|
||||||
msgstr "Eltern-Lagerobjekt"
|
msgstr "Eltern-Lagerobjekt"
|
||||||
|
|
||||||
#: stock/models.py:325
|
#: stock/models.py:320
|
||||||
msgid "Base part"
|
msgid "Base part"
|
||||||
msgstr "Basis-Teil"
|
msgstr "Basis-Teil"
|
||||||
|
|
||||||
#: stock/models.py:334
|
#: stock/models.py:329
|
||||||
msgid "Select a matching supplier part for this stock item"
|
msgid "Select a matching supplier part for this stock item"
|
||||||
msgstr "Passenden Zulieferer für dieses Lagerobjekt auswählen"
|
msgstr "Passenden Zulieferer für dieses Lagerobjekt auswählen"
|
||||||
|
|
||||||
#: stock/models.py:339 stock/templates/stock/stock_app_base.html:7
|
#: stock/models.py:334 stock/templates/stock/stock_app_base.html:7
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Lagerort"
|
msgstr "Lagerort"
|
||||||
|
|
||||||
#: stock/models.py:342
|
#: stock/models.py:337
|
||||||
msgid "Where is this stock item located?"
|
msgid "Where is this stock item located?"
|
||||||
msgstr "Wo wird dieses Teil normalerweise gelagert?"
|
msgstr "Wo wird dieses Teil normalerweise gelagert?"
|
||||||
|
|
||||||
#: stock/models.py:347
|
#: stock/models.py:342
|
||||||
msgid "Installed In"
|
msgid "Installed In"
|
||||||
msgstr "Installiert in"
|
msgstr "Installiert in"
|
||||||
|
|
||||||
#: stock/models.py:350
|
#: stock/models.py:345
|
||||||
msgid "Is this item installed in another item?"
|
msgid "Is this item installed in another item?"
|
||||||
msgstr "Ist dieses Teil in einem anderen verbaut?"
|
msgstr "Ist dieses Teil in einem anderen verbaut?"
|
||||||
|
|
||||||
#: stock/models.py:366
|
#: stock/models.py:361
|
||||||
msgid "Serial number for this item"
|
msgid "Serial number for this item"
|
||||||
msgstr "Seriennummer für dieses Teil"
|
msgstr "Seriennummer für dieses Teil"
|
||||||
|
|
||||||
#: stock/models.py:378
|
#: stock/models.py:373
|
||||||
msgid "Batch code for this stock item"
|
msgid "Batch code for this stock item"
|
||||||
msgstr "Losnummer für dieses Lagerobjekt"
|
msgstr "Losnummer für dieses Lagerobjekt"
|
||||||
|
|
||||||
#: stock/models.py:382
|
#: stock/models.py:377
|
||||||
msgid "Stock Quantity"
|
msgid "Stock Quantity"
|
||||||
msgstr "Bestand"
|
msgstr "Bestand"
|
||||||
|
|
||||||
#: stock/models.py:391
|
#: stock/models.py:386
|
||||||
msgid "Source Build"
|
msgid "Source Build"
|
||||||
msgstr "Quellbau"
|
msgstr "Quellbau"
|
||||||
|
|
||||||
#: stock/models.py:393
|
#: stock/models.py:388
|
||||||
msgid "Build for this stock item"
|
msgid "Build for this stock item"
|
||||||
msgstr "Bau für dieses Lagerobjekt"
|
msgstr "Bau für dieses Lagerobjekt"
|
||||||
|
|
||||||
#: stock/models.py:400
|
#: stock/models.py:395
|
||||||
msgid "Source Purchase Order"
|
msgid "Source Purchase Order"
|
||||||
msgstr "Quellbestellung"
|
msgstr "Quellbestellung"
|
||||||
|
|
||||||
#: stock/models.py:403
|
#: stock/models.py:398
|
||||||
msgid "Purchase order for this stock item"
|
msgid "Purchase order for this stock item"
|
||||||
msgstr "Bestellung für dieses Teil"
|
msgstr "Bestellung für dieses Teil"
|
||||||
|
|
||||||
#: stock/models.py:409
|
#: stock/models.py:404
|
||||||
msgid "Destination Sales Order"
|
msgid "Destination Sales Order"
|
||||||
msgstr "Zielauftrag"
|
msgstr "Zielauftrag"
|
||||||
|
|
||||||
#: stock/models.py:416
|
#: stock/models.py:411
|
||||||
msgid "Destination Build Order"
|
msgid "Destination Build Order"
|
||||||
msgstr "Zielbauauftrag"
|
msgstr "Zielbauauftrag"
|
||||||
|
|
||||||
#: stock/models.py:429
|
#: stock/models.py:424
|
||||||
msgid "Delete this Stock Item when stock is depleted"
|
msgid "Delete this Stock Item when stock is depleted"
|
||||||
msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
|
msgstr "Objekt löschen wenn Lagerbestand aufgebraucht"
|
||||||
|
|
||||||
#: stock/models.py:439 stock/templates/stock/item_notes.html:14
|
#: stock/models.py:434 stock/templates/stock/item_notes.html:14
|
||||||
#: stock/templates/stock/item_notes.html:30
|
#: stock/templates/stock/item_notes.html:30
|
||||||
msgid "Stock Item Notes"
|
msgid "Stock Item Notes"
|
||||||
msgstr "Lagerobjekt-Notizen"
|
msgstr "Lagerobjekt-Notizen"
|
||||||
|
|
||||||
#: stock/models.py:490
|
#: stock/models.py:485
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Item assigned to customer?"
|
#| msgid "Item assigned to customer?"
|
||||||
msgid "Assigned to Customer"
|
msgid "Assigned to Customer"
|
||||||
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
|
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
|
||||||
|
|
||||||
#: stock/models.py:492
|
#: stock/models.py:487
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Item assigned to customer?"
|
#| msgid "Item assigned to customer?"
|
||||||
msgid "Manually assigned to customer"
|
msgid "Manually assigned to customer"
|
||||||
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
|
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
|
||||||
|
|
||||||
#: stock/models.py:505
|
#: stock/models.py:500
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Item assigned to customer?"
|
#| msgid "Item assigned to customer?"
|
||||||
msgid "Returned from customer"
|
msgid "Returned from customer"
|
||||||
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
|
msgstr "Ist dieses Objekt einem Kunden zugeteilt?"
|
||||||
|
|
||||||
#: stock/models.py:507
|
#: stock/models.py:502
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Create new stock location"
|
#| msgid "Create new stock location"
|
||||||
msgid "Returned to location"
|
msgid "Returned to location"
|
||||||
msgstr "Neuen Lagerort anlegen"
|
msgstr "Neuen Lagerort anlegen"
|
||||||
|
|
||||||
#: stock/models.py:678
|
#: stock/models.py:673
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Part is not a virtual part"
|
#| msgid "Part is not a virtual part"
|
||||||
msgid "Part is not set as trackable"
|
msgid "Part is not set as trackable"
|
||||||
msgstr "Teil ist nicht virtuell"
|
msgstr "Teil ist nicht virtuell"
|
||||||
|
|
||||||
#: stock/models.py:684
|
#: stock/models.py:679
|
||||||
msgid "Quantity must be integer"
|
msgid "Quantity must be integer"
|
||||||
msgstr "Anzahl muss eine Ganzzahl sein"
|
msgstr "Anzahl muss eine Ganzzahl sein"
|
||||||
|
|
||||||
#: stock/models.py:690
|
#: stock/models.py:685
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Quantity must not exceed available stock quantity ({n})"
|
msgid "Quantity must not exceed available stock quantity ({n})"
|
||||||
msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})"
|
msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})"
|
||||||
|
|
||||||
#: stock/models.py:693 stock/models.py:696
|
#: stock/models.py:688 stock/models.py:691
|
||||||
msgid "Serial numbers must be a list of integers"
|
msgid "Serial numbers must be a list of integers"
|
||||||
msgstr "Seriennummern muss eine Liste von Ganzzahlen sein"
|
msgstr "Seriennummern muss eine Liste von Ganzzahlen sein"
|
||||||
|
|
||||||
#: stock/models.py:699
|
#: stock/models.py:694
|
||||||
msgid "Quantity does not match serial numbers"
|
msgid "Quantity does not match serial numbers"
|
||||||
msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
|
msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
|
||||||
|
|
||||||
#: stock/models.py:709
|
#: stock/models.py:704
|
||||||
msgid "Serial numbers already exist: "
|
msgid "Serial numbers already exist: "
|
||||||
msgstr "Seriennummern existieren bereits:"
|
msgstr "Seriennummern existieren bereits:"
|
||||||
|
|
||||||
#: stock/models.py:734
|
#: stock/models.py:729
|
||||||
msgid "Add serial number"
|
msgid "Add serial number"
|
||||||
msgstr "Seriennummer hinzufügen"
|
msgstr "Seriennummer hinzufügen"
|
||||||
|
|
||||||
#: stock/models.py:737
|
#: stock/models.py:732
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Serialized {n} items"
|
msgid "Serialized {n} items"
|
||||||
msgstr "{n} Teile serialisiert"
|
msgstr "{n} Teile serialisiert"
|
||||||
|
|
||||||
#: stock/models.py:848
|
#: stock/models.py:843
|
||||||
msgid "StockItem cannot be moved as it is not in stock"
|
msgid "StockItem cannot be moved as it is not in stock"
|
||||||
msgstr "Lagerobjekt kann nicht bewegt werden, da kein Bestand vorhanden ist"
|
msgstr "Lagerobjekt kann nicht bewegt werden, da kein Bestand vorhanden ist"
|
||||||
|
|
||||||
#: stock/models.py:1175
|
#: stock/models.py:1170
|
||||||
msgid "Tracking entry title"
|
msgid "Tracking entry title"
|
||||||
msgstr "Name des Eintrags-Trackings"
|
msgstr "Name des Eintrags-Trackings"
|
||||||
|
|
||||||
#: stock/models.py:1177
|
#: stock/models.py:1172
|
||||||
msgid "Entry notes"
|
msgid "Entry notes"
|
||||||
msgstr "Eintrags-Notizen"
|
msgstr "Eintrags-Notizen"
|
||||||
|
|
||||||
#: stock/models.py:1179
|
#: stock/models.py:1174
|
||||||
msgid "Link to external page for further information"
|
msgid "Link to external page for further information"
|
||||||
msgstr "Link auf externe Seite für weitere Informationen"
|
msgstr "Link auf externe Seite für weitere Informationen"
|
||||||
|
|
||||||
#: stock/models.py:1239
|
#: stock/models.py:1234
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Serial number for this item"
|
#| msgid "Serial number for this item"
|
||||||
msgid "Value must be provided for this test"
|
msgid "Value must be provided for this test"
|
||||||
msgstr "Seriennummer für dieses Teil"
|
msgstr "Seriennummer für dieses Teil"
|
||||||
|
|
||||||
#: stock/models.py:1245
|
#: stock/models.py:1240
|
||||||
msgid "Attachment must be uploaded for this test"
|
msgid "Attachment must be uploaded for this test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1262
|
#: stock/models.py:1257
|
||||||
msgid "Test"
|
msgid "Test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1263
|
#: stock/models.py:1258
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Part name"
|
#| msgid "Part name"
|
||||||
msgid "Test name"
|
msgid "Test name"
|
||||||
msgstr "Name des Teils"
|
msgstr "Name des Teils"
|
||||||
|
|
||||||
#: stock/models.py:1268
|
#: stock/models.py:1263
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Search Results"
|
#| msgid "Search Results"
|
||||||
msgid "Result"
|
msgid "Result"
|
||||||
msgstr "Suchergebnisse"
|
msgstr "Suchergebnisse"
|
||||||
|
|
||||||
#: stock/models.py:1269 templates/js/table_filters.html:90
|
#: stock/models.py:1264 templates/js/table_filters.html:90
|
||||||
msgid "Test result"
|
msgid "Test result"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1275
|
#: stock/models.py:1270
|
||||||
msgid "Test output value"
|
msgid "Test output value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1281
|
#: stock/models.py:1276
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Attachments"
|
#| msgid "Attachments"
|
||||||
msgid "Attachment"
|
msgid "Attachment"
|
||||||
msgstr "Anhänge"
|
msgstr "Anhänge"
|
||||||
|
|
||||||
#: stock/models.py:1282
|
#: stock/models.py:1277
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Delete attachment"
|
#| msgid "Delete attachment"
|
||||||
msgid "Test result attachment"
|
msgid "Test result attachment"
|
||||||
msgstr "Anhang löschen"
|
msgstr "Anhang löschen"
|
||||||
|
|
||||||
#: stock/models.py:1288
|
#: stock/models.py:1283
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Edit notes"
|
#| msgid "Edit notes"
|
||||||
msgid "Test notes"
|
msgid "Test notes"
|
||||||
@ -3257,41 +3350,37 @@ msgstr "Lagerobjekt löschen"
|
|||||||
msgid "Generate test report"
|
msgid "Generate test report"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:132
|
#: stock/templates/stock/item_base.html:137
|
||||||
msgid "Print labels"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:140
|
|
||||||
msgid "Stock Item Details"
|
msgid "Stock Item Details"
|
||||||
msgstr "Lagerbestands-Details"
|
msgstr "Lagerbestands-Details"
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:173
|
#: stock/templates/stock/item_base.html:170
|
||||||
msgid "Belongs To"
|
msgid "Belongs To"
|
||||||
msgstr "Gehört zu"
|
msgstr "Gehört zu"
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:195
|
#: stock/templates/stock/item_base.html:192
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "No stock location set"
|
#| msgid "No stock location set"
|
||||||
msgid "No location set"
|
msgid "No location set"
|
||||||
msgstr "Kein Lagerort gesetzt"
|
msgstr "Kein Lagerort gesetzt"
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:202
|
#: stock/templates/stock/item_base.html:199
|
||||||
msgid "Unique Identifier"
|
msgid "Unique Identifier"
|
||||||
msgstr "Eindeutiger Bezeichner"
|
msgstr "Eindeutiger Bezeichner"
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:230
|
#: stock/templates/stock/item_base.html:227
|
||||||
msgid "Parent Item"
|
msgid "Parent Item"
|
||||||
msgstr "Elternposition"
|
msgstr "Elternposition"
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:255
|
#: stock/templates/stock/item_base.html:252
|
||||||
msgid "Last Updated"
|
msgid "Last Updated"
|
||||||
msgstr "Zuletzt aktualisiert"
|
msgstr "Zuletzt aktualisiert"
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:260
|
#: stock/templates/stock/item_base.html:257
|
||||||
msgid "Last Stocktake"
|
msgid "Last Stocktake"
|
||||||
msgstr "Letzte Inventur"
|
msgstr "Letzte Inventur"
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:264
|
#: stock/templates/stock/item_base.html:261
|
||||||
msgid "No stocktake performed"
|
msgid "No stocktake performed"
|
||||||
msgstr "Keine Inventur ausgeführt"
|
msgstr "Keine Inventur ausgeführt"
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2020-08-16 02:11+0000\n"
|
"POT-Creation-Date: 2020-08-18 04:01+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -42,30 +42,30 @@ msgstr ""
|
|||||||
msgid "Confirm new password"
|
msgid "Confirm new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:328 order/models.py:187 order/models.py:261
|
#: InvenTree/helpers.py:336 order/models.py:187 order/models.py:261
|
||||||
msgid "Invalid quantity provided"
|
msgid "Invalid quantity provided"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:331
|
#: InvenTree/helpers.py:339
|
||||||
msgid "Empty serial number string"
|
msgid "Empty serial number string"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:352 InvenTree/helpers.py:369
|
#: InvenTree/helpers.py:360 InvenTree/helpers.py:377
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Duplicate serial: {n}"
|
msgid "Duplicate serial: {n}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:356 InvenTree/helpers.py:359 InvenTree/helpers.py:362
|
#: InvenTree/helpers.py:364 InvenTree/helpers.py:367 InvenTree/helpers.py:370
|
||||||
#: InvenTree/helpers.py:373
|
#: InvenTree/helpers.py:381
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Invalid group: {g}"
|
msgid "Invalid group: {g}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:379
|
#: InvenTree/helpers.py:387
|
||||||
msgid "No serial numbers found"
|
msgid "No serial numbers found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:383
|
#: InvenTree/helpers.py:391
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Number of unique serial number ({s}) must match quantity ({q})"
|
msgid "Number of unique serial number ({s}) must match quantity ({q})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -322,7 +322,7 @@ msgstr ""
|
|||||||
msgid "Build status code"
|
msgid "Build status code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build/models.py:136 stock/models.py:376
|
#: build/models.py:136 stock/models.py:371
|
||||||
msgid "Batch Code"
|
msgid "Batch Code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -334,11 +334,11 @@ msgstr ""
|
|||||||
#: company/templates/company/supplier_part_base.html:60
|
#: company/templates/company/supplier_part_base.html:60
|
||||||
#: company/templates/company/supplier_part_detail.html:24
|
#: company/templates/company/supplier_part_detail.html:24
|
||||||
#: part/templates/part/detail.html:74 part/templates/part/part_base.html:86
|
#: part/templates/part/detail.html:74 part/templates/part/part_base.html:86
|
||||||
#: stock/models.py:370 stock/templates/stock/item_base.html:237
|
#: stock/models.py:365 stock/templates/stock/item_base.html:234
|
||||||
msgid "External Link"
|
msgid "External Link"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build/models.py:156 stock/models.py:372
|
#: build/models.py:156 stock/models.py:367
|
||||||
msgid "Link to external URL"
|
msgid "Link to external URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -346,7 +346,7 @@ msgstr ""
|
|||||||
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
|
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
|
||||||
#: order/templates/order/purchase_order_detail.html:200
|
#: order/templates/order/purchase_order_detail.html:200
|
||||||
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64
|
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64
|
||||||
#: stock/models.py:438 stock/models.py:1287 stock/templates/stock/tabs.html:26
|
#: stock/models.py:433 stock/models.py:1282 stock/templates/stock/tabs.html:26
|
||||||
#: templates/js/barcode.html:391 templates/js/bom.html:229
|
#: templates/js/barcode.html:391 templates/js/bom.html:229
|
||||||
#: templates/js/stock.html:114 templates/js/stock.html:526
|
#: templates/js/stock.html:114 templates/js/stock.html:526
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
@ -413,8 +413,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: build/templates/build/allocate.html:161
|
#: build/templates/build/allocate.html:161
|
||||||
#: order/templates/order/sales_order_detail.html:68
|
#: order/templates/order/sales_order_detail.html:68
|
||||||
#: order/templates/order/sales_order_detail.html:150 stock/models.py:364
|
#: order/templates/order/sales_order_detail.html:150 stock/models.py:359
|
||||||
#: stock/templates/stock/item_base.html:153
|
#: stock/templates/stock/item_base.html:150
|
||||||
msgid "Serial Number"
|
msgid "Serial Number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -431,7 +431,7 @@ msgstr ""
|
|||||||
#: part/templates/part/allocation.html:49
|
#: part/templates/part/allocation.html:49
|
||||||
#: stock/templates/stock/item_base.html:26
|
#: stock/templates/stock/item_base.html:26
|
||||||
#: stock/templates/stock/item_base.html:32
|
#: stock/templates/stock/item_base.html:32
|
||||||
#: stock/templates/stock/item_base.html:159
|
#: stock/templates/stock/item_base.html:156
|
||||||
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
|
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
|
||||||
#: templates/js/bom.html:172 templates/js/build.html:52
|
#: templates/js/bom.html:172 templates/js/build.html:52
|
||||||
#: templates/js/stock.html:673
|
#: templates/js/stock.html:673
|
||||||
@ -440,7 +440,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: build/templates/build/allocate.html:177
|
#: build/templates/build/allocate.html:177
|
||||||
#: build/templates/build/auto_allocate.html:20
|
#: build/templates/build/auto_allocate.html:20
|
||||||
#: stock/templates/stock/item_base.html:191
|
#: stock/templates/stock/item_base.html:188
|
||||||
#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337
|
#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337
|
||||||
#: templates/js/stock.html:508
|
#: templates/js/stock.html:508
|
||||||
msgid "Location"
|
msgid "Location"
|
||||||
@ -478,7 +478,7 @@ msgstr ""
|
|||||||
msgid "Reference"
|
msgid "Reference"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build/templates/build/allocate.html:338 part/models.py:1270
|
#: build/templates/build/allocate.html:338 part/models.py:1271
|
||||||
#: templates/js/part.html:359 templates/js/table_filters.html:100
|
#: templates/js/part.html:359 templates/js/table_filters.html:100
|
||||||
msgid "Required"
|
msgid "Required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -522,7 +522,7 @@ msgstr ""
|
|||||||
#: build/templates/build/build_base.html:8
|
#: build/templates/build/build_base.html:8
|
||||||
#: build/templates/build/build_base.html:34
|
#: build/templates/build/build_base.html:34
|
||||||
#: build/templates/build/complete.html:6
|
#: build/templates/build/complete.html:6
|
||||||
#: stock/templates/stock/item_base.html:216 templates/js/build.html:33
|
#: stock/templates/stock/item_base.html:213 templates/js/build.html:33
|
||||||
#: templates/navbar.html:12
|
#: templates/navbar.html:12
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -542,7 +542,7 @@ msgstr ""
|
|||||||
#: build/templates/build/build_base.html:80
|
#: build/templates/build/build_base.html:80
|
||||||
#: build/templates/build/detail.html:42
|
#: build/templates/build/detail.html:42
|
||||||
#: order/templates/order/receive_parts.html:24
|
#: order/templates/order/receive_parts.html:24
|
||||||
#: stock/templates/stock/item_base.html:269 templates/js/barcode.html:42
|
#: stock/templates/stock/item_base.html:266 templates/js/barcode.html:42
|
||||||
#: templates/js/build.html:57 templates/js/order.html:162
|
#: templates/js/build.html:57 templates/js/order.html:162
|
||||||
#: templates/js/order.html:235 templates/js/stock.html:495
|
#: templates/js/order.html:235 templates/js/stock.html:495
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
@ -554,7 +554,7 @@ msgstr ""
|
|||||||
#: order/templates/order/sales_order_notes.html:10
|
#: order/templates/order/sales_order_notes.html:10
|
||||||
#: order/templates/order/sales_order_ship.html:25
|
#: order/templates/order/sales_order_ship.html:25
|
||||||
#: part/templates/part/allocation.html:27
|
#: part/templates/part/allocation.html:27
|
||||||
#: stock/templates/stock/item_base.html:179 templates/js/order.html:209
|
#: stock/templates/stock/item_base.html:176 templates/js/order.html:209
|
||||||
msgid "Sales Order"
|
msgid "Sales Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -621,7 +621,7 @@ msgid "Stock can be taken from any available location."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build/templates/build/detail.html:48
|
#: build/templates/build/detail.html:48
|
||||||
#: stock/templates/stock/item_base.html:209 templates/js/stock.html:503
|
#: stock/templates/stock/item_base.html:206 templates/js/stock.html:503
|
||||||
msgid "Batch"
|
msgid "Batch"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -910,8 +910,8 @@ msgstr ""
|
|||||||
msgid "Does this company manufacture parts?"
|
msgid "Does this company manufacture parts?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: company/models.py:279 stock/models.py:324
|
#: company/models.py:279 stock/models.py:319
|
||||||
#: stock/templates/stock/item_base.html:145
|
#: stock/templates/stock/item_base.html:142
|
||||||
msgid "Base Part"
|
msgid "Base Part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -982,14 +982,14 @@ msgstr ""
|
|||||||
#: company/templates/company/supplier_part_detail.html:21 order/models.py:148
|
#: company/templates/company/supplier_part_detail.html:21 order/models.py:148
|
||||||
#: order/templates/order/order_base.html:74
|
#: order/templates/order/order_base.html:74
|
||||||
#: order/templates/order/order_wizard/select_pos.html:30
|
#: order/templates/order/order_wizard/select_pos.html:30
|
||||||
#: stock/templates/stock/item_base.html:244 templates/js/company.html:52
|
#: stock/templates/stock/item_base.html:241 templates/js/company.html:52
|
||||||
#: templates/js/company.html:134 templates/js/order.html:144
|
#: templates/js/company.html:134 templates/js/order.html:144
|
||||||
msgid "Supplier"
|
msgid "Supplier"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: company/templates/company/detail.html:26 order/models.py:314
|
#: company/templates/company/detail.html:26 order/models.py:314
|
||||||
#: order/templates/order/sales_order_base.html:73 stock/models.py:359
|
#: order/templates/order/sales_order_base.html:73 stock/models.py:354
|
||||||
#: stock/models.py:360 stock/templates/stock/item_base.html:166
|
#: stock/models.py:355 stock/templates/stock/item_base.html:163
|
||||||
#: templates/js/company.html:44 templates/js/order.html:217
|
#: templates/js/company.html:44 templates/js/order.html:217
|
||||||
msgid "Customer"
|
msgid "Customer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1102,8 +1102,8 @@ msgid "New Sales Order"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: company/templates/company/supplier_part_base.html:6
|
#: company/templates/company/supplier_part_base.html:6
|
||||||
#: company/templates/company/supplier_part_base.html:19 stock/models.py:333
|
#: company/templates/company/supplier_part_base.html:19 stock/models.py:328
|
||||||
#: stock/templates/stock/item_base.html:249 templates/js/company.html:150
|
#: stock/templates/stock/item_base.html:246 templates/js/company.html:150
|
||||||
msgid "Supplier Part"
|
msgid "Supplier Part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1367,8 +1367,8 @@ msgstr ""
|
|||||||
msgid "Supplier order reference code"
|
msgid "Supplier order reference code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: order/models.py:185 order/models.py:259 part/views.py:1167
|
#: order/models.py:185 order/models.py:259 part/views.py:1250
|
||||||
#: stock/models.py:238 stock/models.py:687
|
#: stock/models.py:239 stock/models.py:682
|
||||||
msgid "Quantity must be greater than zero"
|
msgid "Quantity must be greater than zero"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1402,7 +1402,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: order/models.py:466 order/templates/order/order_base.html:9
|
#: order/models.py:466 order/templates/order/order_base.html:9
|
||||||
#: order/templates/order/order_base.html:23
|
#: order/templates/order/order_base.html:23
|
||||||
#: stock/templates/stock/item_base.html:223 templates/js/order.html:136
|
#: stock/templates/stock/item_base.html:220 templates/js/order.html:136
|
||||||
msgid "Purchase Order"
|
msgid "Purchase Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1819,16 +1819,16 @@ msgstr ""
|
|||||||
msgid "Remove allocation"
|
msgid "Remove allocation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/bom.py:140
|
#: part/bom.py:144
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Unsupported file format: {f}"
|
msgid "Unsupported file format: {f}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/bom.py:145
|
#: part/bom.py:149
|
||||||
msgid "Error reading BOM file (invalid data)"
|
msgid "Error reading BOM file (invalid data)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/bom.py:147
|
#: part/bom.py:151
|
||||||
msgid "Error reading BOM file (incorrect row size)"
|
msgid "Error reading BOM file (incorrect row size)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1848,31 +1848,39 @@ msgstr ""
|
|||||||
msgid "Download cascading / multi-level BOM"
|
msgid "Download cascading / multi-level BOM"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:76
|
#: part/forms.py:59
|
||||||
|
msgid "Levels"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/forms.py:59
|
||||||
|
msgid "Select maximum number of BOM levels to export (0 = all levels)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/forms.py:78
|
||||||
msgid "Confirm that the BOM is correct"
|
msgid "Confirm that the BOM is correct"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:88
|
#: part/forms.py:90
|
||||||
msgid "Select BOM file to upload"
|
msgid "Select BOM file to upload"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:112
|
#: part/forms.py:114
|
||||||
msgid "Select part category"
|
msgid "Select part category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:126
|
#: part/forms.py:128
|
||||||
msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
|
msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:131
|
#: part/forms.py:133
|
||||||
msgid "Confirm part creation"
|
msgid "Confirm part creation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:221
|
#: part/forms.py:223
|
||||||
msgid "Input quantity for price calculation"
|
msgid "Input quantity for price calculation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:224
|
#: part/forms.py:226
|
||||||
msgid "Select currency for price calculation"
|
msgid "Select currency for price calculation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1985,116 +1993,117 @@ msgstr ""
|
|||||||
msgid "Stored BOM checksum"
|
msgid "Stored BOM checksum"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1222
|
#: part/models.py:1223
|
||||||
msgid "Test templates can only be created for trackable parts"
|
msgid "Test templates can only be created for trackable parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1239
|
#: part/models.py:1240
|
||||||
msgid "Test with this name already exists for this part"
|
msgid "Test with this name already exists for this part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1258 templates/js/part.html:350 templates/js/stock.html:90
|
#: part/models.py:1259 templates/js/part.html:350 templates/js/stock.html:90
|
||||||
msgid "Test Name"
|
msgid "Test Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1259
|
#: part/models.py:1260
|
||||||
msgid "Enter a name for the test"
|
msgid "Enter a name for the test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1264
|
#: part/models.py:1265
|
||||||
msgid "Test Description"
|
msgid "Test Description"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1265
|
#: part/models.py:1266
|
||||||
msgid "Enter description for this test"
|
msgid "Enter description for this test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1271
|
#: part/models.py:1272
|
||||||
msgid "Is this test required to pass?"
|
msgid "Is this test required to pass?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1276 templates/js/part.html:367
|
#: part/models.py:1277 templates/js/part.html:367
|
||||||
msgid "Requires Value"
|
msgid "Requires Value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1277
|
#: part/models.py:1278
|
||||||
msgid "Does this test require a value when adding a test result?"
|
msgid "Does this test require a value when adding a test result?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1282 templates/js/part.html:374
|
#: part/models.py:1283 templates/js/part.html:374
|
||||||
msgid "Requires Attachment"
|
msgid "Requires Attachment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1283
|
#: part/models.py:1284
|
||||||
msgid "Does this test require a file attachment when adding a test result?"
|
msgid "Does this test require a file attachment when adding a test result?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1316
|
#: part/models.py:1317
|
||||||
msgid "Parameter template name must be unique"
|
msgid "Parameter template name must be unique"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1321
|
#: part/models.py:1322
|
||||||
msgid "Parameter Name"
|
msgid "Parameter Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1323
|
#: part/models.py:1324
|
||||||
msgid "Parameter Units"
|
msgid "Parameter Units"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1349
|
#: part/models.py:1350
|
||||||
msgid "Parent Part"
|
msgid "Parent Part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1351
|
#: part/models.py:1352
|
||||||
msgid "Parameter Template"
|
msgid "Parameter Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1353
|
#: part/models.py:1354
|
||||||
msgid "Parameter Value"
|
msgid "Parameter Value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1382
|
#: part/models.py:1383
|
||||||
msgid "Select parent part"
|
msgid "Select parent part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1390
|
#: part/models.py:1391
|
||||||
msgid "Select part to be used in BOM"
|
msgid "Select part to be used in BOM"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1396
|
#: part/models.py:1397
|
||||||
msgid "BOM quantity for this BOM item"
|
msgid "BOM quantity for this BOM item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1399
|
#: part/models.py:1400
|
||||||
msgid "Estimated build wastage quantity (absolute or percentage)"
|
msgid "Estimated build wastage quantity (absolute or percentage)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1402
|
#: part/models.py:1403
|
||||||
msgid "BOM item reference"
|
msgid "BOM item reference"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1405
|
#: part/models.py:1406
|
||||||
msgid "BOM item notes"
|
msgid "BOM item notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1407
|
#: part/models.py:1408
|
||||||
msgid "BOM line checksum"
|
msgid "BOM line checksum"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1471 stock/models.py:228
|
#: part/models.py:1472 part/views.py:1256 part/views.py:1308
|
||||||
|
#: stock/models.py:229
|
||||||
msgid "Quantity must be integer value for trackable parts"
|
msgid "Quantity must be integer value for trackable parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1480
|
#: part/models.py:1481
|
||||||
msgid "Part cannot be added to its own Bill of Materials"
|
msgid "Part cannot be added to its own Bill of Materials"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1487
|
#: part/models.py:1488
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
|
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1494
|
#: part/models.py:1495
|
||||||
msgid "BOM Item"
|
msgid "BOM Item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2113,14 +2122,14 @@ msgstr ""
|
|||||||
#: part/templates/part/allocation.html:45
|
#: part/templates/part/allocation.html:45
|
||||||
#: stock/templates/stock/item_base.html:8
|
#: stock/templates/stock/item_base.html:8
|
||||||
#: stock/templates/stock/item_base.html:58
|
#: stock/templates/stock/item_base.html:58
|
||||||
#: stock/templates/stock/item_base.html:231
|
#: stock/templates/stock/item_base.html:228
|
||||||
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:106
|
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:106
|
||||||
#: templates/js/stock.html:643
|
#: templates/js/stock.html:643
|
||||||
msgid "Stock Item"
|
msgid "Stock Item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/allocation.html:20
|
#: part/templates/part/allocation.html:20
|
||||||
#: stock/templates/stock/item_base.html:185
|
#: stock/templates/stock/item_base.html:182
|
||||||
msgid "Build Order"
|
msgid "Build Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2156,10 +2165,78 @@ msgstr ""
|
|||||||
msgid "Validate Bill of Materials"
|
msgid "Validate Bill of Materials"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/bom.html:46 part/views.py:1412
|
#: part/templates/part/bom.html:46 part/views.py:1523
|
||||||
msgid "Export Bill of Materials"
|
msgid "Export Bill of Materials"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:8
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:8
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:10
|
||||||
|
msgid "Upload Bill of Materials"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:10
|
||||||
|
msgid "Step 2 - Select Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:15
|
||||||
|
msgid "Missing selections for the following required columns"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:26
|
||||||
|
msgid "Submit Selections"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:35
|
||||||
|
msgid "File Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:52
|
||||||
|
msgid "Match Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:10
|
||||||
|
msgid "Step 3 - Select Parts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:15
|
||||||
|
msgid "Errors exist in the submitted data"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:21
|
||||||
|
msgid "Submit BOM"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:33
|
||||||
|
msgid "Row"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:34
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:63
|
||||||
|
msgid "Select Part"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:13
|
||||||
|
msgid "Step 1 - Select BOM File"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:16
|
||||||
|
msgid "Requirements for BOM upload"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:18
|
||||||
|
msgid ""
|
||||||
|
"The BOM file must contain the required named columns as provided in the "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:18
|
||||||
|
msgid "BOM Upload Template"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:19
|
||||||
|
msgid "Each part must already exist in the database"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/category.html:14
|
#: part/templates/part/category.html:14
|
||||||
msgid "All parts"
|
msgid "All parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2354,7 +2431,7 @@ msgstr ""
|
|||||||
msgid "New Parameter"
|
msgid "New Parameter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/params.html:21 stock/models.py:1274
|
#: part/templates/part/params.html:21 stock/models.py:1269
|
||||||
#: templates/js/stock.html:110
|
#: templates/js/stock.html:110
|
||||||
msgid "Value"
|
msgid "Value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2535,7 +2612,7 @@ msgstr ""
|
|||||||
msgid "Used In"
|
msgid "Used In"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:275
|
#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:272
|
||||||
msgid "Tests"
|
msgid "Tests"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2640,91 +2717,91 @@ msgstr ""
|
|||||||
msgid "Validate BOM"
|
msgid "Validate BOM"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:908
|
#: part/views.py:909
|
||||||
msgid "No BOM file provided"
|
msgid "No BOM file provided"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1169
|
#: part/views.py:1259
|
||||||
msgid "Enter a valid quantity"
|
msgid "Enter a valid quantity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1193 part/views.py:1196
|
#: part/views.py:1284 part/views.py:1287
|
||||||
msgid "Select valid part"
|
msgid "Select valid part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1202
|
#: part/views.py:1293
|
||||||
msgid "Duplicate part selected"
|
msgid "Duplicate part selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1230
|
#: part/views.py:1329
|
||||||
msgid "Select a part"
|
msgid "Select a part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1234
|
#: part/views.py:1333
|
||||||
msgid "Specify quantity"
|
msgid "Specify quantity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1450
|
#: part/views.py:1565
|
||||||
msgid "Confirm Part Deletion"
|
msgid "Confirm Part Deletion"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1457
|
#: part/views.py:1572
|
||||||
msgid "Part was deleted"
|
msgid "Part was deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1466
|
#: part/views.py:1581
|
||||||
msgid "Part Pricing"
|
msgid "Part Pricing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1588
|
#: part/views.py:1703
|
||||||
msgid "Create Part Parameter Template"
|
msgid "Create Part Parameter Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1596
|
#: part/views.py:1711
|
||||||
msgid "Edit Part Parameter Template"
|
msgid "Edit Part Parameter Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1603
|
#: part/views.py:1718
|
||||||
msgid "Delete Part Parameter Template"
|
msgid "Delete Part Parameter Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1611
|
#: part/views.py:1726
|
||||||
msgid "Create Part Parameter"
|
msgid "Create Part Parameter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1661
|
#: part/views.py:1776
|
||||||
msgid "Edit Part Parameter"
|
msgid "Edit Part Parameter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1675
|
#: part/views.py:1790
|
||||||
msgid "Delete Part Parameter"
|
msgid "Delete Part Parameter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1691
|
#: part/views.py:1806
|
||||||
msgid "Edit Part Category"
|
msgid "Edit Part Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1726
|
#: part/views.py:1841
|
||||||
msgid "Delete Part Category"
|
msgid "Delete Part Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1732
|
#: part/views.py:1847
|
||||||
msgid "Part category was deleted"
|
msgid "Part category was deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1740
|
#: part/views.py:1855
|
||||||
msgid "Create new part category"
|
msgid "Create new part category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1791
|
#: part/views.py:1906
|
||||||
msgid "Create BOM item"
|
msgid "Create BOM item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1857
|
#: part/views.py:1972
|
||||||
msgid "Edit BOM item"
|
msgid "Edit BOM item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1905
|
#: part/views.py:2020
|
||||||
msgid "Confim BOM item deletion"
|
msgid "Confim BOM item deletion"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2776,203 +2853,203 @@ msgstr ""
|
|||||||
msgid "Set the destination as the default location for selected parts"
|
msgid "Set the destination as the default location for selected parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:209
|
#: stock/models.py:210
|
||||||
msgid "StockItem with this serial number already exists"
|
msgid "StockItem with this serial number already exists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:245
|
#: stock/models.py:246
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Part type ('{pf}') must be {pe}"
|
msgid "Part type ('{pf}') must be {pe}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:255 stock/models.py:264
|
#: stock/models.py:256 stock/models.py:265
|
||||||
msgid "Quantity must be 1 for item with a serial number"
|
msgid "Quantity must be 1 for item with a serial number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:256
|
#: stock/models.py:257
|
||||||
msgid "Serial number cannot be set if quantity greater than 1"
|
msgid "Serial number cannot be set if quantity greater than 1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:277
|
#: stock/models.py:278
|
||||||
msgid "Item cannot belong to itself"
|
msgid "Item cannot belong to itself"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:316
|
#: stock/models.py:311
|
||||||
msgid "Parent Stock Item"
|
msgid "Parent Stock Item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:325
|
#: stock/models.py:320
|
||||||
msgid "Base part"
|
msgid "Base part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:334
|
#: stock/models.py:329
|
||||||
msgid "Select a matching supplier part for this stock item"
|
msgid "Select a matching supplier part for this stock item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:339 stock/templates/stock/stock_app_base.html:7
|
#: stock/models.py:334 stock/templates/stock/stock_app_base.html:7
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:342
|
#: stock/models.py:337
|
||||||
msgid "Where is this stock item located?"
|
msgid "Where is this stock item located?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:347
|
#: stock/models.py:342
|
||||||
msgid "Installed In"
|
msgid "Installed In"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:350
|
#: stock/models.py:345
|
||||||
msgid "Is this item installed in another item?"
|
msgid "Is this item installed in another item?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:366
|
#: stock/models.py:361
|
||||||
msgid "Serial number for this item"
|
msgid "Serial number for this item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:378
|
#: stock/models.py:373
|
||||||
msgid "Batch code for this stock item"
|
msgid "Batch code for this stock item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:382
|
#: stock/models.py:377
|
||||||
msgid "Stock Quantity"
|
msgid "Stock Quantity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:391
|
#: stock/models.py:386
|
||||||
msgid "Source Build"
|
msgid "Source Build"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:393
|
#: stock/models.py:388
|
||||||
msgid "Build for this stock item"
|
msgid "Build for this stock item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:400
|
#: stock/models.py:395
|
||||||
msgid "Source Purchase Order"
|
msgid "Source Purchase Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:403
|
#: stock/models.py:398
|
||||||
msgid "Purchase order for this stock item"
|
msgid "Purchase order for this stock item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:409
|
#: stock/models.py:404
|
||||||
msgid "Destination Sales Order"
|
msgid "Destination Sales Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:416
|
#: stock/models.py:411
|
||||||
msgid "Destination Build Order"
|
msgid "Destination Build Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:429
|
#: stock/models.py:424
|
||||||
msgid "Delete this Stock Item when stock is depleted"
|
msgid "Delete this Stock Item when stock is depleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:439 stock/templates/stock/item_notes.html:14
|
#: stock/models.py:434 stock/templates/stock/item_notes.html:14
|
||||||
#: stock/templates/stock/item_notes.html:30
|
#: stock/templates/stock/item_notes.html:30
|
||||||
msgid "Stock Item Notes"
|
msgid "Stock Item Notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:490
|
#: stock/models.py:485
|
||||||
msgid "Assigned to Customer"
|
msgid "Assigned to Customer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:492
|
#: stock/models.py:487
|
||||||
msgid "Manually assigned to customer"
|
msgid "Manually assigned to customer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:505
|
#: stock/models.py:500
|
||||||
msgid "Returned from customer"
|
msgid "Returned from customer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:507
|
#: stock/models.py:502
|
||||||
msgid "Returned to location"
|
msgid "Returned to location"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:678
|
#: stock/models.py:673
|
||||||
msgid "Part is not set as trackable"
|
msgid "Part is not set as trackable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:684
|
#: stock/models.py:679
|
||||||
msgid "Quantity must be integer"
|
msgid "Quantity must be integer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:690
|
#: stock/models.py:685
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Quantity must not exceed available stock quantity ({n})"
|
msgid "Quantity must not exceed available stock quantity ({n})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:693 stock/models.py:696
|
#: stock/models.py:688 stock/models.py:691
|
||||||
msgid "Serial numbers must be a list of integers"
|
msgid "Serial numbers must be a list of integers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:699
|
#: stock/models.py:694
|
||||||
msgid "Quantity does not match serial numbers"
|
msgid "Quantity does not match serial numbers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:709
|
#: stock/models.py:704
|
||||||
msgid "Serial numbers already exist: "
|
msgid "Serial numbers already exist: "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:734
|
#: stock/models.py:729
|
||||||
msgid "Add serial number"
|
msgid "Add serial number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:737
|
#: stock/models.py:732
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Serialized {n} items"
|
msgid "Serialized {n} items"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:848
|
#: stock/models.py:843
|
||||||
msgid "StockItem cannot be moved as it is not in stock"
|
msgid "StockItem cannot be moved as it is not in stock"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1175
|
#: stock/models.py:1170
|
||||||
msgid "Tracking entry title"
|
msgid "Tracking entry title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1177
|
#: stock/models.py:1172
|
||||||
msgid "Entry notes"
|
msgid "Entry notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1179
|
#: stock/models.py:1174
|
||||||
msgid "Link to external page for further information"
|
msgid "Link to external page for further information"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1239
|
#: stock/models.py:1234
|
||||||
msgid "Value must be provided for this test"
|
msgid "Value must be provided for this test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1245
|
#: stock/models.py:1240
|
||||||
msgid "Attachment must be uploaded for this test"
|
msgid "Attachment must be uploaded for this test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1262
|
#: stock/models.py:1257
|
||||||
msgid "Test"
|
msgid "Test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1263
|
#: stock/models.py:1258
|
||||||
msgid "Test name"
|
msgid "Test name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1268
|
#: stock/models.py:1263
|
||||||
msgid "Result"
|
msgid "Result"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1269 templates/js/table_filters.html:90
|
#: stock/models.py:1264 templates/js/table_filters.html:90
|
||||||
msgid "Test result"
|
msgid "Test result"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1275
|
#: stock/models.py:1270
|
||||||
msgid "Test output value"
|
msgid "Test output value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1281
|
#: stock/models.py:1276
|
||||||
msgid "Attachment"
|
msgid "Attachment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1282
|
#: stock/models.py:1277
|
||||||
msgid "Test result attachment"
|
msgid "Test result attachment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1288
|
#: stock/models.py:1283
|
||||||
msgid "Test notes"
|
msgid "Test notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3078,39 +3155,35 @@ msgstr ""
|
|||||||
msgid "Generate test report"
|
msgid "Generate test report"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:132
|
#: stock/templates/stock/item_base.html:137
|
||||||
msgid "Print labels"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:140
|
|
||||||
msgid "Stock Item Details"
|
msgid "Stock Item Details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:173
|
#: stock/templates/stock/item_base.html:170
|
||||||
msgid "Belongs To"
|
msgid "Belongs To"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:195
|
#: stock/templates/stock/item_base.html:192
|
||||||
msgid "No location set"
|
msgid "No location set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:202
|
#: stock/templates/stock/item_base.html:199
|
||||||
msgid "Unique Identifier"
|
msgid "Unique Identifier"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:230
|
#: stock/templates/stock/item_base.html:227
|
||||||
msgid "Parent Item"
|
msgid "Parent Item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:255
|
#: stock/templates/stock/item_base.html:252
|
||||||
msgid "Last Updated"
|
msgid "Last Updated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:260
|
#: stock/templates/stock/item_base.html:257
|
||||||
msgid "Last Stocktake"
|
msgid "Last Stocktake"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:264
|
#: stock/templates/stock/item_base.html:261
|
||||||
msgid "No stocktake performed"
|
msgid "No stocktake performed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2020-08-16 02:11+0000\n"
|
"POT-Creation-Date: 2020-08-18 04:01+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -42,30 +42,30 @@ msgstr ""
|
|||||||
msgid "Confirm new password"
|
msgid "Confirm new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:328 order/models.py:187 order/models.py:261
|
#: InvenTree/helpers.py:336 order/models.py:187 order/models.py:261
|
||||||
msgid "Invalid quantity provided"
|
msgid "Invalid quantity provided"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:331
|
#: InvenTree/helpers.py:339
|
||||||
msgid "Empty serial number string"
|
msgid "Empty serial number string"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:352 InvenTree/helpers.py:369
|
#: InvenTree/helpers.py:360 InvenTree/helpers.py:377
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Duplicate serial: {n}"
|
msgid "Duplicate serial: {n}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:356 InvenTree/helpers.py:359 InvenTree/helpers.py:362
|
#: InvenTree/helpers.py:364 InvenTree/helpers.py:367 InvenTree/helpers.py:370
|
||||||
#: InvenTree/helpers.py:373
|
#: InvenTree/helpers.py:381
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Invalid group: {g}"
|
msgid "Invalid group: {g}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:379
|
#: InvenTree/helpers.py:387
|
||||||
msgid "No serial numbers found"
|
msgid "No serial numbers found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: InvenTree/helpers.py:383
|
#: InvenTree/helpers.py:391
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Number of unique serial number ({s}) must match quantity ({q})"
|
msgid "Number of unique serial number ({s}) must match quantity ({q})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -322,7 +322,7 @@ msgstr ""
|
|||||||
msgid "Build status code"
|
msgid "Build status code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build/models.py:136 stock/models.py:376
|
#: build/models.py:136 stock/models.py:371
|
||||||
msgid "Batch Code"
|
msgid "Batch Code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -334,11 +334,11 @@ msgstr ""
|
|||||||
#: company/templates/company/supplier_part_base.html:60
|
#: company/templates/company/supplier_part_base.html:60
|
||||||
#: company/templates/company/supplier_part_detail.html:24
|
#: company/templates/company/supplier_part_detail.html:24
|
||||||
#: part/templates/part/detail.html:74 part/templates/part/part_base.html:86
|
#: part/templates/part/detail.html:74 part/templates/part/part_base.html:86
|
||||||
#: stock/models.py:370 stock/templates/stock/item_base.html:237
|
#: stock/models.py:365 stock/templates/stock/item_base.html:234
|
||||||
msgid "External Link"
|
msgid "External Link"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build/models.py:156 stock/models.py:372
|
#: build/models.py:156 stock/models.py:367
|
||||||
msgid "Link to external URL"
|
msgid "Link to external URL"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -346,7 +346,7 @@ msgstr ""
|
|||||||
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
|
#: company/templates/company/tabs.html:33 order/templates/order/po_tabs.html:15
|
||||||
#: order/templates/order/purchase_order_detail.html:200
|
#: order/templates/order/purchase_order_detail.html:200
|
||||||
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64
|
#: order/templates/order/so_tabs.html:23 part/templates/part/tabs.html:64
|
||||||
#: stock/models.py:438 stock/models.py:1287 stock/templates/stock/tabs.html:26
|
#: stock/models.py:433 stock/models.py:1282 stock/templates/stock/tabs.html:26
|
||||||
#: templates/js/barcode.html:391 templates/js/bom.html:229
|
#: templates/js/barcode.html:391 templates/js/bom.html:229
|
||||||
#: templates/js/stock.html:114 templates/js/stock.html:526
|
#: templates/js/stock.html:114 templates/js/stock.html:526
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
@ -413,8 +413,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: build/templates/build/allocate.html:161
|
#: build/templates/build/allocate.html:161
|
||||||
#: order/templates/order/sales_order_detail.html:68
|
#: order/templates/order/sales_order_detail.html:68
|
||||||
#: order/templates/order/sales_order_detail.html:150 stock/models.py:364
|
#: order/templates/order/sales_order_detail.html:150 stock/models.py:359
|
||||||
#: stock/templates/stock/item_base.html:153
|
#: stock/templates/stock/item_base.html:150
|
||||||
msgid "Serial Number"
|
msgid "Serial Number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -431,7 +431,7 @@ msgstr ""
|
|||||||
#: part/templates/part/allocation.html:49
|
#: part/templates/part/allocation.html:49
|
||||||
#: stock/templates/stock/item_base.html:26
|
#: stock/templates/stock/item_base.html:26
|
||||||
#: stock/templates/stock/item_base.html:32
|
#: stock/templates/stock/item_base.html:32
|
||||||
#: stock/templates/stock/item_base.html:159
|
#: stock/templates/stock/item_base.html:156
|
||||||
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
|
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.html:338
|
||||||
#: templates/js/bom.html:172 templates/js/build.html:52
|
#: templates/js/bom.html:172 templates/js/build.html:52
|
||||||
#: templates/js/stock.html:673
|
#: templates/js/stock.html:673
|
||||||
@ -440,7 +440,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: build/templates/build/allocate.html:177
|
#: build/templates/build/allocate.html:177
|
||||||
#: build/templates/build/auto_allocate.html:20
|
#: build/templates/build/auto_allocate.html:20
|
||||||
#: stock/templates/stock/item_base.html:191
|
#: stock/templates/stock/item_base.html:188
|
||||||
#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337
|
#: stock/templates/stock/stock_adjust.html:17 templates/js/barcode.html:337
|
||||||
#: templates/js/stock.html:508
|
#: templates/js/stock.html:508
|
||||||
msgid "Location"
|
msgid "Location"
|
||||||
@ -478,7 +478,7 @@ msgstr ""
|
|||||||
msgid "Reference"
|
msgid "Reference"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build/templates/build/allocate.html:338 part/models.py:1270
|
#: build/templates/build/allocate.html:338 part/models.py:1271
|
||||||
#: templates/js/part.html:359 templates/js/table_filters.html:100
|
#: templates/js/part.html:359 templates/js/table_filters.html:100
|
||||||
msgid "Required"
|
msgid "Required"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -522,7 +522,7 @@ msgstr ""
|
|||||||
#: build/templates/build/build_base.html:8
|
#: build/templates/build/build_base.html:8
|
||||||
#: build/templates/build/build_base.html:34
|
#: build/templates/build/build_base.html:34
|
||||||
#: build/templates/build/complete.html:6
|
#: build/templates/build/complete.html:6
|
||||||
#: stock/templates/stock/item_base.html:216 templates/js/build.html:33
|
#: stock/templates/stock/item_base.html:213 templates/js/build.html:33
|
||||||
#: templates/navbar.html:12
|
#: templates/navbar.html:12
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -542,7 +542,7 @@ msgstr ""
|
|||||||
#: build/templates/build/build_base.html:80
|
#: build/templates/build/build_base.html:80
|
||||||
#: build/templates/build/detail.html:42
|
#: build/templates/build/detail.html:42
|
||||||
#: order/templates/order/receive_parts.html:24
|
#: order/templates/order/receive_parts.html:24
|
||||||
#: stock/templates/stock/item_base.html:269 templates/js/barcode.html:42
|
#: stock/templates/stock/item_base.html:266 templates/js/barcode.html:42
|
||||||
#: templates/js/build.html:57 templates/js/order.html:162
|
#: templates/js/build.html:57 templates/js/order.html:162
|
||||||
#: templates/js/order.html:235 templates/js/stock.html:495
|
#: templates/js/order.html:235 templates/js/stock.html:495
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
@ -554,7 +554,7 @@ msgstr ""
|
|||||||
#: order/templates/order/sales_order_notes.html:10
|
#: order/templates/order/sales_order_notes.html:10
|
||||||
#: order/templates/order/sales_order_ship.html:25
|
#: order/templates/order/sales_order_ship.html:25
|
||||||
#: part/templates/part/allocation.html:27
|
#: part/templates/part/allocation.html:27
|
||||||
#: stock/templates/stock/item_base.html:179 templates/js/order.html:209
|
#: stock/templates/stock/item_base.html:176 templates/js/order.html:209
|
||||||
msgid "Sales Order"
|
msgid "Sales Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -621,7 +621,7 @@ msgid "Stock can be taken from any available location."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build/templates/build/detail.html:48
|
#: build/templates/build/detail.html:48
|
||||||
#: stock/templates/stock/item_base.html:209 templates/js/stock.html:503
|
#: stock/templates/stock/item_base.html:206 templates/js/stock.html:503
|
||||||
msgid "Batch"
|
msgid "Batch"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -910,8 +910,8 @@ msgstr ""
|
|||||||
msgid "Does this company manufacture parts?"
|
msgid "Does this company manufacture parts?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: company/models.py:279 stock/models.py:324
|
#: company/models.py:279 stock/models.py:319
|
||||||
#: stock/templates/stock/item_base.html:145
|
#: stock/templates/stock/item_base.html:142
|
||||||
msgid "Base Part"
|
msgid "Base Part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -982,14 +982,14 @@ msgstr ""
|
|||||||
#: company/templates/company/supplier_part_detail.html:21 order/models.py:148
|
#: company/templates/company/supplier_part_detail.html:21 order/models.py:148
|
||||||
#: order/templates/order/order_base.html:74
|
#: order/templates/order/order_base.html:74
|
||||||
#: order/templates/order/order_wizard/select_pos.html:30
|
#: order/templates/order/order_wizard/select_pos.html:30
|
||||||
#: stock/templates/stock/item_base.html:244 templates/js/company.html:52
|
#: stock/templates/stock/item_base.html:241 templates/js/company.html:52
|
||||||
#: templates/js/company.html:134 templates/js/order.html:144
|
#: templates/js/company.html:134 templates/js/order.html:144
|
||||||
msgid "Supplier"
|
msgid "Supplier"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: company/templates/company/detail.html:26 order/models.py:314
|
#: company/templates/company/detail.html:26 order/models.py:314
|
||||||
#: order/templates/order/sales_order_base.html:73 stock/models.py:359
|
#: order/templates/order/sales_order_base.html:73 stock/models.py:354
|
||||||
#: stock/models.py:360 stock/templates/stock/item_base.html:166
|
#: stock/models.py:355 stock/templates/stock/item_base.html:163
|
||||||
#: templates/js/company.html:44 templates/js/order.html:217
|
#: templates/js/company.html:44 templates/js/order.html:217
|
||||||
msgid "Customer"
|
msgid "Customer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1102,8 +1102,8 @@ msgid "New Sales Order"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: company/templates/company/supplier_part_base.html:6
|
#: company/templates/company/supplier_part_base.html:6
|
||||||
#: company/templates/company/supplier_part_base.html:19 stock/models.py:333
|
#: company/templates/company/supplier_part_base.html:19 stock/models.py:328
|
||||||
#: stock/templates/stock/item_base.html:249 templates/js/company.html:150
|
#: stock/templates/stock/item_base.html:246 templates/js/company.html:150
|
||||||
msgid "Supplier Part"
|
msgid "Supplier Part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1367,8 +1367,8 @@ msgstr ""
|
|||||||
msgid "Supplier order reference code"
|
msgid "Supplier order reference code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: order/models.py:185 order/models.py:259 part/views.py:1167
|
#: order/models.py:185 order/models.py:259 part/views.py:1250
|
||||||
#: stock/models.py:238 stock/models.py:687
|
#: stock/models.py:239 stock/models.py:682
|
||||||
msgid "Quantity must be greater than zero"
|
msgid "Quantity must be greater than zero"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1402,7 +1402,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: order/models.py:466 order/templates/order/order_base.html:9
|
#: order/models.py:466 order/templates/order/order_base.html:9
|
||||||
#: order/templates/order/order_base.html:23
|
#: order/templates/order/order_base.html:23
|
||||||
#: stock/templates/stock/item_base.html:223 templates/js/order.html:136
|
#: stock/templates/stock/item_base.html:220 templates/js/order.html:136
|
||||||
msgid "Purchase Order"
|
msgid "Purchase Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1819,16 +1819,16 @@ msgstr ""
|
|||||||
msgid "Remove allocation"
|
msgid "Remove allocation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/bom.py:140
|
#: part/bom.py:144
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Unsupported file format: {f}"
|
msgid "Unsupported file format: {f}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/bom.py:145
|
#: part/bom.py:149
|
||||||
msgid "Error reading BOM file (invalid data)"
|
msgid "Error reading BOM file (invalid data)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/bom.py:147
|
#: part/bom.py:151
|
||||||
msgid "Error reading BOM file (incorrect row size)"
|
msgid "Error reading BOM file (incorrect row size)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1848,31 +1848,39 @@ msgstr ""
|
|||||||
msgid "Download cascading / multi-level BOM"
|
msgid "Download cascading / multi-level BOM"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:76
|
#: part/forms.py:59
|
||||||
|
msgid "Levels"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/forms.py:59
|
||||||
|
msgid "Select maximum number of BOM levels to export (0 = all levels)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/forms.py:78
|
||||||
msgid "Confirm that the BOM is correct"
|
msgid "Confirm that the BOM is correct"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:88
|
#: part/forms.py:90
|
||||||
msgid "Select BOM file to upload"
|
msgid "Select BOM file to upload"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:112
|
#: part/forms.py:114
|
||||||
msgid "Select part category"
|
msgid "Select part category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:126
|
#: part/forms.py:128
|
||||||
msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
|
msgid "Perform 'deep copy' which will duplicate all BOM data for this part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:131
|
#: part/forms.py:133
|
||||||
msgid "Confirm part creation"
|
msgid "Confirm part creation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:221
|
#: part/forms.py:223
|
||||||
msgid "Input quantity for price calculation"
|
msgid "Input quantity for price calculation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/forms.py:224
|
#: part/forms.py:226
|
||||||
msgid "Select currency for price calculation"
|
msgid "Select currency for price calculation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -1985,116 +1993,117 @@ msgstr ""
|
|||||||
msgid "Stored BOM checksum"
|
msgid "Stored BOM checksum"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1222
|
#: part/models.py:1223
|
||||||
msgid "Test templates can only be created for trackable parts"
|
msgid "Test templates can only be created for trackable parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1239
|
#: part/models.py:1240
|
||||||
msgid "Test with this name already exists for this part"
|
msgid "Test with this name already exists for this part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1258 templates/js/part.html:350 templates/js/stock.html:90
|
#: part/models.py:1259 templates/js/part.html:350 templates/js/stock.html:90
|
||||||
msgid "Test Name"
|
msgid "Test Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1259
|
#: part/models.py:1260
|
||||||
msgid "Enter a name for the test"
|
msgid "Enter a name for the test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1264
|
#: part/models.py:1265
|
||||||
msgid "Test Description"
|
msgid "Test Description"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1265
|
#: part/models.py:1266
|
||||||
msgid "Enter description for this test"
|
msgid "Enter description for this test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1271
|
#: part/models.py:1272
|
||||||
msgid "Is this test required to pass?"
|
msgid "Is this test required to pass?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1276 templates/js/part.html:367
|
#: part/models.py:1277 templates/js/part.html:367
|
||||||
msgid "Requires Value"
|
msgid "Requires Value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1277
|
#: part/models.py:1278
|
||||||
msgid "Does this test require a value when adding a test result?"
|
msgid "Does this test require a value when adding a test result?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1282 templates/js/part.html:374
|
#: part/models.py:1283 templates/js/part.html:374
|
||||||
msgid "Requires Attachment"
|
msgid "Requires Attachment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1283
|
#: part/models.py:1284
|
||||||
msgid "Does this test require a file attachment when adding a test result?"
|
msgid "Does this test require a file attachment when adding a test result?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1316
|
#: part/models.py:1317
|
||||||
msgid "Parameter template name must be unique"
|
msgid "Parameter template name must be unique"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1321
|
#: part/models.py:1322
|
||||||
msgid "Parameter Name"
|
msgid "Parameter Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1323
|
#: part/models.py:1324
|
||||||
msgid "Parameter Units"
|
msgid "Parameter Units"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1349
|
#: part/models.py:1350
|
||||||
msgid "Parent Part"
|
msgid "Parent Part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1351
|
#: part/models.py:1352
|
||||||
msgid "Parameter Template"
|
msgid "Parameter Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1353
|
#: part/models.py:1354
|
||||||
msgid "Parameter Value"
|
msgid "Parameter Value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1382
|
#: part/models.py:1383
|
||||||
msgid "Select parent part"
|
msgid "Select parent part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1390
|
#: part/models.py:1391
|
||||||
msgid "Select part to be used in BOM"
|
msgid "Select part to be used in BOM"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1396
|
#: part/models.py:1397
|
||||||
msgid "BOM quantity for this BOM item"
|
msgid "BOM quantity for this BOM item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1399
|
#: part/models.py:1400
|
||||||
msgid "Estimated build wastage quantity (absolute or percentage)"
|
msgid "Estimated build wastage quantity (absolute or percentage)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1402
|
#: part/models.py:1403
|
||||||
msgid "BOM item reference"
|
msgid "BOM item reference"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1405
|
#: part/models.py:1406
|
||||||
msgid "BOM item notes"
|
msgid "BOM item notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1407
|
#: part/models.py:1408
|
||||||
msgid "BOM line checksum"
|
msgid "BOM line checksum"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1471 stock/models.py:228
|
#: part/models.py:1472 part/views.py:1256 part/views.py:1308
|
||||||
|
#: stock/models.py:229
|
||||||
msgid "Quantity must be integer value for trackable parts"
|
msgid "Quantity must be integer value for trackable parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1480
|
#: part/models.py:1481
|
||||||
msgid "Part cannot be added to its own Bill of Materials"
|
msgid "Part cannot be added to its own Bill of Materials"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1487
|
#: part/models.py:1488
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
|
msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/models.py:1494
|
#: part/models.py:1495
|
||||||
msgid "BOM Item"
|
msgid "BOM Item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2113,14 +2122,14 @@ msgstr ""
|
|||||||
#: part/templates/part/allocation.html:45
|
#: part/templates/part/allocation.html:45
|
||||||
#: stock/templates/stock/item_base.html:8
|
#: stock/templates/stock/item_base.html:8
|
||||||
#: stock/templates/stock/item_base.html:58
|
#: stock/templates/stock/item_base.html:58
|
||||||
#: stock/templates/stock/item_base.html:231
|
#: stock/templates/stock/item_base.html:228
|
||||||
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:106
|
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.html:106
|
||||||
#: templates/js/stock.html:643
|
#: templates/js/stock.html:643
|
||||||
msgid "Stock Item"
|
msgid "Stock Item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/allocation.html:20
|
#: part/templates/part/allocation.html:20
|
||||||
#: stock/templates/stock/item_base.html:185
|
#: stock/templates/stock/item_base.html:182
|
||||||
msgid "Build Order"
|
msgid "Build Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2156,10 +2165,78 @@ msgstr ""
|
|||||||
msgid "Validate Bill of Materials"
|
msgid "Validate Bill of Materials"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/bom.html:46 part/views.py:1412
|
#: part/templates/part/bom.html:46 part/views.py:1523
|
||||||
msgid "Export Bill of Materials"
|
msgid "Export Bill of Materials"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:8
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:8
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:10
|
||||||
|
msgid "Upload Bill of Materials"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:10
|
||||||
|
msgid "Step 2 - Select Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:15
|
||||||
|
msgid "Missing selections for the following required columns"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:26
|
||||||
|
msgid "Submit Selections"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:35
|
||||||
|
msgid "File Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_fields.html:52
|
||||||
|
msgid "Match Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:10
|
||||||
|
msgid "Step 3 - Select Parts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:15
|
||||||
|
msgid "Errors exist in the submitted data"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:21
|
||||||
|
msgid "Submit BOM"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:33
|
||||||
|
msgid "Row"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:34
|
||||||
|
#: part/templates/part/bom_upload/select_parts.html:63
|
||||||
|
msgid "Select Part"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:13
|
||||||
|
msgid "Step 1 - Select BOM File"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:16
|
||||||
|
msgid "Requirements for BOM upload"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:18
|
||||||
|
msgid ""
|
||||||
|
"The BOM file must contain the required named columns as provided in the "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:18
|
||||||
|
msgid "BOM Upload Template"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: part/templates/part/bom_upload/upload_file.html:19
|
||||||
|
msgid "Each part must already exist in the database"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/category.html:14
|
#: part/templates/part/category.html:14
|
||||||
msgid "All parts"
|
msgid "All parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2354,7 +2431,7 @@ msgstr ""
|
|||||||
msgid "New Parameter"
|
msgid "New Parameter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/params.html:21 stock/models.py:1274
|
#: part/templates/part/params.html:21 stock/models.py:1269
|
||||||
#: templates/js/stock.html:110
|
#: templates/js/stock.html:110
|
||||||
msgid "Value"
|
msgid "Value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -2535,7 +2612,7 @@ msgstr ""
|
|||||||
msgid "Used In"
|
msgid "Used In"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:275
|
#: part/templates/part/tabs.html:55 stock/templates/stock/item_base.html:272
|
||||||
msgid "Tests"
|
msgid "Tests"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2640,91 +2717,91 @@ msgstr ""
|
|||||||
msgid "Validate BOM"
|
msgid "Validate BOM"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:908
|
#: part/views.py:909
|
||||||
msgid "No BOM file provided"
|
msgid "No BOM file provided"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1169
|
#: part/views.py:1259
|
||||||
msgid "Enter a valid quantity"
|
msgid "Enter a valid quantity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1193 part/views.py:1196
|
#: part/views.py:1284 part/views.py:1287
|
||||||
msgid "Select valid part"
|
msgid "Select valid part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1202
|
#: part/views.py:1293
|
||||||
msgid "Duplicate part selected"
|
msgid "Duplicate part selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1230
|
#: part/views.py:1329
|
||||||
msgid "Select a part"
|
msgid "Select a part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1234
|
#: part/views.py:1333
|
||||||
msgid "Specify quantity"
|
msgid "Specify quantity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1450
|
#: part/views.py:1565
|
||||||
msgid "Confirm Part Deletion"
|
msgid "Confirm Part Deletion"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1457
|
#: part/views.py:1572
|
||||||
msgid "Part was deleted"
|
msgid "Part was deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1466
|
#: part/views.py:1581
|
||||||
msgid "Part Pricing"
|
msgid "Part Pricing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1588
|
#: part/views.py:1703
|
||||||
msgid "Create Part Parameter Template"
|
msgid "Create Part Parameter Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1596
|
#: part/views.py:1711
|
||||||
msgid "Edit Part Parameter Template"
|
msgid "Edit Part Parameter Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1603
|
#: part/views.py:1718
|
||||||
msgid "Delete Part Parameter Template"
|
msgid "Delete Part Parameter Template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1611
|
#: part/views.py:1726
|
||||||
msgid "Create Part Parameter"
|
msgid "Create Part Parameter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1661
|
#: part/views.py:1776
|
||||||
msgid "Edit Part Parameter"
|
msgid "Edit Part Parameter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1675
|
#: part/views.py:1790
|
||||||
msgid "Delete Part Parameter"
|
msgid "Delete Part Parameter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1691
|
#: part/views.py:1806
|
||||||
msgid "Edit Part Category"
|
msgid "Edit Part Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1726
|
#: part/views.py:1841
|
||||||
msgid "Delete Part Category"
|
msgid "Delete Part Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1732
|
#: part/views.py:1847
|
||||||
msgid "Part category was deleted"
|
msgid "Part category was deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1740
|
#: part/views.py:1855
|
||||||
msgid "Create new part category"
|
msgid "Create new part category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1791
|
#: part/views.py:1906
|
||||||
msgid "Create BOM item"
|
msgid "Create BOM item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1857
|
#: part/views.py:1972
|
||||||
msgid "Edit BOM item"
|
msgid "Edit BOM item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: part/views.py:1905
|
#: part/views.py:2020
|
||||||
msgid "Confim BOM item deletion"
|
msgid "Confim BOM item deletion"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -2776,203 +2853,203 @@ msgstr ""
|
|||||||
msgid "Set the destination as the default location for selected parts"
|
msgid "Set the destination as the default location for selected parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:209
|
#: stock/models.py:210
|
||||||
msgid "StockItem with this serial number already exists"
|
msgid "StockItem with this serial number already exists"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:245
|
#: stock/models.py:246
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Part type ('{pf}') must be {pe}"
|
msgid "Part type ('{pf}') must be {pe}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:255 stock/models.py:264
|
#: stock/models.py:256 stock/models.py:265
|
||||||
msgid "Quantity must be 1 for item with a serial number"
|
msgid "Quantity must be 1 for item with a serial number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:256
|
#: stock/models.py:257
|
||||||
msgid "Serial number cannot be set if quantity greater than 1"
|
msgid "Serial number cannot be set if quantity greater than 1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:277
|
#: stock/models.py:278
|
||||||
msgid "Item cannot belong to itself"
|
msgid "Item cannot belong to itself"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:316
|
#: stock/models.py:311
|
||||||
msgid "Parent Stock Item"
|
msgid "Parent Stock Item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:325
|
#: stock/models.py:320
|
||||||
msgid "Base part"
|
msgid "Base part"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:334
|
#: stock/models.py:329
|
||||||
msgid "Select a matching supplier part for this stock item"
|
msgid "Select a matching supplier part for this stock item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:339 stock/templates/stock/stock_app_base.html:7
|
#: stock/models.py:334 stock/templates/stock/stock_app_base.html:7
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:342
|
#: stock/models.py:337
|
||||||
msgid "Where is this stock item located?"
|
msgid "Where is this stock item located?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:347
|
#: stock/models.py:342
|
||||||
msgid "Installed In"
|
msgid "Installed In"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:350
|
#: stock/models.py:345
|
||||||
msgid "Is this item installed in another item?"
|
msgid "Is this item installed in another item?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:366
|
#: stock/models.py:361
|
||||||
msgid "Serial number for this item"
|
msgid "Serial number for this item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:378
|
#: stock/models.py:373
|
||||||
msgid "Batch code for this stock item"
|
msgid "Batch code for this stock item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:382
|
#: stock/models.py:377
|
||||||
msgid "Stock Quantity"
|
msgid "Stock Quantity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:391
|
#: stock/models.py:386
|
||||||
msgid "Source Build"
|
msgid "Source Build"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:393
|
#: stock/models.py:388
|
||||||
msgid "Build for this stock item"
|
msgid "Build for this stock item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:400
|
#: stock/models.py:395
|
||||||
msgid "Source Purchase Order"
|
msgid "Source Purchase Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:403
|
#: stock/models.py:398
|
||||||
msgid "Purchase order for this stock item"
|
msgid "Purchase order for this stock item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:409
|
#: stock/models.py:404
|
||||||
msgid "Destination Sales Order"
|
msgid "Destination Sales Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:416
|
#: stock/models.py:411
|
||||||
msgid "Destination Build Order"
|
msgid "Destination Build Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:429
|
#: stock/models.py:424
|
||||||
msgid "Delete this Stock Item when stock is depleted"
|
msgid "Delete this Stock Item when stock is depleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:439 stock/templates/stock/item_notes.html:14
|
#: stock/models.py:434 stock/templates/stock/item_notes.html:14
|
||||||
#: stock/templates/stock/item_notes.html:30
|
#: stock/templates/stock/item_notes.html:30
|
||||||
msgid "Stock Item Notes"
|
msgid "Stock Item Notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:490
|
#: stock/models.py:485
|
||||||
msgid "Assigned to Customer"
|
msgid "Assigned to Customer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:492
|
#: stock/models.py:487
|
||||||
msgid "Manually assigned to customer"
|
msgid "Manually assigned to customer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:505
|
#: stock/models.py:500
|
||||||
msgid "Returned from customer"
|
msgid "Returned from customer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:507
|
#: stock/models.py:502
|
||||||
msgid "Returned to location"
|
msgid "Returned to location"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:678
|
#: stock/models.py:673
|
||||||
msgid "Part is not set as trackable"
|
msgid "Part is not set as trackable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:684
|
#: stock/models.py:679
|
||||||
msgid "Quantity must be integer"
|
msgid "Quantity must be integer"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:690
|
#: stock/models.py:685
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Quantity must not exceed available stock quantity ({n})"
|
msgid "Quantity must not exceed available stock quantity ({n})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:693 stock/models.py:696
|
#: stock/models.py:688 stock/models.py:691
|
||||||
msgid "Serial numbers must be a list of integers"
|
msgid "Serial numbers must be a list of integers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:699
|
#: stock/models.py:694
|
||||||
msgid "Quantity does not match serial numbers"
|
msgid "Quantity does not match serial numbers"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:709
|
#: stock/models.py:704
|
||||||
msgid "Serial numbers already exist: "
|
msgid "Serial numbers already exist: "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:734
|
#: stock/models.py:729
|
||||||
msgid "Add serial number"
|
msgid "Add serial number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:737
|
#: stock/models.py:732
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgid "Serialized {n} items"
|
msgid "Serialized {n} items"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:848
|
#: stock/models.py:843
|
||||||
msgid "StockItem cannot be moved as it is not in stock"
|
msgid "StockItem cannot be moved as it is not in stock"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1175
|
#: stock/models.py:1170
|
||||||
msgid "Tracking entry title"
|
msgid "Tracking entry title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1177
|
#: stock/models.py:1172
|
||||||
msgid "Entry notes"
|
msgid "Entry notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1179
|
#: stock/models.py:1174
|
||||||
msgid "Link to external page for further information"
|
msgid "Link to external page for further information"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1239
|
#: stock/models.py:1234
|
||||||
msgid "Value must be provided for this test"
|
msgid "Value must be provided for this test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1245
|
#: stock/models.py:1240
|
||||||
msgid "Attachment must be uploaded for this test"
|
msgid "Attachment must be uploaded for this test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1262
|
#: stock/models.py:1257
|
||||||
msgid "Test"
|
msgid "Test"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1263
|
#: stock/models.py:1258
|
||||||
msgid "Test name"
|
msgid "Test name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1268
|
#: stock/models.py:1263
|
||||||
msgid "Result"
|
msgid "Result"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1269 templates/js/table_filters.html:90
|
#: stock/models.py:1264 templates/js/table_filters.html:90
|
||||||
msgid "Test result"
|
msgid "Test result"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1275
|
#: stock/models.py:1270
|
||||||
msgid "Test output value"
|
msgid "Test output value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1281
|
#: stock/models.py:1276
|
||||||
msgid "Attachment"
|
msgid "Attachment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1282
|
#: stock/models.py:1277
|
||||||
msgid "Test result attachment"
|
msgid "Test result attachment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/models.py:1288
|
#: stock/models.py:1283
|
||||||
msgid "Test notes"
|
msgid "Test notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -3078,39 +3155,35 @@ msgstr ""
|
|||||||
msgid "Generate test report"
|
msgid "Generate test report"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:132
|
#: stock/templates/stock/item_base.html:137
|
||||||
msgid "Print labels"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:140
|
|
||||||
msgid "Stock Item Details"
|
msgid "Stock Item Details"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:173
|
#: stock/templates/stock/item_base.html:170
|
||||||
msgid "Belongs To"
|
msgid "Belongs To"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:195
|
#: stock/templates/stock/item_base.html:192
|
||||||
msgid "No location set"
|
msgid "No location set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:202
|
#: stock/templates/stock/item_base.html:199
|
||||||
msgid "Unique Identifier"
|
msgid "Unique Identifier"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:230
|
#: stock/templates/stock/item_base.html:227
|
||||||
msgid "Parent Item"
|
msgid "Parent Item"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:255
|
#: stock/templates/stock/item_base.html:252
|
||||||
msgid "Last Updated"
|
msgid "Last Updated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:260
|
#: stock/templates/stock/item_base.html:257
|
||||||
msgid "Last Stocktake"
|
msgid "Last Stocktake"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: stock/templates/stock/item_base.html:264
|
#: stock/templates/stock/item_base.html:261
|
||||||
msgid "No stocktake performed"
|
msgid "No stocktake performed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -139,16 +139,71 @@ class BomItemResource(ModelResource):
|
|||||||
|
|
||||||
bom_id = Field(attribute='pk')
|
bom_id = Field(attribute='pk')
|
||||||
|
|
||||||
|
# ID of the parent part
|
||||||
parent_part_id = Field(attribute='part', widget=widgets.ForeignKeyWidget(Part))
|
parent_part_id = Field(attribute='part', widget=widgets.ForeignKeyWidget(Part))
|
||||||
|
|
||||||
parent_part_name = Field(attribute='part__full_name', readonly=True)
|
# IPN of the parent part
|
||||||
|
parent_part_ipn = Field(attribute='part__IPN', readonly=True)
|
||||||
|
|
||||||
sub_part_id = Field(attribute='sub_part', widget=widgets.ForeignKeyWidget(Part))
|
# Name of the parent part
|
||||||
|
parent_part_name = Field(attribute='part__name', readonly=True)
|
||||||
|
|
||||||
sub_part_name = Field(attribute='sub_part__full_name', readonly=True)
|
# ID of the sub-part
|
||||||
|
part_id = Field(attribute='sub_part', widget=widgets.ForeignKeyWidget(Part))
|
||||||
|
|
||||||
|
# IPN of the sub-part
|
||||||
|
part_ipn = Field(attribute='sub_part__IPN', readonly=True)
|
||||||
|
|
||||||
|
# Name of the sub-part
|
||||||
|
part_name = Field(attribute='sub_part__name', readonly=True)
|
||||||
|
|
||||||
|
# Description of the sub-part
|
||||||
|
part_description = Field(attribute='sub_part__description', readonly=True)
|
||||||
|
|
||||||
|
# Is the sub-part itself an assembly?
|
||||||
sub_assembly = Field(attribute='sub_part__assembly', readonly=True)
|
sub_assembly = Field(attribute='sub_part__assembly', readonly=True)
|
||||||
|
|
||||||
|
def before_export(self, queryset, *args, **kwargs):
|
||||||
|
|
||||||
|
self.is_importing = kwargs.get('importing', False)
|
||||||
|
|
||||||
|
def get_fields(self, **kwargs):
|
||||||
|
"""
|
||||||
|
If we are exporting for the purposes of generating
|
||||||
|
a 'bom-import' template, there are some fields which
|
||||||
|
we are not interested in.
|
||||||
|
"""
|
||||||
|
|
||||||
|
fields = super().get_fields(**kwargs)
|
||||||
|
|
||||||
|
# If we are not generating an "import" template,
|
||||||
|
# just return the complete list of fields
|
||||||
|
if not self.is_importing:
|
||||||
|
return fields
|
||||||
|
|
||||||
|
# Otherwise, remove some fields we are not interested in
|
||||||
|
|
||||||
|
idx = 0
|
||||||
|
|
||||||
|
to_remove = [
|
||||||
|
'level',
|
||||||
|
'bom_id',
|
||||||
|
'parent_part_id',
|
||||||
|
'parent_part_ipn',
|
||||||
|
'parent_part_name',
|
||||||
|
'part_description',
|
||||||
|
'sub_assembly'
|
||||||
|
]
|
||||||
|
|
||||||
|
while idx < len(fields):
|
||||||
|
|
||||||
|
if fields[idx].column_name.lower() in to_remove:
|
||||||
|
del fields[idx]
|
||||||
|
else:
|
||||||
|
idx += 1
|
||||||
|
|
||||||
|
return fields
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = BomItem
|
model = BomItem
|
||||||
skip_unchanged = True
|
skip_unchanged = True
|
||||||
|
@ -30,8 +30,14 @@ def MakeBomTemplate(fmt):
|
|||||||
if not IsValidBOMFormat(fmt):
|
if not IsValidBOMFormat(fmt):
|
||||||
fmt = 'csv'
|
fmt = 'csv'
|
||||||
|
|
||||||
|
# Create an "empty" queryset, essentially.
|
||||||
|
# This will then export just the row headers!
|
||||||
query = BomItem.objects.filter(pk=None)
|
query = BomItem.objects.filter(pk=None)
|
||||||
dataset = BomItemResource().export(queryset=query)
|
|
||||||
|
dataset = BomItemResource().export(
|
||||||
|
queryset=query,
|
||||||
|
importing=True
|
||||||
|
)
|
||||||
|
|
||||||
data = dataset.export(fmt)
|
data = dataset.export(fmt)
|
||||||
|
|
||||||
@ -96,26 +102,23 @@ class BomUploadManager:
|
|||||||
|
|
||||||
# Fields which are absolutely necessary for valid upload
|
# Fields which are absolutely necessary for valid upload
|
||||||
REQUIRED_HEADERS = [
|
REQUIRED_HEADERS = [
|
||||||
'Part',
|
'Part_Name',
|
||||||
'Quantity'
|
'Quantity'
|
||||||
]
|
]
|
||||||
|
|
||||||
# Fields which would be helpful but are not required
|
# Fields which would be helpful but are not required
|
||||||
OPTIONAL_HEADERS = [
|
OPTIONAL_HEADERS = [
|
||||||
|
'Part_IPN',
|
||||||
|
'Part_ID',
|
||||||
'Reference',
|
'Reference',
|
||||||
'Notes',
|
'Note',
|
||||||
'Overage',
|
'Overage',
|
||||||
'Description',
|
|
||||||
'Category',
|
|
||||||
'Supplier',
|
|
||||||
'Manufacturer',
|
|
||||||
'MPN',
|
|
||||||
'IPN',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
EDITABLE_HEADERS = [
|
EDITABLE_HEADERS = [
|
||||||
'Reference',
|
'Reference',
|
||||||
'Notes'
|
'Note',
|
||||||
|
'Overage'
|
||||||
]
|
]
|
||||||
|
|
||||||
HEADERS = REQUIRED_HEADERS + OPTIONAL_HEADERS
|
HEADERS = REQUIRED_HEADERS + OPTIONAL_HEADERS
|
||||||
@ -165,6 +168,11 @@ class BomUploadManager:
|
|||||||
if h.lower() == header.lower():
|
if h.lower() == header.lower():
|
||||||
return h
|
return h
|
||||||
|
|
||||||
|
# Try for a case-insensitive match with space replacement
|
||||||
|
for h in self.HEADERS:
|
||||||
|
if h.lower() == header.lower().replace(' ', '_'):
|
||||||
|
return h
|
||||||
|
|
||||||
# Finally, look for a close match using fuzzy matching
|
# Finally, look for a close match using fuzzy matching
|
||||||
matches = []
|
matches = []
|
||||||
|
|
||||||
|
@ -271,6 +271,42 @@ class Part(MPTTModel):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{n} - {d}".format(n=self.full_name, d=self.description)
|
return "{n} - {d}".format(n=self.full_name, d=self.description)
|
||||||
|
|
||||||
|
def checkAddToBOM(self, parent):
|
||||||
|
"""
|
||||||
|
Check if this Part can be added to the BOM of another part.
|
||||||
|
|
||||||
|
This will fail if:
|
||||||
|
|
||||||
|
a) The parent part is the same as this one
|
||||||
|
b) The parent part is used in the BOM for *this* part
|
||||||
|
c) The parent part is used in the BOM for any child parts under this one
|
||||||
|
|
||||||
|
Failing this check raises a ValidationError!
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
if parent is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.pk == parent.pk:
|
||||||
|
raise ValidationError({'sub_part': _("Part '{p1}' is used in BOM for '{p2}' (recursive)".format(
|
||||||
|
p1=str(self),
|
||||||
|
p2=str(parent)
|
||||||
|
))})
|
||||||
|
|
||||||
|
# Ensure that the parent part does not appear under any child BOM item!
|
||||||
|
for item in self.bom_items.all():
|
||||||
|
|
||||||
|
# Check for simple match
|
||||||
|
if item.sub_part == parent:
|
||||||
|
raise ValidationError({'sub_part': _("Part '{p1}' is used in BOM for '{p2}' (recursive)".format(
|
||||||
|
p1=str(parent),
|
||||||
|
p2=str(self)
|
||||||
|
))})
|
||||||
|
|
||||||
|
# And recursively check too
|
||||||
|
item.sub_part.checkAddToBOM(parent)
|
||||||
|
|
||||||
def checkIfSerialNumberExists(self, sn):
|
def checkIfSerialNumberExists(self, sn):
|
||||||
"""
|
"""
|
||||||
Check if a serial number exists for this Part.
|
Check if a serial number exists for this Part.
|
||||||
@ -1474,22 +1510,8 @@ class BomItem(models.Model):
|
|||||||
except Part.DoesNotExist:
|
except Part.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# A part cannot refer to itself in its BOM
|
# Check for circular BOM references
|
||||||
try:
|
self.sub_part.checkAddToBOM(self.part)
|
||||||
if self.sub_part is not None and self.part is not None:
|
|
||||||
if self.part == self.sub_part:
|
|
||||||
raise ValidationError({'sub_part': _('Part cannot be added to its own Bill of Materials')})
|
|
||||||
|
|
||||||
# TODO - Make sure that there is no recusion
|
|
||||||
|
|
||||||
# Test for simple recursion
|
|
||||||
for item in self.sub_part.bom_items.all():
|
|
||||||
if self.part == item.sub_part:
|
|
||||||
raise ValidationError({'sub_part': _("Part '{p1}' is used in BOM for '{p2}' (recursive)".format(p1=str(self.part), p2=str(self.sub_part)))})
|
|
||||||
|
|
||||||
except Part.DoesNotExist:
|
|
||||||
# A blank Part will be caught elsewhere
|
|
||||||
pass
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("BOM Item")
|
verbose_name = _("BOM Item")
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
{% extends "part/part_base.html" %}
|
{% extends "part/part_base.html" %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load i18n %}
|
||||||
{% load inventree_extras %}
|
{% load inventree_extras %}
|
||||||
|
|
||||||
{% block details %}
|
{% block details %}
|
||||||
{% include "part/tabs.html" with tab='bom' %}
|
{% include "part/tabs.html" with tab='bom' %}
|
||||||
<h4>Upload Bill of Materials</h4>
|
<h4>{% trans "Upload Bill of Materials" %}</h4>
|
||||||
|
|
||||||
<p>Step 2 - Select Fields</p>
|
<p>{% trans "Step 2 - Select Fields" %}</p>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
{% if missing_columns and missing_columns|length > 0 %}
|
{% if missing_columns and missing_columns|length > 0 %}
|
||||||
<div class='alert alert-danger alert-block' role='alert'>
|
<div class='alert alert-danger alert-block' role='alert'>
|
||||||
Missing selections for the following required columns:
|
{% trans "Missing selections for the following required columns" %}:
|
||||||
<br>
|
<br>
|
||||||
<ul>
|
<ul>
|
||||||
{% for col in missing_columns %}
|
{% for col in missing_columns %}
|
||||||
@ -22,7 +23,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form method="post" action='' class='js-modal-form' enctype="multipart/form-data">
|
<form method="post" action='' class='js-modal-form' enctype="multipart/form-data">
|
||||||
<button type="submit" class="save btn btn-default">Submit Selections</button>
|
<button type="submit" class="save btn btn-default">{% trans "Submit Selections" %}</button>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
<input type='hidden' name='form_step' value='select_fields'/>
|
<input type='hidden' name='form_step' value='select_fields'/>
|
||||||
@ -31,7 +32,7 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th>Row</th>
|
<th>{% trans "File Fields" %}</th>
|
||||||
{% for col in bom_columns %}
|
{% for col in bom_columns %}
|
||||||
<th>
|
<th>
|
||||||
<div>
|
<div>
|
||||||
@ -48,7 +49,7 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td></td>
|
<td>{% trans "Match Fields" %}</td>
|
||||||
{% for col in bom_columns %}
|
{% for col in bom_columns %}
|
||||||
<td>
|
<td>
|
||||||
<select class='select' id='id_col_{{ forloop.counter0 }}' name='col_guess_{{ forloop.counter0 }}'>
|
<select class='select' id='id_col_{{ forloop.counter0 }}' name='col_guess_{{ forloop.counter0 }}'>
|
||||||
|
@ -1,23 +1,24 @@
|
|||||||
{% extends "part/part_base.html" %}
|
{% extends "part/part_base.html" %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load i18n %}
|
||||||
{% load inventree_extras %}
|
{% load inventree_extras %}
|
||||||
|
|
||||||
{% block details %}
|
{% block details %}
|
||||||
{% include "part/tabs.html" with tab="bom" %}
|
{% include "part/tabs.html" with tab="bom" %}
|
||||||
<h4>Upload Bill of Materials</h4>
|
<h4>{% trans "Upload Bill of Materials" %}</h4>
|
||||||
|
|
||||||
<p>Step 3 - Select Parts</p>
|
<p>{% trans "Step 3 - Select Parts" %}</p>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
{% if form_errors %}
|
{% if form_errors %}
|
||||||
<div class='alert alert-danger alert-block' role='alert'>
|
<div class='alert alert-danger alert-block' role='alert'>
|
||||||
Errors exist in the submitted data.
|
{% trans "Errors exist in the submitted data" %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form method="post" action='' class='js-modal-form' enctype="multipart/form-data">
|
<form method="post" action='' class='js-modal-form' enctype="multipart/form-data">
|
||||||
|
|
||||||
<button type="submit" class="save btn btn-default">Submit BOM</button>
|
<button type="submit" class="save btn btn-default">{% trans "Submit BOM" %}</button>
|
||||||
|
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
@ -29,7 +30,8 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th>Row</th>
|
<th>{% trans "Row" %}</th>
|
||||||
|
<th>{% trans "Select Part" %}</th>
|
||||||
{% for col in bom_columns %}
|
{% for col in bom_columns %}
|
||||||
<th>
|
<th>
|
||||||
<input type='hidden' name='col_name_{{ forloop.counter0 }}' value='{{ col.name }}'/>
|
<input type='hidden' name='col_name_{{ forloop.counter0 }}' value='{{ col.name }}'/>
|
||||||
@ -51,39 +53,39 @@
|
|||||||
<span row_id='{{ forloop.counter }}' class='fas fa-trash-alt icon-red'></span>
|
<span row_id='{{ forloop.counter }}' class='fas fa-trash-alt icon-red'></span>
|
||||||
</button>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td></td>
|
||||||
</td>
|
|
||||||
<td>{% add row.index 1 %}</td>
|
<td>{% add row.index 1 %}</td>
|
||||||
|
<td>
|
||||||
|
<button class='btn btn-default btn-create' onClick='newPartFromBomWizard()' id='new_part_row_{{ row.index }}' title='Create new part' type='button'>
|
||||||
|
<span row_id='{{ row.index }}' class='fas fa-plus icon-green'/>
|
||||||
|
</button>
|
||||||
|
<select class='select bomselect' id='select_part_{{ row.index }}' name='part_{{ row.index }}'>
|
||||||
|
<option value=''>--- {% trans "Select Part" %} ---</option>
|
||||||
|
{% for part in row.part_options %}
|
||||||
|
<option value='{{ part.id }}' {% if part.id == row.part.id %} selected='selected' {% elif part.id == row.part_match.id %} selected='selected' {% endif %}>
|
||||||
|
{{ part.full_name }} - {{ part.description }}
|
||||||
|
</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
{% if row.errors.part %}
|
||||||
|
<p class='help-inline'>{{ row.errors.part }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
{% for item in row.data %}
|
{% for item in row.data %}
|
||||||
<td>
|
<td>
|
||||||
{% if item.column.guess == 'Part' %}
|
{% if item.column.guess == 'Part' %}
|
||||||
<button class='btn btn-default btn-create' onClick='newPartFromBomWizard()' id='new_part_row_{{ row.index }}' title='Create new part' type='button'>
|
|
||||||
<span row_id='{{ row.index }}' class='fas fa-trash-alt icon-red'/>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<select class='select bomselect' id='select_part_{{ row.index }}' name='part_{{ row.index }}'>
|
|
||||||
{% if row.part_match %}
|
|
||||||
{% with row.part_match as part %}
|
|
||||||
<option value='{{ part.id }}'{% if part.id == row.part.id %} selected='selected'{% endif %}>{{ part.full_name }} - {{ part.description }}</option>
|
|
||||||
{% endwith %}
|
|
||||||
{% endif %}
|
|
||||||
<option value=''>---------</option>
|
|
||||||
{% for part in row.part_options %}
|
|
||||||
<option value='{{ part.id }}'{% if part.id == row.part.id %} selected='selected'{% endif %}>{{ part.full_name }} - {{ part.description }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
<i>{{ item.cell }}</i>
|
<i>{{ item.cell }}</i>
|
||||||
{% if row.errors.part %}
|
{% if row.errors.part %}
|
||||||
<p class='help-inline'>{{ row.errors.part }}</p>
|
<p class='help-inline'>{{ row.errors.part }}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% elif item.column.guess == 'Quantity' %}
|
{% elif item.column.guess == 'Quantity' %}
|
||||||
<input name='quantity_{{ row.index }}' class='numberinput' type='number' min='1' value='{{ row.quantity }}'/>
|
<input name='quantity_{{ row.index }}' class='numberinput' type='number' min='1' step='any' value='{% decimal row.quantity %}'/>
|
||||||
{% if row.errors.quantity %}
|
{% if row.errors.quantity %}
|
||||||
<p class='help-inline'>{{ row.errors.quantity }}</p>
|
<p class='help-inline'>{{ row.errors.quantity }}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% elif item.column.guess == 'Reference' %}
|
{% elif item.column.guess == 'Reference' %}
|
||||||
<input name='reference_{{ row.index }}' value='{{ row.reference }}'/>
|
<input name='reference_{{ row.index }}' value='{{ row.reference }}'/>
|
||||||
{% elif item.column.guess == 'Notes' %}
|
{% elif item.column.guess == 'Note' %}
|
||||||
<input name='notes_{{ row.index }}' value='{{ row.notes }}'/>
|
<input name='notes_{{ row.index }}' value='{{ row.notes }}'/>
|
||||||
{% elif item.column.guess == 'Overage' %}
|
{% elif item.column.guess == 'Overage' %}
|
||||||
<input name='overage_{{ row.index }}' value='{{ row.overage }}'/>
|
<input name='overage_{{ row.index }}' value='{{ row.overage }}'/>
|
||||||
|
@ -1,18 +1,23 @@
|
|||||||
{% extends "part/part_base.html" %}
|
{% extends "part/part_base.html" %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load i18n %}
|
||||||
{% load inventree_extras %}
|
{% load inventree_extras %}
|
||||||
|
|
||||||
{% block details %}
|
{% block details %}
|
||||||
|
|
||||||
{% include "part/tabs.html" with tab='bom' %}
|
{% include "part/tabs.html" with tab='bom' %}
|
||||||
|
|
||||||
<h4>Upload Bill of Materials</h4>
|
<h4>{% trans "Upload Bill of Materials" %}</h4>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<p>Step 1 - Select BOM File</p>
|
<p>{% trans "Step 1 - Select BOM File" %}</p>
|
||||||
|
|
||||||
<div class='alert alert-info alert-block'>
|
<div class='alert alert-info alert-block'>
|
||||||
<p>The BOM file must contain the required named columns as provided in the <a href="/part/bom_template/">BOM Upload Template</a></a></p>
|
<b>{% trans "Requirements for BOM upload" %}:</b>
|
||||||
|
<ul>
|
||||||
|
<li>{% trans "The BOM file must contain the required named columns as provided in the " %} <b><a href="/part/bom_template/">{% trans "BOM Upload Template" %}</a></b></li>
|
||||||
|
<li>{% trans "Each part must already exist in the database" %}</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form method="post" action='' class='js-modal-form' enctype="multipart/form-data">
|
<form method="post" action='' class='js-modal-form' enctype="multipart/form-data">
|
||||||
|
@ -19,7 +19,7 @@ from django.conf import settings
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
from rapidfuzz import fuzz
|
from rapidfuzz import fuzz
|
||||||
from decimal import Decimal
|
from decimal import Decimal, InvalidOperation
|
||||||
|
|
||||||
from .models import PartCategory, Part, PartAttachment
|
from .models import PartCategory, Part, PartAttachment
|
||||||
from .models import PartParameterTemplate, PartParameter
|
from .models import PartParameterTemplate, PartParameter
|
||||||
@ -948,81 +948,133 @@ class BomUpload(FormView):
|
|||||||
The pre-fill data are then passed through to the part selection form.
|
The pre-fill data are then passed through to the part selection form.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Fields prefixed with "Part_" can be used to do "smart matching" against Part objects in the database
|
||||||
|
k_idx = self.getColumnIndex('Part_ID')
|
||||||
|
p_idx = self.getColumnIndex('Part_Name')
|
||||||
|
i_idx = self.getColumnIndex('Part_IPN')
|
||||||
|
|
||||||
q_idx = self.getColumnIndex('Quantity')
|
q_idx = self.getColumnIndex('Quantity')
|
||||||
p_idx = self.getColumnIndex('Part')
|
|
||||||
i_idx = self.getColumnIndex('IPN')
|
|
||||||
d_idx = self.getColumnIndex('Description')
|
|
||||||
r_idx = self.getColumnIndex('Reference')
|
r_idx = self.getColumnIndex('Reference')
|
||||||
n_idx = self.getColumnIndex('Notes')
|
o_idx = self.getColumnIndex('Overage')
|
||||||
|
n_idx = self.getColumnIndex('Note')
|
||||||
|
|
||||||
for row in self.bom_rows:
|
for row in self.bom_rows:
|
||||||
|
"""
|
||||||
|
|
||||||
quantity = 0
|
Iterate through each row in the uploaded data,
|
||||||
part = None
|
and see if we can match the row to a "Part" object in the database.
|
||||||
|
|
||||||
|
There are three potential ways to match, based on the uploaded data:
|
||||||
|
|
||||||
|
a) Use the PK (primary key) field for the part, uploaded in the "Part_ID" field
|
||||||
|
b) Use the IPN (internal part number) field for the part, uploaded in the "Part_IPN" field
|
||||||
|
c) Use the name of the part, uploaded in the "Part_Name" field
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- If using the Part_ID field, we can do an exact match against the PK field
|
||||||
|
- If using the Part_IPN field, we can do an exact match against the IPN field
|
||||||
|
- If using the Part_Name field, we can use fuzzy string matching to match "close" values
|
||||||
|
|
||||||
|
We also extract other information from the row, for the other non-matched fields:
|
||||||
|
- Quantity
|
||||||
|
- Reference
|
||||||
|
- Overage
|
||||||
|
- Note
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Initially use a quantity of zero
|
||||||
|
quantity = Decimal(0)
|
||||||
|
|
||||||
|
# Initially we do not have a part to reference
|
||||||
|
exact_match_part = None
|
||||||
|
|
||||||
|
# A list of potential Part matches
|
||||||
|
part_options = self.allowed_parts
|
||||||
|
|
||||||
|
# Check if there is a column corresponding to "quantity"
|
||||||
if q_idx >= 0:
|
if q_idx >= 0:
|
||||||
q_val = row['data'][q_idx]
|
q_val = row['data'][q_idx]
|
||||||
|
|
||||||
try:
|
if q_val:
|
||||||
quantity = int(q_val)
|
try:
|
||||||
except ValueError:
|
# Attempt to extract a valid quantity from the field
|
||||||
pass
|
quantity = Decimal(q_val)
|
||||||
|
except (ValueError, InvalidOperation):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Store the 'quantity' value
|
||||||
|
row['quantity'] = quantity
|
||||||
|
|
||||||
|
# Check if there is a column corresponding to "PK"
|
||||||
|
if k_idx >= 0:
|
||||||
|
pk = row['data'][k_idx]
|
||||||
|
|
||||||
|
if pk:
|
||||||
|
try:
|
||||||
|
# Attempt Part lookup based on PK value
|
||||||
|
exact_match_part = Part.objects.get(pk=pk)
|
||||||
|
except (ValueError, Part.DoesNotExist):
|
||||||
|
exact_match_part = None
|
||||||
|
|
||||||
|
# Check if there is a column corresponding to "Part Name"
|
||||||
if p_idx >= 0:
|
if p_idx >= 0:
|
||||||
part_name = row['data'][p_idx]
|
part_name = row['data'][p_idx]
|
||||||
|
|
||||||
row['part_name'] = part_name
|
row['part_name'] = part_name
|
||||||
|
|
||||||
# Fuzzy match the values and see what happens
|
|
||||||
matches = []
|
matches = []
|
||||||
|
|
||||||
for part in self.allowed_parts:
|
for part in self.allowed_parts:
|
||||||
ratio = fuzz.partial_ratio(part.name + part.description, part_name)
|
ratio = fuzz.partial_ratio(part.name + part.description, part_name)
|
||||||
matches.append({'part': part, 'match': ratio})
|
matches.append({'part': part, 'match': ratio})
|
||||||
|
|
||||||
|
# Sort matches by the 'strength' of the match ratio
|
||||||
if len(matches) > 0:
|
if len(matches) > 0:
|
||||||
matches = sorted(matches, key=lambda item: item['match'], reverse=True)
|
matches = sorted(matches, key=lambda item: item['match'], reverse=True)
|
||||||
|
|
||||||
|
part_options = [m['part'] for m in matches]
|
||||||
|
|
||||||
|
# Check if there is a column corresponding to "Part IPN"
|
||||||
if i_idx >= 0:
|
if i_idx >= 0:
|
||||||
row['part_ipn'] = row['data'][i_idx]
|
row['part_ipn'] = row['data'][i_idx]
|
||||||
|
|
||||||
if d_idx >= 0:
|
# Check if there is a column corresponding to "Overage" field
|
||||||
row['description'] = row['data'][d_idx]
|
if o_idx >= 0:
|
||||||
|
row['overage'] = row['data'][o_idx]
|
||||||
|
|
||||||
|
# Check if there is a column corresponding to "Reference" field
|
||||||
if r_idx >= 0:
|
if r_idx >= 0:
|
||||||
row['reference'] = row['data'][r_idx]
|
row['reference'] = row['data'][r_idx]
|
||||||
|
|
||||||
|
# Check if there is a column corresponding to "Note" field
|
||||||
if n_idx >= 0:
|
if n_idx >= 0:
|
||||||
row['notes'] = row['data'][n_idx]
|
row['note'] = row['data'][n_idx]
|
||||||
|
|
||||||
row['quantity'] = quantity
|
# Supply list of part options for each row, sorted by how closely they match the part name
|
||||||
|
row['part_options'] = part_options
|
||||||
|
|
||||||
# Part selection using IPN
|
# Unless found, the 'part_match' is blank
|
||||||
try:
|
row['part_match'] = None
|
||||||
if row['part_ipn']:
|
|
||||||
part_matches = [part for part in self.allowed_parts if row['part_ipn'] == part.IPN]
|
|
||||||
part_options = [part for part in self.allowed_parts if part not in part_matches]
|
|
||||||
|
|
||||||
# Check for single match
|
if exact_match_part:
|
||||||
if len(part_matches) == 1:
|
# If there is an exact match based on PK, use that
|
||||||
row['part_match'] = part_matches[0]
|
row['part_match'] = exact_match_part
|
||||||
|
|
||||||
row['part_options'] = part_options
|
|
||||||
|
|
||||||
continue
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Part selection using Part Name
|
|
||||||
match_limit = 100
|
|
||||||
part_matches = [m['part'] for m in matches if m['match'] >= match_limit]
|
|
||||||
|
|
||||||
# Check for single match
|
|
||||||
if len(part_matches) == 1:
|
|
||||||
row['part_match'] = part_matches[0]
|
|
||||||
row['part_options'] = [m['part'] for m in matches if m['match'] < match_limit]
|
|
||||||
else:
|
else:
|
||||||
row['part_options'] = [m['part'] for m in matches]
|
# Otherwise, check to see if there is a matching IPN
|
||||||
|
try:
|
||||||
|
if row['part_ipn']:
|
||||||
|
part_matches = [part for part in self.allowed_parts if row['part_ipn'].lower() == part.IPN.lower()]
|
||||||
|
|
||||||
|
# Check for single match
|
||||||
|
if len(part_matches) == 1:
|
||||||
|
row['part_match'] = part_matches[0]
|
||||||
|
|
||||||
|
continue
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
print(row, row['part_match'], len(row['part_options']))
|
||||||
|
|
||||||
def extractDataFromFile(self, bom):
|
def extractDataFromFile(self, bom):
|
||||||
""" Read data from the BOM file """
|
""" Read data from the BOM file """
|
||||||
@ -1190,13 +1242,20 @@ class BomUpload(FormView):
|
|||||||
if row is None:
|
if row is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
q = 1
|
q = Decimal(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
q = int(value)
|
q = Decimal(value)
|
||||||
if q <= 0:
|
if q < 0:
|
||||||
row['errors']['quantity'] = _('Quantity must be greater than zero')
|
row['errors']['quantity'] = _('Quantity must be greater than zero')
|
||||||
except ValueError:
|
|
||||||
|
if 'part' in row.keys():
|
||||||
|
if row['part'].trackable:
|
||||||
|
# Trackable parts must use integer quantities
|
||||||
|
if not q == int(q):
|
||||||
|
row['errors']['quantity'] = _('Quantity must be integer value for trackable parts')
|
||||||
|
|
||||||
|
except (ValueError, InvalidOperation):
|
||||||
row['errors']['quantity'] = _('Enter a valid quantity')
|
row['errors']['quantity'] = _('Enter a valid quantity')
|
||||||
|
|
||||||
row['quantity'] = q
|
row['quantity'] = q
|
||||||
@ -1206,6 +1265,7 @@ class BomUpload(FormView):
|
|||||||
|
|
||||||
# Extract part from each row
|
# Extract part from each row
|
||||||
if key.startswith('part_'):
|
if key.startswith('part_'):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
row_id = int(key.replace('part_', ''))
|
row_id = int(key.replace('part_', ''))
|
||||||
|
|
||||||
@ -1239,6 +1299,14 @@ class BomUpload(FormView):
|
|||||||
|
|
||||||
row['part'] = part
|
row['part'] = part
|
||||||
|
|
||||||
|
if part.trackable:
|
||||||
|
# For trackable parts, ensure the quantity is an integer value!
|
||||||
|
if 'quantity' in row.keys():
|
||||||
|
q = row['quantity']
|
||||||
|
|
||||||
|
if not q == int(q):
|
||||||
|
row['errors']['quantity'] = _('Quantity must be integer value for trackable parts')
|
||||||
|
|
||||||
# Extract other fields which do not require further validation
|
# Extract other fields which do not require further validation
|
||||||
for field in ['reference', 'notes']:
|
for field in ['reference', 'notes']:
|
||||||
if key.startswith(field + '_'):
|
if key.startswith(field + '_'):
|
||||||
@ -1257,8 +1325,16 @@ class BomUpload(FormView):
|
|||||||
|
|
||||||
for row in self.bom_rows:
|
for row in self.bom_rows:
|
||||||
# Has a part been selected for the given row?
|
# Has a part been selected for the given row?
|
||||||
if row.get('part', None) is None:
|
part = row.get('part', None)
|
||||||
|
|
||||||
|
if part is None:
|
||||||
row['errors']['part'] = _('Select a part')
|
row['errors']['part'] = _('Select a part')
|
||||||
|
else:
|
||||||
|
# Will the selected part result in a recursive BOM?
|
||||||
|
try:
|
||||||
|
part.checkAddToBOM(self.part)
|
||||||
|
except ValidationError:
|
||||||
|
row['errors']['part'] = _('Selected part creates a circular BOM')
|
||||||
|
|
||||||
# Has a quantity been specified?
|
# Has a quantity been specified?
|
||||||
if row.get('quantity', None) is None:
|
if row.get('quantity', None) is None:
|
||||||
|
Loading…
Reference in New Issue
Block a user