Merge remote-tracking branch 'inventree/master'

This commit is contained in:
Oliver Walters 2021-03-15 21:13:53 +11:00
commit 97f93f8b03
40 changed files with 2535 additions and 2737 deletions

View File

@ -586,6 +586,8 @@
.breadcrump {
margin-bottom: 5px;
margin-left: 5px;
margin-right: 10px;
}
.inventree-body {

View File

@ -95,7 +95,7 @@ class BuildOutputCreateForm(HelperForm):
confirm = forms.BooleanField(
required=True,
label=_('Confirm'),
help_text=_('Confirm creation of build outut'),
help_text=_('Confirm creation of build output'),
)
class Meta:

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-02 17:40+0100\n"
"POT-Creation-Date: 2021-03-09 11:11+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -332,7 +332,7 @@ msgstr ""
#: stock/templates/stock/item_base.html:57
#: stock/templates/stock/item_base.html:234
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364
#: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:950
#: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954
#: templates/js/stock.js:952 templates/js/stock.js:1190
msgid "Quantity"
msgstr ""
@ -350,7 +350,7 @@ msgid "Enter serial numbers for build outputs"
msgstr ""
#: build/forms.py:98
msgid "Confirm creation of build outut"
msgid "Confirm creation of build output"
msgstr ""
#: build/forms.py:118
@ -401,6 +401,7 @@ msgstr ""
#: order/templates/order/so_navbar.html:19
#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55
#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:181
#: templates/InvenTree/search.html:169
#: templates/InvenTree/settings/tabs.html:31 users/models.py:36
msgid "Build Orders"
msgstr ""
@ -410,7 +411,7 @@ msgid "Build Order Reference"
msgstr ""
#: build/models.py:127 order/templates/order/purchase_order_detail.html:188
#: templates/js/bom.js:197 templates/js/build.js:509 templates/js/build.js:944
#: templates/js/bom.js:197 templates/js/build.js:509 templates/js/build.js:948
msgid "Reference"
msgstr ""
@ -422,11 +423,11 @@ msgstr ""
#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
#: report/models.py:175
#: report/templates/report/inventree_build_order_base.html:121
#: templates/InvenTree/search.html:194
#: templates/InvenTree/search.html:208
#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
#: templates/js/build.js:673 templates/js/build.js:940
#: templates/js/company.js:56 templates/js/order.js:181
#: templates/js/order.js:276 templates/js/part.js:168 templates/js/part.js:251
#: templates/js/build.js:677 templates/js/build.js:944
#: templates/js/company.js:56 templates/js/order.js:183
#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251
#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552
#: templates/js/stock.js:934
msgid "Description"
@ -453,11 +454,12 @@ msgstr ""
#: order/templates/order/receive_parts.html:19 part/models.py:320
#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:29
#: part/templates/part/set_category.html:13
#: part/templates/part/subcategories.html:17
#: report/templates/report/inventree_build_order_base.html:113
#: templates/InvenTree/search.html:111 templates/InvenTree/search.html:180
#: templates/InvenTree/search.html:111 templates/InvenTree/search.html:194
#: templates/js/barcode.js:362 templates/js/bom.js:163
#: templates/js/build.js:678 templates/js/build.js:917
#: templates/js/company.js:139 templates/js/part.js:232
#: templates/js/build.js:681 templates/js/build.js:921
#: templates/js/company.js:138 templates/js/part.js:232
#: templates/js/part.js:337 templates/js/stock.js:524
#: templates/js/stock.js:1262
msgid "Part"
@ -699,7 +701,7 @@ msgstr ""
#: build/templates/build/auto_allocate.html:18 stock/forms.py:346
#: stock/templates/stock/item_base.html:264
#: stock/templates/stock/stock_adjust.html:17
#: templates/InvenTree/search.html:230 templates/js/barcode.js:363
#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
#: templates/js/barcode.js:531 templates/js/build.js:434
#: templates/js/stock.js:637
msgid "Location"
@ -775,9 +777,9 @@ msgstr ""
#: build/templates/build/build_base.html:96
#: build/templates/build/detail.html:59
#: order/templates/order/receive_parts.html:24
#: stock/templates/stock/item_base.html:370 templates/InvenTree/search.html:222
#: templates/js/barcode.js:119 templates/js/build.js:706
#: templates/js/order.js:186 templates/js/order.js:281
#: stock/templates/stock/item_base.html:370 templates/InvenTree/search.html:236
#: templates/js/barcode.js:119 templates/js/build.js:710
#: templates/js/order.js:187 templates/js/order.js:285
#: templates/js/stock.js:624 templates/js/stock.js:1198
msgid "Status"
msgstr ""
@ -787,8 +789,8 @@ msgstr ""
#: order/templates/order/order_base.html:121
#: order/templates/order/sales_order_base.html:114
#: report/templates/report/inventree_build_order_base.html:129
#: templates/js/build.js:719 templates/js/order.js:199
#: templates/js/order.js:294
#: templates/js/build.js:723 templates/js/order.js:200
#: templates/js/order.js:298
msgid "Target Date"
msgstr ""
@ -808,7 +810,7 @@ msgstr ""
#: order/templates/order/sales_order_ship.html:25
#: part/templates/part/allocation.html:30
#: report/templates/report/inventree_build_order_base.html:139
#: stock/templates/stock/item_base.html:258 templates/js/order.js:242
#: stock/templates/stock/item_base.html:258 templates/js/order.js:245
msgid "Sales Order"
msgstr ""
@ -935,7 +937,7 @@ msgstr ""
#: build/templates/build/detail.html:116
#: order/templates/order/order_base.html:108
#: order/templates/order/sales_order_base.html:108 templates/js/build.js:714
#: order/templates/order/sales_order_base.html:108 templates/js/build.js:718
msgid "Created"
msgstr ""
@ -943,8 +945,8 @@ msgstr ""
msgid "No target date set"
msgstr ""
#: build/templates/build/detail.html:132 templates/js/build.js:692
#: templates/js/build.js:724
#: build/templates/build/detail.html:132 templates/js/build.js:696
#: templates/js/build.js:728
msgid "Completed"
msgstr ""
@ -1139,7 +1141,7 @@ msgid "Stock item is over-allocated"
msgstr ""
#: build/views.py:851 templates/js/bom.js:230 templates/js/build.js:519
#: templates/js/build.js:774 templates/js/build.js:957
#: templates/js/build.js:778 templates/js/build.js:961
msgid "Available"
msgstr ""
@ -1541,7 +1543,7 @@ msgid "Description of the company"
msgstr ""
#: company/models.py:100 company/templates/company/company_base.html:57
#: company/templates/company/detail.html:31 templates/js/company.js:61
#: company/templates/company/detail.html:31 templates/js/company.js:60
msgid "Website"
msgstr ""
@ -1616,7 +1618,7 @@ msgstr ""
#: order/templates/order/order_base.html:89
#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
#: stock/templates/stock/item_base.html:331 templates/js/company.js:48
#: templates/js/company.js:165 templates/js/order.js:168
#: templates/js/company.js:164 templates/js/order.js:170
msgid "Supplier"
msgstr ""
@ -1637,7 +1639,7 @@ msgstr ""
#: company/models.py:340 company/templates/company/detail.html:55
#: company/templates/company/supplier_part_base.html:93
#: company/templates/company/supplier_part_detail.html:34 part/bom.py:172
#: templates/js/company.js:44 templates/js/company.js:189
#: templates/js/company.js:44 templates/js/company.js:188
msgid "Manufacturer"
msgstr ""
@ -1648,7 +1650,7 @@ msgstr ""
#: company/models.py:347 company/templates/company/supplier_part_base.html:99
#: company/templates/company/supplier_part_detail.html:35
#: order/templates/order/purchase_order_detail.html:183 part/bom.py:173
#: templates/js/company.js:205
#: templates/js/company.js:204
msgid "MPN"
msgstr ""
@ -1658,7 +1660,7 @@ msgstr ""
#: company/models.py:353 part/models.py:742
#: report/templates/report/inventree_build_order_base.html:168
#: templates/js/company.js:209 templates/js/part.js:430
#: templates/js/company.js:208 templates/js/part.js:430
msgid "Link"
msgstr ""
@ -1691,7 +1693,7 @@ msgstr ""
#: company/templates/company/company_base.html:7
#: company/templates/company/company_base.html:22
#: templates/InvenTree/search.html:274 templates/js/company.js:33
#: templates/InvenTree/search.html:288 templates/js/company.js:33
msgid "Company"
msgstr ""
@ -1720,7 +1722,7 @@ msgstr ""
#: company/templates/company/detail.html:65
#: order/templates/order/sales_order_base.html:89 stock/models.py:412
#: stock/models.py:413 stock/templates/stock/item_base.html:241
#: templates/js/company.js:40 templates/js/order.js:263
#: templates/js/company.js:40 templates/js/order.js:267
msgid "Customer"
msgstr ""
@ -1821,16 +1823,18 @@ msgstr ""
#: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33
#: stock/templates/stock/location.html:100
#: stock/templates/stock/location.html:115 templates/InvenTree/search.html:168
#: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182
#: templates/stats.html:48 templates/stats.html:57 users/models.py:35
msgid "Stock Items"
msgstr ""
#: company/templates/company/navbar.html:30
#: company/templates/company/part_navbar.html:14
#: part/templates/part/navbar.html:36 stock/templates/stock/location.html:29
#: templates/InvenTree/index.html:127 templates/InvenTree/search.html:166
#: templates/InvenTree/search.html:202
#: part/templates/part/navbar.html:36 stock/templates/stock/loc_link.html:7
#: stock/templates/stock/location.html:29
#: stock/templates/stock/stock_app_base.html:9
#: templates/InvenTree/index.html:127 templates/InvenTree/search.html:180
#: templates/InvenTree/search.html:216
#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:172
#: templates/js/part.js:397 templates/js/stock.js:559 templates/navbar.html:26
msgid "Stock"
@ -1843,7 +1847,8 @@ msgstr ""
#: order/templates/order/sales_orders.html:8
#: order/templates/order/sales_orders.html:13
#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95
#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228
#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:226
#: templates/InvenTree/search.html:330
#: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46
#: users/models.py:38
msgid "Sales Orders"
@ -1854,7 +1859,8 @@ msgstr ""
#: order/templates/order/purchase_orders.html:8
#: order/templates/order/purchase_orders.html:13
#: part/templates/part/navbar.html:78 part/templates/part/navbar.html:81
#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205
#: part/templates/part/orders.html:10 templates/InvenTree/index.html:203
#: templates/InvenTree/search.html:300
#: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37
#: users/models.py:37
msgid "Purchase Orders"
@ -1912,7 +1918,7 @@ msgstr ""
#: company/templates/company/supplier_part_base.html:6
#: company/templates/company/supplier_part_base.html:19 stock/models.py:379
#: stock/templates/stock/item_base.html:336 templates/js/company.js:181
#: stock/templates/stock/item_base.html:336 templates/js/company.js:180
msgid "Supplier Part"
msgstr ""
@ -1974,17 +1980,17 @@ msgid "Delete price break"
msgstr ""
#: company/views.py:55 part/templates/part/navbar.html:72
#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:277
#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:291
#: templates/navbar.html:35
msgid "Suppliers"
msgstr ""
#: company/views.py:62 templates/InvenTree/search.html:286
#: company/views.py:62 templates/InvenTree/search.html:308
#: templates/navbar.html:36
msgid "Manufacturers"
msgstr ""
#: company/views.py:69 templates/InvenTree/search.html:299
#: company/views.py:69 templates/InvenTree/search.html:321
#: templates/navbar.html:45
msgid "Customers"
msgstr ""
@ -2243,7 +2249,7 @@ msgstr ""
#: order/models.py:608 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:24
#: stock/templates/stock/item_base.html:303 templates/js/order.js:146
#: stock/templates/stock/item_base.html:303 templates/js/order.js:148
msgid "Purchase Order"
msgstr ""
@ -2321,7 +2327,7 @@ msgstr ""
msgid "Order Status"
msgstr ""
#: order/templates/order/order_base.html:95 templates/js/order.js:176
#: order/templates/order/order_base.html:95 templates/js/order.js:179
msgid "Supplier Reference"
msgstr ""
@ -2375,7 +2381,7 @@ msgid "Select existing purchase orders, or create new orders."
msgstr ""
#: order/templates/order/order_wizard/select_pos.html:31
#: templates/js/order.js:204 templates/js/order.js:304
#: templates/js/order.js:205 templates/js/order.js:308
msgid "Items"
msgstr ""
@ -2383,7 +2389,7 @@ msgstr ""
msgid "Select Purchase Order"
msgstr ""
#: order/templates/order/order_wizard/select_pos.html:67
#: order/templates/order/order_wizard/select_pos.html:68
msgid "Select a purchase order for"
msgstr ""
@ -2483,7 +2489,7 @@ msgstr ""
msgid "Sales Order Details"
msgstr ""
#: order/templates/order/sales_order_base.html:95 templates/js/order.js:270
#: order/templates/order/sales_order_base.html:95 templates/js/order.js:275
msgid "Customer Reference"
msgstr ""
@ -2507,17 +2513,17 @@ msgid "Serial Number"
msgstr ""
#: order/templates/order/sales_order_detail.html:99 templates/js/build.js:459
#: templates/js/build.js:785
#: templates/js/build.js:789
msgid "Edit stock allocation"
msgstr ""
#: order/templates/order/sales_order_detail.html:100 templates/js/build.js:461
#: templates/js/build.js:786
#: templates/js/build.js:790
msgid "Delete stock allocation"
msgstr ""
#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
#: templates/js/build.js:781
#: templates/js/build.js:785
msgid "Allocated"
msgstr ""
@ -3192,7 +3198,7 @@ msgstr ""
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:89
#: stock/templates/stock/item_base.html:318
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:767
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
#: templates/js/stock.js:923 templates/js/stock.js:1181
msgid "Stock Item"
msgstr ""
@ -3428,6 +3434,47 @@ msgstr ""
msgid "Create new Stock Location"
msgstr ""
#: part/templates/part/category_delete.html:5
msgid "Are you sure you want to delete category"
msgstr ""
#: part/templates/part/category_delete.html:8
#: part/templates/part/category_delete.html:25
msgid "This category contains"
msgstr ""
#: part/templates/part/category_delete.html:8
msgid "child categories"
msgstr ""
#: part/templates/part/category_delete.html:9
msgid ""
"If this category is deleted, these child categories will be moved to the"
msgstr ""
#: part/templates/part/category_delete.html:11
msgid "category"
msgstr ""
#: part/templates/part/category_delete.html:13
msgid "top level Parts category"
msgstr ""
#: part/templates/part/category_delete.html:25
msgid "parts"
msgstr ""
#: part/templates/part/category_delete.html:27
msgid ""
"If this category is deleted, these parts will be moved to the parent category"
msgstr ""
#: part/templates/part/category_delete.html:29
msgid ""
"If this category is deleted, these parts will be moved to the top-level "
"category Teile"
msgstr ""
#: part/templates/part/category_navbar.html:18
#: part/templates/part/category_navbar.html:21
#: part/templates/part/navbar.html:22
@ -3439,6 +3486,14 @@ msgstr ""
msgid "Part Parameters"
msgstr ""
#: part/templates/part/copy_part.html:9 part/views.py:455
msgid "Duplicate Part"
msgstr ""
#: part/templates/part/copy_part.html:10
msgid "Make a copy of part"
msgstr ""
#: part/templates/part/copy_part.html:14
#: part/templates/part/create_part.html:11
msgid "Possible Matching Parts"
@ -3469,7 +3524,7 @@ msgstr ""
msgid "Stock Expiry Time"
msgstr ""
#: part/templates/part/detail.html:126 templates/js/order.js:289
#: part/templates/part/detail.html:126 templates/js/order.js:293
msgid "Creation Date"
msgstr ""
@ -3620,7 +3675,7 @@ msgstr ""
msgid "This part is a variant of"
msgstr ""
#: part/templates/part/part_base.html:32 templates/js/company.js:156
#: part/templates/part/part_base.html:32 templates/js/company.js:155
#: templates/js/part.js:75 templates/js/part.js:152
msgid "Inactive"
msgstr ""
@ -3735,6 +3790,10 @@ msgstr ""
msgid "Part Stock"
msgstr ""
#: part/templates/part/stock.html:16
msgid "Showing stock for all variants of"
msgstr ""
#: part/templates/part/stock_count.html:7 templates/js/bom.js:239
#: templates/js/part.js:421
msgid "No Stock"
@ -3744,6 +3803,10 @@ msgstr ""
msgid "Low Stock"
msgstr ""
#: part/templates/part/subcategories.html:5
msgid "Child Categories"
msgstr ""
#: part/templates/part/supplier.html:10
msgid "Part Suppliers"
msgstr ""
@ -3837,10 +3900,6 @@ msgstr ""
msgid "Create Variant"
msgstr ""
#: part/views.py:455
msgid "Duplicate Part"
msgstr ""
#: part/views.py:460
msgid "Copied part"
msgstr ""
@ -4084,7 +4143,7 @@ msgid "Result"
msgstr ""
#: report/templates/report/inventree_test_report_base.html:92
#: templates/js/order.js:194 templates/js/stock.js:905
#: templates/js/order.js:195 templates/js/stock.js:905
msgid "Date"
msgstr ""
@ -4553,8 +4612,8 @@ msgstr ""
msgid "Barcode Identifier"
msgstr ""
#: stock/templates/stock/item_base.html:296 templates/js/build.js:651
#: templates/navbar.html:29
#: stock/templates/stock/item_base.html:296 templates/InvenTree/search.html:167
#: templates/js/build.js:655 templates/navbar.html:29
msgid "Build"
msgstr ""
@ -4682,7 +4741,7 @@ msgstr ""
msgid "Stock Details"
msgstr ""
#: stock/templates/stock/location.html:110 templates/InvenTree/search.html:249
#: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263
#: templates/stats.html:52 users/models.py:34
msgid "Stock Locations"
msgstr ""
@ -4691,6 +4750,18 @@ msgstr ""
msgid "Are you sure you want to delete this stock location?"
msgstr ""
#: stock/templates/stock/location_list.html:6
msgid "Sub-Locations"
msgstr ""
#. Translators: pluralize with counter
#: stock/templates/stock/location_list.html:17
#, python-format
msgid "%(counter)s Item"
msgid_plural "%(counter)s Items"
msgstr[0] ""
msgstr[1] ""
#: stock/templates/stock/navbar.html:11
msgid "Stock Item Tracking"
msgstr ""
@ -4972,19 +5043,19 @@ msgstr ""
msgid "Overdue Build Orders"
msgstr ""
#: templates/InvenTree/index.html:206
#: templates/InvenTree/index.html:204
msgid "Outstanding Purchase Orders"
msgstr ""
#: templates/InvenTree/index.html:207
#: templates/InvenTree/index.html:205
msgid "Overdue Purchase Orders"
msgstr ""
#: templates/InvenTree/index.html:229
#: templates/InvenTree/index.html:227
msgid "Outstanding Sales Orders"
msgstr ""
#: templates/InvenTree/index.html:230
#: templates/InvenTree/index.html:228
msgid "Overdue Sales Orders"
msgstr ""
@ -4996,11 +5067,11 @@ msgstr ""
msgid "Enter a search query"
msgstr ""
#: templates/InvenTree/search.html:238 templates/js/stock.js:301
#: templates/InvenTree/search.html:252 templates/js/stock.js:301
msgid "Shipped to customer"
msgstr ""
#: templates/InvenTree/search.html:241 templates/js/stock.js:311
#: templates/InvenTree/search.html:255 templates/js/stock.js:311
msgid "No stock location set"
msgstr ""
@ -5316,7 +5387,7 @@ msgstr ""
msgid "Barcode does not match a valid location"
msgstr ""
#: templates/js/bom.js:175 templates/js/build.js:930
#: templates/js/bom.js:175 templates/js/build.js:934
msgid "Open subassembly"
msgstr ""
@ -5332,7 +5403,7 @@ msgstr ""
msgid "View BOM"
msgstr ""
#: templates/js/bom.js:338 templates/js/build.js:571 templates/js/build.js:980
#: templates/js/bom.js:338 templates/js/build.js:571 templates/js/build.js:984
msgid "Actions"
msgstr ""
@ -5352,7 +5423,7 @@ msgstr ""
msgid "Delete BOM Item"
msgstr ""
#: templates/js/bom.js:443 templates/js/build.js:305 templates/js/build.js:1028
#: templates/js/bom.js:443 templates/js/build.js:305 templates/js/build.js:1032
msgid "No BOM items found"
msgstr ""
@ -5384,11 +5455,11 @@ msgstr ""
msgid "Quantity Per"
msgstr ""
#: templates/js/build.js:578 templates/js/build.js:988
#: templates/js/build.js:578 templates/js/build.js:992
msgid "Build stock"
msgstr ""
#: templates/js/build.js:582 templates/js/build.js:992
#: templates/js/build.js:582 templates/js/build.js:996
#: templates/stock_table.html:57
msgid "Order stock"
msgstr ""
@ -5397,44 +5468,44 @@ msgstr ""
msgid "Allocate stock"
msgstr ""
#: templates/js/build.js:628
#: templates/js/build.js:632
msgid "No builds matching query"
msgstr ""
#: templates/js/build.js:645 templates/js/part.js:323 templates/js/stock.js:512
#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:512
#: templates/js/stock.js:1250
msgid "Select"
msgstr ""
#: templates/js/build.js:665
#: templates/js/build.js:669
msgid "Build order is overdue"
msgstr ""
#: templates/js/build.js:763
#: templates/js/build.js:767
msgid "No parts allocated for"
msgstr ""
#: templates/js/company.js:75
#: templates/js/company.js:74
msgid "Parts Supplied"
msgstr ""
#: templates/js/company.js:84
#: templates/js/company.js:83
msgid "Parts Manufactured"
msgstr ""
#: templates/js/company.js:97
#: templates/js/company.js:96
msgid "No company information found"
msgstr ""
#: templates/js/company.js:130
#: templates/js/company.js:129
msgid "No supplier parts found"
msgstr ""
#: templates/js/company.js:148 templates/js/part.js:59 templates/js/part.js:144
#: templates/js/company.js:147 templates/js/part.js:59 templates/js/part.js:144
msgid "Template part"
msgstr ""
#: templates/js/company.js:152 templates/js/part.js:63 templates/js/part.js:148
#: templates/js/company.js:151 templates/js/part.js:63 templates/js/part.js:148
msgid "Assembled part"
msgstr ""
@ -5572,19 +5643,19 @@ msgstr ""
msgid "Error requesting form data"
msgstr ""
#: templates/js/order.js:136
#: templates/js/order.js:138
msgid "No purchase orders found"
msgstr ""
#: templates/js/order.js:160 templates/js/order.js:254
#: templates/js/order.js:162 templates/js/order.js:257
msgid "Order is overdue"
msgstr ""
#: templates/js/order.js:231
#: templates/js/order.js:234
msgid "No sales orders found"
msgstr ""
#: templates/js/order.js:299
#: templates/js/order.js:303
msgid "Shipment Date"
msgstr ""
@ -6051,7 +6122,7 @@ msgstr ""
msgid "Admin"
msgstr ""
#: templates/navbar.html:71
#: templates/navbar.html:71 templates/registration/logout.html:5
msgid "Logout"
msgstr ""
@ -6083,6 +6154,18 @@ msgstr ""
msgid "Username / password combination is incorrect"
msgstr ""
#: templates/registration/logout.html:6
msgid "You have been logged out"
msgstr ""
#: templates/registration/logout.html:7
msgid "Click"
msgstr ""
#: templates/registration/logout.html:7
msgid "here</a> to log in</p>"
msgstr ""
#: templates/stats.html:9
msgid "Server"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-02 17:40+0100\n"
"POT-Creation-Date: 2021-03-09 11:11+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -332,7 +332,7 @@ msgstr ""
#: stock/templates/stock/item_base.html:57
#: stock/templates/stock/item_base.html:234
#: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364
#: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:950
#: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954
#: templates/js/stock.js:952 templates/js/stock.js:1190
msgid "Quantity"
msgstr ""
@ -350,7 +350,7 @@ msgid "Enter serial numbers for build outputs"
msgstr ""
#: build/forms.py:98
msgid "Confirm creation of build outut"
msgid "Confirm creation of build output"
msgstr ""
#: build/forms.py:118
@ -401,6 +401,7 @@ msgstr ""
#: order/templates/order/so_navbar.html:19
#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55
#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:181
#: templates/InvenTree/search.html:169
#: templates/InvenTree/settings/tabs.html:31 users/models.py:36
msgid "Build Orders"
msgstr ""
@ -410,7 +411,7 @@ msgid "Build Order Reference"
msgstr ""
#: build/models.py:127 order/templates/order/purchase_order_detail.html:188
#: templates/js/bom.js:197 templates/js/build.js:509 templates/js/build.js:944
#: templates/js/bom.js:197 templates/js/build.js:509 templates/js/build.js:948
msgid "Reference"
msgstr ""
@ -422,11 +423,11 @@ msgstr ""
#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
#: report/models.py:175
#: report/templates/report/inventree_build_order_base.html:121
#: templates/InvenTree/search.html:194
#: templates/InvenTree/search.html:208
#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
#: templates/js/build.js:673 templates/js/build.js:940
#: templates/js/company.js:56 templates/js/order.js:181
#: templates/js/order.js:276 templates/js/part.js:168 templates/js/part.js:251
#: templates/js/build.js:677 templates/js/build.js:944
#: templates/js/company.js:56 templates/js/order.js:183
#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251
#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552
#: templates/js/stock.js:934
msgid "Description"
@ -453,11 +454,12 @@ msgstr ""
#: order/templates/order/receive_parts.html:19 part/models.py:320
#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:29
#: part/templates/part/set_category.html:13
#: part/templates/part/subcategories.html:17
#: report/templates/report/inventree_build_order_base.html:113
#: templates/InvenTree/search.html:111 templates/InvenTree/search.html:180
#: templates/InvenTree/search.html:111 templates/InvenTree/search.html:194
#: templates/js/barcode.js:362 templates/js/bom.js:163
#: templates/js/build.js:678 templates/js/build.js:917
#: templates/js/company.js:139 templates/js/part.js:232
#: templates/js/build.js:681 templates/js/build.js:921
#: templates/js/company.js:138 templates/js/part.js:232
#: templates/js/part.js:337 templates/js/stock.js:524
#: templates/js/stock.js:1262
msgid "Part"
@ -699,7 +701,7 @@ msgstr ""
#: build/templates/build/auto_allocate.html:18 stock/forms.py:346
#: stock/templates/stock/item_base.html:264
#: stock/templates/stock/stock_adjust.html:17
#: templates/InvenTree/search.html:230 templates/js/barcode.js:363
#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
#: templates/js/barcode.js:531 templates/js/build.js:434
#: templates/js/stock.js:637
msgid "Location"
@ -775,9 +777,9 @@ msgstr ""
#: build/templates/build/build_base.html:96
#: build/templates/build/detail.html:59
#: order/templates/order/receive_parts.html:24
#: stock/templates/stock/item_base.html:370 templates/InvenTree/search.html:222
#: templates/js/barcode.js:119 templates/js/build.js:706
#: templates/js/order.js:186 templates/js/order.js:281
#: stock/templates/stock/item_base.html:370 templates/InvenTree/search.html:236
#: templates/js/barcode.js:119 templates/js/build.js:710
#: templates/js/order.js:187 templates/js/order.js:285
#: templates/js/stock.js:624 templates/js/stock.js:1198
msgid "Status"
msgstr ""
@ -787,8 +789,8 @@ msgstr ""
#: order/templates/order/order_base.html:121
#: order/templates/order/sales_order_base.html:114
#: report/templates/report/inventree_build_order_base.html:129
#: templates/js/build.js:719 templates/js/order.js:199
#: templates/js/order.js:294
#: templates/js/build.js:723 templates/js/order.js:200
#: templates/js/order.js:298
msgid "Target Date"
msgstr ""
@ -808,7 +810,7 @@ msgstr ""
#: order/templates/order/sales_order_ship.html:25
#: part/templates/part/allocation.html:30
#: report/templates/report/inventree_build_order_base.html:139
#: stock/templates/stock/item_base.html:258 templates/js/order.js:242
#: stock/templates/stock/item_base.html:258 templates/js/order.js:245
msgid "Sales Order"
msgstr ""
@ -935,7 +937,7 @@ msgstr ""
#: build/templates/build/detail.html:116
#: order/templates/order/order_base.html:108
#: order/templates/order/sales_order_base.html:108 templates/js/build.js:714
#: order/templates/order/sales_order_base.html:108 templates/js/build.js:718
msgid "Created"
msgstr ""
@ -943,8 +945,8 @@ msgstr ""
msgid "No target date set"
msgstr ""
#: build/templates/build/detail.html:132 templates/js/build.js:692
#: templates/js/build.js:724
#: build/templates/build/detail.html:132 templates/js/build.js:696
#: templates/js/build.js:728
msgid "Completed"
msgstr ""
@ -1139,7 +1141,7 @@ msgid "Stock item is over-allocated"
msgstr ""
#: build/views.py:851 templates/js/bom.js:230 templates/js/build.js:519
#: templates/js/build.js:774 templates/js/build.js:957
#: templates/js/build.js:778 templates/js/build.js:961
msgid "Available"
msgstr ""
@ -1541,7 +1543,7 @@ msgid "Description of the company"
msgstr ""
#: company/models.py:100 company/templates/company/company_base.html:57
#: company/templates/company/detail.html:31 templates/js/company.js:61
#: company/templates/company/detail.html:31 templates/js/company.js:60
msgid "Website"
msgstr ""
@ -1616,7 +1618,7 @@ msgstr ""
#: order/templates/order/order_base.html:89
#: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
#: stock/templates/stock/item_base.html:331 templates/js/company.js:48
#: templates/js/company.js:165 templates/js/order.js:168
#: templates/js/company.js:164 templates/js/order.js:170
msgid "Supplier"
msgstr ""
@ -1637,7 +1639,7 @@ msgstr ""
#: company/models.py:340 company/templates/company/detail.html:55
#: company/templates/company/supplier_part_base.html:93
#: company/templates/company/supplier_part_detail.html:34 part/bom.py:172
#: templates/js/company.js:44 templates/js/company.js:189
#: templates/js/company.js:44 templates/js/company.js:188
msgid "Manufacturer"
msgstr ""
@ -1648,7 +1650,7 @@ msgstr ""
#: company/models.py:347 company/templates/company/supplier_part_base.html:99
#: company/templates/company/supplier_part_detail.html:35
#: order/templates/order/purchase_order_detail.html:183 part/bom.py:173
#: templates/js/company.js:205
#: templates/js/company.js:204
msgid "MPN"
msgstr ""
@ -1658,7 +1660,7 @@ msgstr ""
#: company/models.py:353 part/models.py:742
#: report/templates/report/inventree_build_order_base.html:168
#: templates/js/company.js:209 templates/js/part.js:430
#: templates/js/company.js:208 templates/js/part.js:430
msgid "Link"
msgstr ""
@ -1691,7 +1693,7 @@ msgstr ""
#: company/templates/company/company_base.html:7
#: company/templates/company/company_base.html:22
#: templates/InvenTree/search.html:274 templates/js/company.js:33
#: templates/InvenTree/search.html:288 templates/js/company.js:33
msgid "Company"
msgstr ""
@ -1720,7 +1722,7 @@ msgstr ""
#: company/templates/company/detail.html:65
#: order/templates/order/sales_order_base.html:89 stock/models.py:412
#: stock/models.py:413 stock/templates/stock/item_base.html:241
#: templates/js/company.js:40 templates/js/order.js:263
#: templates/js/company.js:40 templates/js/order.js:267
msgid "Customer"
msgstr ""
@ -1821,16 +1823,18 @@ msgstr ""
#: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33
#: stock/templates/stock/location.html:100
#: stock/templates/stock/location.html:115 templates/InvenTree/search.html:168
#: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182
#: templates/stats.html:48 templates/stats.html:57 users/models.py:35
msgid "Stock Items"
msgstr ""
#: company/templates/company/navbar.html:30
#: company/templates/company/part_navbar.html:14
#: part/templates/part/navbar.html:36 stock/templates/stock/location.html:29
#: templates/InvenTree/index.html:127 templates/InvenTree/search.html:166
#: templates/InvenTree/search.html:202
#: part/templates/part/navbar.html:36 stock/templates/stock/loc_link.html:7
#: stock/templates/stock/location.html:29
#: stock/templates/stock/stock_app_base.html:9
#: templates/InvenTree/index.html:127 templates/InvenTree/search.html:180
#: templates/InvenTree/search.html:216
#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:172
#: templates/js/part.js:397 templates/js/stock.js:559 templates/navbar.html:26
msgid "Stock"
@ -1843,7 +1847,8 @@ msgstr ""
#: order/templates/order/sales_orders.html:8
#: order/templates/order/sales_orders.html:13
#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95
#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228
#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:226
#: templates/InvenTree/search.html:330
#: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46
#: users/models.py:38
msgid "Sales Orders"
@ -1854,7 +1859,8 @@ msgstr ""
#: order/templates/order/purchase_orders.html:8
#: order/templates/order/purchase_orders.html:13
#: part/templates/part/navbar.html:78 part/templates/part/navbar.html:81
#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205
#: part/templates/part/orders.html:10 templates/InvenTree/index.html:203
#: templates/InvenTree/search.html:300
#: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37
#: users/models.py:37
msgid "Purchase Orders"
@ -1912,7 +1918,7 @@ msgstr ""
#: company/templates/company/supplier_part_base.html:6
#: company/templates/company/supplier_part_base.html:19 stock/models.py:379
#: stock/templates/stock/item_base.html:336 templates/js/company.js:181
#: stock/templates/stock/item_base.html:336 templates/js/company.js:180
msgid "Supplier Part"
msgstr ""
@ -1974,17 +1980,17 @@ msgid "Delete price break"
msgstr ""
#: company/views.py:55 part/templates/part/navbar.html:72
#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:277
#: part/templates/part/navbar.html:75 templates/InvenTree/search.html:291
#: templates/navbar.html:35
msgid "Suppliers"
msgstr ""
#: company/views.py:62 templates/InvenTree/search.html:286
#: company/views.py:62 templates/InvenTree/search.html:308
#: templates/navbar.html:36
msgid "Manufacturers"
msgstr ""
#: company/views.py:69 templates/InvenTree/search.html:299
#: company/views.py:69 templates/InvenTree/search.html:321
#: templates/navbar.html:45
msgid "Customers"
msgstr ""
@ -2243,7 +2249,7 @@ msgstr ""
#: order/models.py:608 order/templates/order/order_base.html:9
#: order/templates/order/order_base.html:24
#: stock/templates/stock/item_base.html:303 templates/js/order.js:146
#: stock/templates/stock/item_base.html:303 templates/js/order.js:148
msgid "Purchase Order"
msgstr ""
@ -2321,7 +2327,7 @@ msgstr ""
msgid "Order Status"
msgstr ""
#: order/templates/order/order_base.html:95 templates/js/order.js:176
#: order/templates/order/order_base.html:95 templates/js/order.js:179
msgid "Supplier Reference"
msgstr ""
@ -2375,7 +2381,7 @@ msgid "Select existing purchase orders, or create new orders."
msgstr ""
#: order/templates/order/order_wizard/select_pos.html:31
#: templates/js/order.js:204 templates/js/order.js:304
#: templates/js/order.js:205 templates/js/order.js:308
msgid "Items"
msgstr ""
@ -2383,7 +2389,7 @@ msgstr ""
msgid "Select Purchase Order"
msgstr ""
#: order/templates/order/order_wizard/select_pos.html:67
#: order/templates/order/order_wizard/select_pos.html:68
msgid "Select a purchase order for"
msgstr ""
@ -2483,7 +2489,7 @@ msgstr ""
msgid "Sales Order Details"
msgstr ""
#: order/templates/order/sales_order_base.html:95 templates/js/order.js:270
#: order/templates/order/sales_order_base.html:95 templates/js/order.js:275
msgid "Customer Reference"
msgstr ""
@ -2507,17 +2513,17 @@ msgid "Serial Number"
msgstr ""
#: order/templates/order/sales_order_detail.html:99 templates/js/build.js:459
#: templates/js/build.js:785
#: templates/js/build.js:789
msgid "Edit stock allocation"
msgstr ""
#: order/templates/order/sales_order_detail.html:100 templates/js/build.js:461
#: templates/js/build.js:786
#: templates/js/build.js:790
msgid "Delete stock allocation"
msgstr ""
#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
#: templates/js/build.js:781
#: templates/js/build.js:785
msgid "Allocated"
msgstr ""
@ -3192,7 +3198,7 @@ msgstr ""
#: stock/templates/stock/item_base.html:8
#: stock/templates/stock/item_base.html:89
#: stock/templates/stock/item_base.html:318
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:767
#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
#: templates/js/stock.js:923 templates/js/stock.js:1181
msgid "Stock Item"
msgstr ""
@ -3428,6 +3434,47 @@ msgstr ""
msgid "Create new Stock Location"
msgstr ""
#: part/templates/part/category_delete.html:5
msgid "Are you sure you want to delete category"
msgstr ""
#: part/templates/part/category_delete.html:8
#: part/templates/part/category_delete.html:25
msgid "This category contains"
msgstr ""
#: part/templates/part/category_delete.html:8
msgid "child categories"
msgstr ""
#: part/templates/part/category_delete.html:9
msgid ""
"If this category is deleted, these child categories will be moved to the"
msgstr ""
#: part/templates/part/category_delete.html:11
msgid "category"
msgstr ""
#: part/templates/part/category_delete.html:13
msgid "top level Parts category"
msgstr ""
#: part/templates/part/category_delete.html:25
msgid "parts"
msgstr ""
#: part/templates/part/category_delete.html:27
msgid ""
"If this category is deleted, these parts will be moved to the parent category"
msgstr ""
#: part/templates/part/category_delete.html:29
msgid ""
"If this category is deleted, these parts will be moved to the top-level "
"category Teile"
msgstr ""
#: part/templates/part/category_navbar.html:18
#: part/templates/part/category_navbar.html:21
#: part/templates/part/navbar.html:22
@ -3439,6 +3486,14 @@ msgstr ""
msgid "Part Parameters"
msgstr ""
#: part/templates/part/copy_part.html:9 part/views.py:455
msgid "Duplicate Part"
msgstr ""
#: part/templates/part/copy_part.html:10
msgid "Make a copy of part"
msgstr ""
#: part/templates/part/copy_part.html:14
#: part/templates/part/create_part.html:11
msgid "Possible Matching Parts"
@ -3469,7 +3524,7 @@ msgstr ""
msgid "Stock Expiry Time"
msgstr ""
#: part/templates/part/detail.html:126 templates/js/order.js:289
#: part/templates/part/detail.html:126 templates/js/order.js:293
msgid "Creation Date"
msgstr ""
@ -3620,7 +3675,7 @@ msgstr ""
msgid "This part is a variant of"
msgstr ""
#: part/templates/part/part_base.html:32 templates/js/company.js:156
#: part/templates/part/part_base.html:32 templates/js/company.js:155
#: templates/js/part.js:75 templates/js/part.js:152
msgid "Inactive"
msgstr ""
@ -3735,6 +3790,10 @@ msgstr ""
msgid "Part Stock"
msgstr ""
#: part/templates/part/stock.html:16
msgid "Showing stock for all variants of"
msgstr ""
#: part/templates/part/stock_count.html:7 templates/js/bom.js:239
#: templates/js/part.js:421
msgid "No Stock"
@ -3744,6 +3803,10 @@ msgstr ""
msgid "Low Stock"
msgstr ""
#: part/templates/part/subcategories.html:5
msgid "Child Categories"
msgstr ""
#: part/templates/part/supplier.html:10
msgid "Part Suppliers"
msgstr ""
@ -3837,10 +3900,6 @@ msgstr ""
msgid "Create Variant"
msgstr ""
#: part/views.py:455
msgid "Duplicate Part"
msgstr ""
#: part/views.py:460
msgid "Copied part"
msgstr ""
@ -4084,7 +4143,7 @@ msgid "Result"
msgstr ""
#: report/templates/report/inventree_test_report_base.html:92
#: templates/js/order.js:194 templates/js/stock.js:905
#: templates/js/order.js:195 templates/js/stock.js:905
msgid "Date"
msgstr ""
@ -4553,8 +4612,8 @@ msgstr ""
msgid "Barcode Identifier"
msgstr ""
#: stock/templates/stock/item_base.html:296 templates/js/build.js:651
#: templates/navbar.html:29
#: stock/templates/stock/item_base.html:296 templates/InvenTree/search.html:167
#: templates/js/build.js:655 templates/navbar.html:29
msgid "Build"
msgstr ""
@ -4682,7 +4741,7 @@ msgstr ""
msgid "Stock Details"
msgstr ""
#: stock/templates/stock/location.html:110 templates/InvenTree/search.html:249
#: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263
#: templates/stats.html:52 users/models.py:34
msgid "Stock Locations"
msgstr ""
@ -4691,6 +4750,18 @@ msgstr ""
msgid "Are you sure you want to delete this stock location?"
msgstr ""
#: stock/templates/stock/location_list.html:6
msgid "Sub-Locations"
msgstr ""
#. Translators: pluralize with counter
#: stock/templates/stock/location_list.html:17
#, python-format
msgid "%(counter)s Item"
msgid_plural "%(counter)s Items"
msgstr[0] ""
msgstr[1] ""
#: stock/templates/stock/navbar.html:11
msgid "Stock Item Tracking"
msgstr ""
@ -4972,19 +5043,19 @@ msgstr ""
msgid "Overdue Build Orders"
msgstr ""
#: templates/InvenTree/index.html:206
#: templates/InvenTree/index.html:204
msgid "Outstanding Purchase Orders"
msgstr ""
#: templates/InvenTree/index.html:207
#: templates/InvenTree/index.html:205
msgid "Overdue Purchase Orders"
msgstr ""
#: templates/InvenTree/index.html:229
#: templates/InvenTree/index.html:227
msgid "Outstanding Sales Orders"
msgstr ""
#: templates/InvenTree/index.html:230
#: templates/InvenTree/index.html:228
msgid "Overdue Sales Orders"
msgstr ""
@ -4996,11 +5067,11 @@ msgstr ""
msgid "Enter a search query"
msgstr ""
#: templates/InvenTree/search.html:238 templates/js/stock.js:301
#: templates/InvenTree/search.html:252 templates/js/stock.js:301
msgid "Shipped to customer"
msgstr ""
#: templates/InvenTree/search.html:241 templates/js/stock.js:311
#: templates/InvenTree/search.html:255 templates/js/stock.js:311
msgid "No stock location set"
msgstr ""
@ -5316,7 +5387,7 @@ msgstr ""
msgid "Barcode does not match a valid location"
msgstr ""
#: templates/js/bom.js:175 templates/js/build.js:930
#: templates/js/bom.js:175 templates/js/build.js:934
msgid "Open subassembly"
msgstr ""
@ -5332,7 +5403,7 @@ msgstr ""
msgid "View BOM"
msgstr ""
#: templates/js/bom.js:338 templates/js/build.js:571 templates/js/build.js:980
#: templates/js/bom.js:338 templates/js/build.js:571 templates/js/build.js:984
msgid "Actions"
msgstr ""
@ -5352,7 +5423,7 @@ msgstr ""
msgid "Delete BOM Item"
msgstr ""
#: templates/js/bom.js:443 templates/js/build.js:305 templates/js/build.js:1028
#: templates/js/bom.js:443 templates/js/build.js:305 templates/js/build.js:1032
msgid "No BOM items found"
msgstr ""
@ -5384,11 +5455,11 @@ msgstr ""
msgid "Quantity Per"
msgstr ""
#: templates/js/build.js:578 templates/js/build.js:988
#: templates/js/build.js:578 templates/js/build.js:992
msgid "Build stock"
msgstr ""
#: templates/js/build.js:582 templates/js/build.js:992
#: templates/js/build.js:582 templates/js/build.js:996
#: templates/stock_table.html:57
msgid "Order stock"
msgstr ""
@ -5397,44 +5468,44 @@ msgstr ""
msgid "Allocate stock"
msgstr ""
#: templates/js/build.js:628
#: templates/js/build.js:632
msgid "No builds matching query"
msgstr ""
#: templates/js/build.js:645 templates/js/part.js:323 templates/js/stock.js:512
#: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:512
#: templates/js/stock.js:1250
msgid "Select"
msgstr ""
#: templates/js/build.js:665
#: templates/js/build.js:669
msgid "Build order is overdue"
msgstr ""
#: templates/js/build.js:763
#: templates/js/build.js:767
msgid "No parts allocated for"
msgstr ""
#: templates/js/company.js:75
#: templates/js/company.js:74
msgid "Parts Supplied"
msgstr ""
#: templates/js/company.js:84
#: templates/js/company.js:83
msgid "Parts Manufactured"
msgstr ""
#: templates/js/company.js:97
#: templates/js/company.js:96
msgid "No company information found"
msgstr ""
#: templates/js/company.js:130
#: templates/js/company.js:129
msgid "No supplier parts found"
msgstr ""
#: templates/js/company.js:148 templates/js/part.js:59 templates/js/part.js:144
#: templates/js/company.js:147 templates/js/part.js:59 templates/js/part.js:144
msgid "Template part"
msgstr ""
#: templates/js/company.js:152 templates/js/part.js:63 templates/js/part.js:148
#: templates/js/company.js:151 templates/js/part.js:63 templates/js/part.js:148
msgid "Assembled part"
msgstr ""
@ -5572,19 +5643,19 @@ msgstr ""
msgid "Error requesting form data"
msgstr ""
#: templates/js/order.js:136
#: templates/js/order.js:138
msgid "No purchase orders found"
msgstr ""
#: templates/js/order.js:160 templates/js/order.js:254
#: templates/js/order.js:162 templates/js/order.js:257
msgid "Order is overdue"
msgstr ""
#: templates/js/order.js:231
#: templates/js/order.js:234
msgid "No sales orders found"
msgstr ""
#: templates/js/order.js:299
#: templates/js/order.js:303
msgid "Shipment Date"
msgstr ""
@ -6051,7 +6122,7 @@ msgstr ""
msgid "Admin"
msgstr ""
#: templates/navbar.html:71
#: templates/navbar.html:71 templates/registration/logout.html:5
msgid "Logout"
msgstr ""
@ -6083,6 +6154,18 @@ msgstr ""
msgid "Username / password combination is incorrect"
msgstr ""
#: templates/registration/logout.html:6
msgid "You have been logged out"
msgstr ""
#: templates/registration/logout.html:7
msgid "Click"
msgstr ""
#: templates/registration/logout.html:7
msgid "here</a> to log in</p>"
msgstr ""
#: templates/stats.html:9
msgid "Server"
msgstr ""

View File

@ -116,6 +116,7 @@ class EditPurchaseOrderForm(HelperForm):
'description',
'target_date',
'link',
'responsible',
]
@ -148,7 +149,8 @@ class EditSalesOrderForm(HelperForm):
'customer_reference',
'description',
'target_date',
'link'
'link',
'responsible',
]

