mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Merge remote-tracking branch 'inventree/master'
This commit is contained in:
commit
97f93f8b03
@ -586,6 +586,8 @@
|
||||
|
||||
.breadcrump {
|
||||
margin-bottom: 5px;
|
||||
margin-left: 5px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.inventree-body {
|
||||
|
@ -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:
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -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 ""
|
||||
|
@ -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 ""
|
||||
|
@ -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',
|
||||
]
|
||||
|
||||
|
||||
|
25
InvenTree/order/migrations/0042_auto_20210310_1619.py
Normal file
25
InvenTree/order/migrations/0042_auto_20210310_1619.py
Normal 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'),
|
||||
),
|
||||
]
|
@ -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'))
|
||||
|
||||
|
||||
|
@ -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 %}",
|
||||
{
|
||||
|
@ -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>
|
||||
|
@ -15,10 +15,15 @@ InvenTree | {% trans "Purchase Orders" %}
|
||||
|
||||
<div id='table-buttons'>
|
||||
<div class='button-toolbar container-fluid' style='float: right;'>
|
||||
<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>
|
||||
<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>
|
||||
@ -29,6 +34,7 @@ InvenTree | {% trans "Purchase Orders" %}
|
||||
<!-- An empty div in which the filter list will be constructed -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class='table table-striped table-condensed po-table' data-toolbar='#table-buttons' id='purchase-order-table'>
|
||||
@ -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' %}",
|
||||
{
|
||||
|
@ -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 %}
|
@ -15,10 +15,15 @@ InvenTree | {% trans "Sales Orders" %}
|
||||
|
||||
<div id='table-buttons'>
|
||||
<div class='button-toolbar container-fluid' style='float: right;'>
|
||||
<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>
|
||||
<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>
|
||||
@ -29,6 +34,7 @@ InvenTree | {% trans "Sales Orders" %}
|
||||
<!-- An empty div in which the filter list will be constructed -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class='table table-striped table-condensed po-table' data-toolbar='#table-buttons' id='sales-order-table'>
|
||||
@ -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" %}',
|
||||
}
|
||||
]
|
||||
}
|
||||
);
|
||||
});
|
||||
|
@ -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 %}
|
||||
|
@ -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 %}
|
||||
|
@ -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 %}
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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,
|
||||
}
|
||||
);
|
||||
});
|
||||
|
@ -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 %}
|
||||
|
||||
|
@ -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 %}
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
},
|
||||
),
|
||||
]
|
@ -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)
|
||||
|
@ -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',
|
||||
]
|
||||
|
@ -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>
|
||||
|
116
InvenTree/report/templates/report/inventree_po_report.html
Normal file
116
InvenTree/report/templates/report/inventree_po_report.html
Normal 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 %}
|
116
InvenTree/report/templates/report/inventree_so_report.html
Normal file
116
InvenTree/report/templates/report/inventree_so_report.html
Normal 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 %}
|
@ -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):
|
||||
"""
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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 %}
|
||||
|
@ -6,7 +6,7 @@
|
||||
{% if location %}
|
||||
InvenTree | {% trans "Stock Location" %} - {{ location }}
|
||||
{% else %}
|
||||
InvenTree | Stock
|
||||
InvenTree | {% trans "Stock" %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
|
@ -739,9 +739,10 @@ function handleModalForm(url, options) {
|
||||
// Form was returned, invalid!
|
||||
else {
|
||||
|
||||
if (!options.hideErrorMessage) {
|
||||
var warningDiv = $(modal).find('#form-validation-warning');
|
||||
|
||||
warningDiv.css('display', 'block');
|
||||
}
|
||||
|
||||
if (response.html_form) {
|
||||
injectModalForm(modal, response.html_form);
|
||||
|
@ -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,
|
||||
},
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
@ -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',
|
||||
|
@ -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 %}
|
@ -124,6 +124,8 @@ class RuleSet(models.Model):
|
||||
'report_reportasset',
|
||||
'report_reportsnippet',
|
||||
'report_billofmaterialsreport',
|
||||
'report_purchaseorderreport',
|
||||
'report_salesorderreport',
|
||||
'users_owner',
|
||||
|
||||
# Third-party tables
|
||||
|
Loading…
Reference in New Issue
Block a user