From 97b35d92696b62f45c1b537ecfb98a9302a3cdf2 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 19:33:32 +1000 Subject: [PATCH 01/16] Renamed related name "owned_parts" to "installed_parts" --- .../migrations/0051_auto_20200928_0928.py | 19 +++++++++++++++++++ InvenTree/stock/models.py | 16 +++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 InvenTree/stock/migrations/0051_auto_20200928_0928.py diff --git a/InvenTree/stock/migrations/0051_auto_20200928_0928.py b/InvenTree/stock/migrations/0051_auto_20200928_0928.py new file mode 100644 index 0000000000..dd82e6edd0 --- /dev/null +++ b/InvenTree/stock/migrations/0051_auto_20200928_0928.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.7 on 2020-09-28 09:28 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('stock', '0050_auto_20200821_1403'), + ] + + operations = [ + migrations.AlterField( + model_name='stockitem', + name='belongs_to', + field=models.ForeignKey(blank=True, help_text='Is this item installed in another item?', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='installed_parts', to='stock.StockItem', verbose_name='Installed In'), + ), + ] diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 40c80e882c..e2468772e2 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -341,7 +341,7 @@ class StockItem(MPTTModel): 'self', verbose_name=_('Installed In'), on_delete=models.DO_NOTHING, - related_name='owned_parts', blank=True, null=True, + related_name='installed_parts', blank=True, null=True, help_text=_('Is this item installed in another item?') ) @@ -585,6 +585,20 @@ class StockItem(MPTTModel): return True + def installedItemCount(self): + """ + Return the number of stock items installed inside this one. + """ + + return self.installed_parts.count() + + def hasInstalledItems(self): + """ + Returns true if this stock item has other stock items installed in it. + """ + + return self.installedItemCount() > 0 + @property def children(self): """ Return a list of the child items which have been split from this stock item """ From 8dd8e69c055cb1d4bd41f71d3a002fb503cae8e6 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 19:34:43 +1000 Subject: [PATCH 02/16] Add "installed parts" tab for stock item --- InvenTree/stock/templates/stock/tabs.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/InvenTree/stock/templates/stock/tabs.html b/InvenTree/stock/templates/stock/tabs.html index 1e6e9ddb3b..72da8a5cf2 100644 --- a/InvenTree/stock/templates/stock/tabs.html +++ b/InvenTree/stock/templates/stock/tabs.html @@ -38,4 +38,12 @@ {% trans "Children" %}{% if item.child_count > 0 %}{{ item.child_count }}{% endif %} {% endif %} - \ No newline at end of file + {% if item.installedItemCount > 0 %} +
  • + + {% trans "Installed Parts" %} + {{ item.installedItemCount }} + +
  • + {% endif %} + From f253bf18434eb06a48bab00719c9c4899b991253 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 20:07:25 +1000 Subject: [PATCH 03/16] Add ability for stock API to be filtered by installed status --- .../build/templates/build/build_output.html | 2 +- InvenTree/stock/api.py | 20 ++++++++++++ .../stock/templates/stock/item_installed.html | 31 +++++++++++++++++++ InvenTree/stock/templates/stock/tabs.html | 6 ++-- InvenTree/stock/urls.py | 1 + InvenTree/templates/js/stock.html | 18 ++++++----- InvenTree/templates/js/table_filters.html | 5 +++ 7 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 InvenTree/stock/templates/stock/item_installed.html diff --git a/InvenTree/build/templates/build/build_output.html b/InvenTree/build/templates/build/build_output.html index e5a3e77e61..75257f2d5d 100644 --- a/InvenTree/build/templates/build/build_output.html +++ b/InvenTree/build/templates/build/build_output.html @@ -19,7 +19,7 @@ loadStockTable($("#stock-table"), { params: { location_detail: true, - part_details: true, + part_detail: true, build: {{ build.id }}, }, groupByField: 'location', diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 900a94ed52..55bc62a44e 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -476,6 +476,26 @@ class StockList(generics.ListCreateAPIView): if sales_order: queryset = queryset.filter(sales_order=sales_order) + # Filter stock items which are installed in another (specific) stock item + installed_in = params.get('installed_in', None) + + if installed_in: + # Note: The "installed_in" field is called "belongs_to" + queryset = queryset.filter(belongs_to=installed_in) + + # Filter stock items which are installed in another stock item + installed = params.get('installed', None) + + if installed is not None: + installed = str2bool(installed) + + if installed: + # Exclude items which are *not* installed in another item + queryset = queryset.exclude(belongs_to=None) + else: + # Exclude items which are instaled in another item + queryset = queryset.filter(belongs_to=None) + # Filter by customer customer = params.get('customer', None) diff --git a/InvenTree/stock/templates/stock/item_installed.html b/InvenTree/stock/templates/stock/item_installed.html new file mode 100644 index 0000000000..abecaf6e3c --- /dev/null +++ b/InvenTree/stock/templates/stock/item_installed.html @@ -0,0 +1,31 @@ +{% extends "stock/item_base.html" %} + +{% load static %} +{% load i18n %} + +{% block details %} + +{% include "stock/tabs.html" with tab='installed' %} + +

    {% trans "Installed Items" %}

    +
    + + +
    + +{% endblock %} + +{% block js_ready %} + +{{ block.super }} + +loadStockTable($("#installed-table"), { + params: { + installed_in: {{ item.id }}, + part_detail: true, + }, + name: 'stock-item-installed', + url: "{% url 'api-stock-list' %}", +}) + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/stock/templates/stock/tabs.html b/InvenTree/stock/templates/stock/tabs.html index 72da8a5cf2..05841987da 100644 --- a/InvenTree/stock/templates/stock/tabs.html +++ b/InvenTree/stock/templates/stock/tabs.html @@ -38,11 +38,11 @@ {% trans "Children" %}{% if item.child_count > 0 %}{{ item.child_count }}{% endif %} {% endif %} - {% if item.installedItemCount > 0 %} + {% if item.part.assembly or item.installedItemCount > 0 %}
  • - + {% trans "Installed Parts" %} - {{ item.installedItemCount }} + {% if item.installedItemCount > 0 %}{{ item.installedItemCount }}{% endif %}
  • {% endif %} diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py index 51067b57de..c6b0b2b54c 100644 --- a/InvenTree/stock/urls.py +++ b/InvenTree/stock/urls.py @@ -34,6 +34,7 @@ stock_item_detail_urls = [ url(r'^test/', views.StockItemDetail.as_view(template_name='stock/item_tests.html'), name='stock-item-test-results'), url(r'^children/', views.StockItemDetail.as_view(template_name='stock/item_childs.html'), name='stock-item-children'), url(r'^attachments/', views.StockItemDetail.as_view(template_name='stock/item_attachments.html'), name='stock-item-attachments'), + url(r'^installed/', views.StockItemDetail.as_view(template_name='stock/item_installed.html'), name='stock-item-installed'), url(r'^notes/', views.StockItemNotes.as_view(), name='stock-item-notes'), url('^.*$', views.StockItemDetail.as_view(), name='stock-item-detail'), diff --git a/InvenTree/templates/js/stock.html b/InvenTree/templates/js/stock.html index bb0673c16d..9a9e629efe 100644 --- a/InvenTree/templates/js/stock.html +++ b/InvenTree/templates/js/stock.html @@ -512,16 +512,20 @@ function loadStockTable(table, options) { title: '{% trans "Location" %}', sortable: true, formatter: function(value, row, index, field) { - if (value) { + if (row.belongs_to) { + var text = "{% trans 'Installed in Stock Item ' %}" + row.belongs_to; + var url = `/stock/item/${row.belongs_to}/installed/`; + + return renderLink(text, url); + } else if (row.customer) { + var text = "{% trans "Shipped to customer" %}"; + return renderLink(text, `/company/${row.customer}/assigned-stock/`); + } + else if (value) { return renderLink(value, `/stock/location/${row.location}/`); } else { - if (row.customer) { - var text = "{% trans "Shipped to customer" %}"; - return renderLink(text, `/company/${row.customer}/assigned-stock/`); - } else { - return '{% trans "No stock location set" %}'; - } + return '{% trans "No stock location set" %}'; } } }, diff --git a/InvenTree/templates/js/table_filters.html b/InvenTree/templates/js/table_filters.html index 316abcad7b..44c4149265 100644 --- a/InvenTree/templates/js/table_filters.html +++ b/InvenTree/templates/js/table_filters.html @@ -65,6 +65,11 @@ function getAvailableTableFilters(tableKey) { title: '{% trans "In Stock" %}', description: '{% trans "Show items which are in stock" %}', }, + installed: { + type: 'bool', + title: '{% trans "Installed" %}', + description: '{% trans "Show stock items which are installed in another item" %}', + }, sent_to_customer: { type: 'bool', title: '{% trans "Sent to customer" %}', From d684ed076bd0f8337a2c0b7b90bb922aa48e2e76 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 20:10:29 +1000 Subject: [PATCH 04/16] Improve table filter naming --- InvenTree/stock/templates/stock/item_childs.html | 1 + InvenTree/templates/js/stock.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/InvenTree/stock/templates/stock/item_childs.html b/InvenTree/stock/templates/stock/item_childs.html index 1a8febbbea..a271852846 100644 --- a/InvenTree/stock/templates/stock/item_childs.html +++ b/InvenTree/stock/templates/stock/item_childs.html @@ -31,6 +31,7 @@ loadStockTable($("#stock-table"), { part_details: true, ancestor: {{ item.id }}, }, + name: 'item-childs', groupByField: 'location', buttons: [ '#stock-options', diff --git a/InvenTree/templates/js/stock.html b/InvenTree/templates/js/stock.html index 9a9e629efe..7de6f01669 100644 --- a/InvenTree/templates/js/stock.html +++ b/InvenTree/templates/js/stock.html @@ -238,7 +238,7 @@ function loadStockTable(table, options) { var filters = {}; - var filterKey = options.filterKey || "stock"; + var filterKey = options.filterKey || options.name || "stock"; if (!options.disableFilters) { filters = loadTableFilters(filterKey); From b58f7d74616ec40598eb4ed3eb6e9ab5c1ff8548 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 20:19:56 +1000 Subject: [PATCH 05/16] Custom table display for installed stock items --- .../stock/templates/stock/item_installed.html | 95 ++++++++++++++++++- InvenTree/templates/js/stock.html | 16 ++-- 2 files changed, 100 insertions(+), 11 deletions(-) diff --git a/InvenTree/stock/templates/stock/item_installed.html b/InvenTree/stock/templates/stock/item_installed.html index abecaf6e3c..c9c429c87b 100644 --- a/InvenTree/stock/templates/stock/item_installed.html +++ b/InvenTree/stock/templates/stock/item_installed.html @@ -19,13 +19,102 @@ {{ block.super }} -loadStockTable($("#installed-table"), { - params: { +$('#installed-table').inventreeTable({ + formatNoMatches: function() { + return '{% trans "No stock items installed" %}'; + }, + url: "{% url 'api-stock-list' %}", + queryParams: { installed_in: {{ item.id }}, part_detail: true, }, name: 'stock-item-installed', url: "{% url 'api-stock-list' %}", -}) + showColumns: true, + columns: [ + { + checkbox: true, + title: '{% trans 'Select' %}', + searchable: false, + switchable: false, + visible: false, + }, + { + field: 'pk', + title: 'ID', + visible: false, + switchable: false, + }, + { + field: 'part_name', + title: '{% trans "Part" %}', + sortable: true, + formatter: function(value, row, index, field) { + + var url = `/stock/item/${row.pk}/`; + var thumb = row.part_detail.thumbnail; + var name = row.part_detail.full_name; + + html = imageHoverIcon(thumb) + renderLink(name, url); + + return html; + } + }, + { + field: 'IPN', + title: 'IPN', + sortable: true, + formatter: function(value, row, index, field) { + return row.part_detail.IPN; + }, + }, + { + field: 'part_description', + title: '{% trans "Description" %}', + sortable: true, + formatter: function(value, row, index, field) { + return row.part_detail.description; + } + }, + { + field: 'quantity', + title: '{% trans "Stock" %}', + sortable: true, + formatter: function(value, row, index, field) { + + var val = parseFloat(value); + + // If there is a single unit with a serial number, use the serial number + if (row.serial && row.quantity == 1) { + val = '# ' + row.serial; + } else { + val = +val.toFixed(5); + } + + var html = renderLink(val, `/stock/item/${row.pk}/`); + + return html; + } + }, + { + field: 'status', + title: '{% trans "Status" %}', + sortable: 'true', + formatter: function(value, row, index, field) { + return stockStatusDisplay(value); + }, + }, + { + field: 'batch', + title: '{% trans "Batch" %}', + sortable: true, + }, + { + field: 'actions', + switchable: false, + title: '', + } + ] +}); {% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/js/stock.html b/InvenTree/templates/js/stock.html index 7de6f01669..dd99c5b611 100644 --- a/InvenTree/templates/js/stock.html +++ b/InvenTree/templates/js/stock.html @@ -416,14 +416,6 @@ function loadStockTable(table, options) { visible: false, switchable: false, }, - { - field: 'IPN', - title: 'IPN', - sortable: true, - formatter: function(value, row, index, field) { - return row.part_detail.IPN; - }, - }, { field: 'part_name', title: '{% trans "Part" %}', @@ -439,6 +431,14 @@ function loadStockTable(table, options) { return html; } }, + { + field: 'IPN', + title: 'IPN', + sortable: true, + formatter: function(value, row, index, field) { + return row.part_detail.IPN; + }, + }, { field: 'part_description', title: '{% trans "Description" %}', From 2ef8464a83471e923da555f0e199b4135c7baa62 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 20:27:13 +1000 Subject: [PATCH 06/16] Add buttons to remove installed items from a stock item --- .../stock/templates/stock/item_installed.html | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/InvenTree/stock/templates/stock/item_installed.html b/InvenTree/stock/templates/stock/item_installed.html index c9c429c87b..72451f11e9 100644 --- a/InvenTree/stock/templates/stock/item_installed.html +++ b/InvenTree/stock/templates/stock/item_installed.html @@ -113,8 +113,28 @@ $('#installed-table').inventreeTable({ field: 'actions', switchable: false, title: '', + formatter: function(value, row) { + var pk = row.pk; + + var html = `
    `; + + html += makeIconButton('fa-trash-alt icon-red', 'button-uninstall', pk, '{% trans "Uninstall item" %}'); + + html += `
    `; + + return html; + } } - ] + ], + onLoadSuccess: function() { + + var table = $('#installed-table'); + + // Find buttons and associate actions + table.find('.button-uninstall').click(function() { + var pk = $(this).attr('pk'); + }); + } }); {% endblock %} \ No newline at end of file From ca6994566dced4dc8bbf4b1b64e4846fa4ab24e9 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 21:26:40 +1000 Subject: [PATCH 07/16] Add better terminal support for invoke server command --- tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks.py b/tasks.py index cbf9d1722c..9948b470d1 100644 --- a/tasks.py +++ b/tasks.py @@ -256,4 +256,4 @@ def server(c, address="127.0.0.1:8000"): Note: This is *not* sufficient for a production installation. """ - manage(c, "runserver {address}".format(address=address)) + manage(c, "runserver {address}".format(address=address), pty=True) From 39cfe3917213958f0f22449a5a68a2e0efe68c29 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 21:27:27 +1000 Subject: [PATCH 08/16] View / form / url for stock-uninstall form --- .../static/script/inventree/tables.js | 5 ++ InvenTree/stock/forms.py | 26 +++++- .../stock/templates/stock/item_installed.html | 28 ++++++- .../templates/stock/stock_uninstall.html | 28 +++++++ InvenTree/stock/urls.py | 2 + InvenTree/stock/views.py | 83 +++++++++++++++++++ 6 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 InvenTree/stock/templates/stock/stock_uninstall.html diff --git a/InvenTree/InvenTree/static/script/inventree/tables.js b/InvenTree/InvenTree/static/script/inventree/tables.js index be0e1e6325..cc4320307b 100644 --- a/InvenTree/InvenTree/static/script/inventree/tables.js +++ b/InvenTree/InvenTree/static/script/inventree/tables.js @@ -157,6 +157,11 @@ $.fn.inventreeTable = function(options) { console.log('Could not get list of visible columns!'); } } + + // Optionally, link buttons to the table selection + if (options.buttons) { + linkButtonsToSelection(table, options.buttons); + } } function customGroupSorter(sortName, sortOrder, sortData) { diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py index e0b1623a54..37d8d91c8a 100644 --- a/InvenTree/stock/forms.py +++ b/InvenTree/stock/forms.py @@ -271,6 +271,24 @@ class ExportOptionsForm(HelperForm): self.fields['file_format'].choices = self.get_format_choices() +class UninstallStockForm(forms.ModelForm): + """ + Form for uninstalling a stock item which is installed in another item. + """ + + location = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label=_('Location'), help_text=_('Destination location for uninstalled items')) + + confirm = forms.BooleanField(required=False, initial=False, label=_('Confirm uninstall'), help_text=_('Confirm removal of installed stock items')) + + class Meta: + + model = StockItem + + fields = [ + 'location', + 'confirm', + ] + class AdjustStockForm(forms.ModelForm): """ Form for performing simple stock adjustments. @@ -282,15 +300,15 @@ class AdjustStockForm(forms.ModelForm): This form is used for managing stock adjuments for single or multiple stock items. """ - destination = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label='Destination', required=True, help_text=_('Destination stock location')) + destination = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label=_('Destination'), required=True, help_text=_('Destination stock location')) - note = forms.CharField(label='Notes', required=True, help_text='Add note (required)') + note = forms.CharField(label=_('Notes'), required=True, help_text=_('Add note (required)')) # transaction = forms.BooleanField(required=False, initial=False, label='Create Transaction', help_text='Create a stock transaction for these parts') - confirm = forms.BooleanField(required=False, initial=False, label='Confirm stock adjustment', help_text=_('Confirm movement of stock items')) + confirm = forms.BooleanField(required=False, initial=False, label=_('Confirm stock adjustment'), help_text=_('Confirm movement of stock items')) - set_loc = forms.BooleanField(required=False, initial=False, label='Set Default Location', help_text=_('Set the destination as the default location for selected parts')) + set_loc = forms.BooleanField(required=False, initial=False, label=_('Set Default Location'), help_text=_('Set the destination as the default location for selected parts')) class Meta: model = StockItem diff --git a/InvenTree/stock/templates/stock/item_installed.html b/InvenTree/stock/templates/stock/item_installed.html index 72451f11e9..d6a4675bf4 100644 --- a/InvenTree/stock/templates/stock/item_installed.html +++ b/InvenTree/stock/templates/stock/item_installed.html @@ -10,7 +10,18 @@

    {% trans "Installed Items" %}


    - +
    +
    +
    + + +
    +
    +
    + +
    {% endblock %} @@ -37,7 +48,6 @@ $('#installed-table').inventreeTable({ title: '{% trans 'Select' %}', searchable: false, switchable: false, - visible: false, }, { field: 'pk', @@ -133,8 +143,20 @@ $('#installed-table').inventreeTable({ // Find buttons and associate actions table.find('.button-uninstall').click(function() { var pk = $(this).attr('pk'); + + launchModalForm( + "{% url 'stock-item-uninstall' %}", + { + data: { + 'items[]': [pk], + } + } + ); }); - } + }, + buttons: [ + '#stock-options', + ] }); {% endblock %} \ No newline at end of file diff --git a/InvenTree/stock/templates/stock/stock_uninstall.html b/InvenTree/stock/templates/stock/stock_uninstall.html new file mode 100644 index 0000000000..2a8d9c7ee4 --- /dev/null +++ b/InvenTree/stock/templates/stock/stock_uninstall.html @@ -0,0 +1,28 @@ +{% extends "modal_form.html" %} +{% load i18n %} +{% load inventree_extras %} + +{% block pre_form_content %} + +
    + {% trans "The following stock items will be uninstalled" %} +
    + +
      + {% for item in stock_items %} +
    • + {% include "hover_image.html" with image=item.part.image hover=False %} + {{ item }} +
    • + {% endfor %} +
    + +{% endblock %} + +{% block form_data %} + +{% for item in stock_items %} + +{% endfor %} + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py index c6b0b2b54c..4c86995cda 100644 --- a/InvenTree/stock/urls.py +++ b/InvenTree/stock/urls.py @@ -60,6 +60,8 @@ stock_urls = [ url(r'^item/new/?', views.StockItemCreate.as_view(), name='stock-item-create'), + url(r'^item/uninstall/', views.StockItemUninstall.as_view(), name='stock-item-uninstall'), + url(r'^item/test-report-download/', views.StockItemTestReportDownload.as_view(), name='stock-item-test-report-download'), url(r'^item/print-stock-labels/', views.StockItemPrintLabels.as_view(), name='stock-item-print-labels'), diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index aadac17c7a..6aedfe1b4c 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -683,6 +683,89 @@ class StockItemQRCode(QRCodeView): return None +class StockItemUninstall(AjaxView, FormMixin): + """ + View for uninstalling one or more StockItems, + which are installed in another stock item. + + Stock items are uninstalled into a location, + defaulting to the location that they were "in" before they were installed. + + If multiple default locations are detected, + leave the final location up to the user. + """ + + ajax_template_name = 'stock/stock_uninstall.html' + ajax_form_title = _('Uninstall Stock Items') + form_class = StockForms.UninstallStockForm + + # List of stock items to uninstall (initially empty) + stock_items = [] + + def get_stock_items(self): + + return self.stock_items + + def get(self, request, *args, **kwargs): + + """ Extract list of stock items, which are supplied as a list, + e.g. items[]=1,2,3 + """ + + if 'items[]' in request.GET: + self.stock_items = StockItem.objects.filter(id__in=request.GET.getlist('items[]')) + else: + self.stock_items = [] + + print("GET:", request.GET) + + return self.renderJsonResponse(request, self.get_form()) + + def post(self, request, *args, **kwargs): + + """ + Extract a list of stock items which are included as hidden inputs in the form data. + """ + + items = [] + + for item in self.request.POST: + if item.startswith('stock-item-'): + pk = item.replace('stock-item', '') + + try: + stock_item = StockItem.objects.get(pk=pk) + items.append(stock_item) + except (ValueError, StockItem.DoesNotExist): + pass + + self.stock_items = items + + confirmed = str2bool(request.POST.get('confirm')) + + valid = False + + form = self.get_form() + + if not confirmed: + valid = False + form.errors['confirm'] = [_('Confirm stock adjustment')] + + data = { + 'form_valid': valid, + } + + return self.renderJsonResponse(request, form=form, data=data) + + def get_context_data(self): + + context = super().get_context_data() + + context['stock_items'] = self.get_stock_items() + + return context + + class StockAdjust(AjaxView, FormMixin): """ View for enacting simple stock adjustments: From 81ce284264957eea35e97fe3f27540e70550700b Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 21:41:35 +1000 Subject: [PATCH 09/16] Select the "default" where we wish to uninstall parts --- .../stock/templates/stock/item_installed.html | 24 +++++++- InvenTree/stock/views.py | 56 +++++++++++++++++-- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/InvenTree/stock/templates/stock/item_installed.html b/InvenTree/stock/templates/stock/item_installed.html index d6a4675bf4..ae4e90b8c4 100644 --- a/InvenTree/stock/templates/stock/item_installed.html +++ b/InvenTree/stock/templates/stock/item_installed.html @@ -149,7 +149,8 @@ $('#installed-table').inventreeTable({ { data: { 'items[]': [pk], - } + }, + reload: true, } ); }); @@ -159,4 +160,25 @@ $('#installed-table').inventreeTable({ ] }); +$('#multi-item-uninstall').click(function() { + + var selections = $('#installed-table').bootstrapTable('getSelections'); + + var items = []; + + selections.forEach(function(item) { + items.push(item.pk); + }); + + launchModalForm( + "{% url 'stock-item-uninstall' %}", + { + data: { + 'items[]': items, + }, + reload: true, + } + ); +}); + {% endblock %} \ No newline at end of file diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 6aedfe1b4c..885a39540a 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -706,6 +706,36 @@ class StockItemUninstall(AjaxView, FormMixin): return self.stock_items + def get_initial(self): + + initials = super().get_initial().copy() + + # Keep track of the current locations of stock items + current_locations = set() + + # Keep track of the default locations for stock items + default_locations = set() + + for item in self.stock_items: + + if item.location: + current_locations.add(item.location) + + if item.part.default_location: + default_locations.add(item.part.default_location) + + if len(current_locations) == 1: + # If the selected stock items are currently in a single location, + # select that location as the destination. + initials['location'] = next(iter(current_locations)) + elif len(current_locations) == 0: + # There are no current locations set + if len(default_locations) == 1: + # Select the single default location + initials['location'] = next(iter(default_locations)) + + return initials + def get(self, request, *args, **kwargs): """ Extract list of stock items, which are supplied as a list, @@ -717,8 +747,6 @@ class StockItemUninstall(AjaxView, FormMixin): else: self.stock_items = [] - print("GET:", request.GET) - return self.renderJsonResponse(request, self.get_form()) def post(self, request, *args, **kwargs): @@ -731,7 +759,7 @@ class StockItemUninstall(AjaxView, FormMixin): for item in self.request.POST: if item.startswith('stock-item-'): - pk = item.replace('stock-item', '') + pk = item.replace('stock-item-', '') try: stock_item = StockItem.objects.get(pk=pk) @@ -741,9 +769,22 @@ class StockItemUninstall(AjaxView, FormMixin): self.stock_items = items + # Assume the form is valid, until it isn't! + valid = True + confirmed = str2bool(request.POST.get('confirm')) - valid = False + location = request.POST.get('location', None) + + if location: + try: + location = StockLocation.objects.get(pk=location) + except (ValueError, StockLocation.DoesNotExist): + location = None + + if not location: + # Location is required! + valid = False form = self.get_form() @@ -755,6 +796,13 @@ class StockItemUninstall(AjaxView, FormMixin): 'form_valid': valid, } + if valid: + # Ok, now let's actually uninstall the stock items + for item in self.stock_items: + pass + + data['success'] = _('Uninstalled stock items') + return self.renderJsonResponse(request, form=form, data=data) def get_context_data(self): From df8d1fb32b4c5d3aa69306d1c9dc52011277e36d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 21:52:23 +1000 Subject: [PATCH 10/16] Add functions to install and uninstall stock items --- InvenTree/stock/forms.py | 3 ++ InvenTree/stock/models.py | 58 +++++++++++++++++++++++++++++++++++++++ InvenTree/stock/views.py | 4 ++- 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py index 37d8d91c8a..04701c8eb6 100644 --- a/InvenTree/stock/forms.py +++ b/InvenTree/stock/forms.py @@ -278,6 +278,8 @@ class UninstallStockForm(forms.ModelForm): location = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label=_('Location'), help_text=_('Destination location for uninstalled items')) + note = forms.CharField(label=_('Notes'), required=False, help_text=_('Add transaction note (optional)')) + confirm = forms.BooleanField(required=False, initial=False, label=_('Confirm uninstall'), help_text=_('Confirm removal of installed stock items')) class Meta: @@ -286,6 +288,7 @@ class UninstallStockForm(forms.ModelForm): fields = [ 'location', + 'note', 'confirm', ] diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index e2468772e2..b1e9f95e7e 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -599,6 +599,64 @@ class StockItem(MPTTModel): return self.installedItemCount() > 0 + @transaction.atomic + def installIntoStockItem(self, otherItem, user, notes): + """ + Install this stock item into another stock item. + + Args + otherItem: The stock item to install this item into + user: The user performing the operation + notes: Any notes associated with the operation + """ + + # Cannot be already installed in another stock item! + if self.belongs_to is not None: + return False + + # TODO - Are there any other checks that need to be performed at this stage? + + # Mark this stock item as belonging to the other one + self.belongs_to = otherItem + + self.save() + + # Add a transaction note! + self.addTransactionNote( + _('Installed in stock item') + ' ' + str(otherItem.pk), + user, + notes=notes + ) + + @transaction.atomic + def uninstallIntoLocation(self, location, user, notes): + """ + Uninstall this stock item from another item, into a location. + + Args: + location: The stock location where the item will be moved + user: The user performing the operation + notes: Any notes associated with the operation + """ + + # If the stock item is not installed in anything, ignore + if self.belongs_to is None: + return False + + # TODO - Are there any other checks that need to be performed at this stage? + + self.belongs_to = None + self.location = location + + self.save() + + # Add a transaction note! + self.addTransactionNote( + _('Uninstalled into location') + ' ' + str(location), + user, + notes=notes + ) + @property def children(self): """ Return a list of the child items which have been split from this stock item """ diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 885a39540a..7e62eda936 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -774,6 +774,8 @@ class StockItemUninstall(AjaxView, FormMixin): confirmed = str2bool(request.POST.get('confirm')) + note = request.POST.get('note', '') + location = request.POST.get('location', None) if location: @@ -799,7 +801,7 @@ class StockItemUninstall(AjaxView, FormMixin): if valid: # Ok, now let's actually uninstall the stock items for item in self.stock_items: - pass + item.uninstallIntoLocation(location, request.user, note) data['success'] = _('Uninstalled stock items') From a18886f1968685a6cfa6c4282c850559436fea34 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 22:00:17 +1000 Subject: [PATCH 11/16] Add some unit tests for the new functions --- InvenTree/stock/tests.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/InvenTree/stock/tests.py b/InvenTree/stock/tests.py index 1001ed12ea..b500f1c6e5 100644 --- a/InvenTree/stock/tests.py +++ b/InvenTree/stock/tests.py @@ -335,6 +335,35 @@ class StockTest(TestCase): # Serialize the remainder of the stock item.serializeStock(2, [99, 100], self.user) + def test_installation(self): + """ + Test that the functions to install stock items in other stock items work. + """ + + item_1 = StockItem.objects.get(pk=1) + item_2 = StockItem.objects.get(pk=2) + + self.assertEqual(item_1.belongs_to, None) + self.assertFalse(item_2.hasInstalledItems()) + + n = item_1.tracking_info_count + + # Now, let's install item_1 into item_2 + item_1.installIntoStockItem(item_2, self.user, "Hello world!") + + # Check that it installed properly! + self.assertEqual(item_1.tracking_info_count, n + 1) + self.assertTrue(item_2.hasInstalledItems()) + self.assertEqual(item_1.belongs_to, item_2) + + # Now, let's uninstall it! + item_1.uninstallIntoLocation(item_1.location, self.user, "Wello horld!") + + # Check that it uninstalled + self.assertEqual(item_1.tracking_info_count, n + 2) + self.assertFalse(item_2.hasInstalledItems()) + self.assertEqual(item_1.belongs_to, None) + class VariantTest(StockTest): """ From b2b22762efc4a77e716abf116993d36e84f6fb00 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 22:01:45 +1000 Subject: [PATCH 12/16] style fixes --- InvenTree/stock/forms.py | 1 + InvenTree/stock/models.py | 2 +- InvenTree/stock/views.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py index 04701c8eb6..a5c689a605 100644 --- a/InvenTree/stock/forms.py +++ b/InvenTree/stock/forms.py @@ -292,6 +292,7 @@ class UninstallStockForm(forms.ModelForm): 'confirm', ] + class AdjustStockForm(forms.ModelForm): """ Form for performing simple stock adjustments. diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index b1e9f95e7e..df1a628f47 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -625,7 +625,7 @@ class StockItem(MPTTModel): self.addTransactionNote( _('Installed in stock item') + ' ' + str(otherItem.pk), user, - notes=notes + notes=notes ) @transaction.atomic diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 7e62eda936..5041fad9d4 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -765,7 +765,7 @@ class StockItemUninstall(AjaxView, FormMixin): stock_item = StockItem.objects.get(pk=pk) items.append(stock_item) except (ValueError, StockItem.DoesNotExist): - pass + pass self.stock_items = items From 54bfcff213b55b9fcf9de8391ff667ae9d13a1fd Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 28 Sep 2020 19:41:41 +1000 Subject: [PATCH 13/16] CHange "parts" to "items" --- InvenTree/stock/fixtures/stock_tests.yaml | 2 +- .../stock/templates/stock/item_installed.html | 2 +- InvenTree/stock/templates/stock/tabs.html | 2 +- InvenTree/stock/tests.py | 48 +++++++------------ 4 files changed, 20 insertions(+), 34 deletions(-) diff --git a/InvenTree/stock/fixtures/stock_tests.yaml b/InvenTree/stock/fixtures/stock_tests.yaml index 7ee6f3b387..8a99e8b56b 100644 --- a/InvenTree/stock/fixtures/stock_tests.yaml +++ b/InvenTree/stock/fixtures/stock_tests.yaml @@ -62,7 +62,7 @@ pk: 8 fields: stock_item: 522 - test: 'Check that chair is GreEn ' + test: 'Check that chair is GreEn' result: True date: 2020-05-17 diff --git a/InvenTree/stock/templates/stock/item_installed.html b/InvenTree/stock/templates/stock/item_installed.html index ae4e90b8c4..2d8a8142cf 100644 --- a/InvenTree/stock/templates/stock/item_installed.html +++ b/InvenTree/stock/templates/stock/item_installed.html @@ -7,7 +7,7 @@ {% include "stock/tabs.html" with tab='installed' %} -

    {% trans "Installed Items" %}

    +

    {% trans "Installed Stock Items" %}


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