View File

@ -0,0 +1,25 @@
# Generated by Django 3.0.7 on 2021-03-10 05:19
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0005_owner_model'),
('order', '0041_auto_20210114_1728'),
]
operations = [
migrations.AddField(
model_name='purchaseorder',
name='responsible',
field=models.ForeignKey(blank=True, help_text='User or group responsible for this order', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='users.Owner', verbose_name='Responsible'),
),
migrations.AddField(
model_name='salesorder',
name='responsible',
field=models.ForeignKey(blank=True, help_text='User or group responsible for this order', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='users.Owner', verbose_name='Responsible'),
),
]

View File

@ -21,6 +21,7 @@ from markdownx.models import MarkdownxField
from djmoney.models.fields import MoneyField
from users import models as UserModels
from part import models as PartModels
from stock import models as stock_models
from company.models import Company, SupplierPart
@ -46,7 +47,7 @@ class Order(models.Model):
created_by: User who created this order (automatically captured)
issue_date: Date the order was issued
complete_date: Date the order was completed
responsible: User (or group) responsible for managing the order
"""
@classmethod
@ -109,6 +110,15 @@ class Order(models.Model):
related_name='+'
)
responsible = models.ForeignKey(
UserModels.Owner,
on_delete=models.SET_NULL,
blank=True, null=True,
help_text=_('User or group responsible for this order'),
verbose_name=_('Responsible'),
related_name='+',
)
notes = MarkdownxField(blank=True, help_text=_('Order notes'))

View File

@ -35,7 +35,10 @@ src="{% static 'img/blank_image.png' %}"
<hr>
<p>{{ order.description }}</p>
<div class='btn-row'>
<div class='btn-group action-buttons'>
<div class='btn-group action-buttons' role='group'>
<button type='button' class='btn btn-default' id='print-order-report' title='{% trans "Print" %}'>
<span class='fas fa-print'></span>
</button>
{% if roles.purchase_order.change %}
<button type='button' class='btn btn-default' id='edit-order' title='{% trans "Edit order information" %}'>
<span class='fas fa-edit icon-green'></span>
@ -129,6 +132,13 @@ src="{% static 'img/blank_image.png' %}"
<td>{{ order.complete_date }}<span class='badge'>{{ order.received_by }}</span></td>
</tr>
{% endif %}
{% if order.responsible %}
<tr>
<td><span class='fas fa-users'></span></td>
<td>{% trans "Responsible" %}</td>
<td>{{ order.responsible }}</td>
</tr>
{% endif %}
</table>
{% endblock %}
@ -149,6 +159,10 @@ $("#place-order").click(function() {
});
{% endif %}
$('#print-order-report').click(function() {
printPurchaseOrderReports([{{ order.pk }}]);
});
$("#edit-order").click(function() {
launchModalForm("{% url 'po-edit' order.id %}",
{

View File

@ -44,8 +44,9 @@
id='new_po_{{ supplier.id }}'
title='Create new purchase order for {{ supplier.name }}'
type='button'
supplierid='{{ supplier.id }}'
onclick='newPurchaseOrderFromOrderWizard()'>
<span supplier-id='{{ supplier.id }}' class='fas fa-plus-circle'></span>
<span supplierid='{{ supplier.id }}' class='fas fa-plus-circle'></span>
</button>
</td>
<td>

View File

@ -15,18 +15,24 @@ InvenTree | {% trans "Purchase Orders" %}
<div id='table-buttons'>
<div class='button-toolbar container-fluid' style='float: right;'>
{% if roles.purchase_order.add %}
<button class='btn btn-primary' type='button' id='po-create' title='{% trans "Create new purchase order" %}'>
<span class='fas fa-plus-circle'></span> {% trans "New Purchase Order" %}</button>
{% endif %}
<button class='btn btn-default' type='button' id='view-calendar' title='{% trans "Display calendar view" %}'>
<span class='fas fa-calendar-alt'></span>
</button>
<button class='btn btn-default' type='button' id='view-list' title='{% trans "Display list view" %}'>
<span class='fas fa-th-list'></span>
</button>
<div class='filter-list' id='filter-list-purchaseorder'>
<!-- An empty div in which the filter list will be constructed -->
<div class='btn-group'>
{% if roles.purchase_order.add %}
<button class='btn btn-primary' type='button' id='po-create' title='{% trans "Create new purchase order" %}'>
<span class='fas fa-plus-circle'></span> {% trans "New Purchase Order" %}
</button>
{% endif %}
<button id='order-print' class='btn btn-default' title='{% trans "Print Order Reports" %}'>
<span class='fas fa-print'></span>
</button>
<button class='btn btn-default' type='button' id='view-calendar' title='{% trans "Display calendar view" %}'>
<span class='fas fa-calendar-alt'></span>
</button>
<button class='btn btn-default' type='button' id='view-list' title='{% trans "Display list view" %}'>
<span class='fas fa-th-list'></span>
</button>
<div class='filter-list' id='filter-list-purchaseorder'>
<!-- An empty div in which the filter list will be constructed -->
</div>
</div>
</div>
</div>
@ -154,6 +160,18 @@ $("#view-list").click(function() {
$("#view-calendar").show();
});
$("#order-print").click(function() {
var rows = $("#purchase-order-table").bootstrapTable('getSelections');
var orders = [];
rows.forEach(function(row) {
orders.push(row.pk);
});
printPurchaseOrderReports(orders);
})
$("#po-create").click(function() {
launchModalForm("{% url 'po-create' %}",
{

View File

@ -45,6 +45,9 @@ src="{% static 'img/blank_image.png' %}"
<p>{{ order.description }}</p>
<div class='btn-row'>
<div class='btn-group action-buttons'>
<button type='button' class='btn btn-default' id='print-order-report' title='{% trans "Print" %}'>
<span class='fas fa-print'></span>
</button>
{% if roles.sales_order.change %}
<button type='button' class='btn btn-default' id='edit-order' title='Edit order information'>
<span class='fas fa-edit icon-green'></span>
@ -129,6 +132,13 @@ src="{% static 'img/blank_image.png' %}"
<td>{{ order.complete_date }}<span class='badge'>{{ order.received_by }}</span></td>
</tr>
{% endif %}
{% if order.responsible %}
<tr>
<td><span class='fas fa-users'></span></td>
<td>{% trans "Responsible" %}</td>
<td>{{ order.responsible }}</td>
</tr>
{% endif %}
</table>
{% endblock %}
@ -158,4 +168,8 @@ $("#ship-order").click(function() {
});
});
$('#print-order-report').click(function() {
printSalesOrderReports([{{ order.pk }}]);
});
{% endblock %}

View File

@ -15,18 +15,24 @@ InvenTree | {% trans "Sales Orders" %}
<div id='table-buttons'>
<div class='button-toolbar container-fluid' style='float: right;'>
{% if roles.sales_order.add %}
<button class='btn btn-primary' type='button' id='so-create' title='{% trans "Create new sales order" %}'>
<span class='fas fa-plus-circle'></span> {% trans "New Sales Order" %}</button>
{% endif %}
<button class='btn btn-default' type='button' id='view-calendar' title='{% trans "Display calendar view" %}'>
<span class='fas fa-calendar-alt'></span>
</button>
<button class='btn btn-default' type='button' id='view-list' title='{% trans "Display list view" %}'>
<span class='fas fa-th-list'></span>
</button>
<div class='filter-list' id='filter-list-salesorder'>
<!-- An empty div in which the filter list will be constructed -->
<div class='btn-group'>
{% if roles.sales_order.add %}
<button class='btn btn-primary' type='button' id='so-create' title='{% trans "Create new sales order" %}'>
<span class='fas fa-plus-circle'></span> {% trans "New Sales Order" %}
</button>
{% endif %}
<button id='order-print' class='btn btn-default' title='{% trans "Print Order Reports" %}'>
<span class='fas fa-print'></span>
</button>
<button class='btn btn-default' type='button' id='view-calendar' title='{% trans "Display calendar view" %}'>
<span class='fas fa-calendar-alt'></span>
</button>
<button class='btn btn-default' type='button' id='view-list' title='{% trans "Display list view" %}'>
<span class='fas fa-th-list'></span>
</button>
<div class='filter-list' id='filter-list-salesorder'>
<!-- An empty div in which the filter list will be constructed -->
</div>
</div>
</div>
</div>
@ -156,10 +162,30 @@ loadSalesOrderTable("#sales-order-table", {
url: "{% url 'api-so-list' %}",
});
$("#order-print").click(function() {
var rows = $("#sales-order-table").bootstrapTable('getSelections');
var orders = [];
rows.forEach(function(row) {
orders.push(row.pk);
});
printSalesOrderReports(orders);
})
$("#so-create").click(function() {
launchModalForm("{% url 'so-create' %}",
{
follow: true,
secondary: [
{
field: 'customer',
label: '{% trans "New Customer" %}',
title: '{% trans "Create new Customer" %}',
url: '{% url "customer-create" %}',
}
]
}
);
});

View File

@ -3,7 +3,7 @@
<div class='navigation'>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li><a href='#' id='toggle-part-tree'><b><span class='fas fa-stream'></span></b></a></li>
<li><a href='#' id='toggle-part-tree'><strong><span class='fas fa-stream'></span></strong></a></li>
<li class="breadcrumb-item{% if category is None %} active" aria-current="page{% endif %}"><a href="/part/">{% trans "Parts" %}</a></li>
{% if category %}
{% for path_item in category.parentpath %}

View File

@ -1,36 +1,37 @@
{% extends "modal_delete_form.html" %}
{% load i18n %}
{% block pre_form_content %}
Are you sure you want to delete category '{{ category.name }}'?
{% trans 'Are you sure you want to delete category' %} <strong>{{ category.name }}</strong>?
{% if category.children.all|length > 0 %}
<p>This category contains {{ category.children.all|length }} child categories.<br>
If this category is deleted, these child categories will be moved to
<p>{% trans 'This category contains' %} {{ category.children.all|length }} {% trans 'child categories' %}.<br>
{% trans 'If this category is deleted, these child categories will be moved to the' %}
{% if category.parent %}
the '{{ category.parent.name }}' category.
<strong>{{ category.parent.name }}</strong> {% trans 'category' %}.
{% else %}
the top level 'Parts' category.
{% trans 'top level Parts category' %}.
{% endif %}
</p>
<ul class='list-group'>
{% for cat in category.children.all %}
<li class='list-group-item'><b>{{ cat.name }}</b> - <i>{{ cat.description }}</i></li>
<li class='list-group-item'><strong>{{ cat.name }}</strong> - <em>{{ cat.description }}</em></li>
{% endfor %}
</ul>
{% endif %}
{% if category.parts.all|length > 0 %}
<p>This category contains {{ category.parts.all|length }} parts.<br>
<p>{% trans 'This category contains' %} {{ category.parts.all|length }} {% trans 'parts' %}.<br>
{% if category.parent %}
If this category is deleted, these parts will be moved to the parent category '{{ category.parent.pathstring }}'
{% trans 'If this category is deleted, these parts will be moved to the parent category' %} {{ category.parent.pathstring }}
{% else %}
If this category is deleted, these parts will be moved to the top-level category 'Parts'
{% trans 'If this category is deleted, these parts will be moved to the top-level category Teile' %}
{% endif %}
</p>
<ul class='list-group'>
{% for part in category.parts.all %}
<li class='list-group-item'><b>{{ part.full_name }}</b> - <i>{{ part.description }}</i></li>
<li class='list-group-item'><strong>{{ part.full_name }}</strong> - <em>{{ part.description }}</em></li>
{% endfor %}
</ul>
{% endif %}

View File

@ -6,19 +6,19 @@
{{ block.super }}
<div class='alert alert-info alert-block'>
<b>Duplicate Part</b><br>
Make a copy of part '{{ part.full_name }}'.
<strong>{% trans 'Duplicate Part' %}</strong><br>
{% trans 'Make a copy of part' %} '{{ part.full_name }}'.
</div>
{% if matches %}
<b>{% trans "Possible Matching Parts" %}</b>
<strong>{% trans "Possible Matching Parts" %}</strong>
<p>{% trans "The new part may be a duplicate of these existing parts" %}:</p>
<ul class='list-group'>
{% for match in matches %}
<li class='list-group-item list-group-item-condensed'>
{{ match.part.full_name }} - <i>{{ match.part.description }}</i> ({{ match.ratio }}%)
</li>
{% endfor %}
{% for match in matches %}
<li class='list-group-item list-group-item-condensed'>
{{ match.part.full_name }} - <em>{{ match.part.description }}</em> ({{ match.ratio }}%)
</li>
{% endfor %}
</ul>
{% endif %}

View File

@ -19,58 +19,58 @@
<col width='25'>
<tr>
<td><span class='fas fa-font'></span></td>
<td><b>{% trans "Part name" %}</b></td>
<td><strong>{% trans "Part name" %}</strong></td>
<td>{{ part.name }}</td>
</tr>
{% if part.IPN %}
<tr>
<td></td>
<td><b>{% trans "IPN" %}</b></td>
<td><strong>{% trans "IPN" %}</strong></td>
<td>{{ part.IPN }}</td>
</tr>
{% endif %}
{% if part.revision %}
<tr>
<td><span class='fas fa-code-branch'></span></td>
<td><b>{% trans "Revision" %}</b></td>
<td><strong>{% trans "Revision" %}</strong></td>
<td>{{ part.revision }}</td>
</tr>
{% endif %}
{% if part.trackable %}
<tr>
<td><span class='fas fa-hashtag'></span></td>
<td><b>{% trans "Latest Serial Number" %}</b></td>
<td><strong>{% trans "Latest Serial Number" %}</strong></td>
<td>
{% if part.getLatestSerialNumber %}
{{ part.getLatestSerialNumber }}
{% else %}
<i>{% trans "No serial numbers recorded" %}</i>
<em>{% trans "No serial numbers recorded" %}</em>
{% endif %}
</td>
</tr>
{% endif %}
<tr>
<td><span class='fas fa-info-circle'></span></td>
<td><b>{% trans "Description" %}</b></td>
<td><strong>{% trans "Description" %}</strong></td>
<td>{{ part.description }}</td>
</tr>
{% if part.variant_of %}
<tr>
<td></td>
<td><b>{% trans "Variant Of" %}</b></td>
<td><strong>{% trans "Variant Of" %}</strong></td>
<td><a href="{% url 'part-detail' part.variant_of.id %}">{{ part.variant_of.full_name }}</a></td>
</tr>
{% endif %}
{% if part.keywords %}
<tr>
<td><span class='fas fa-key'></span></td>
<td><b>{% trans "Keywords" %}</b></td>
<td><strong>{% trans "Keywords" %}</strong></td>
<td>{{ part.keywords }}</td>
</tr>
{% endif %}
<tr>
<td><span class='fas fa-sitemap'></span></td>
<td><b>{% trans "Category" %}</b></td>
<td><strong>{% trans "Category" %}</strong></td>
<td>
{% if part.category %}
<a href="{% url 'category-detail' part.category.id %}">{{ part.category.pathstring }}</a>
@ -80,21 +80,21 @@
{% if part.link %}
<tr>
<td><span class='fas fa-link'></span></td>
<td><b>{% trans "External Link" %}</b></td>
<td><strong>{% trans "External Link" %}</strong></td>
<td><a href="{{ part.link }}">{{ part.link }}</a></td>
</tr>
{% endif %}
{% if part.default_location %}
<tr>
<td><span class='fas fa-map-marker-alt'></span></td>
<td><b>{% trans "Default Location" %}</b></td>
<td><strong>{% trans "Default Location" %}</strong></td>
<td><a href="{% url 'stock-location-detail' part.default_location.id %}">{{ part.default_location.pathstring }}</a></td>
</tr>
{% endif %}
{% if part.default_supplier %}
<tr>
<td></td>
<td><b>{% trans "Default Supplier" %}</b></td>
<td><strong>{% trans "Default Supplier" %}</strong></td>
<td><a href="{% url 'supplier-part-detail' part.default_supplier.id %}">
{{ part.default_supplier.supplier.name }} | {{ part.default_supplier.SKU }}
</a></td>
@ -103,40 +103,40 @@
{% if part.units %}
<tr>
<td></td>
<td><b>{% trans "Units" %}</b></td>
<td><strong>{% trans "Units" %}</strong></td>
<td>{{ part.units }}</td>
</tr>
{% endif %}
{% if part.minimum_stock > 0 %}
<tr>
<td><span class='fas fa-greater-than-equal'></span></td>
<td><b>{% trans "Minimum Stock" %}</b></td>
<td><strong>{% trans "Minimum Stock" %}</strong></td>
<td>{{ part.minimum_stock }}</td>
</tr>
{% endif %}
{% if part.default_expiry > 0 %}
<tr>
<td><span class='fas fa-stopwatch'></span></td>
<td><b>{% trans "Stock Expiry Time" %}</b></td>
<td><strong>{% trans "Stock Expiry Time" %}</strong></td>
<td>{{ part.default_expiry }} {% trans "days" %}</td>
</tr>
{% endif %}
<tr>
<td><span class='fas fa-calendar-alt'></span></td>
<td><b>{% trans "Creation Date" %}</b></td>
<td><strong>{% trans "Creation Date" %}</strong></td>
<td>{{ part.creation_date }}</td>
</tr>
{% if part.creation_user %}
<tr>
<td><span class='fas fa-user'></span></td>
<td><b>{% trans "Created By" %}</b></td>
<td><strong>{% trans "Created By" %}</strong></td>
<td>{{ part.creation_user }}</td>
</tr>
{% endif %}
{% if part.responsible %}
<tr>
<td><span class='fas fa-user'>d</span></td>
<td><b>{% trans "Responsible User" %}</b></td>
<td><strong>{% trans "Responsible User" %}</strong></td>
<td>{{ part.responsible }}</td>
</tr>
{% endif %}
@ -147,72 +147,72 @@
<col width='25'>
<tr>
<td><span class='fas fa-ghost'%></span></td>
<td><b>{% trans "Virtual" %}</b></td>
<td><strong>{% trans "Virtual" %}</strong></td>
<td>{% include "slide.html" with state=part.virtual field='virtual' %}</td>
{% if part.virtual %}
<td>{% trans "Part is virtual (not a physical part)" %}</td>
{% else %}
<td><i>{% trans "Part is not a virtual part" %}</i></td>
<td><em>{% trans "Part is not a virtual part" %}</em></td>
{% endif %}
</tr>
<tr>
<td><span class='fas fa-clone'></span></td>
<td><b>{% trans "Template" %}</b></td>
<td><strong>{% trans "Template" %}</strong></td>
<td>{% include "slide.html" with state=part.is_template field='is_template' %}</td>
{% if part.is_template %}
<td>{% trans "Part is a template part (variants can be made from this part)" %}</td>
{% else %}
<td><i>{% trans "Part is not a template part" %}</i></td>
<td><em>{% trans "Part is not a template part" %}</em></td>
{% endif %}
</tr>
<tr>
<td><span class='fas fa-tools'></span></td>
<td><b>{% trans "Assembly" %}</b></td>
<td><strong>{% trans "Assembly" %}</strong></td>
<td>{% include "slide.html" with state=part.assembly field='assembly' %}</td>
{% if part.assembly %}
<td>{% trans "Part can be assembled from other parts" %}</td>
{% else %}
<td><i>{% trans "Part cannot be assembled from other parts" %}</i></td>
<td><em>{% trans "Part cannot be assembled from other parts" %}</em></td>
{% endif %}
</tr>
<tr>
<td><span class='fas fa-th'></span></td>
<td><b>{% trans "Component" %}</b></td>
<td><strong>{% trans "Component" %}</strong></td>
<td>{% include "slide.html" with state=part.component field='component' %}</td>
{% if part.component %}
<td>{% trans "Part can be used in assemblies" %}</td>
{% else %}
<td><i>{% trans "Part cannot be used in assemblies" %}</i></td>
<td><em>{% trans "Part cannot be used in assemblies" %}</em></td>
{% endif %}
</tr>
<tr>
<td><span class='fas fa-directions'></span></td>
<td><b>{% trans "Trackable" %}</b></td>
<td><strong>{% trans "Trackable" %}</strong></td>
<td>{% include "slide.html" with state=part.trackable field='trackable' %}</td>
{% if part.trackable %}
<td>{% trans "Part stock is tracked by serial number" %}</td>
{% else %}
<td><i>{% trans "Part stock is not tracked by serial number" %}</i></td>
<td><em>{% trans "Part stock is not tracked by serial number" %}</em></td>
{% endif %}
</tr>
<tr>
<td><span class='fas fa-shopping-cart'></span></td>
<td><b>{% trans "Purchaseable" %}</b></td>
<td><strong>{% trans "Purchaseable" %}</strong></td>
<td>{% include "slide.html" with state=part.purchaseable field='purchaseable' %}</td>
{% if part.purchaseable %}
<td>{% trans "Part can be purchased from external suppliers" %}</td>
{% else %}
<td><i>{% trans "Part can be purchased from external suppliers" %}</i></td>
<td><em>{% trans "Part can be purchased from external suppliers" %}</em></td>
{% endif %}
</tr>
<tr>
<td><span class='fas fa-dollar-sign'></span></td>
<td><b>{% trans "Salable" %}</b></td>
<td><strong>{% trans "Salable" %}</strong></td>
<td>{% include "slide.html" with state=part.salable field='salable' %}</td>
{% if part.salable %}
<td>{% trans "Part can be sold to customers" %}</td>
{% else %}
<td><i>{% trans "Part cannot be sold to customers" %}</i></td>
<td><em>{% trans "Part cannot be sold to customers" %}</em></td>
{% endif %}
</tr>
<tr><td colspan='4'></td></tr>
@ -224,12 +224,12 @@
<span class='fas fa-times-circle icon-red'></span>
{% endif %}
</td>
<td><b>{% trans "Active" %}</b></td>
<td><strong>{% trans "Active" %}</strong></td>
<td>{% include "slide.html" with state=part.active field='active' disabled=False %}</td>
{% if part.active %}
<td>{% trans "Part is active" %}</td>
{% else %}
<td><i>{% trans "Part is not active" %}</i></td>
<td><em>{% trans "Part is not active" %}</em></td>
{% endif %}
</tr>
</table>

View File

@ -14,7 +14,7 @@
{% if part.variant_of %}
<div class='alert alert-info alert-block'>
{% trans "This part is a variant of" %} <b><a href="{% url 'part-variants' part.variant_of.id %}">{{ part.variant_of.full_name }}</a></b>
{% trans "This part is a variant of" %} <strong><a href="{% url 'part-variants' part.variant_of.id %}">{{ part.variant_of.full_name }}</a></strong>
</div>
{% endif %}
@ -33,7 +33,7 @@
</div>
{% endif %}
</h3>
<p><i>{{ part.description }}</i></p>
<p><em>{{ part.description }}</em></p>
<div class='btn-group action-buttons' role='group'>
<button type='button' class='btn btn-default' id='toggle-starred' title='{% trans "Star this part" %}'>
@ -156,7 +156,7 @@
<tr>
<td><span class='fas fa-tools'></span></td>
<td colspan='2'>
<b>{% trans "Build Status" %}</b>
<strong>{% trans "Build Status" %}</strong>
</td>
</tr>
<tr>
@ -241,6 +241,7 @@
"{% url 'part-pricing' part.id %}",
{
submit_text: 'Calculate',
hideErrorMessage: true,
}
);
});

View File

@ -13,7 +13,7 @@
{% block details %}
{% if part.is_template %}
<div class='alert alert-info alert-block'>
Showing stock for all variants of <i>{{ part.full_name }}</i>
{% trans 'Showing stock for all variants of' %} <i>{{ part.full_name }}</i>
</div>
{% endif %}

View File

@ -1,19 +1,20 @@
{% extends "collapse.html" %}
{% load i18n %}
{% block collapse_title %}
{{ children | length }} Child Categories
{{ children | length }} {% trans 'Child Categories' %}
{% endblock %}
{% block collapse_content %}
<ul class="list-group">
{% for child in children %}
<li class="list-group-item">
<b><a href="{% url 'category-detail' child.id %}">{{ child.name }}</a></b>
<strong><a href="{% url 'category-detail' child.id %}">{{ child.name }}</a></strong>
{% if child.description %}
<i> - {{ child.description }}</i>
<em> - {{ child.description }}</em>
{% endif %}
{% if child.partcount > 0 %}
<span class='badge'>{{ child.partcount }} Part{% if child.partcount > 1 %}s{% endif %}</span>
<span class='badge'>{{ child.partcount }} {% trans 'Part' %}{% if child.partcount > 1 %}s{% endif %}</span>
{% endif %}
</li>
{% endfor %}

View File

@ -7,6 +7,8 @@ from .models import ReportSnippet, ReportAsset
from .models import TestReport
from .models import BuildReport
from .models import BillOfMaterialsReport
from .models import PurchaseOrderReport
from .models import SalesOrderReport
class ReportTemplateAdmin(admin.ModelAdmin):
@ -30,3 +32,5 @@ admin.site.register(ReportAsset, ReportAssetAdmin)
admin.site.register(TestReport, ReportTemplateAdmin)
admin.site.register(BuildReport, ReportTemplateAdmin)
admin.site.register(BillOfMaterialsReport, ReportTemplateAdmin)
admin.site.register(PurchaseOrderReport, ReportTemplateAdmin)
admin.site.register(SalesOrderReport, ReportTemplateAdmin)

View File

@ -18,14 +18,19 @@ from stock.models import StockItem
import build.models
import part.models
import order.models
from .models import TestReport
from .models import BuildReport
from .models import BillOfMaterialsReport
from .models import PurchaseOrderReport
from .models import SalesOrderReport
from .serializers import TestReportSerializer
from .serializers import BuildReportSerializer
from .serializers import BOMReportSerializer
from .serializers import POReportSerializer
from .serializers import SOReportSerializer
class ReportListView(generics.ListAPIView):
@ -113,6 +118,40 @@ class BuildReportMixin:
return build.models.Build.objects.filter(pk__in=valid_ids)
class OrderReportMixin:
"""
Mixin for extracting order items from query params
requires the OrderModel class attribute to be set!
"""
def get_orders(self):
"""
Return a list of order objects
"""
orders = []
params = self.request.query_params
for key in ['order', 'order[]', 'orders', 'orders[]']:
if key in params:
orders = params.getlist(key, [])
break
valid_ids = []
for o in orders:
try:
valid_ids.append(int(o))
except (ValueError):
pass
valid_orders = self.OrderModel.objects.filter(pk__in=valid_ids)
return valid_orders
class PartReportMixin:
"""
Mixin for extracting part items from query params
@ -481,14 +520,203 @@ class BuildReportPrint(generics.RetrieveAPIView, BuildReportMixin, ReportPrintMi
return self.print(request, builds)
class POReportList(ReportListView, OrderReportMixin):
OrderModel = order.models.PurchaseOrder
queryset = PurchaseOrderReport.objects.all()
serializer_class = POReportSerializer
def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset)
orders = self.get_orders()
if len(orders) > 0:
"""
We wish to filter by purchase orders
We need to compare the 'filters' string of each report,
and see if it matches against each of the specified orders.
TODO: In the future, perhaps there is a way to make this more efficient.
"""
valid_report_ids = set()
for report in queryset.all():
matches = True
# Filter string defined for the report object
try:
filters = InvenTree.helpers.validateFilterString(report.filters)
except:
continue
for o in orders:
order_query = order.models.PurchaseOrder.objects.filter(pk=o.pk)
try:
if not order_query.filter(**filters).exists():
matches = False
break
except FieldError:
matches = False
break
if matches:
valid_report_ids.add(report.pk)
else:
continue
# Reduce queryset to only valid matches
queryset = queryset.filter(pk__in=[pk for pk in valid_report_ids])
return queryset
class POReportDetail(generics.RetrieveUpdateDestroyAPIView):
"""
API endpoint for a single PurchaseOrderReport object
"""
queryset = PurchaseOrderReport.objects.all()
serializer_class = POReportSerializer
class POReportPrint(generics.RetrieveAPIView, OrderReportMixin, ReportPrintMixin):
"""
API endpoint for printing a PurchaseOrderReport object
"""
OrderModel = order.models.PurchaseOrder
queryset = PurchaseOrderReport.objects.all()
serializer_class = POReportSerializer
def get(self, request, *args, **kwargs):
orders = self.get_orders()
return self.print(request, orders)
class SOReportList(ReportListView, OrderReportMixin):
OrderModel = order.models.SalesOrder
queryset = SalesOrderReport.objects.all()
serializer_class = SOReportSerializer
def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset)
orders = self.get_orders()
if len(orders) > 0:
"""
We wish to filter by purchase orders
We need to compare the 'filters' string of each report,
and see if it matches against each of the specified orders.
TODO: In the future, perhaps there is a way to make this more efficient.
"""
valid_report_ids = set()
for report in queryset.all():
matches = True
# Filter string defined for the report object
try:
filters = InvenTree.helpers.validateFilterString(report.filters)
except:
continue
for o in orders:
order_query = order.models.SalesOrder.objects.filter(pk=o.pk)
try:
if not order_query.filter(**filters).exists():
matches = False
break
except FieldError:
matches = False
break
if matches:
valid_report_ids.add(report.pk)
else:
continue
# Reduce queryset to only valid matches
queryset = queryset.filter(pk__in=[pk for pk in valid_report_ids])
return queryset
class SOReportDetail(generics.RetrieveUpdateDestroyAPIView):
"""
API endpoint for a single SalesOrderReport object
"""
queryset = SalesOrderReport.objects.all()
serializer_class = SOReportSerializer
class SOReportPrint(generics.RetrieveAPIView, OrderReportMixin, ReportPrintMixin):
"""
API endpoint for printing a PurchaseOrderReport object
"""
OrderModel = order.models.SalesOrder
queryset = SalesOrderReport.objects.all()
serializer_class = SOReportSerializer
def get(self, request, *args, **kwargs):
orders = self.get_orders()
return self.print(request, orders)
report_api_urls = [
# Purchase order reports
url(r'po/', include([
# Detail views
url(r'^(?P<pk>\d+)/', include([
url(r'print/', POReportPrint.as_view(), name='api-po-report-print'),
url(r'^$', POReportDetail.as_view(), name='api-po-report-detail'),
])),
# List view
url(r'^$', POReportList.as_view(), name='api-po-report-list'),
])),
# Sales order reports
url(r'so/', include([
# Detail views
url(r'^(?P<pk>\d+)/', include([
url(r'print/', SOReportPrint.as_view(), name='api-so-report-print'),
url(r'^$', SOReportDetail.as_view(), name='api-so-report-detail'),
])),
url(r'^$', SOReportList.as_view(), name='api-so-report-list'),
])),
# Build reports
url(r'build/', include([
# Detail views
url(r'^(?P<pk>\d+)/', include([
url(r'print/?', BuildReportPrint.as_view(), name='api-build-report-print'),
url(r'^.*$', BuildReportDetail.as_view(), name='api-build-report-detail'),
url(r'^.$', BuildReportDetail.as_view(), name='api-build-report-detail'),
])),
# List view

View File

@ -0,0 +1,45 @@
# Generated by Django 3.0.7 on 2021-03-10 05:46
import django.core.validators
from django.db import migrations, models
import report.models
class Migration(migrations.Migration):
dependencies = [
('report', '0013_testreport_include_installed'),
]
operations = [
migrations.CreateModel(
name='PurchaseOrderReport',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Template name', max_length=100, verbose_name='Name')),
('template', models.FileField(help_text='Report template file', upload_to=report.models.rename_template, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['html', 'htm'])], verbose_name='Template')),
('description', models.CharField(help_text='Report template description', max_length=250, verbose_name='Description')),
('revision', models.PositiveIntegerField(default=1, editable=False, help_text='Report revision number (auto-increments)', verbose_name='Revision')),
('enabled', models.BooleanField(default=True, help_text='Report template is enabled', verbose_name='Enabled')),
('filters', models.CharField(blank=True, help_text='Purchase order query filters', max_length=250, validators=[report.models.validate_purchase_order_filters], verbose_name='Filters')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='SalesOrderReport',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Template name', max_length=100, verbose_name='Name')),
('template', models.FileField(help_text='Report template file', upload_to=report.models.rename_template, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['html', 'htm'])], verbose_name='Template')),
('description', models.CharField(help_text='Report template description', max_length=250, verbose_name='Description')),
('revision', models.PositiveIntegerField(default=1, editable=False, help_text='Report revision number (auto-increments)', verbose_name='Revision')),
('enabled', models.BooleanField(default=True, help_text='Report template is enabled', verbose_name='Enabled')),
('filters', models.CharField(blank=True, help_text='Sales order query filters', max_length=250, validators=[report.models.validate_sales_order_filters], verbose_name='Filters')),
],
options={
'abstract': False,
},
),
]

View File

@ -24,6 +24,7 @@ import build.models
import common.models
import part.models
import stock.models
import order.models
from InvenTree.helpers import validateFilterString
@ -94,6 +95,22 @@ def validate_build_report_filters(filters):
return validateFilterString(filters, model=build.models.Build)
def validate_purchase_order_filters(filters):
"""
Validate filter string against PurchaseOrder model
"""
return validateFilterString(filters, model=order.models.PurchaseOrder)
def validate_sales_order_filters(filters):
"""
Validate filter string against SalesOrder model
"""
return validateFilterString(filters, model=order.models.SalesOrder)
class WeasyprintReportMixin(WeasyTemplateResponseMixin):
"""
Class for rendering a HTML template to a PDF.
@ -383,6 +400,74 @@ class BillOfMaterialsReport(ReportTemplateBase):
}
class PurchaseOrderReport(ReportTemplateBase):
"""
Render a report against a PurchaseOrder object
"""
@classmethod
def getSubdir(cls):
return 'purchaseorder'
filters = models.CharField(
blank=True,
max_length=250,
verbose_name=_('Filters'),
help_text=_('Purchase order query filters'),
validators=[
validate_purchase_order_filters,
]
)
def get_context_data(self, request):
order = self.object_to_print
return {
'description': order.description,
'lines': order.lines,
'order': order,
'reference': order.reference,
'supplier': order.supplier,
'prefix': common.models.InvenTreeSetting.get_setting('PURCHASEORDER_REFERENCE_PREFIX'),
'title': str(order),
}
class SalesOrderReport(ReportTemplateBase):
"""
Render a report against a SalesOrder object
"""
@classmethod
def getSubdir(cls):
return 'salesorder'
filters = models.CharField(
blank=True,
max_length=250,
verbose_name=_('Filters'),
help_text=_('Sales order query filters'),
validators=[
validate_sales_order_filters
]
)
def get_context_data(self, request):
order = self.object_to_print
return {
'customer': order.customer,
'description': order.description,
'lines': order.lines,
'order': order,
'prefix': common.models.InvenTreeSetting.get_setting('SALESORDER_REFERENCE_PREFIX'),
'reference': order.reference,
'title': str(order),
}
def rename_snippet(instance, filename):
filename = os.path.basename(filename)

View File

@ -7,6 +7,7 @@ from InvenTree.serializers import InvenTreeAttachmentSerializerField
from .models import TestReport
from .models import BuildReport
from .models import BillOfMaterialsReport
from .models import PurchaseOrderReport, SalesOrderReport
class TestReportSerializer(InvenTreeModelSerializer):
@ -55,3 +56,35 @@ class BOMReportSerializer(InvenTreeModelSerializer):
'filters',
'enabled',
]
class POReportSerializer(InvenTreeModelSerializer):
template = InvenTreeAttachmentSerializerField(required=True)
class Meta:
model = PurchaseOrderReport
fields = [
'pk',
'name',
'description',
'template',
'filters',
'enabled',
]
class SOReportSerializer(InvenTreeModelSerializer):
template = InvenTreeAttachmentSerializerField(required=True)
class Meta:
model = SalesOrderReport
fields = [
'pk',
'name',
'description',
'template',
'filters',
'enabled',
]

View File

@ -77,12 +77,9 @@ margin-top: 4cm;
content: "v{{report_revision}} - {{ date.isoformat }}";
{% endblock %}
{% block bottom_center %}
content: "www.currawong.aero";
{% endblock %}
{% block header_content %}
<img class='logo' src="{% asset 'logo_black_with_black_bird.png' %}" alt="hello" width="150">
<!-- TODO - Make the company logo asset generic -->
<img class='logo' src="{% asset 'company_logo.png' %}" alt="hello" width="150">
<div class='header-right'>
<h3>

View File

@ -0,0 +1,116 @@
{% extends "report/inventree_report_base.html" %}
{% load i18n %}
{% load report %}
{% load barcode %}
{% load inventree_extras %}
{% load markdownify %}
{% block page_margin %}
margin: 2cm;
margin-top: 4cm;
{% endblock %}
{% block bottom_left %}
content: "v{{report_revision}} - {{ date.isoformat }}";
{% endblock %}
{% block bottom_center %}
content: "InvenTree v{% inventree_version %}";
{% endblock %}
{% block style %}
.header-right {
text-align: right;
float: right;
}
.logo {
height: 20mm;
vertical-align: middle;
}
.thumb-container {
width: 32px;
display: inline;
}
.part-thumb {
max-width: 32px;
max-height: 32px;
display: inline;
}
.part-text {
display: inline;
}
table {
border: 1px solid #eee;
border-radius: 3px;
border-collapse: collapse;
width: 100%;
font-size: 80%;
}
table td {
border: 1px solid #eee;
}
table td.shrink {
white-space: nowrap
}
table td.expand {
width: 99%
}
{% endblock %}
{% block header_content %}
<img class='logo' src='{% company_image supplier %}' alt="{{ supplier }}" width='150'>
<div class='header-right'>
<h3>{% trans "Purchase Order" %} {{ prefix }}{{ reference }}</h3>
{{ supplier.name }}
</div>
{% endblock %}
{% block page_content %}
<h3>{% trans "Line Items" %}</h3>
<table class='table table-striped table-condensed'>
<thead>
<tr>
<th>{% trans "Part" %}</th>
<th>{% trans "Quantity" %}</th>
<th>{% trans "Reference" %}</th>
<th>{% trans "Note" %}</th>
</tr>
</thead>
<tbody>
{% for line in lines.all %}
<tr>
<td>
<div class='thumb-container'>
<img src='{% part_image line.part.part %}' class='part-thumb'>
</div>
<div class='part-text'>
{{ line.part.part.full_name }}
</div>
</td>
<td>{% decimal line.quantity %}</td>
<td>{{ line.reference }}</td>
<td>{{ line.notes }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -0,0 +1,116 @@
{% extends "report/inventree_report_base.html" %}
{% load i18n %}
{% load report %}
{% load barcode %}
{% load inventree_extras %}
{% load markdownify %}
{% block page_margin %}
margin: 2cm;
margin-top: 4cm;
{% endblock %}
{% block bottom_left %}
content: "v{{report_revision}} - {{ date.isoformat }}";
{% endblock %}
{% block bottom_center %}
content: "InvenTree v{% inventree_version %}";
{% endblock %}
{% block style %}
.header-right {
text-align: right;
float: right;
}
.logo {
height: 20mm;
vertical-align: middle;
}
.thumb-container {
width: 32px;
display: inline;
}
.part-thumb {
max-width: 32px;
max-height: 32px;
display: inline;
}
.part-text {
display: inline;
}
table {
border: 1px solid #eee;
border-radius: 3px;
border-collapse: collapse;
width: 100%;
font-size: 80%;
}
table td {
border: 1px solid #eee;
}
table td.shrink {
white-space: nowrap
}
table td.expand {
width: 99%
}
{% endblock %}
{% block header_content %}
<img class='logo' src='{% company_image customer %}' alt="{{ customer }}" width='150'>
<div class='header-right'>
<h3>{% trans "Sales Order" %} {{ prefix }}{{ reference }}</h3>
{{ customer.name }}
</div>
{% endblock %}
{% block page_content %}
<h3>{% trans "Line Items" %}</h3>
<table class='table table-striped table-condensed'>
<thead>
<tr>
<th>{% trans "Part" %}</th>
<th>{% trans "Quantity" %}</th>
<th>{% trans "Reference" %}</th>
<th>{% trans "Note" %}</th>
</tr>
</thead>
<tbody>
{% for line in lines.all %}
<tr>
<td>
<div class='thumb-container'>
<img src='{% part_image line.part %}' class='part-thumb'>
</div>
<div class='part-text'>
{{ line.part.full_name }}
</div>
</td>
<td>{% decimal line.quantity %}</td>
<td>{{ line.reference }}</td>
<td>{{ line.notes }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -8,6 +8,7 @@ from django import template
from django.conf import settings
from django.utils.safestring import mark_safe
from company.models import Company
from part.models import Part
from stock.models import StockItem
@ -72,6 +73,39 @@ def part_image(part):
return f"file://{path}"
@register.simple_tag()
def company_image(company):
"""
Return a fully-qualified path for a company image
"""
# If in debug mode, return the URL to the image, not a local file
debug_mode = InvenTreeSetting.get_setting('REPORT_DEBUG_MODE')
if type(company) is Company:
img = company.image.name
else:
img = ''
if debug_mode:
if img:
return os.path.join(settings.MEDIA_URL, img)
else:
return os.path.join(settings.STATIC_URL, 'img', 'blank_image.png')
else:
path = os.path.join(settings.MEDIA_ROOT, img)
path = os.path.abspath(path)
if not os.path.exists(path) or not os.path.isfile(path):
# Image does not exist
# Return the 'blank' image
path = os.path.join(settings.STATIC_ROOT, 'img', 'blank_image.png')
path = os.path.abspath(path)
return f"file://{path}"
@register.simple_tag()
def internal_link(link, text):
"""

View File

@ -665,6 +665,13 @@ class StockList(generics.ListCreateAPIView):
active = str2bool(active)
queryset = queryset.filter(part__active=active)
# Do we wish to filter by "assembly parts"
assembly = params.get('assembly', None)
if assembly is not None:
assembly = str2bool(assembly)
queryset = queryset.filter(part__assembly=assembly)
# Filter by 'depleted' status
depleted = params.get('depleted', None)

View File

@ -1,8 +1,10 @@
{% load i18n %}
<div class="navigation">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li><a href='#' title='Toggle Stock Tree' id='toggle-stock-tree'><b><span class='fas fa-stream'></span></b></a></li>
<li class="breadcrumb-item{% if location is None %} active" aria-current="page{% endif %}"><a href="/stock/">Stock</a></li>
<li class="breadcrumb-item{% if location is None %} active" aria-current="page{% endif %}"><a href="/stock/">{% trans "Stock" %}</a></li>
{% if location %}
{% for path_item in location.parentpath %}
<li class='breadcrumb-item'><a href="{% url 'stock-location-detail' path_item.id %}">{{ path_item.name }}</a></li>

View File

@ -1,8 +1,9 @@
{% extends "collapse.html" %}
{% load i18n %}
{% if roles.stock_location.view or roles.stock.view %}
{% block collapse_title %}
Sub-Locations<span class='badge'>{{ children|length }}</span>
{% trans 'Sub-Locations' %}<span class='badge'>{{ children|length }}</span>
{% endblock %}
{% block collapse_content %}
@ -10,7 +11,11 @@ Sub-Locations<span class='badge'>{{ children|length }}</span>
{% for child in children %}
<li class="list-group-item"><a href="{% url 'stock-location-detail' child.id %}">{{ child.name }}</a> - <i>{{ child.description }}</i>
{% if child.item_count > 0 %}
<span class='badge'>{{ child.item_count }} Item{% if child.item_count > 1 %}s{% endif %}</span>
<!-- span class='badge'>{{ child.item_count }} Item{% if child.item_count > 1 %}s{% endif %}</span> -->
<span class='badge'>
{% comment %}Translators: pluralize with counter{% endcomment %}
{% blocktrans count counter=child.item_count %}{{ counter }} Item{% plural %}{{ counter }} Items{% endblocktrans %}
</span>
{% endif %}
</li>
{% endfor %}

View File

@ -6,7 +6,7 @@
{% if location %}
InvenTree | {% trans "Stock Location" %} - {{ location }}
{% else %}
InvenTree | Stock
InvenTree | {% trans "Stock" %}
{% endif %}
{% endblock %}

View File

@ -739,9 +739,10 @@ function handleModalForm(url, options) {
// Form was returned, invalid!
else {
var warningDiv = $(modal).find('#form-validation-warning');
warningDiv.css('display', 'block');
if (!options.hideErrorMessage) {
var warningDiv = $(modal).find('#form-validation-warning');
warningDiv.css('display', 'block');
}
if (response.html_form) {
injectModalForm(modal, response.html_form);

View File

@ -59,7 +59,7 @@ function newPurchaseOrderFromOrderWizard(e) {
var src = e.target || e.srcElement;
var supplier = $(src).attr('supplier-id');
var supplier = $(src).attr('supplierid');
launchModalForm("/order/purchase-order/new/", {
modal: '#modal-form-secondary',
@ -138,9 +138,9 @@ function loadPurchaseOrderTable(table, options) {
formatNoMatches: function() { return '{% trans "No purchase orders found" %}'; },
columns: [
{
field: 'pk',
title: 'ID',
visible: false,
title: '',
visible: true,
checkbox: true,
switchable: false,
},
{
@ -234,9 +234,9 @@ function loadSalesOrderTable(table, options) {
formatNoMatches: function() { return '{% trans "No sales orders found" %}'; },
columns: [
{
field: 'pk',
title: 'ID',
visible: false,
title: '',
checkbox: true,
visible: true,
switchable: false,
},
{

View File

@ -247,3 +247,111 @@ function printBomReports(parts, options={}) {
}
)
}
function printPurchaseOrderReports(orders, options={}) {
/**
* Print PO reports for the provided purchase order(s)
*/
if (orders.length == 0) {
showAlertDialog(
'{% trans "Select Purchase Orders" %}',
'{% trans "Purchase Order(s) must be selected before printing report" %}',
);
return;
}
// Request avaiable report templates
inventreeGet(
'{% url "api-po-report-list" %}',
{
enabled: true,
orders: orders,
},
{
success: function(response) {
if (response.length == 0) {
showAlertDialog(
'{% trans "No Reports Found" %}',
'{% trans "No report templates found which match selected orders" %}',
);
return;
}
// Select report template
selectReport(
response,
orders,
{
success: function(pk) {
var href = `/api/report/po/${pk}/print/?`;
orders.forEach(function(order) {
href += `order=${order}&`;
});
window.location.href = href;
}
}
)
}
}
)
}
function printSalesOrderReports(orders, options={}) {
/**
* Print SO reports for the provided purchase order(s)
*/
if (orders.length == 0) {
showAlertDialog(
'{% trans "Select Sales Orders" %}',
'{% trans "Sales Order(s) must be selected before printing report" %}',
);
return;
}
// Request avaiable report templates
inventreeGet(
'{% url "api-so-report-list" %}',
{
enabled: true,
orders: orders,
},
{
success: function(response) {
if (response.length == 0) {
showAlertDialog(
'{% trans "No Reports Found" %}',
'{% trans "No report templates found which match selected orders" %}',
);
return;
}
// Select report template
selectReport(
response,
orders,
{
success: function(pk) {
var href = `/api/report/so/${pk}/print/?`;
orders.forEach(function(order) {
href += `order=${order}&`;
});
window.location.href = href;
}
}
)
}
}
)
}

View File

@ -96,10 +96,15 @@ function getAvailableTableFilters(tableKey) {
title: '{% trans "Active parts" %}',
description: '{% trans "Show stock for active parts" %}',
},
assembly: {
type: 'bool',
title: '{% trans "Assembly" %}',
description: '{% trans "Part is an assembly" %}',
},
allocated: {
type: 'bool',
title: '{% trans "Is allocated" %}',
description: '{% trans "Item has been alloacted" %}',
description: '{% trans "Item has been allocated" %}',
},
cascade: {
type: 'bool',

View File

@ -1,7 +1,8 @@
{% extends "base.html" %}
{% load i18n %}
{% block content %}
<h4>Logout</h4>
<p>You have been logged out</p>
<p>Click <a href="{% url 'login' %}">here</a> to log in</p>
<h4>{% trans "Logout" %}</h4>
<p>{% trans "You have been logged out" %}</p>
<p>{% trans 'Click' %} <a href="{% url 'login' %}"> {% trans 'here</a> to log in</p>' %}
{% endblock %}

View File

@ -124,6 +124,8 @@ class RuleSet(models.Model):
'report_reportasset',
'report_reportsnippet',
'report_billofmaterialsreport',
'report_purchaseorderreport',
'report_salesorderreport',
'users_owner',
# Third-party tables