From 307a097ab4685d45bbf7930a728740979b6db986 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 00:56:14 +0200 Subject: [PATCH 001/110] adding in url --- InvenTree/part/urls.py | 3 +++ InvenTree/part/views.py | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index c734b7f610..e2b172780a 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -120,6 +120,9 @@ part_urls = [ # Create a new part url(r'^new/?', views.PartCreate.as_view(), name='part-create'), + # Upload a part + url(r'^import/', views.PartImport.as_view(), name='part-upload'), + # Create a new BOM item url(r'^bom/new/?', views.BomItemCreate.as_view(), name='bom-item-create'), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 2fabdb9fc8..d9b0b51693 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -39,6 +39,7 @@ from .models import PartSellPriceBreak from common.models import InvenTreeSetting from company.models import SupplierPart +from common.views import FileManagementFormView import common.settings as inventree_settings @@ -718,6 +719,9 @@ class PartCreate(AjaxCreateView): return initials +class PartImport(FileManagementFormView): + ''' Part: Upload file, match to fields and import parts(using multi-Step form) ''' + class PartNotes(UpdateView): """ View for editing the 'notes' field of a Part object. Presents a live markdown editor. From 8effdffe6f8f43491d5b97e37d6ca3137a997f40 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 00:57:18 +0200 Subject: [PATCH 002/110] templates and FileManagement config --- InvenTree/common/files.py | 21 ++++ .../part/import_wizard/match_fields.html | 99 +++++++++++++++++++ .../part/import_wizard/match_references.html | 90 +++++++++++++++++ .../part/import_wizard/part_upload.html | 61 ++++++++++++ InvenTree/part/views.py | 25 +++++ 5 files changed, 296 insertions(+) create mode 100644 InvenTree/part/templates/part/import_wizard/match_fields.html create mode 100644 InvenTree/part/templates/part/import_wizard/match_references.html create mode 100644 InvenTree/part/templates/part/import_wizard/part_upload.html diff --git a/InvenTree/common/files.py b/InvenTree/common/files.py index 377120f44d..759ff04ee7 100644 --- a/InvenTree/common/files.py +++ b/InvenTree/common/files.py @@ -109,6 +109,27 @@ class FileManager: # Update headers self.update_headers() + if self.name == 'part': + self.REQUIRED_HEADERS = [ + 'Name', + 'Description', + ] + + self.OPTIONAL_HEADERS = [ + 'Keywords', + 'IPN', + 'Revision', + 'Link', + 'default_expiry', + 'minimum_stock', + 'Units', + 'Notes', + ] + + # Update headers + self.update_headers() + + def guess_header(self, header, threshold=80): """ Try to match a header (from the file) to a list of known headers diff --git a/InvenTree/part/templates/part/import_wizard/match_fields.html b/InvenTree/part/templates/part/import_wizard/match_fields.html new file mode 100644 index 0000000000..54008d6bae --- /dev/null +++ b/InvenTree/part/templates/part/import_wizard/match_fields.html @@ -0,0 +1,99 @@ +{% extends "part/import_wizard/part_upload.html" %} +{% load inventree_extras %} +{% load i18n %} +{% load static %} + +{% block form_alert %} +{% if missing_columns and missing_columns|length > 0 %} + +{% endif %} +{% if duplicates and duplicates|length > 0 %} + +{% endif %} +{% endblock form_alert %} + +{% block form_buttons_top %} + {% if wizard.steps.prev %} + + {% endif %} + +{% endblock form_buttons_top %} + +{% block form_content %} + + + {% trans "File Fields" %} + + {% for col in form %} + +
+ + {{ col.name }} + +
+ + {% endfor %} + + + + + {% trans "Match Fields" %} + + {% for col in form %} + + {{ col }} + {% for duplicate in duplicates %} + {% if duplicate == col.name %} + + {% endif %} + {% endfor %} + + {% endfor %} + + {% for row in rows %} + {% with forloop.counter as row_index %} + + + + + {{ row_index }} + {% for item in row.data %} + + + {{ item }} + + {% endfor %} + + {% endwith %} + {% endfor %} + +{% endblock form_content %} + +{% block form_buttons_bottom %} +{% endblock form_buttons_bottom %} + +{% block js_ready %} +{{ block.super }} + +$('.fieldselect').select2({ + width: '100%', + matcher: partialMatcher, +}); + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/import_wizard/match_references.html b/InvenTree/part/templates/part/import_wizard/match_references.html new file mode 100644 index 0000000000..efc69b98d5 --- /dev/null +++ b/InvenTree/part/templates/part/import_wizard/match_references.html @@ -0,0 +1,90 @@ +{% extends "part/import_wizard/part_upload.html" %} +{% load inventree_extras %} +{% load i18n %} +{% load static %} + +{% block form_alert %} +{% if form.errors %} +{% endif %} +{% if form_errors %} + +{% endif %} +{% endblock form_alert %} + +{% block form_buttons_top %} + {% if wizard.steps.prev %} + + {% endif %} + +{% endblock form_buttons_top %} + +{% block form_content %} + + + + {% trans "Row" %} + {% for col in columns %} + + + + + {% if col.guess %} + {{ col.guess }} + {% else %} + {{ col.name }} + {% endif %} + + {% endfor %} + + + + {% comment %} Dummy row for javascript del_row method {% endcomment %} + {% for row in rows %} + + + + + + {% add row.index 1 %} + + {% for item in row.data %} + + {% if item.column.guess %} + {% with row_name=item.column.guess|lower %} + {% for field in form.visible_fields %} + {% if field.name == row|keyvalue:row_name %} + {{ field }} + {% endif %} + {% endfor %} + {% endwith %} + {% else %} + {{ item.cell }} + {% endif %} + + + {% endfor %} + + {% endfor %} + +{% endblock form_content %} + +{% block form_buttons_bottom %} +{% endblock form_buttons_bottom %} + +{% block js_ready %} +{{ block.super }} + +$('.bomselect').select2({ + dropdownAutoWidth: true, + matcher: partialMatcher, +}); + +$('.currencyselect').select2({ + dropdownAutoWidth: true, +}); + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/import_wizard/part_upload.html b/InvenTree/part/templates/part/import_wizard/part_upload.html new file mode 100644 index 0000000000..87809603bb --- /dev/null +++ b/InvenTree/part/templates/part/import_wizard/part_upload.html @@ -0,0 +1,61 @@ +{% extends "part/category.html" %} +{% load inventree_extras %} +{% load i18n %} +{% load static %} + +{% block menubar %} +{% include 'part/category_navbar.html' with tab='import' %} +{% endblock %} + +{% block category_content %} +
+
+

+ {% trans "Import Parts from File" %} + {{ wizard.form.media }} +

+
+
+ {% if roles.part.change %} + +

{% blocktrans with step=wizard.steps.step1 count=wizard.steps.count %}Step {{step}} of {{count}}{% endblocktrans %} + {% if description %}- {{ description }}{% endif %}

+ + {% block form_alert %} + {% endblock form_alert %} + +
+ {% csrf_token %} + {% load crispy_forms_tags %} + + {% block form_buttons_top %} + {% endblock form_buttons_top %} + + + {{ wizard.management_form }} + {% block form_content %} + {% crispy wizard.form %} + {% endblock form_content %} +
+ + {% block form_buttons_bottom %} + {% if wizard.steps.prev %} + + {% endif %} + +
+ {% endblock form_buttons_bottom %} + + {% else %} + + {% endif %} +
+
+{% endblock %} + +{% block js_ready %} +{{ block.super }} + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index d9b0b51693..1e19387e81 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -722,6 +722,31 @@ class PartCreate(AjaxCreateView): class PartImport(FileManagementFormView): ''' Part: Upload file, match to fields and import parts(using multi-Step form) ''' + name = 'part' + form_steps_template = [ + 'part/import_wizard/part_upload.html', + 'part/import_wizard/match_fields.html', + 'part/import_wizard/match_references.html', + ] + form_steps_description = [ + _("Upload File"), + _("Match Fields"), + _("Match References"), + ] + + form_field_map = { + 'name': 'name', + 'description': 'description', + 'keywords': 'keywords', + 'IPN': 'IPN', + 'revision': 'revision', + 'link': 'link', + 'default_expiry': 'default_expiry', + 'minimum_stock': 'minimum_stock', + 'units': 'units', + 'notes': 'notes', + } + class PartNotes(UpdateView): """ View for editing the 'notes' field of a Part object. Presents a live markdown editor. From 4ae7debb2b7f61fbe9c75bdafea630d6b7911a04 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 00:57:38 +0200 Subject: [PATCH 003/110] navigation --- InvenTree/part/templates/part/category_navbar.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/InvenTree/part/templates/part/category_navbar.html b/InvenTree/part/templates/part/category_navbar.html index e723db358d..e5fb13bbda 100644 --- a/InvenTree/part/templates/part/category_navbar.html +++ b/InvenTree/part/templates/part/category_navbar.html @@ -30,6 +30,13 @@ +
  • + + + {% trans "Upload File" %} + +
  • + {% if category %}
  • From 0c5fa5777029588db382dbceef018e19ecd504ca Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 00:58:03 +0200 Subject: [PATCH 004/110] template tag for dict-reading --- InvenTree/part/templatetags/inventree_extras.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index 2c588a81e5..6ac34f9d5e 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -162,6 +162,11 @@ def get_color_theme_css(username): return inventree_css_static_url +@register.filter +def keyvalue(dict, key): + return dict[key] + + @register.simple_tag() def authorized_owners(group): """ Return authorized owners """ From f136f90e129b3fb44bc98d96927a9835367c174f Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 00:59:47 +0200 Subject: [PATCH 005/110] config for all form-fields --- InvenTree/common/forms.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 8a0017e38b..c869d4a4f3 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -151,6 +151,8 @@ class MatchItem(forms.Form): # Set field name field_name = col_guess.lower() + '-' + str(row['index']) # Set field input box + + # TODO maybe not here but in an own function? if 'quantity' in col_guess.lower(): self.fields[field_name] = forms.CharField( required=False, @@ -164,6 +166,15 @@ class MatchItem(forms.Form): }) ) + else: + # Get value + value = row.get(col_guess.lower(), '') + # Set field input box + self.fields[field_name] = forms.CharField( + required=True, + initial=value, + ) + # Create item selection box elif col_guess in file_manager.ITEM_MATCH_HEADERS: # Get item options From 888154e30bd46ef6a052b92050298a7644081d02 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 01:01:57 +0200 Subject: [PATCH 006/110] added todo for cleaner implemention --- InvenTree/common/files.py | 1 + 1 file changed, 1 insertion(+) diff --git a/InvenTree/common/files.py b/InvenTree/common/files.py index 759ff04ee7..c4b40e1e2b 100644 --- a/InvenTree/common/files.py +++ b/InvenTree/common/files.py @@ -109,6 +109,7 @@ class FileManager: # Update headers self.update_headers() + # TODO maybe not here but in an own function? if self.name == 'part': self.REQUIRED_HEADERS = [ 'Name', From f1f75b45cbc3c9b90718bdc176040f5ccd665dc5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 01:02:25 +0200 Subject: [PATCH 007/110] using messages for alerts --- InvenTree/InvenTree/settings.py | 7 +++++++ InvenTree/part/templates/part/category.html | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 7ff90fc7c3..3f9c2d6cec 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -21,6 +21,7 @@ from datetime import datetime import yaml from django.utils.translation import gettext_lazy as _ +from django.contrib.messages import constants as messages def _is_true(x): @@ -593,3 +594,9 @@ IMPORT_EXPORT_USE_TRANSACTIONS = True INTERNAL_IPS = [ '127.0.0.1', ] + +MESSAGE_TAGS = { + messages.SUCCESS: 'alert alert-block alert-success', + messages.ERROR: 'alert alert-block alert-danger', + messages.INFO: 'alert alert-block alert-info', +} diff --git a/InvenTree/part/templates/part/category.html b/InvenTree/part/templates/part/category.html index b79ee0ee60..0b7fbba8f5 100644 --- a/InvenTree/part/templates/part/category.html +++ b/InvenTree/part/templates/part/category.html @@ -8,6 +8,15 @@ {% block content %} +{% if messages %} + {% for message in messages %} +
    + {{ message|safe }} +
    + {% endfor %} +{% endif %} + +
    From 437e75c598df179a4249745be34f46b3d1e83f09 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 01:09:29 +0200 Subject: [PATCH 008/110] form functions --- InvenTree/part/views.py | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 1e19387e81..7c1f1d0325 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -747,6 +747,51 @@ class PartImport(FileManagementFormView): 'notes': 'notes', } + def get_field_selection(self): + """ Fill the form fields for step 3 """ + + # collect reference indexes + idx_s = {} + for col in self.file_manager.HEADERS: + index = self.get_column_index(col) + if index >= 0: + idx_s[col] = index + + for row in self.rows: + for idx in idx_s: + data = row['data'][idx_s[idx]]['cell'] + row[idx.lower()] = data + + + def done(self, form_list, **kwargs): + """ Create items """ + items = {} + + for form_key, form_value in self.get_all_cleaned_data().items(): + # Split key from row value + try: + (field, idx) = form_key.split('-') + except ValueError: + continue + + try: + if idx not in items: + # Insert into items + items.update({ + idx: { + self.form_field_map[field]: form_value, + } + }) + else: + # Update items + items[idx][self.form_field_map[field]] = form_value + except KeyError: + pass + + + return HttpResponseRedirect(reverse('part-index')) + + class PartNotes(UpdateView): """ View for editing the 'notes' field of a Part object. Presents a live markdown editor. From 6c2e18dd7a31da3dead3f88ea3431bfe5fd9d068 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 01:09:50 +0200 Subject: [PATCH 009/110] part creation + alerts --- InvenTree/part/views.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 7c1f1d0325..3170a48c16 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -17,6 +17,7 @@ from django.views.generic import DetailView, ListView, FormView, UpdateView from django.forms.models import model_to_dict from django.forms import HiddenInput, CheckboxInput from django.conf import settings +from django.contrib import messages from moneyed import CURRENCIES @@ -788,6 +789,36 @@ class PartImport(FileManagementFormView): except KeyError: pass + import_done = 0 + import_error = [] + + # Create Part instances + for part_data in items.values(): + new_part = Part( + name=part_data.get('name', ''), + description=part_data.get('description', ''), + keywords=part_data.get('keywords', None), + IPN=part_data.get('ipn', None), + revision=part_data.get('revision', None), + link=part_data.get('link', None), + default_expiry=part_data.get('default_expiry', 0), + minimum_stock=part_data.get('minimum_stock', 0), + units=part_data.get('units', None), + notes=part_data.get('notes', None), + ) + try: + new_part.save() + import_done += 1 + except ValidationError as _e: + import_error.append(', '.join(set(_e.messages))) + + # Set alerts + if import_done: + alert = f"{_('Part-Import')}
    {_('Imported {n} parts').format(n=import_done)}" + messages.success(self.request, alert) + if import_error: + error_text = '\n'.join([f'
  • x{import_error.count(a)}: {a}
  • ' for a in set(import_error)]) + messages.error(self.request, f"{_('Some errors occured:')}
      {error_text}
    ") return HttpResponseRedirect(reverse('part-index')) From 27ed20c1239f08cb356abd187ae30954f8ac099d Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 08:36:08 +0200 Subject: [PATCH 010/110] fix for wrong mapping --- InvenTree/part/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 3170a48c16..89eaca25c4 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -739,7 +739,7 @@ class PartImport(FileManagementFormView): 'name': 'name', 'description': 'description', 'keywords': 'keywords', - 'IPN': 'IPN', + 'ipn': 'ipn', 'revision': 'revision', 'link': 'link', 'default_expiry': 'default_expiry', From 941ac25d53350be3995e40fc04bae420a74fb00b Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 08:45:01 +0200 Subject: [PATCH 011/110] style fixes --- InvenTree/common/files.py | 1 - InvenTree/part/views.py | 1 - 2 files changed, 2 deletions(-) diff --git a/InvenTree/common/files.py b/InvenTree/common/files.py index c4b40e1e2b..9c4e7c039c 100644 --- a/InvenTree/common/files.py +++ b/InvenTree/common/files.py @@ -130,7 +130,6 @@ class FileManager: # Update headers self.update_headers() - def guess_header(self, header, threshold=80): """ Try to match a header (from the file) to a list of known headers diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 89eaca25c4..ac2749a612 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -763,7 +763,6 @@ class PartImport(FileManagementFormView): data = row['data'][idx_s[idx]]['cell'] row[idx.lower()] = data - def done(self, form_list, **kwargs): """ Create items """ items = {} From 90ae2813870588fcb2f10fb2dfb5baf69c6ac4b0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 16 May 2021 15:50:13 +0200 Subject: [PATCH 012/110] adding in optional headers --- InvenTree/common/files.py | 6 ++++-- InvenTree/common/forms.py | 21 +++++++++++++++++++++ InvenTree/part/views.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/InvenTree/common/files.py b/InvenTree/common/files.py index 9c4e7c039c..62f6426ef7 100644 --- a/InvenTree/common/files.py +++ b/InvenTree/common/files.py @@ -26,6 +26,8 @@ class FileManager: # Fields which would be helpful but are not required OPTIONAL_HEADERS = [] + OPTIONAL_MATCH_HEADERS = [] + EDITABLE_HEADERS = [] HEADERS = [] @@ -82,8 +84,8 @@ class FileManager: def update_headers(self): """ Update headers """ - self.HEADERS = self.REQUIRED_HEADERS + self.ITEM_MATCH_HEADERS + self.OPTIONAL_HEADERS - + self.HEADERS = self.REQUIRED_HEADERS + self.ITEM_MATCH_HEADERS + self.OPTIONAL_MATCH_HEADERS + self.OPTIONAL_HEADERS + def setup(self): """ Setup headers depending on the file name """ diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index c869d4a4f3..e166d235d8 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -220,3 +220,24 @@ class MatchItem(forms.Form): required=False, initial=value, ) + + # Optional item selection box + elif col_guess in file_manager.OPTIONAL_MATCH_HEADERS: + # Get item options + item_options = [(option.id, option) for option in row['match_options_' + col_guess]] + # Get item match + item_match = row['match_' + col_guess] + # Set field name + field_name = col_guess.lower() + '-' + str(row['index']) + # Set field select box + self.fields[field_name] = forms.ChoiceField( + choices=[('', '-' * 10)] + item_options, + required=False, + widget=forms.Select(attrs={ + 'class': 'select bomselect', + }) + ) + # Update select box when match was found + if item_match: + # Update initial value + self.fields[field_name].initial = item_match.id diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index ac2749a612..23799e4fec 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -751,6 +751,7 @@ class PartImport(FileManagementFormView): def get_field_selection(self): """ Fill the form fields for step 3 """ + self.file_manager.setup() # collect reference indexes idx_s = {} for col in self.file_manager.HEADERS: @@ -758,9 +759,24 @@ class PartImport(FileManagementFormView): if index >= 0: idx_s[col] = index + # fetch available elements + self.allowed_items = {} + self.matches = {} for row in self.rows: for idx in idx_s: data = row['data'][idx_s[idx]]['cell'] + + if idx in self.file_manager.OPTIONAL_MATCH_HEADERS: + try: + exact_match = self.allowed_items[idx].get(**{a:data for a in self.matches[idx]}) + except (ValueError, self.allowed_items[idx].model.DoesNotExist, self.allowed_items[idx].model.MultipleObjectsReturned): + exact_match = None + + row['match_options_' + idx] = self.allowed_items[idx] + row['match_' + idx] = exact_match + continue + + # general fields row[idx.lower()] = data def done(self, form_list, **kwargs): @@ -793,6 +809,19 @@ class PartImport(FileManagementFormView): # Create Part instances for part_data in items.values(): + + # set related parts + optional_matches = {} + for idx in self.file_manager.OPTIONAL_MATCH_HEADERS: + if idx.lower() in part_data: + try: + optional_matches[idx] = self.allowed_items[idx].get(pk=int(part_data[idx.lower()])) + except (ValueError, self.allowed_items[idx].model.DoesNotExist, self.allowed_items[idx].model.MultipleObjectsReturned): + optional_matches[idx] = None + else: + optional_matches[idx] = None + + # add part new_part = Part( name=part_data.get('name', ''), description=part_data.get('description', ''), From 8168db806180f71541fa845fee9fac868acab13d Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 16 May 2021 15:57:57 +0200 Subject: [PATCH 013/110] implementation for part import --- InvenTree/common/files.py | 6 ++++++ InvenTree/part/views.py | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/InvenTree/common/files.py b/InvenTree/common/files.py index 62f6426ef7..94f96f42e5 100644 --- a/InvenTree/common/files.py +++ b/InvenTree/common/files.py @@ -118,6 +118,12 @@ class FileManager: 'Description', ] + self.OPTIONAL_MATCH_HEADERS = [ + 'Category', + 'default_location', + 'default_supplier', + ] + self.OPTIONAL_HEADERS = [ 'Keywords', 'IPN', diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 23799e4fec..75ab43ef81 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -42,6 +42,8 @@ from common.models import InvenTreeSetting from company.models import SupplierPart from common.views import FileManagementFormView +from stock.models import StockLocation + import common.settings as inventree_settings from . import forms as part_forms @@ -746,6 +748,9 @@ class PartImport(FileManagementFormView): 'minimum_stock': 'minimum_stock', 'units': 'units', 'notes': 'notes', + 'category': 'category', + 'default_location': 'default_location', + 'default_supplier': 'default_supplier', } def get_field_selection(self): @@ -762,6 +767,14 @@ class PartImport(FileManagementFormView): # fetch available elements self.allowed_items = {} self.matches = {} + + self.allowed_items['Category'] = PartCategory.objects.all() + self.matches['Category'] = ['name__contains'] + self.allowed_items['default_location'] = StockLocation.objects.all() + self.matches['default_location'] = ['name__contains'] + self.allowed_items['default_supplier'] = SupplierPart.objects.all() + self.matches['default_supplier'] = ['SKU__contains'] + for row in self.rows: for idx in idx_s: data = row['data'][idx_s[idx]]['cell'] @@ -833,6 +846,9 @@ class PartImport(FileManagementFormView): minimum_stock=part_data.get('minimum_stock', 0), units=part_data.get('units', None), notes=part_data.get('notes', None), + category=optional_matches['Category'], + default_location=optional_matches['default_location'], + default_supplier=optional_matches['default_supplier'], ) try: new_part.save() From b9c73b1e603d4fe7e6f882bf670a8411df244b2d Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 16 May 2021 15:58:35 +0200 Subject: [PATCH 014/110] simpler code --- InvenTree/common/forms.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index e166d235d8..0c91dcfeea 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -145,11 +145,11 @@ class MatchItem(forms.Form): for col in row['data']: # Get column matching col_guess = col['column'].get('guess', None) + # Set field name + field_name = col_guess.lower() + '-' + str(row['index']) # Create input for required headers if col_guess in file_manager.REQUIRED_HEADERS: - # Set field name - field_name = col_guess.lower() + '-' + str(row['index']) # Set field input box # TODO maybe not here but in an own function? @@ -201,8 +201,6 @@ class MatchItem(forms.Form): # Optional entries elif col_guess in file_manager.OPTIONAL_HEADERS: - # Set field name - field_name = col_guess.lower() + '-' + str(row['index']) # Get value value = row.get(col_guess.lower(), '') # Set field input box @@ -227,8 +225,6 @@ class MatchItem(forms.Form): item_options = [(option.id, option) for option in row['match_options_' + col_guess]] # Get item match item_match = row['match_' + col_guess] - # Set field name - field_name = col_guess.lower() + '-' + str(row['index']) # Set field select box self.fields[field_name] = forms.ChoiceField( choices=[('', '-' * 10)] + item_options, From 3a5b4ab74b6979a583ccd16323e40f895efe4298 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 16 May 2021 16:00:02 +0200 Subject: [PATCH 015/110] crispy forms for FileManagementFormView --- InvenTree/common/views.py | 10 ++++++++++ .../templates/order/order_wizard/match_parts.html | 9 +++++---- .../templates/part/import_wizard/match_references.html | 3 ++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index fa605c2b80..0b2eda794e 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -13,6 +13,7 @@ from django.conf import settings from django.core.files.storage import FileSystemStorage from formtools.wizard.views import SessionWizardView +from crispy_forms.helper import FormHelper from InvenTree.views import AjaxUpdateView from InvenTree.helpers import str2bool @@ -269,6 +270,15 @@ class FileManagementFormView(MultiStepFormView): return super().get_form_kwargs() + def get_form(self, step=None, data=None, files=None): + """ add crispy-form helper to form """ + form = super().get_form(step=step, data=data, files=files) + + form.helper = FormHelper() + form.helper.form_show_labels = False + + return form + def get_form_table_data(self, form_data): """ Extract table cell data from form data and fields. These data are used to maintain state between sessions. diff --git a/InvenTree/order/templates/order/order_wizard/match_parts.html b/InvenTree/order/templates/order/order_wizard/match_parts.html index f97edff913..e0f030bad5 100644 --- a/InvenTree/order/templates/order/order_wizard/match_parts.html +++ b/InvenTree/order/templates/order/order_wizard/match_parts.html @@ -2,6 +2,7 @@ {% load inventree_extras %} {% load i18n %} {% load static %} +{% load crispy_forms_tags %} {% block form_alert %} {% if form.errors %} @@ -67,7 +68,7 @@ {% for field in form.visible_fields %} {% if field.name == row.quantity %} - {{ field }} + {{ field|as_crispy_field }} {% endif %} {% endfor %} {% if row.errors.quantity %} @@ -80,19 +81,19 @@ {% if item.column.guess == 'Purchase_Price' %} {% for field in form.visible_fields %} {% if field.name == row.purchase_price %} - {{ field }} + {{ field|as_crispy_field }} {% endif %} {% endfor %} {% elif item.column.guess == 'Reference' %} {% for field in form.visible_fields %} {% if field.name == row.reference %} - {{ field }} + {{ field|as_crispy_field }} {% endif %} {% endfor %} {% elif item.column.guess == 'Notes' %} {% for field in form.visible_fields %} {% if field.name == row.notes %} - {{ field }} + {{ field|as_crispy_field }} {% endif %} {% endfor %} {% else %} diff --git a/InvenTree/part/templates/part/import_wizard/match_references.html b/InvenTree/part/templates/part/import_wizard/match_references.html index efc69b98d5..99b9ccd191 100644 --- a/InvenTree/part/templates/part/import_wizard/match_references.html +++ b/InvenTree/part/templates/part/import_wizard/match_references.html @@ -2,6 +2,7 @@ {% load inventree_extras %} {% load i18n %} {% load static %} +{% load crispy_forms_tags %} {% block form_alert %} {% if form.errors %} @@ -57,7 +58,7 @@ {% with row_name=item.column.guess|lower %} {% for field in form.visible_fields %} {% if field.name == row|keyvalue:row_name %} - {{ field }} + {{ field|as_crispy_field }} {% endif %} {% endfor %} {% endwith %} From 508099e536360184f269bcd45b601f7598f168e9 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 16 May 2021 19:53:01 +0200 Subject: [PATCH 016/110] style fixing --- InvenTree/common/views.py | 2 +- InvenTree/part/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 0b2eda794e..6018f64cef 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -275,7 +275,7 @@ class FileManagementFormView(MultiStepFormView): form = super().get_form(step=step, data=data, files=files) form.helper = FormHelper() - form.helper.form_show_labels = False + form.helper.form_show_labels = False return form diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 75ab43ef81..266b31ada7 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -781,7 +781,7 @@ class PartImport(FileManagementFormView): if idx in self.file_manager.OPTIONAL_MATCH_HEADERS: try: - exact_match = self.allowed_items[idx].get(**{a:data for a in self.matches[idx]}) + exact_match = self.allowed_items[idx].get(**{a: data for a in self.matches[idx]}) except (ValueError, self.allowed_items[idx].model.DoesNotExist, self.allowed_items[idx].model.MultipleObjectsReturned): exact_match = None From eafaf92ae272691839cdd487f40bf9174db43941 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 01:02:31 +0200 Subject: [PATCH 017/110] unified naming schema --- InvenTree/part/templates/part/category_navbar.html | 6 +++--- InvenTree/part/urls.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/InvenTree/part/templates/part/category_navbar.html b/InvenTree/part/templates/part/category_navbar.html index e5fb13bbda..e2cbaf55db 100644 --- a/InvenTree/part/templates/part/category_navbar.html +++ b/InvenTree/part/templates/part/category_navbar.html @@ -30,10 +30,10 @@
    -
  • - +
  • + - {% trans "Upload File" %} + {% trans "Import Parts" %}
  • diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index e2b172780a..131797ea03 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -121,7 +121,7 @@ part_urls = [ url(r'^new/?', views.PartCreate.as_view(), name='part-create'), # Upload a part - url(r'^import/', views.PartImport.as_view(), name='part-upload'), + url(r'^import/', views.PartImport.as_view(), name='part-import'), # Create a new BOM item url(r'^bom/new/?', views.BomItemCreate.as_view(), name='bom-item-create'), From 92f8bd36f1eb962ead461de29ac87e6a8d9cd282 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 01:55:47 +0200 Subject: [PATCH 018/110] inherited setup method --- InvenTree/common/files.py | 52 +++++---------------------------------- InvenTree/common/views.py | 11 ++++++++- InvenTree/order/views.py | 21 ++++++++++++++++ InvenTree/part/views.py | 28 +++++++++++++++++++++ 4 files changed, 65 insertions(+), 47 deletions(-) diff --git a/InvenTree/common/files.py b/InvenTree/common/files.py index 94f96f42e5..52e461c9c7 100644 --- a/InvenTree/common/files.py +++ b/InvenTree/common/files.py @@ -87,56 +87,16 @@ class FileManager: self.HEADERS = self.REQUIRED_HEADERS + self.ITEM_MATCH_HEADERS + self.OPTIONAL_MATCH_HEADERS + self.OPTIONAL_HEADERS def setup(self): - """ Setup headers depending on the file name """ + """ + Setup headers + should be overriden in usage to set the Different Headers + """ if not self.name: return - if self.name == 'order': - self.REQUIRED_HEADERS = [ - 'Quantity', - ] - - self.ITEM_MATCH_HEADERS = [ - 'Manufacturer_MPN', - 'Supplier_SKU', - ] - - self.OPTIONAL_HEADERS = [ - 'Purchase_Price', - 'Reference', - 'Notes', - ] - - # Update headers - self.update_headers() - - # TODO maybe not here but in an own function? - if self.name == 'part': - self.REQUIRED_HEADERS = [ - 'Name', - 'Description', - ] - - self.OPTIONAL_MATCH_HEADERS = [ - 'Category', - 'default_location', - 'default_supplier', - ] - - self.OPTIONAL_HEADERS = [ - 'Keywords', - 'IPN', - 'Revision', - 'Link', - 'default_expiry', - 'minimum_stock', - 'Units', - 'Notes', - ] - - # Update headers - self.update_headers() + # Update headers + self.update_headers() def guess_header(self, header, threshold=80): """ Try to match a header (from the file) to a list of known headers diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 669a5e8212..72a8d7fb1a 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -189,6 +189,15 @@ class FileManagementFormView(MultiStepFormView): media_folder = 'file_upload/' extra_context_data = {} + def __init__(self, *args, **kwargs): + """ initialize the FormView """ + # perform all checks and inits from MultiStepFormView + super().__init__(*args, **kwargs) + + # Check + if not(hasattr(self, 'file_manager_class') and issubclass(self.file_manager_class, FileManager)): + raise NotImplementedError('A subclass of a file manager class needs to be set!') + def get_context_data(self, form, **kwargs): context = super().get_context_data(form=form, **kwargs) @@ -228,7 +237,7 @@ class FileManagementFormView(MultiStepFormView): # Get file file = upload_files.get('upload-file', None) if file: - self.file_manager = FileManager(file=file, name=self.name) + self.file_manager = self.file_manager_class(file=file, name=self.name) def get_form_kwargs(self, step=None): """ Update kwargs to dynamically build forms """ diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index c8ec42d3e7..bbda2f1716 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -31,6 +31,7 @@ from part.models import Part from common.models import InvenTreeSetting from common.views import FileManagementFormView +from common.files import FileManager from . import forms as order_forms from part.views import PartPricing @@ -591,6 +592,26 @@ class PurchaseOrderUpload(FileManagementFormView): 'reference': 'reference', 'notes': 'notes', } + class MyManger(FileManager): + def setup(self): + self.REQUIRED_HEADERS = [ + 'Quantity', + ] + + self.ITEM_MATCH_HEADERS = [ + 'Manufacturer_MPN', + 'Supplier_SKU', + ] + + self.OPTIONAL_HEADERS = [ + 'Purchase_Price', + 'Reference', + 'Notes', + ] + + return super().setup() + + file_manager_class = MyManger def get_order(self): """ Get order or return 404 """ diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 266b31ada7..d3c32bebca 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -40,6 +40,7 @@ from .models import PartSellPriceBreak from common.models import InvenTreeSetting from company.models import SupplierPart +from common.files import FileManager from common.views import FileManagementFormView from stock.models import StockLocation @@ -752,6 +753,33 @@ class PartImport(FileManagementFormView): 'default_location': 'default_location', 'default_supplier': 'default_supplier', } + class MyManger(FileManager): + def setup(self): + self.REQUIRED_HEADERS = [ + 'Name', + 'Description', + ] + + self.OPTIONAL_MATCH_HEADERS = [ + 'Category', + 'default_location', + 'default_supplier', + ] + + self.OPTIONAL_HEADERS = [ + 'Keywords', + 'IPN', + 'Revision', + 'Link', + 'default_expiry', + 'minimum_stock', + 'Units', + 'Notes', + ] + + return super().setup() + + file_manager_class = MyManger def get_field_selection(self): """ Fill the form fields for step 3 """ From cb0ef30effafd7bf9319ae3bae3f1af2e2163b2e Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 10:17:19 +0200 Subject: [PATCH 019/110] form overrides --- InvenTree/common/views.py | 21 +++++++++++++++++++-- InvenTree/order/views.py | 11 ++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 72a8d7fb1a..b645d16651 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -191,10 +191,27 @@ class FileManagementFormView(MultiStepFormView): def __init__(self, *args, **kwargs): """ initialize the FormView """ - # perform all checks and inits from MultiStepFormView + # check if form_list should be overriden + if hasattr(self, 'form_list_override'): + # check for list + if not isinstance(self.form_list_override, list): + raise ValueError('form_list_override must be a list') + + # loop through and override /add form_list enrties + for entry in self.form_list_override: + # fetch postition + pos = [self.form_list.index(i) for i in self.form_list if i[0] == 'items'] + # replace if exists + if pos: + self.form_list[pos[0]] = entry + # or append + else: + self.form_list.append(entry) + + # perform all checks and inits for MultiStepFormView super().__init__(*args, **kwargs) - # Check + # Check for file manager class if not(hasattr(self, 'file_manager_class') and issubclass(self.file_manager_class, FileManager)): raise NotImplementedError('A subclass of a file manager class needs to be set!') diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index bbda2f1716..2cb7263269 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -32,6 +32,7 @@ from part.models import Part from common.models import InvenTreeSetting from common.views import FileManagementFormView from common.files import FileManager +from common import forms as cm_forms from . import forms as order_forms from part.views import PartPricing @@ -573,7 +574,16 @@ class SalesOrderShip(AjaxUpdateView): class PurchaseOrderUpload(FileManagementFormView): ''' PurchaseOrder: Upload file, match to fields and parts (using multi-Step form) ''' + class MyMatch(cm_forms.MatchItem): + """ override MatchItem fields """ + def get_special_field(self, col_guess, row, file_manager): + """ set special field """ + # run default + super().get_special_field(col_guess, row, file_manager) name = 'order' + form_list_override = [ + ('items', MyMatch), + ] form_steps_template = [ 'order/order_wizard/po_upload.html', 'order/order_wizard/match_fields.html', @@ -584,7 +594,6 @@ class PurchaseOrderUpload(FileManagementFormView): _("Match Fields"), _("Match Supplier Parts"), ] - # Form field name: PurchaseOrderLineItem field form_field_map = { 'item_select': 'part', 'quantity': 'quantity', From ad4902ea44e63436c9d9080ae42354646503917c Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 10:19:35 +0200 Subject: [PATCH 020/110] restucture --- InvenTree/common/forms.py | 90 +++++++++++++++------------------------ InvenTree/order/views.py | 31 +++++++++++++- 2 files changed, 65 insertions(+), 56 deletions(-) diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 0c91dcfeea..3ce83ac72f 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -10,8 +10,6 @@ from decimal import Decimal, InvalidOperation from django import forms from django.utils.translation import gettext as _ -from djmoney.forms.fields import MoneyField - from InvenTree.forms import HelperForm from .files import FileManager @@ -119,21 +117,6 @@ class MatchItem(forms.Form): super().__init__(*args, **kwargs) - def clean(number): - """ Clean-up decimal value """ - - # Check if empty - if not number: - return number - - # Check if decimal type - try: - clean_number = Decimal(number) - except InvalidOperation: - clean_number = number - - return clean_number.quantize(Decimal(1)) if clean_number == clean_number.to_integral() else clean_number.normalize() - # Setup FileManager file_manager.setup() @@ -148,32 +131,20 @@ class MatchItem(forms.Form): # Set field name field_name = col_guess.lower() + '-' + str(row['index']) + # check if field def was overriden + overriden_field = self.get_special_field(col_guess, row, file_manager) + if overriden_field: + self.fields[field_name] = overriden_field + # Create input for required headers - if col_guess in file_manager.REQUIRED_HEADERS: + elif col_guess in file_manager.REQUIRED_HEADERS: + # Get value + value = row.get(col_guess.lower(), '') # Set field input box - - # TODO maybe not here but in an own function? - if 'quantity' in col_guess.lower(): - self.fields[field_name] = forms.CharField( - required=False, - widget=forms.NumberInput(attrs={ - 'name': 'quantity' + str(row['index']), - 'class': 'numberinput', # form-control', - 'type': 'number', - 'min': '0', - 'step': 'any', - 'value': clean(row.get('quantity', '')), - }) - ) - - else: - # Get value - value = row.get(col_guess.lower(), '') - # Set field input box - self.fields[field_name] = forms.CharField( - required=True, - initial=value, - ) + self.fields[field_name] = forms.CharField( + required=True, + initial=value, + ) # Create item selection box elif col_guess in file_manager.ITEM_MATCH_HEADERS: @@ -204,20 +175,10 @@ class MatchItem(forms.Form): # Get value value = row.get(col_guess.lower(), '') # Set field input box - if 'price' in col_guess.lower(): - self.fields[field_name] = MoneyField( - label=_(col_guess), - default_currency=InvenTreeSetting.get_setting('INVENTREE_DEFAULT_CURRENCY'), - decimal_places=5, - max_digits=19, - required=False, - default_amount=clean(value), - ) - else: - self.fields[field_name] = forms.CharField( - required=False, - initial=value, - ) + self.fields[field_name] = forms.CharField( + required=False, + initial=value, + ) # Optional item selection box elif col_guess in file_manager.OPTIONAL_MATCH_HEADERS: @@ -237,3 +198,22 @@ class MatchItem(forms.Form): if item_match: # Update initial value self.fields[field_name].initial = item_match.id + + def clean_nbr(self, number): + """ Clean-up decimal value """ + + # Check if empty + if not number: + return number + + # Check if decimal type + try: + clean_number = Decimal(number) + except InvalidOperation: + clean_number = number + + return clean_number.quantize(Decimal(1)) if clean_number == clean_number.to_integral() else clean_number.normalize() + + def get_special_field(self, col_guess, row, file_manager): + """ function to be overriden in inherited forms to add specific form settings """ + pass diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 2cb7263269..d89401e3cb 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -15,7 +15,7 @@ from django.http import HttpResponseRedirect from django.utils.translation import ugettext_lazy as _ from django.views.generic import DetailView, ListView, UpdateView from django.views.generic.edit import FormMixin -from django.forms import HiddenInput, IntegerField +from django.forms import HiddenInput, IntegerField, CharField, NumberInput import logging from decimal import Decimal, InvalidOperation @@ -44,6 +44,8 @@ from InvenTree.views import InvenTreeRoleMixin from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus, StockStatus +from djmoney.forms.fields import MoneyField + logger = logging.getLogger("inventree") @@ -580,6 +582,33 @@ class PurchaseOrderUpload(FileManagementFormView): """ set special field """ # run default super().get_special_field(col_guess, row, file_manager) + + # set quantity field + if 'quantity' in col_guess.lower(): + return CharField( + required=False, + widget=NumberInput(attrs={ + 'name': 'quantity' + str(row['index']), + 'class': 'numberinput', + 'type': 'number', + 'min': '0', + 'step': 'any', + 'value': self.clean_nbr(row.get('quantity', '')), + }) + ) + # set price field + elif 'price' in col_guess.lower(): + return MoneyField( + label=_(col_guess), + default_currency=InvenTreeSetting.get_setting('INVENTREE_DEFAULT_CURRENCY'), + decimal_places=5, + max_digits=19, + required=False, + default_amount=self.clean_nbr(row.get('price', '')), + ) + + + name = 'order' form_list_override = [ ('items', MyMatch), From 64f8846e9901bfc0f849049c7c06e16c5a64772c Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 10:47:56 +0200 Subject: [PATCH 021/110] generalising for done() --- InvenTree/common/views.py | 27 +++++++++++++++++++++++++++ InvenTree/order/views.py | 21 +-------------------- InvenTree/part/views.py | 23 +---------------------- 3 files changed, 29 insertions(+), 42 deletions(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index b645d16651..53909cc0d7 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -450,6 +450,33 @@ class FileManagementFormView(MultiStepFormView): """ pass + def get_clean_items(self): + """ returns dict with all cleaned values """ + items = {} + + for form_key, form_value in self.get_all_cleaned_data().items(): + # Split key from row value + try: + (field, idx) = form_key.split('-') + except ValueError: + continue + + try: + if idx not in items: + # Insert into items + items.update({ + idx: { + self.form_field_map[field]: form_value, + } + }) + else: + # Update items + items[idx][self.form_field_map[field]] = form_value + except KeyError: + pass + + return items + def check_field_selection(self, form): """ Check field matching """ diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index d89401e3cb..3db0d4412f 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -767,26 +767,7 @@ class PurchaseOrderUpload(FileManagementFormView): """ Once all the data is in, process it to add PurchaseOrderLineItem instances to the order """ order = self.get_order() - - items = {} - - for form_key, form_value in self.get_all_cleaned_data().items(): - # Split key from row value - try: - (field, idx) = form_key.split('-') - except ValueError: - continue - - if idx not in items: - # Insert into items - items.update({ - idx: { - self.form_field_map[field]: form_value, - } - }) - else: - # Update items - items[idx][self.form_field_map[field]] = form_value + items = self.get_clean_items() # Create PurchaseOrderLineItem instances for purchase_order_item in items.values(): diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index d3c32bebca..1e5e2153e8 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -822,28 +822,7 @@ class PartImport(FileManagementFormView): def done(self, form_list, **kwargs): """ Create items """ - items = {} - - for form_key, form_value in self.get_all_cleaned_data().items(): - # Split key from row value - try: - (field, idx) = form_key.split('-') - except ValueError: - continue - - try: - if idx not in items: - # Insert into items - items.update({ - idx: { - self.form_field_map[field]: form_value, - } - }) - else: - # Update items - items[idx][self.form_field_map[field]] = form_value - except KeyError: - pass + items = self.get_clean_items() import_done = 0 import_error = [] From db9fd282768f1bacc89a68710b8cae380583b0db Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 10:48:29 +0200 Subject: [PATCH 022/110] preparing stuff for gen get_field_selection() --- InvenTree/part/views.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 1e5e2153e8..45a5ad1c2b 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -783,15 +783,6 @@ class PartImport(FileManagementFormView): def get_field_selection(self): """ Fill the form fields for step 3 """ - - self.file_manager.setup() - # collect reference indexes - idx_s = {} - for col in self.file_manager.HEADERS: - index = self.get_column_index(col) - if index >= 0: - idx_s[col] = index - # fetch available elements self.allowed_items = {} self.matches = {} @@ -803,6 +794,15 @@ class PartImport(FileManagementFormView): self.allowed_items['default_supplier'] = SupplierPart.objects.all() self.matches['default_supplier'] = ['SKU__contains'] + # setup + self.file_manager.setup() + # collect reference indexes + idx_s = {} + for col in self.file_manager.HEADERS: + index = self.get_column_index(col) + if index >= 0: + idx_s[col] = index + for row in self.rows: for idx in idx_s: data = row['data'][idx_s[idx]]['cell'] From e49256a2182fe1d1b8e57958c398ce7549688641 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 10:52:27 +0200 Subject: [PATCH 023/110] fixed bug pointed out by @eeintech --- InvenTree/part/templates/part/import_wizard/match_fields.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/part/templates/part/import_wizard/match_fields.html b/InvenTree/part/templates/part/import_wizard/match_fields.html index 54008d6bae..ba709bc639 100644 --- a/InvenTree/part/templates/part/import_wizard/match_fields.html +++ b/InvenTree/part/templates/part/import_wizard/match_fields.html @@ -55,7 +55,7 @@ {{ col }} {% for duplicate in duplicates %} - {% if duplicate == col.name %} + {% if duplicate == col.value %} From 616dd76f8ab2ef9993b73ca39d833cd403b0a38d Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 11:10:01 +0200 Subject: [PATCH 024/110] refactor and doc --- InvenTree/order/views.py | 39 +++++++++++++++++++-------------------- InvenTree/part/views.py | 12 +++++++----- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 3db0d4412f..9aa9b8d473 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -576,6 +576,7 @@ class SalesOrderShip(AjaxUpdateView): class PurchaseOrderUpload(FileManagementFormView): ''' PurchaseOrder: Upload file, match to fields and parts (using multi-Step form) ''' + # overriden classes class MyMatch(cm_forms.MatchItem): """ override MatchItem fields """ def get_special_field(self, col_guess, row, file_manager): @@ -607,7 +608,24 @@ class PurchaseOrderUpload(FileManagementFormView): default_amount=self.clean_nbr(row.get('price', '')), ) + class MyFileManager(FileManager): + def setup(self): + self.REQUIRED_HEADERS = [ + 'Quantity', + ] + self.ITEM_MATCH_HEADERS = [ + 'Manufacturer_MPN', + 'Supplier_SKU', + ] + + self.OPTIONAL_HEADERS = [ + 'Purchase_Price', + 'Reference', + 'Notes', + ] + + return super().setup() name = 'order' form_list_override = [ @@ -630,26 +648,7 @@ class PurchaseOrderUpload(FileManagementFormView): 'reference': 'reference', 'notes': 'notes', } - class MyManger(FileManager): - def setup(self): - self.REQUIRED_HEADERS = [ - 'Quantity', - ] - - self.ITEM_MATCH_HEADERS = [ - 'Manufacturer_MPN', - 'Supplier_SKU', - ] - - self.OPTIONAL_HEADERS = [ - 'Purchase_Price', - 'Reference', - 'Notes', - ] - - return super().setup() - - file_manager_class = MyManger + file_manager_class = MyFileManager def get_order(self): """ Get order or return 404 """ diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 45a5ad1c2b..65a5cc652d 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -796,16 +796,18 @@ class PartImport(FileManagementFormView): # setup self.file_manager.setup() - # collect reference indexes - idx_s = {} + # collect submitted column indexes + col_ids = {} for col in self.file_manager.HEADERS: index = self.get_column_index(col) if index >= 0: - idx_s[col] = index + col_ids[col] = index + # parse all rows for row in self.rows: - for idx in idx_s: - data = row['data'][idx_s[idx]]['cell'] + # check each submitted column + for idx in col_ids: + data = row['data'][col_ids[idx]]['cell'] if idx in self.file_manager.OPTIONAL_MATCH_HEADERS: try: From dd56bc1fa531eca2a6e703443d9d3540e2eca4aa Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 11:18:13 +0200 Subject: [PATCH 025/110] setup not realy needed --- InvenTree/order/views.py | 27 ++++++++++++-------------- InvenTree/part/views.py | 42 ++++++++++++++++++---------------------- 2 files changed, 31 insertions(+), 38 deletions(-) diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 9aa9b8d473..5d0acb9a7c 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -609,23 +609,20 @@ class PurchaseOrderUpload(FileManagementFormView): ) class MyFileManager(FileManager): - def setup(self): - self.REQUIRED_HEADERS = [ - 'Quantity', - ] + REQUIRED_HEADERS = [ + 'Quantity', + ] - self.ITEM_MATCH_HEADERS = [ - 'Manufacturer_MPN', - 'Supplier_SKU', - ] + ITEM_MATCH_HEADERS = [ + 'Manufacturer_MPN', + 'Supplier_SKU', + ] - self.OPTIONAL_HEADERS = [ - 'Purchase_Price', - 'Reference', - 'Notes', - ] - - return super().setup() + OPTIONAL_HEADERS = [ + 'Purchase_Price', + 'Reference', + 'Notes', + ] name = 'order' form_list_override = [ diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 65a5cc652d..1a792dd0ce 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -754,31 +754,27 @@ class PartImport(FileManagementFormView): 'default_supplier': 'default_supplier', } class MyManger(FileManager): - def setup(self): - self.REQUIRED_HEADERS = [ - 'Name', - 'Description', - ] + REQUIRED_HEADERS = [ + 'Name', + 'Description', + ] - self.OPTIONAL_MATCH_HEADERS = [ - 'Category', - 'default_location', - 'default_supplier', - ] - - self.OPTIONAL_HEADERS = [ - 'Keywords', - 'IPN', - 'Revision', - 'Link', - 'default_expiry', - 'minimum_stock', - 'Units', - 'Notes', - ] - - return super().setup() + OPTIONAL_MATCH_HEADERS = [ + 'Category', + 'default_location', + 'default_supplier', + ] + OPTIONAL_HEADERS = [ + 'Keywords', + 'IPN', + 'Revision', + 'Link', + 'default_expiry', + 'minimum_stock', + 'Units', + 'Notes', + ] file_manager_class = MyManger def get_field_selection(self): From 9a42421852b0fe69264b25cac4a2a598283ceaa4 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 11:20:25 +0200 Subject: [PATCH 026/110] restructure overrides --- InvenTree/part/views.py | 47 +++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 1a792dd0ce..b9c4d2ec03 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -726,6 +726,29 @@ class PartCreate(AjaxCreateView): class PartImport(FileManagementFormView): ''' Part: Upload file, match to fields and import parts(using multi-Step form) ''' + class MyFileManager(FileManager): + REQUIRED_HEADERS = [ + 'Name', + 'Description', + ] + + OPTIONAL_MATCH_HEADERS = [ + 'Category', + 'default_location', + 'default_supplier', + ] + + OPTIONAL_HEADERS = [ + 'Keywords', + 'IPN', + 'Revision', + 'Link', + 'default_expiry', + 'minimum_stock', + 'Units', + 'Notes', + ] + name = 'part' form_steps_template = [ 'part/import_wizard/part_upload.html', @@ -753,29 +776,7 @@ class PartImport(FileManagementFormView): 'default_location': 'default_location', 'default_supplier': 'default_supplier', } - class MyManger(FileManager): - REQUIRED_HEADERS = [ - 'Name', - 'Description', - ] - - OPTIONAL_MATCH_HEADERS = [ - 'Category', - 'default_location', - 'default_supplier', - ] - - OPTIONAL_HEADERS = [ - 'Keywords', - 'IPN', - 'Revision', - 'Link', - 'default_expiry', - 'minimum_stock', - 'Units', - 'Notes', - ] - file_manager_class = MyManger + file_manager_class = MyFileManager def get_field_selection(self): """ Fill the form fields for step 3 """ From 900f707ff9cebc1e7da9fe3e6fa43f310b307552 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 18 May 2021 11:51:08 +0200 Subject: [PATCH 027/110] permission added --- InvenTree/part/templates/part/category_navbar.html | 2 ++ InvenTree/part/views.py | 1 + 2 files changed, 3 insertions(+) diff --git a/InvenTree/part/templates/part/category_navbar.html b/InvenTree/part/templates/part/category_navbar.html index e2cbaf55db..553b03745b 100644 --- a/InvenTree/part/templates/part/category_navbar.html +++ b/InvenTree/part/templates/part/category_navbar.html @@ -30,12 +30,14 @@ + {% if user.is_staff and roles.part.add %}
  • {% trans "Import Parts" %}
  • + {% endif %} {% if category %}
  • diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index b9c4d2ec03..20185b7a1c 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -725,6 +725,7 @@ class PartCreate(AjaxCreateView): class PartImport(FileManagementFormView): ''' Part: Upload file, match to fields and import parts(using multi-Step form) ''' + permission_required = 'part.add' class MyFileManager(FileManager): REQUIRED_HEADERS = [ From 3c5bb048a1b8e3bd964dc85973f20c5cb7f71312 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 22 May 2021 15:39:54 +0200 Subject: [PATCH 028/110] renaming a few parts --- InvenTree/order/views.py | 8 ++++---- InvenTree/part/views.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 5d0acb9a7c..312c49b6db 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -577,7 +577,7 @@ class PurchaseOrderUpload(FileManagementFormView): ''' PurchaseOrder: Upload file, match to fields and parts (using multi-Step form) ''' # overriden classes - class MyMatch(cm_forms.MatchItem): + class OrderMatchItem(cm_forms.MatchItem): """ override MatchItem fields """ def get_special_field(self, col_guess, row, file_manager): """ set special field """ @@ -608,7 +608,7 @@ class PurchaseOrderUpload(FileManagementFormView): default_amount=self.clean_nbr(row.get('price', '')), ) - class MyFileManager(FileManager): + class OrderFileManager(FileManager): REQUIRED_HEADERS = [ 'Quantity', ] @@ -626,7 +626,7 @@ class PurchaseOrderUpload(FileManagementFormView): name = 'order' form_list_override = [ - ('items', MyMatch), + ('items', OrderMatchItem), ] form_steps_template = [ 'order/order_wizard/po_upload.html', @@ -645,7 +645,7 @@ class PurchaseOrderUpload(FileManagementFormView): 'reference': 'reference', 'notes': 'notes', } - file_manager_class = MyFileManager + file_manager_class = OrderFileManager def get_order(self): """ Get order or return 404 """ diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 20185b7a1c..91ff3bacf6 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -727,7 +727,7 @@ class PartImport(FileManagementFormView): ''' Part: Upload file, match to fields and import parts(using multi-Step form) ''' permission_required = 'part.add' - class MyFileManager(FileManager): + class PartFileManager(FileManager): REQUIRED_HEADERS = [ 'Name', 'Description', @@ -777,7 +777,7 @@ class PartImport(FileManagementFormView): 'default_location': 'default_location', 'default_supplier': 'default_supplier', } - file_manager_class = MyFileManager + file_manager_class = PartFileManager def get_field_selection(self): """ Fill the form fields for step 3 """ From 4319ba16af0fc9dfe96fa6322bc596fd21f5eea7 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 26 May 2021 09:20:50 +0200 Subject: [PATCH 029/110] Settings to show import-button --- InvenTree/common/models.py | 7 +++++++ .../part/templates/part/category_navbar.html | 5 ++++- .../templates/InvenTree/settings/part.html | 20 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 99712b2a93..30de70f6d9 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -211,6 +211,13 @@ class InvenTreeSetting(models.Model): 'validator': bool, }, + 'PART_SHOW_IMPORT': { + 'name': _('Show Import in Views'), + 'description': _('Display the import wizard in some part views'), + 'default': False, + 'validator': bool, + }, + 'REPORT_DEBUG_MODE': { 'name': _('Debug Mode'), 'description': _('Generate reports in debug mode (HTML output)'), diff --git a/InvenTree/part/templates/part/category_navbar.html b/InvenTree/part/templates/part/category_navbar.html index 553b03745b..f6d083b864 100644 --- a/InvenTree/part/templates/part/category_navbar.html +++ b/InvenTree/part/templates/part/category_navbar.html @@ -1,4 +1,7 @@ {% load i18n %} +{% load inventree_extras %} + +{% settings_value 'PART_SHOW_IMPORT' as show_import %}
      @@ -30,7 +33,7 @@ - {% if user.is_staff and roles.part.add %} + {% if show_import and user.is_staff and roles.part.add %}
    • diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index e359acdfc2..c054ef7111 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -37,6 +37,22 @@ +

      {% trans "Part Import" %}

      + + + + + + {% include "InvenTree/settings/header.html" %} + + {% include "InvenTree/settings/setting.html" with key="PART_SHOW_IMPORT" icon="fa-file-upload" %} + +
      + + +

      {% trans "Part Parameter Templates" %}

      @@ -121,4 +137,8 @@ }); }); + $("#import-part").click(function() { + launchModalForm("{% url 'part-import' %}", {}); + }); + {% endblock %} \ No newline at end of file From 002706849c9b203c3d1388e057b4c2c860bbc49b Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 26 May 2021 12:20:37 +0200 Subject: [PATCH 030/110] enrich context with form if not set --- InvenTree/common/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 53909cc0d7..a48e3c1944 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -215,7 +215,10 @@ class FileManagementFormView(MultiStepFormView): if not(hasattr(self, 'file_manager_class') and issubclass(self.file_manager_class, FileManager)): raise NotImplementedError('A subclass of a file manager class needs to be set!') - def get_context_data(self, form, **kwargs): + def get_context_data(self, form=None, **kwargs): + if form is None: + form = self.get_form() + context = super().get_context_data(form=form, **kwargs) if self.steps.current in ('fields', 'items'): From 421b0a896dd637ac13e75933650b4f0afdd32dac Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 26 May 2021 13:04:21 +0200 Subject: [PATCH 031/110] AjaxView for reuse of FormViews --- InvenTree/common/views.py | 47 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index a48e3c1944..a2335447cf 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -15,7 +15,7 @@ from django.core.files.storage import FileSystemStorage from formtools.wizard.views import SessionWizardView from crispy_forms.helper import FormHelper -from InvenTree.views import AjaxUpdateView +from InvenTree.views import AjaxUpdateView, AjaxView from InvenTree.helpers import str2bool from . import models @@ -563,3 +563,48 @@ class FileManagementFormView(MultiStepFormView): return self.render(form) return super().post(*args, **kwargs) + + +class FileManagementAjaxView(AjaxView): + """ Use a FileManagementFormView as base for a AjaxView + Inherit this class before inheriting the base FileManagementFormView + + ajax_form_steps_template: templates for rendering ajax + validate: function to validate the current form -> normally point to the same function in the base FileManagementFormView + """ + + def post(self, request): + form = self.get_form(data=self.request.POST, files=self.request.FILES) + form_valid = self.validate(self.steps.current, form) + + # check if valid + if not form_valid: + return self.renderJsonResponse(request) + + # store the cleaned data and files. + self.storage.set_step_data(self.steps.current, self.process_step(form)) + self.storage.set_step_files(self.steps.current, self.process_step_files(form)) + + # check if the current step is the last step + if self.steps.current == self.steps.last: + # call done - to process data, returned response is not used + self.render_done(form) + data = {'form_valid': True, 'success': _('Parts imported')} + return self.renderJsonResponse(request, data=data) + else: + self.storage.current_step = self.steps.next + + self.setTemplate() + return self.renderJsonResponse(request, data={'form_valid': None}) + + def get(self, request): + self.setTemplate() + return self.renderJsonResponse(request) + + def setTemplate(self): + """ set template name and title """ + self.ajax_template_name = self.ajax_form_steps_template[self.get_step_index()] + self.ajax_form_title = self.form_steps_description[self.get_step_index()] + + def validate(self, obj, form, **kwargs): + raise NotImplementedError('This function needs to be overridden!') \ No newline at end of file From 79374c5dfd137d733b6dd301d7f68ae1a2eef2ec Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 26 May 2021 13:05:20 +0200 Subject: [PATCH 032/110] ajax implementation for part import --- .../part/import_wizard/ajax_match_fields.html | 89 +++++++++++++++++++ .../import_wizard/ajax_match_references.html | 84 +++++++++++++++++ .../part/import_wizard/ajax_part_upload.html | 33 +++++++ InvenTree/part/urls.py | 1 + InvenTree/part/views.py | 13 ++- .../templates/InvenTree/settings/part.html | 2 +- 6 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 InvenTree/part/templates/part/import_wizard/ajax_match_fields.html create mode 100644 InvenTree/part/templates/part/import_wizard/ajax_match_references.html create mode 100644 InvenTree/part/templates/part/import_wizard/ajax_part_upload.html diff --git a/InvenTree/part/templates/part/import_wizard/ajax_match_fields.html b/InvenTree/part/templates/part/import_wizard/ajax_match_fields.html new file mode 100644 index 0000000000..293ddbc4d8 --- /dev/null +++ b/InvenTree/part/templates/part/import_wizard/ajax_match_fields.html @@ -0,0 +1,89 @@ +{% extends "part/import_wizard/ajax_part_upload.html" %} +{% load inventree_extras %} +{% load i18n %} +{% load static %} + +{% block form_alert %} +{% if missing_columns and missing_columns|length > 0 %} + +{% endif %} +{% if duplicates and duplicates|length > 0 %} + +{% endif %} +{% endblock form_alert %} + +{% block form_content %} + + + {% trans "File Fields" %} + + {% for col in form %} + +
      + + {{ col.name }} + +
      + + {% endfor %} + + + + + {% trans "Match Fields" %} + + {% for col in form %} + + {{ col }} + {% for duplicate in duplicates %} + {% if duplicate == col.value %} + + {% endif %} + {% endfor %} + + {% endfor %} + + {% for row in rows %} + {% with forloop.counter as row_index %} + + + + + {{ row_index }} + {% for item in row.data %} + + + {{ item }} + + {% endfor %} + + {% endwith %} + {% endfor %} + +{% endblock form_content %} + +{% block js_ready %} +{{ block.super }} + +$('.fieldselect').select2({ + width: '100%', + matcher: partialMatcher, +}); + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/import_wizard/ajax_match_references.html b/InvenTree/part/templates/part/import_wizard/ajax_match_references.html new file mode 100644 index 0000000000..e57fb066d3 --- /dev/null +++ b/InvenTree/part/templates/part/import_wizard/ajax_match_references.html @@ -0,0 +1,84 @@ +{% extends "part/import_wizard/ajax_part_upload.html" %} +{% load inventree_extras %} +{% load i18n %} +{% load static %} +{% load crispy_forms_tags %} + +{% block form_alert %} +{% if form.errors %} +{% endif %} +{% if form_errors %} + +{% endif %} +{% endblock form_alert %} + +{% block form_content %} + + + + {% trans "Row" %} + {% for col in columns %} + + + + + {% if col.guess %} + {{ col.guess }} + {% else %} + {{ col.name }} + {% endif %} + + {% endfor %} + + + + {% comment %} Dummy row for javascript del_row method {% endcomment %} + {% for row in rows %} + + + + + + {% add row.index 1 %} + + {% for item in row.data %} + + {% if item.column.guess %} + {% with row_name=item.column.guess|lower %} + {% for field in form.visible_fields %} + {% if field.name == row|keyvalue:row_name %} + {{ field|as_crispy_field }} + {% endif %} + {% endfor %} + {% endwith %} + {% else %} + {{ item.cell }} + {% endif %} + + + {% endfor %} + + {% endfor %} + +{% endblock form_content %} + +{% block form_buttons_bottom %} +{% endblock form_buttons_bottom %} + +{% block js_ready %} +{{ block.super }} + +$('.bomselect').select2({ + dropdownAutoWidth: true, + matcher: partialMatcher, +}); + +$('.currencyselect').select2({ + dropdownAutoWidth: true, +}); + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/import_wizard/ajax_part_upload.html b/InvenTree/part/templates/part/import_wizard/ajax_part_upload.html new file mode 100644 index 0000000000..f2a1e5c844 --- /dev/null +++ b/InvenTree/part/templates/part/import_wizard/ajax_part_upload.html @@ -0,0 +1,33 @@ +{% extends "modal_form.html" %} + +{% load inventree_extras %} +{% load i18n %} + +{% block form %} + +{% if roles.part.change %} + +

      {% blocktrans with step=wizard.steps.step1 count=wizard.steps.count %}Step {{step}} of {{count}}{% endblocktrans %} + {% if description %}- {{ description }}{% endif %}

      + + {% block form_alert %} + {% endblock form_alert %} + +
      + {% csrf_token %} + {% load crispy_forms_tags %} + + + {{ wizard.management_form }} + {% block form_content %} + {% crispy wizard.form %} + {% endblock form_content %} +
      + +{% else %} + +{% endif %} +
      +{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index 131797ea03..5dbd0326d8 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -122,6 +122,7 @@ part_urls = [ # Upload a part url(r'^import/', views.PartImport.as_view(), name='part-import'), + url(r'^import-api/', views.PartImportAjax.as_view(), name='api-part-import'), # Create a new BOM item url(r'^bom/new/?', views.BomItemCreate.as_view(), name='bom-item-create'), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 91ff3bacf6..0e3833cefc 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -41,7 +41,7 @@ from .models import PartSellPriceBreak from common.models import InvenTreeSetting from company.models import SupplierPart from common.files import FileManager -from common.views import FileManagementFormView +from common.views import FileManagementFormView, FileManagementAjaxView from stock.models import StockLocation @@ -874,6 +874,17 @@ class PartImport(FileManagementFormView): return HttpResponseRedirect(reverse('part-index')) +class PartImportAjax(FileManagementAjaxView, PartImport): + ajax_form_steps_template = [ + 'part/import_wizard/ajax_part_upload.html', + 'part/import_wizard/ajax_match_fields.html', + 'part/import_wizard/ajax_match_references.html', + ] + + def validate(self, obj, form, **kwargs): + return PartImport.validate(self, self.steps.current, form, **kwargs) + + class PartNotes(UpdateView): """ View for editing the 'notes' field of a Part object. Presents a live markdown editor. diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index c054ef7111..7c7245f96e 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -138,7 +138,7 @@ }); $("#import-part").click(function() { - launchModalForm("{% url 'part-import' %}", {}); + launchModalForm("{% url 'api-part-import' %}", {}); }); {% endblock %} \ No newline at end of file From 9d5b90190b3f19d84e966c2ddc0891e4c10f75fe Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 26 May 2021 13:18:07 +0200 Subject: [PATCH 033/110] style + merge fix --- InvenTree/common/forms.py | 3 ++- InvenTree/common/views.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 7160c1b219..3ce83ac72f 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -5,11 +5,12 @@ Django forms for interacting with common objects # -*- coding: utf-8 -*- from __future__ import unicode_literals +from decimal import Decimal, InvalidOperation + from django import forms from django.utils.translation import gettext as _ from InvenTree.forms import HelperForm -from InvenTree.helpers import clean_decimal from .files import FileManager from .models import InvenTreeSetting diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index a2335447cf..bd1fb6421b 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -607,4 +607,4 @@ class FileManagementAjaxView(AjaxView): self.ajax_form_title = self.form_steps_description[self.get_step_index()] def validate(self, obj, form, **kwargs): - raise NotImplementedError('This function needs to be overridden!') \ No newline at end of file + raise NotImplementedError('This function needs to be overridden!') From ee582a5490793879c6f2211f1d5fc0ffa94d7ef6 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 2 Jun 2021 00:21:01 +0200 Subject: [PATCH 034/110] fixes the problem reported by @eeintech ? --- InvenTree/common/views.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index bd1fb6421b..0ee8d99cf5 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -414,7 +414,11 @@ class FileManagementFormView(MultiStepFormView): 'data': data, 'errors': {}, } - self.rows.append(row) + + # make sure that the row was submitted - solves https://github.com/inventree/InvenTree/pull/1588#issuecomment-847889353 + row_exist_check = [a for a in self.request.POST.keys() if a.startswith(f'row_{int(row_idx) +1}_')] + if True in row_exist_check: + self.rows.append(row) # In the item selection step: update row data with mapping to form fields if form and self.steps.current == 'items': From 3c384947b2bbb38b5cbdef7ff26babdec911eee5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 2 Jun 2021 00:26:30 +0200 Subject: [PATCH 035/110] spaces cleanup --- InvenTree/common/files.py | 12 ++++++------ InvenTree/common/forms.py | 8 ++++---- InvenTree/common/views.py | 24 ++++++++++++------------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/InvenTree/common/files.py b/InvenTree/common/files.py index 52e461c9c7..f805ceaace 100644 --- a/InvenTree/common/files.py +++ b/InvenTree/common/files.py @@ -22,7 +22,7 @@ class FileManager: # Fields which are used for item matching (only one of them is needed) ITEM_MATCH_HEADERS = [] - + # Fields which would be helpful but are not required OPTIONAL_HEADERS = [] @@ -34,7 +34,7 @@ class FileManager: def __init__(self, file, name=None): """ Initialize the FileManager class with a user-uploaded file object """ - + # Set name if name: self.name = name @@ -73,14 +73,14 @@ class FileManager: raise ValidationError(_('Error reading file (incorrect dimension)')) except KeyError: raise ValidationError(_('Error reading file (data could be corrupted)')) - + return cleaned_data def process(self, file): """ Process file """ self.data = self.__class__.validate(file) - + def update_headers(self): """ Update headers """ @@ -100,7 +100,7 @@ class FileManager: def guess_header(self, header, threshold=80): """ Try to match a header (from the file) to a list of known headers - + Args: header - Header name to look for threshold - Match threshold for fuzzy search @@ -134,7 +134,7 @@ class FileManager: return matches[0]['header'] return None - + def columns(self): """ Return a list of headers for the thingy """ headers = [] diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 3ce83ac72f..59841fbc9a 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -69,7 +69,7 @@ class UploadFile(forms.Form): class MatchField(forms.Form): """ Step 2 of FileManagementFormView """ - + def __init__(self, *args, **kwargs): # Get FileManager @@ -85,7 +85,7 @@ class MatchField(forms.Form): columns = file_manager.columns() # Get headers choices headers_choices = [(header, header) for header in file_manager.HEADERS] - + # Create column fields for col in columns: field_name = col['name'] @@ -102,7 +102,7 @@ class MatchField(forms.Form): class MatchItem(forms.Form): """ Step 3 of FileManagementFormView """ - + def __init__(self, *args, **kwargs): # Get FileManager @@ -145,7 +145,7 @@ class MatchItem(forms.Form): required=True, initial=value, ) - + # Create item selection box elif col_guess in file_manager.ITEM_MATCH_HEADERS: # Get item options diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 0ee8d99cf5..6d6bba5844 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -130,7 +130,7 @@ class MultiStepFormView(SessionWizardView): super().__init__(*args, **kwargs) self.process_media_folder() - + def process_media_folder(self): """ Process media folder """ @@ -142,7 +142,7 @@ class MultiStepFormView(SessionWizardView): def get_template_names(self): """ Select template """ - + try: # Get template template = self.form_steps_template[self.steps.index] @@ -153,7 +153,7 @@ class MultiStepFormView(SessionWizardView): def get_context_data(self, **kwargs): """ Update context data """ - + # Retrieve current context context = super().get_context_data(**kwargs) @@ -222,7 +222,7 @@ class FileManagementFormView(MultiStepFormView): context = super().get_context_data(form=form, **kwargs) if self.steps.current in ('fields', 'items'): - + # Get columns and row data self.columns = self.file_manager.columns() self.rows = self.file_manager.rows() @@ -233,7 +233,7 @@ class FileManagementFormView(MultiStepFormView): elif self.steps.current == 'items': # Set form table data self.set_form_table_data(form=form) - + # Update context context.update({'rows': self.rows}) context.update({'columns': self.columns}) @@ -292,11 +292,11 @@ class FileManagementFormView(MultiStepFormView): self.get_form_table_data(data) self.set_form_table_data() self.get_field_selection() - + kwargs['row_data'] = self.rows return kwargs - + return super().get_form_kwargs() def get_form(self, step=None, data=None, files=None): @@ -366,7 +366,7 @@ class FileManagementFormView(MultiStepFormView): col_id = int(s[3]) except ValueError: continue - + if row_id not in self.row_data: self.row_data[row_id] = {} @@ -401,14 +401,14 @@ class FileManagementFormView(MultiStepFormView): 'name': self.column_names[idx], 'guess': self.column_selections[idx], } - + cell_data = { 'cell': item, 'idx': idx, 'column': column_data, } data.append(cell_data) - + row = { 'index': row_idx, 'data': data, @@ -501,7 +501,7 @@ class FileManagementFormView(MultiStepFormView): if col in self.column_selections.values(): part_match_found = True break - + # If not, notify user if not part_match_found: for col in self.file_manager.ITEM_MATCH_HEADERS: @@ -521,7 +521,7 @@ class FileManagementFormView(MultiStepFormView): n = list(self.column_selections.values()).count(self.column_selections[col]) if n > 1 and self.column_selections[col] not in duplicates: duplicates.append(self.column_selections[col]) - + # Store extra context data self.extra_context_data = { 'missing_columns': missing_columns, From 75cdec81ae7979d105631033fdaf72c97416bfd1 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 2 Jun 2021 00:39:38 +0200 Subject: [PATCH 036/110] style fix --- InvenTree/common/forms.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 5f4ae5808e..085206b65a 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -5,15 +5,11 @@ Django forms for interacting with common objects # -*- coding: utf-8 -*- from __future__ import unicode_literals -from decimal import Decimal, InvalidOperation - from django import forms from django.utils.translation import gettext as _ from InvenTree.forms import HelperForm -from common.settings import currency_code_default - from .files import FileManager from .models import InvenTreeSetting From fc9e1e6770aac74e0ef21a86fc2c1d053ab023aa Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 3 Jun 2021 00:17:29 +0200 Subject: [PATCH 037/110] suggested changes @eeintech --- InvenTree/common/forms.py | 2 +- InvenTree/common/views.py | 44 ++++++++++++++------------------------- InvenTree/order/views.py | 13 ++++++------ 3 files changed, 24 insertions(+), 35 deletions(-) diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 085206b65a..d884ca9d00 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -180,4 +180,4 @@ class MatchItem(forms.Form): def get_special_field(self, col_guess, row, file_manager): """ function to be overriden in inherited forms to add specific form settings """ - pass + return None diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 6d6bba5844..e9ec653c41 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -176,11 +176,11 @@ class FileManagementFormView(MultiStepFormView): """ name = None - form_list = [ - ('upload', forms.UploadFile), - ('fields', forms.MatchField), - ('items', forms.MatchItem), - ] + forms = { + 'upload': forms.UploadFile, + 'fields': forms.MatchField, + 'items': forms.MatchItem, + } form_steps_description = [ _("Upload File"), _("Match Fields"), @@ -190,29 +190,21 @@ class FileManagementFormView(MultiStepFormView): extra_context_data = {} def __init__(self, *args, **kwargs): - """ initialize the FormView """ - # check if form_list should be overriden - if hasattr(self, 'form_list_override'): - # check for list - if not isinstance(self.form_list_override, list): - raise ValueError('form_list_override must be a list') + """ initialize the FormView + Use the following syntax to override the forms that should be used in the steps: - # loop through and override /add form_list enrties - for entry in self.form_list_override: - # fetch postition - pos = [self.form_list.index(i) for i in self.form_list if i[0] == 'items'] - # replace if exists - if pos: - self.form_list[pos[0]] = entry - # or append - else: - self.form_list.append(entry) + def __init__(self, *args, **kwargs): + self.forms['items'] = self.CustomMatchItem + return super().__init__(*args, **kwargs) + """ + # Construct form_list + self.form_list = [(key, value) for key, value in self.forms.items()] # perform all checks and inits for MultiStepFormView - super().__init__(*args, **kwargs) + super().__init__(self, *args, **kwargs) # Check for file manager class - if not(hasattr(self, 'file_manager_class') and issubclass(self.file_manager_class, FileManager)): + if not hasattr(self, 'file_manager_class') and not issubclass(self.file_manager_class, FileManager): raise NotImplementedError('A subclass of a file manager class needs to be set!') def get_context_data(self, form=None, **kwargs): @@ -414,11 +406,7 @@ class FileManagementFormView(MultiStepFormView): 'data': data, 'errors': {}, } - - # make sure that the row was submitted - solves https://github.com/inventree/InvenTree/pull/1588#issuecomment-847889353 - row_exist_check = [a for a in self.request.POST.keys() if a.startswith(f'row_{int(row_idx) +1}_')] - if True in row_exist_check: - self.rows.append(row) + self.rows.append(row) # In the item selection step: update row data with mapping to form fields if form and self.steps.current == 'items': diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 312c49b6db..fe62c19c95 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -581,9 +581,6 @@ class PurchaseOrderUpload(FileManagementFormView): """ override MatchItem fields """ def get_special_field(self, col_guess, row, file_manager): """ set special field """ - # run default - super().get_special_field(col_guess, row, file_manager) - # set quantity field if 'quantity' in col_guess.lower(): return CharField( @@ -608,6 +605,9 @@ class PurchaseOrderUpload(FileManagementFormView): default_amount=self.clean_nbr(row.get('price', '')), ) + # return default + return super().get_special_field(col_guess, row, file_manager) + class OrderFileManager(FileManager): REQUIRED_HEADERS = [ 'Quantity', @@ -625,9 +625,6 @@ class PurchaseOrderUpload(FileManagementFormView): ] name = 'order' - form_list_override = [ - ('items', OrderMatchItem), - ] form_steps_template = [ 'order/order_wizard/po_upload.html', 'order/order_wizard/match_fields.html', @@ -647,6 +644,10 @@ class PurchaseOrderUpload(FileManagementFormView): } file_manager_class = OrderFileManager + def __init__(self, *args, **kwargs): + self.forms['items'] = self.OrderMatchItem + return super().__init__(*args, **kwargs) + def get_order(self): """ Get order or return 404 """ From 625d868a3fe04f93cb6632955efc2bfeb4756877 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 3 Jun 2021 00:29:24 +0200 Subject: [PATCH 038/110] fix for form_list --- InvenTree/common/views.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index e9ec653c41..c1ac20facd 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -127,7 +127,7 @@ class MultiStepFormView(SessionWizardView): def __init__(self, *args, **kwargs): """ Override init method to set media folder """ - super().__init__(*args, **kwargs) + super().__init__(**kwargs) self.process_media_folder() @@ -207,6 +207,12 @@ class FileManagementFormView(MultiStepFormView): if not hasattr(self, 'file_manager_class') and not issubclass(self.file_manager_class, FileManager): raise NotImplementedError('A subclass of a file manager class needs to be set!') + @classmethod + def get_initkwargs(cls, *args, **kwargs): + # Construct form_list + kwargs['form_list'] = [(key, value) for key, value in cls.forms.items()] + return super().get_initkwargs(*args, **kwargs) + def get_context_data(self, form=None, **kwargs): if form is None: form = self.get_form() From 74bd975a0b92230c63e47ec29263276d5cf0fc2f Mon Sep 17 00:00:00 2001 From: eeintech Date: Fri, 4 Jun 2021 13:41:07 -0400 Subject: [PATCH 039/110] Revert back to form_list Moved OrderMatchItemForm to forms.py --- InvenTree/common/forms.py | 9 +++---- InvenTree/common/views.py | 32 ++++++++----------------- InvenTree/order/forms.py | 41 ++++++++++++++++++++++++++++++++ InvenTree/order/views.py | 49 +++++++-------------------------------- 4 files changed, 65 insertions(+), 66 deletions(-) diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index d884ca9d00..8a7a2a41ff 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -27,7 +27,7 @@ class SettingEditForm(HelperForm): ] -class UploadFile(forms.Form): +class UploadFileForm(forms.Form): """ Step 1 of FileManagementFormView """ file = forms.FileField( @@ -65,7 +65,7 @@ class UploadFile(forms.Form): return file -class MatchField(forms.Form): +class MatchFieldForm(forms.Form): """ Step 2 of FileManagementFormView """ def __init__(self, *args, **kwargs): @@ -98,7 +98,7 @@ class MatchField(forms.Form): self.fields[field_name].initial = col['guess'] -class MatchItem(forms.Form): +class MatchItemForm(forms.Form): """ Step 3 of FileManagementFormView """ def __init__(self, *args, **kwargs): @@ -179,5 +179,6 @@ class MatchItem(forms.Form): ) def get_special_field(self, col_guess, row, file_manager): - """ function to be overriden in inherited forms to add specific form settings """ + """ Function to be overriden in inherited forms to add specific form settings """ + return None diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index c1ac20facd..92268d0023 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -118,7 +118,6 @@ class MultiStepFormView(SessionWizardView): form_steps_description: description for each form """ - form_list = [] form_steps_template = [] form_steps_description = [] file_manager = None @@ -176,11 +175,11 @@ class FileManagementFormView(MultiStepFormView): """ name = None - forms = { - 'upload': forms.UploadFile, - 'fields': forms.MatchField, - 'items': forms.MatchItem, - } + form_list = [ + ('upload', forms.UploadFileForm), + ('fields', forms.MatchFieldForm), + ('items', forms.MatchItemForm), + ] form_steps_description = [ _("Upload File"), _("Match Fields"), @@ -190,30 +189,18 @@ class FileManagementFormView(MultiStepFormView): extra_context_data = {} def __init__(self, *args, **kwargs): - """ initialize the FormView - Use the following syntax to override the forms that should be used in the steps: + """ Initialize the FormView """ - def __init__(self, *args, **kwargs): - self.forms['items'] = self.CustomMatchItem - return super().__init__(*args, **kwargs) - """ - # Construct form_list - self.form_list = [(key, value) for key, value in self.forms.items()] - - # perform all checks and inits for MultiStepFormView + # Perform all checks and inits for MultiStepFormView super().__init__(self, *args, **kwargs) # Check for file manager class if not hasattr(self, 'file_manager_class') and not issubclass(self.file_manager_class, FileManager): raise NotImplementedError('A subclass of a file manager class needs to be set!') - @classmethod - def get_initkwargs(cls, *args, **kwargs): - # Construct form_list - kwargs['form_list'] = [(key, value) for key, value in cls.forms.items()] - return super().get_initkwargs(*args, **kwargs) - def get_context_data(self, form=None, **kwargs): + """ Handle context data """ + if form is None: form = self.get_form() @@ -412,6 +399,7 @@ class FileManagementFormView(MultiStepFormView): 'data': data, 'errors': {}, } + self.rows.append(row) # In the item selection step: update row data with mapping to form fields diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index 3973888e95..ceb633688a 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -10,10 +10,17 @@ from django.utils.translation import ugettext_lazy as _ from mptt.fields import TreeNodeChoiceField +from djmoney.forms.fields import MoneyField + from InvenTree.forms import HelperForm from InvenTree.fields import RoundingDecimalFormField from InvenTree.fields import DatePickerFormField +from InvenTree.helpers import clean_decimal + +from common.models import InvenTreeSetting +from common.forms import MatchItemForm + import part.models from stock.models import StockLocation @@ -285,3 +292,37 @@ class EditSalesOrderAllocationForm(HelperForm): 'line', 'item', 'quantity'] + + +class OrderMatchItemForm(MatchItemForm): + """ Override MatchItemForm fields """ + + def get_special_field(self, col_guess, row, file_manager): + """ Set special fields """ + + # set quantity field + if 'quantity' in col_guess.lower(): + return forms.CharField( + required=False, + widget=forms.NumberInput(attrs={ + 'name': 'quantity' + str(row['index']), + 'class': 'numberinput', + 'type': 'number', + 'min': '0', + 'step': 'any', + 'value': clean_decimal(row.get('quantity', '')), + }) + ) + # set price field + elif 'price' in col_guess.lower(): + return MoneyField( + label=_(col_guess), + default_currency=InvenTreeSetting.get_setting('INVENTREE_DEFAULT_CURRENCY'), + decimal_places=5, + max_digits=19, + required=False, + default_amount=clean_decimal(row.get('purchase_price', '')), + ) + + # return default + return super().get_special_field(col_guess, row, file_manager) diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index fe62c19c95..9614f17020 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -15,7 +15,7 @@ from django.http import HttpResponseRedirect from django.utils.translation import ugettext_lazy as _ from django.views.generic import DetailView, ListView, UpdateView from django.views.generic.edit import FormMixin -from django.forms import HiddenInput, IntegerField, CharField, NumberInput +from django.forms import HiddenInput, IntegerField import logging from decimal import Decimal, InvalidOperation @@ -30,9 +30,9 @@ from stock.models import StockItem, StockLocation from part.models import Part from common.models import InvenTreeSetting +from common.forms import UploadFileForm, MatchFieldForm from common.views import FileManagementFormView from common.files import FileManager -from common import forms as cm_forms from . import forms as order_forms from part.views import PartPricing @@ -44,8 +44,6 @@ from InvenTree.views import InvenTreeRoleMixin from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus, StockStatus -from djmoney.forms.fields import MoneyField - logger = logging.getLogger("inventree") @@ -576,38 +574,6 @@ class SalesOrderShip(AjaxUpdateView): class PurchaseOrderUpload(FileManagementFormView): ''' PurchaseOrder: Upload file, match to fields and parts (using multi-Step form) ''' - # overriden classes - class OrderMatchItem(cm_forms.MatchItem): - """ override MatchItem fields """ - def get_special_field(self, col_guess, row, file_manager): - """ set special field """ - # set quantity field - if 'quantity' in col_guess.lower(): - return CharField( - required=False, - widget=NumberInput(attrs={ - 'name': 'quantity' + str(row['index']), - 'class': 'numberinput', - 'type': 'number', - 'min': '0', - 'step': 'any', - 'value': self.clean_nbr(row.get('quantity', '')), - }) - ) - # set price field - elif 'price' in col_guess.lower(): - return MoneyField( - label=_(col_guess), - default_currency=InvenTreeSetting.get_setting('INVENTREE_DEFAULT_CURRENCY'), - decimal_places=5, - max_digits=19, - required=False, - default_amount=self.clean_nbr(row.get('price', '')), - ) - - # return default - return super().get_special_field(col_guess, row, file_manager) - class OrderFileManager(FileManager): REQUIRED_HEADERS = [ 'Quantity', @@ -625,6 +591,11 @@ class PurchaseOrderUpload(FileManagementFormView): ] name = 'order' + form_list = [ + ('upload', UploadFileForm), + ('fields', MatchFieldForm), + ('items', order_forms.OrderMatchItemForm), + ] form_steps_template = [ 'order/order_wizard/po_upload.html', 'order/order_wizard/match_fields.html', @@ -644,16 +615,14 @@ class PurchaseOrderUpload(FileManagementFormView): } file_manager_class = OrderFileManager - def __init__(self, *args, **kwargs): - self.forms['items'] = self.OrderMatchItem - return super().__init__(*args, **kwargs) - def get_order(self): """ Get order or return 404 """ return get_object_or_404(PurchaseOrder, pk=self.kwargs['pk']) def get_context_data(self, form, **kwargs): + """ Handle context data for order """ + context = super().get_context_data(form=form, **kwargs) order = self.get_order() From daf3d06cf0fd863a133edc24700b9b3062964fc1 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 5 Jun 2021 01:19:12 +0200 Subject: [PATCH 040/110] added in optional matches --- InvenTree/common/forms.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/InvenTree/common/forms.py b/InvenTree/common/forms.py index 8a7a2a41ff..4a2a1601aa 100644 --- a/InvenTree/common/forms.py +++ b/InvenTree/common/forms.py @@ -144,6 +144,24 @@ class MatchItemForm(forms.Form): initial=value, ) + # Create item selection box + elif col_guess in file_manager.OPTIONAL_MATCH_HEADERS: + # Get item options + item_options = [(option.id, option) for option in row['match_options_' + col_guess]] + # Get item match + item_match = row['match_' + col_guess] + # Set field select box + self.fields[field_name] = forms.ChoiceField( + choices=[('', '-' * 10)] + item_options, + required=False, + widget=forms.Select(attrs={ + 'class': 'select bomselect', + }) + ) + # Update select box when match was found + if item_match: + self.fields[field_name].initial = item_match.id + # Create item selection box elif col_guess in file_manager.ITEM_MATCH_HEADERS: # Get item options From 35451248c2bdd4d76c256e8ca0221f4478399d13 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 15:25:56 +0200 Subject: [PATCH 041/110] reseting modal on open --- InvenTree/common/views.py | 4 ++++ InvenTree/templates/InvenTree/settings/part.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 92268d0023..d486b2b32e 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -584,6 +584,10 @@ class FileManagementAjaxView(AjaxView): return self.renderJsonResponse(request, data={'form_valid': None}) def get(self, request): + if 'reset' in request.GET: + # reset form + self.storage.reset() + self.storage.current_step = self.steps.first self.setTemplate() return self.renderJsonResponse(request) diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index 7c7245f96e..6502d920e3 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -138,7 +138,7 @@ }); $("#import-part").click(function() { - launchModalForm("{% url 'api-part-import' %}", {}); + launchModalForm("{% url 'api-part-import' %}?reset", {}); }); {% endblock %} \ No newline at end of file From ded68bb4f66add1a7f13e8741130f822ffc17608 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 16:09:51 +0200 Subject: [PATCH 042/110] change titel with modal submit --- InvenTree/templates/js/modals.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/InvenTree/templates/js/modals.js b/InvenTree/templates/js/modals.js index c8ebd90eb4..741d558164 100644 --- a/InvenTree/templates/js/modals.js +++ b/InvenTree/templates/js/modals.js @@ -776,7 +776,11 @@ function handleModalForm(url, options) { // Form was returned, invalid! else { - if (!options.hideErrorMessage) { + if (response.title) { + modalSetTitle(modal, response.title); + } + + if (response.hideErrorMessage || !options.hideErrorMessage) { var warningDiv = $(modal).find('#form-validation-warning'); warningDiv.css('display', 'block'); } From 5e6919f14e69872971544f4feee36674f3627fcd Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 16:32:46 +0200 Subject: [PATCH 043/110] hide error message --- InvenTree/common/views.py | 5 +++++ InvenTree/templates/js/modals.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index d486b2b32e..b695002dc1 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -591,6 +591,11 @@ class FileManagementAjaxView(AjaxView): self.setTemplate() return self.renderJsonResponse(request) + def get_data(self): + data = super().get_data() + data['hideErrorMessage'] = '1' + return data + def setTemplate(self): """ set template name and title """ self.ajax_template_name = self.ajax_form_steps_template[self.get_step_index()] diff --git a/InvenTree/templates/js/modals.js b/InvenTree/templates/js/modals.js index 741d558164..3f6b50cffa 100644 --- a/InvenTree/templates/js/modals.js +++ b/InvenTree/templates/js/modals.js @@ -780,7 +780,7 @@ function handleModalForm(url, options) { modalSetTitle(modal, response.title); } - if (response.hideErrorMessage || !options.hideErrorMessage) { + if (!response.hideErrorMessage && !options.hideErrorMessage) { var warningDiv = $(modal).find('#form-validation-warning'); warningDiv.css('display', 'block'); } From 7439f72ab1efd6bae4c93cb159347d66262a3790 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 16:33:19 +0200 Subject: [PATCH 044/110] hide error messagre on error --- InvenTree/common/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index b695002dc1..5bdaf03df3 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -565,7 +565,7 @@ class FileManagementAjaxView(AjaxView): # check if valid if not form_valid: - return self.renderJsonResponse(request) + return self.renderJsonResponse(request, data={'form_valid': None}) # store the cleaned data and files. self.storage.set_step_data(self.steps.current, self.process_step(form)) From a2a2c61e31de5bf0af7679ea737ae5be18dcaae7 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 16:36:01 +0200 Subject: [PATCH 045/110] refactor and fix rendering on error --- InvenTree/common/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index 5bdaf03df3..c52c063cbf 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -580,7 +580,6 @@ class FileManagementAjaxView(AjaxView): else: self.storage.current_step = self.steps.next - self.setTemplate() return self.renderJsonResponse(request, data={'form_valid': None}) def get(self, request): @@ -588,9 +587,13 @@ class FileManagementAjaxView(AjaxView): # reset form self.storage.reset() self.storage.current_step = self.steps.first - self.setTemplate() return self.renderJsonResponse(request) + def renderJsonResponse(self, request, form=None, data={}, context=None): + """ always set the right templates before rendering """ + self.setTemplate() + return super().renderJsonResponse(request, form=form, data=data, context=context) + def get_data(self): data = super().get_data() data['hideErrorMessage'] = '1' From a535f8df4248960863c569f42a8c9698c0d7c22b Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 16:40:51 +0200 Subject: [PATCH 046/110] hide scrollbar if not needed --- InvenTree/InvenTree/static/css/inventree.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/InvenTree/static/css/inventree.css b/InvenTree/InvenTree/static/css/inventree.css index 0aab04f941..02591c8ed8 100644 --- a/InvenTree/InvenTree/static/css/inventree.css +++ b/InvenTree/InvenTree/static/css/inventree.css @@ -718,7 +718,7 @@ position:relative; height: auto !important; max-height: calc(100vh - 200px) !important; - overflow-y: scroll; + overflow-y: auto; padding: 10px; } From 4f7edac213df376f36c55e57b5ba3597ebd638f3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 17:43:16 +0200 Subject: [PATCH 047/110] back button --- InvenTree/common/views.py | 12 +++++++++++- InvenTree/templates/js/modals.js | 5 +++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py index c52c063cbf..f953dffa81 100644 --- a/InvenTree/common/views.py +++ b/InvenTree/common/views.py @@ -560,6 +560,14 @@ class FileManagementAjaxView(AjaxView): """ def post(self, request): + # check if back-step button was selected + wizard_back = self.request.POST.get('act-btn_back', None) + if wizard_back: + back_step_index = self.get_step_index() - 1 + self.storage.current_step = list(self.get_form_list().keys())[back_step_index] + return self.renderJsonResponse(request, data={'form_valid': None}) + + # validate form form = self.get_form(data=self.request.POST, files=self.request.FILES) form_valid = self.validate(self.steps.current, form) @@ -596,7 +604,9 @@ class FileManagementAjaxView(AjaxView): def get_data(self): data = super().get_data() - data['hideErrorMessage'] = '1' + data['hideErrorMessage'] = '1' # hide the error + buttons = [{'name': 'back', 'title': _('Previous Step')}] if self.get_step_index() > 0 else [] + data['buttons'] = buttons # set buttons return data def setTemplate(self): diff --git a/InvenTree/templates/js/modals.js b/InvenTree/templates/js/modals.js index 3f6b50cffa..e4fe3d3fc1 100644 --- a/InvenTree/templates/js/modals.js +++ b/InvenTree/templates/js/modals.js @@ -795,6 +795,11 @@ function handleModalForm(url, options) { if (options.secondary) { attachSecondaries(modal, options.secondary); } + if (response.buttons) { + // Clean custom action buttons + $(modal).find('#modal-footer-buttons').html(''); + attachButtons(modal, response.buttons); + } } else { $(modal).modal('hide'); From d70b4bcabbcabb6c00694c27db11a3ada93c99a3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 17:44:02 +0200 Subject: [PATCH 048/110] refactor --- InvenTree/templates/js/modals.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/InvenTree/templates/js/modals.js b/InvenTree/templates/js/modals.js index e4fe3d3fc1..033ac635da 100644 --- a/InvenTree/templates/js/modals.js +++ b/InvenTree/templates/js/modals.js @@ -775,11 +775,6 @@ function handleModalForm(url, options) { } // Form was returned, invalid! else { - - if (response.title) { - modalSetTitle(modal, response.title); - } - if (!response.hideErrorMessage && !options.hideErrorMessage) { var warningDiv = $(modal).find('#form-validation-warning'); warningDiv.css('display', 'block'); @@ -795,6 +790,11 @@ function handleModalForm(url, options) { if (options.secondary) { attachSecondaries(modal, options.secondary); } + + if (response.title) { + modalSetTitle(modal, response.title); + } + if (response.buttons) { // Clean custom action buttons $(modal).find('#modal-footer-buttons').html(''); From 413fa2e84295c573416a352552602ef14b3e74d5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 6 Jun 2021 17:50:13 +0200 Subject: [PATCH 049/110] merging in sidebar icon changes fr upstream --- InvenTree/part/templates/part/category_navbar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/part/templates/part/category_navbar.html b/InvenTree/part/templates/part/category_navbar.html index 8172ed8ecd..bd61300531 100644 --- a/InvenTree/part/templates/part/category_navbar.html +++ b/InvenTree/part/templates/part/category_navbar.html @@ -36,7 +36,7 @@ {% if show_import and user.is_staff and roles.part.add %}
    • - + {% trans "Import Parts" %}
    • From 2d8b96a6b8eff120a8292c8a212cc5fc6b9104e4 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 17 Jun 2021 23:15:42 +0200 Subject: [PATCH 050/110] setting to control visibility of price --- InvenTree/common/models.py | 7 +++++++ .../order/templates/order/order_wizard/select_parts.html | 1 + InvenTree/templates/InvenTree/settings/part.html | 1 + 3 files changed, 9 insertions(+) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index ec76475901..d19f0662dd 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -205,6 +205,13 @@ class InvenTreeSetting(models.Model): 'validator': bool, }, + 'PART_SHOW_PRICE_IN_FORMS': { + 'name': _('Show Price in Forms'), + 'description': _('Display part price in some forms'), + 'default': True, + 'validator': bool, + }, + 'REPORT_DEBUG_MODE': { 'name': _('Debug Mode'), 'description': _('Generate reports in debug mode (HTML output)'), diff --git a/InvenTree/order/templates/order/order_wizard/select_parts.html b/InvenTree/order/templates/order/order_wizard/select_parts.html index 28b4a36213..90fb63a080 100644 --- a/InvenTree/order/templates/order/order_wizard/select_parts.html +++ b/InvenTree/order/templates/order/order_wizard/select_parts.html @@ -4,6 +4,7 @@ {% load i18n %} {% block form %} +{% settings_value 'PART_SHOW_PRICE_IN_FORMS' as show_price %}

      {% trans "Step 1 of 2 - Select Part Suppliers" %} diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index e359acdfc2..cb4726bdc4 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -20,6 +20,7 @@ {% include "InvenTree/settings/setting.html" with key="PART_ALLOW_DUPLICATE_IPN" %} {% include "InvenTree/settings/setting.html" with key="PART_ALLOW_EDIT_IPN" %} {% include "InvenTree/settings/setting.html" with key="PART_SHOW_QUANTITY_IN_FORMS" icon="fa-hashtag" %} + {% include "InvenTree/settings/setting.html" with key="PART_SHOW_PRICE_IN_FORMS" icon="fa-dollar-sign" %} {% include "InvenTree/settings/setting.html" with key="PART_RECENT_COUNT" icon="fa-clock" %} {% include "InvenTree/settings/setting.html" with key="PART_TEMPLATE" icon="fa-clone" %} From a3a623a5ca3b27771d40ea77ac4f35aa59e8270e Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 17 Jun 2021 23:24:32 +0200 Subject: [PATCH 051/110] update-button for modal, repeat 1st step on use --- InvenTree/order/views.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index c8ec42d3e7..4a8e576a6d 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -1004,6 +1004,15 @@ class OrderParts(AjaxView): return ctx + def get_data(self): + """ enrich respone json data """ + data = super().get_data() + # if in selection-phase, add a button to update the prices + if getattr(self, 'form_step', 'select_parts') == 'select_parts': + data['buttons'] = [{'name': 'update_price', 'title': _('Update prices')}] # set buttons + data['hideErrorMessage'] = '1' # hide the error message + return data + def get_suppliers(self): """ Calculates a list of suppliers which the user will need to create POs for. This is calculated AFTER the user finishes selecting the parts to order. @@ -1238,9 +1247,10 @@ class OrderParts(AjaxView): valid = False if form_step == 'select_parts': - # No errors? Proceed to PO selection form - if part_errors is False: + # No errors? and the price-update button was not used to submit? Proceed to PO selection form + if part_errors is False and 'act-btn_update_price' not in request.POST: self.ajax_template_name = 'order/order_wizard/select_pos.html' + self.form_step = 'select_purchase_orders' # set step (important for get_data) else: self.ajax_template_name = 'order/order_wizard/select_parts.html' From f0dd543ffabe29f39e7e72e6c7895ff5c81a5da6 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 17 Jun 2021 23:44:22 +0200 Subject: [PATCH 052/110] render price in oer-modal if enabled in settings --- .../order/templates/order/order_wizard/select_parts.html | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/InvenTree/order/templates/order/order_wizard/select_parts.html b/InvenTree/order/templates/order/order_wizard/select_parts.html index 90fb63a080..99a6fe1b54 100644 --- a/InvenTree/order/templates/order/order_wizard/select_parts.html +++ b/InvenTree/order/templates/order/order_wizard/select_parts.html @@ -4,6 +4,7 @@ {% load i18n %} {% block form %} +{% default_currency as currency %} {% settings_value 'PART_SHOW_PRICE_IN_FORMS' as show_price %}

      @@ -50,7 +51,13 @@ From 2cbdeae914eb9766c88e7370f450b77233366efb Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 18 Jun 2021 00:18:45 +0200 Subject: [PATCH 053/110] style-fix --- InvenTree/common/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index d19f0662dd..9d92583e1a 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -205,7 +205,7 @@ class InvenTreeSetting(models.Model): 'validator': bool, }, - 'PART_SHOW_PRICE_IN_FORMS': { + 'PART_SHOW_PRICE_IN_FORMS': { 'name': _('Show Price in Forms'), 'description': _('Display part price in some forms'), 'default': True, From 59e6cc1a103dd713e47a541bd0eef52414d26805 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 18 Jun 2021 23:10:59 +0200 Subject: [PATCH 054/110] Merge branch 'master' of https://github.com/inventree/InvenTree into part-import --- .gitignore | 5 +- .../management/commands/rebuild_models.py | 60 +++ InvenTree/InvenTree/ready.py | 3 +- InvenTree/InvenTree/settings.py | 4 +- InvenTree/InvenTree/urls.py | 25 +- InvenTree/InvenTree/version.py | 2 +- InvenTree/InvenTree/views.py | 15 +- InvenTree/build/api.py | 13 + InvenTree/build/models.py | 19 +- InvenTree/build/serializers.py | 34 +- InvenTree/common/models.py | 24 +- InvenTree/company/api.py | 35 +- InvenTree/company/fixtures/supplier_part.yaml | 7 + InvenTree/company/tests.py | 2 +- InvenTree/config_template.yaml | 4 +- InvenTree/locale/de/LC_MESSAGES/django.po | 446 ++++++++--------- InvenTree/locale/en/LC_MESSAGES/django.po | 444 ++++++++--------- InvenTree/locale/es/LC_MESSAGES/django.po | 446 ++++++++--------- InvenTree/locale/fr/LC_MESSAGES/django.po | 446 ++++++++--------- InvenTree/locale/it/LC_MESSAGES/django.po | 446 ++++++++--------- InvenTree/locale/ja/LC_MESSAGES/django.po | 446 ++++++++--------- InvenTree/locale/pl/LC_MESSAGES/django.po | 446 ++++++++--------- InvenTree/locale/ru/LC_MESSAGES/django.po | 466 +++++++++--------- InvenTree/locale/tr/LC_MESSAGES/django.po | 446 ++++++++--------- InvenTree/locale/zh/LC_MESSAGES/django.po | 446 ++++++++--------- InvenTree/order/api.py | 111 ++++- InvenTree/order/fixtures/order.yaml | 8 + InvenTree/order/forms.py | 10 +- .../0046_purchaseorderlineitem_destination.py | 29 ++ InvenTree/order/models.py | 24 + InvenTree/order/serializers.py | 54 +- .../order/purchase_order_detail.html | 36 +- .../order/templates/order/receive_parts.html | 4 + .../templates/order/sales_order_detail.html | 37 +- InvenTree/order/tests.py | 8 +- InvenTree/part/admin.py | 11 +- InvenTree/part/api.py | 25 +- InvenTree/part/fixtures/part_pricebreaks.yaml | 51 ++ InvenTree/part/forms.py | 18 +- .../migrations/0067_partinternalpricebreak.py | 30 ++ InvenTree/part/models.py | 44 +- InvenTree/part/serializers.py | 22 +- InvenTree/part/templates/part/allocation.html | 65 ++- .../part/templates/part/internal_prices.html | 122 +++++ InvenTree/part/templates/part/navbar.html | 10 +- .../part/templates/part/order_prices.html | 49 +- InvenTree/part/templates/part/part_base.html | 17 + .../part/templates/part/part_pricing.html | 19 + .../part/templatetags/inventree_extras.py | 18 + InvenTree/part/test_bom_item.py | 13 + InvenTree/part/test_part.py | 17 + InvenTree/part/urls.py | 10 + InvenTree/part/views.py | 68 ++- InvenTree/stock/serializers.py | 8 + .../templates/InvenTree/settings/part.html | 3 + InvenTree/templates/js/build.js | 88 +++- InvenTree/templates/js/modals.js | 17 +- InvenTree/templates/js/order.js | 85 ++++ InvenTree/templates/js/stock.js | 7 +- InvenTree/templates/js/tables.js | 2 +- InvenTree/users/models.py | 1 + docker/Dockerfile | 44 +- docker/dev-config.env | 14 +- docker/docker-compose.dev.yml | 22 +- docker/docker-compose.yml | 20 +- docker/nginx.conf | 20 + docker/start_dev_server.sh | 15 +- docker/start_dev_worker.sh | 6 +- docker/start_prod_server.sh | 2 +- .../{start_worker.sh => start_prod_worker.sh} | 0 requirements.txt | 4 +- tasks.py | 16 +- 72 files changed, 3575 insertions(+), 2459 deletions(-) create mode 100644 InvenTree/InvenTree/management/commands/rebuild_models.py create mode 100644 InvenTree/order/migrations/0046_purchaseorderlineitem_destination.py create mode 100644 InvenTree/part/fixtures/part_pricebreaks.yaml create mode 100644 InvenTree/part/migrations/0067_partinternalpricebreak.py create mode 100644 InvenTree/part/templates/part/internal_prices.html rename docker/{start_worker.sh => start_prod_worker.sh} (100%) diff --git a/.gitignore b/.gitignore index 7c360a8231..5dd3580ef6 100644 --- a/.gitignore +++ b/.gitignore @@ -61,4 +61,7 @@ secret_key.txt # Coverage reports .coverage -htmlcov/ \ No newline at end of file +htmlcov/ + +# Development files +dev/ \ No newline at end of file diff --git a/InvenTree/InvenTree/management/commands/rebuild_models.py b/InvenTree/InvenTree/management/commands/rebuild_models.py new file mode 100644 index 0000000000..2a60da9365 --- /dev/null +++ b/InvenTree/InvenTree/management/commands/rebuild_models.py @@ -0,0 +1,60 @@ +""" +Custom management command to rebuild all MPTT models + +- This is crucial after importing any fixtures, etc +""" + +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + """ + Rebuild all database models which leverage the MPTT structure. + """ + + def handle(self, *args, **kwargs): + + # Part model + try: + print("Rebuilding Part objects") + + from part.models import Part + Part.objects.rebuild() + except: + print("Error rebuilding Part objects") + + # Part category + try: + print("Rebuilding PartCategory objects") + + from part.models import PartCategory + PartCategory.objects.rebuild() + except: + print("Error rebuilding PartCategory objects") + + # StockItem model + try: + print("Rebuilding StockItem objects") + + from stock.models import StockItem + StockItem.objects.rebuild() + except: + print("Error rebuilding StockItem objects") + + # StockLocation model + try: + print("Rebuilding StockLocation objects") + + from stock.models import StockLocation + StockLocation.objects.rebuild() + except: + print("Error rebuilding StockLocation objects") + + # Build model + try: + print("Rebuilding Build objects") + + from build.models import Build + Build.objects.rebuild() + except: + print("Error rebuilding Build objects") diff --git a/InvenTree/InvenTree/ready.py b/InvenTree/InvenTree/ready.py index 5a4f1e9576..9e64a2e6c7 100644 --- a/InvenTree/InvenTree/ready.py +++ b/InvenTree/InvenTree/ready.py @@ -26,10 +26,9 @@ def canAppAccessDatabase(): 'flush', 'loaddata', 'dumpdata', - 'makemirations', + 'makemigrations', 'migrate', 'check', - 'mediarestore', 'shell', 'createsuperuser', 'wait_for_db', diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 43b6feee46..e0bc1ccb95 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -98,7 +98,7 @@ DOCKER = _is_true(get_setting( # Configure logging settings log_level = get_setting( 'INVENTREE_LOG_LEVEL', - CONFIG.get('log_level', 'DEBUG') + CONFIG.get('log_level', 'WARNING') ) logging.basicConfig( @@ -192,7 +192,7 @@ STATIC_URL = '/static/' STATIC_ROOT = os.path.abspath( get_setting( 'INVENTREE_STATIC_ROOT', - CONFIG.get('static_root', '/home/inventree/static') + CONFIG.get('static_root', '/home/inventree/data/static') ) ) diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index bce493fb23..0108418517 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -37,6 +37,7 @@ from django.conf.urls.static import static from django.views.generic.base import RedirectView from rest_framework.documentation import include_docs_urls +from .views import auth_request from .views import IndexView, SearchView, DatabaseStatsView from .views import SettingsView, EditUserView, SetPasswordView from .views import CurrencySettingsView, CurrencyRefreshView @@ -155,24 +156,28 @@ urlpatterns = [ url(r'^search/', SearchView.as_view(), name='search'), url(r'^stats/', DatabaseStatsView.as_view(), name='stats'), + url(r'^auth/?', auth_request), + url(r'^api/', include(apipatterns)), url(r'^api-doc/', include_docs_urls(title='InvenTree API')), url(r'^markdownx/', include('markdownx.urls')), ] -# Static file access -urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) +# Server running in "DEBUG" mode? +if settings.DEBUG: + # Static file access + urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) -# Media file access -urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + # Media file access + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -# Debug toolbar access (if in DEBUG mode) -if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS: - import debug_toolbar - urlpatterns = [ - path('__debug/', include(debug_toolbar.urls)), - ] + urlpatterns + # Debug toolbar access (only allowed in DEBUG mode) + if 'debug_toolbar' in settings.INSTALLED_APPS: + import debug_toolbar + urlpatterns = [ + path('__debug/', include(debug_toolbar.urls)), + ] + urlpatterns # Send any unknown URLs to the parts page urlpatterns += [url(r'^.*$', RedirectView.as_view(url='/index/', permanent=False), name='index')] diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index 7b8546b1c2..5161bee6a1 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -8,7 +8,7 @@ import re import common.models -INVENTREE_SW_VERSION = "0.2.3 pre" +INVENTREE_SW_VERSION = "0.2.4 pre" """ Increment thi API version number whenever there is a significant change to the API that any clients need to know about diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index 108908c571..06aec54c18 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -10,7 +10,7 @@ from __future__ import unicode_literals from django.utils.translation import gettext_lazy as _ from django.template.loader import render_to_string -from django.http import JsonResponse, HttpResponseRedirect +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect from django.urls import reverse_lazy from django.conf import settings @@ -36,6 +36,19 @@ from .helpers import str2bool from rest_framework import views +def auth_request(request): + """ + Simple 'auth' endpoint used to determine if the user is authenticated. + Useful for (for example) redirecting authentication requests through + django's permission framework. + """ + + if request.user.is_authenticated: + return HttpResponse(status=200) + else: + return HttpResponse(status=403) + + class TreeSerializer(views.APIView): """ JSON View for serializing a Tree object. diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index 160642281a..1cb973fe05 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -165,6 +165,19 @@ class BuildItemList(generics.ListCreateAPIView): serializer_class = BuildItemSerializer + def get_serializer(self, *args, **kwargs): + + try: + params = self.request.query_params + + kwargs['part_detail'] = str2bool(params.get('part_detail', False)) + kwargs['build_detail'] = str2bool(params.get('build_detail', False)) + kwargs['location_detail'] = str2bool(params.get('location_detail', False)) + except AttributeError: + pass + + return self.serializer_class(*args, **kwargs) + def get_queryset(self): """ Override the queryset method, to allow filtering by stock_item.part diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 03a49b627f..fad5a2934d 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -1289,10 +1289,23 @@ class BuildItem(models.Model): Return qualified URL for part thumbnail image """ + thumb_url = None + if self.stock_item and self.stock_item.part: - return InvenTree.helpers.getMediaUrl(self.stock_item.part.image.thumbnail.url) - elif self.bom_item and self.stock_item.sub_part: - return InvenTree.helpers.getMediaUrl(self.bom_item.sub_part.image.thumbnail.url) + try: + # Try to extract the thumbnail + thumb_url = self.stock_item.part.image.thumbnail.url + except: + pass + + if thumb_url is None and self.bom_item and self.bom_item.sub_part: + try: + thumb_url = self.bom_item.sub_part.image.thumbnail.url + except: + pass + + if thumb_url is not None: + return InvenTree.helpers.getMediaUrl(thumb_url) else: return InvenTree.helpers.getBlankThumbnail() diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py index 629422f6e5..d8573cfa70 100644 --- a/InvenTree/build/serializers.py +++ b/InvenTree/build/serializers.py @@ -13,7 +13,8 @@ from rest_framework import serializers from InvenTree.serializers import InvenTreeModelSerializer from stock.serializers import StockItemSerializerBrief -from part.serializers import PartBriefSerializer +from stock.serializers import LocationSerializer +from part.serializers import PartSerializer, PartBriefSerializer from .models import Build, BuildItem @@ -99,22 +100,45 @@ class BuildItemSerializer(InvenTreeModelSerializer): bom_part = serializers.IntegerField(source='bom_item.sub_part.pk', read_only=True) part = serializers.IntegerField(source='stock_item.part.pk', read_only=True) - part_name = serializers.CharField(source='stock_item.part.full_name', read_only=True) - part_thumb = serializers.CharField(source='getStockItemThumbnail', read_only=True) + location = serializers.IntegerField(source='stock_item.location.pk', read_only=True) + + # Extra (optional) detail fields + part_detail = PartSerializer(source='stock_item.part', many=False, read_only=True) + build_detail = BuildSerializer(source='build', many=False, read_only=True) stock_item_detail = StockItemSerializerBrief(source='stock_item', read_only=True) + location_detail = LocationSerializer(source='stock_item.location', read_only=True) quantity = serializers.FloatField() + def __init__(self, *args, **kwargs): + + build_detail = kwargs.pop('build_detail', False) + part_detail = kwargs.pop('part_detail', False) + location_detail = kwargs.pop('location_detail', False) + + super().__init__(*args, **kwargs) + + if not build_detail: + self.fields.pop('build_detail') + + if not part_detail: + self.fields.pop('part_detail') + + if not location_detail: + self.fields.pop('location_detail') + class Meta: model = BuildItem fields = [ 'pk', 'bom_part', 'build', + 'build_detail', 'install_into', + 'location', + 'location_detail', 'part', - 'part_name', - 'part_thumb', + 'part_detail', 'stock_item', 'stock_item_detail', 'quantity' diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index b1f0a565e2..cf60a20792 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -212,6 +212,21 @@ class InvenTreeSetting(models.Model): 'validator': bool, }, + 'PART_INTERNAL_PRICE': { + 'name': _('Internal Prices'), + 'description': _('Enable internal prices for parts'), + 'default': False, + 'validator': bool + }, + + 'PART_BOM_USE_INTERNAL_PRICE': { + 'name': _('Internal Price as BOM-Price'), + 'description': _('Use the internal price (if set) in BOM-price calculations'), + 'default': False, + 'validator': bool + + }, + 'REPORT_DEBUG_MODE': { 'name': _('Debug Mode'), 'description': _('Generate reports in debug mode (HTML output)'), @@ -733,7 +748,7 @@ class PriceBreak(models.Model): return converted.amount -def get_price(instance, quantity, moq=True, multiples=True, currency=None): +def get_price(instance, quantity, moq=True, multiples=True, currency=None, break_name: str = 'price_breaks'): """ Calculate the price based on quantity price breaks. - Don't forget to add in flat-fee cost (base_cost field) @@ -741,7 +756,10 @@ def get_price(instance, quantity, moq=True, multiples=True, currency=None): - If order multiples are to be observed, then we need to calculate based on that, too """ - price_breaks = instance.price_breaks.all() + if hasattr(instance, break_name): + price_breaks = getattr(instance, break_name).all() + else: + price_breaks = [] # No price break information available? if len(price_breaks) == 0: @@ -763,7 +781,7 @@ def get_price(instance, quantity, moq=True, multiples=True, currency=None): currency = currency_code_default() pb_min = None - for pb in instance.price_breaks.all(): + for pb in price_breaks: # Store smallest price break if not pb_min: pb_min = pb diff --git a/InvenTree/company/api.py b/InvenTree/company/api.py index ff8b6d667b..83aef7531b 100644 --- a/InvenTree/company/api.py +++ b/InvenTree/company/api.py @@ -103,17 +103,11 @@ class ManufacturerPartList(generics.ListCreateAPIView): # Do we wish to include extra detail? try: - kwargs['part_detail'] = str2bool(self.request.query_params.get('part_detail', None)) - except AttributeError: - pass + params = self.request.query_params - try: - kwargs['manufacturer_detail'] = str2bool(self.request.query_params.get('manufacturer_detail', None)) - except AttributeError: - pass - - try: - kwargs['pretty'] = str2bool(self.request.query_params.get('pretty', None)) + kwargs['part_detail'] = str2bool(params.get('part_detail', None)) + kwargs['manufacturer_detail'] = str2bool(params.get('manufacturer_detail', None)) + kwargs['pretty'] = str2bool(params.get('pretty', None)) except AttributeError: pass @@ -252,22 +246,11 @@ class SupplierPartList(generics.ListCreateAPIView): # Do we wish to include extra detail? try: - kwargs['part_detail'] = str2bool(self.request.query_params.get('part_detail', None)) - except AttributeError: - pass - - try: - kwargs['supplier_detail'] = str2bool(self.request.query_params.get('supplier_detail', None)) - except AttributeError: - pass - - try: - kwargs['manufacturer_detail'] = str2bool(self.request.query_params.get('manufacturer_detail', None)) - except AttributeError: - pass - - try: - kwargs['pretty'] = str2bool(self.request.query_params.get('pretty', None)) + params = self.request.query_params + kwargs['part_detail'] = str2bool(params.get('part_detail', None)) + kwargs['supplier_detail'] = str2bool(params.get('supplier_detail', None)) + kwargs['manufacturer_detail'] = str2bool(self.params.get('manufacturer_detail', None)) + kwargs['pretty'] = str2bool(params.get('pretty', None)) except AttributeError: pass diff --git a/InvenTree/company/fixtures/supplier_part.yaml b/InvenTree/company/fixtures/supplier_part.yaml index 446339d58b..02cf33e12e 100644 --- a/InvenTree/company/fixtures/supplier_part.yaml +++ b/InvenTree/company/fixtures/supplier_part.yaml @@ -52,3 +52,10 @@ part: 2 supplier: 2 SKU: 'ZERGM312' + +- model: company.supplierpart + pk: 5 + fields: + part: 4 + supplier: 2 + SKU: 'R_4K7_0603' diff --git a/InvenTree/company/tests.py b/InvenTree/company/tests.py index b1e05efe14..e4a70b077a 100644 --- a/InvenTree/company/tests.py +++ b/InvenTree/company/tests.py @@ -65,7 +65,7 @@ class CompanySimpleTest(TestCase): self.assertEqual(acme.supplied_part_count, 4) self.assertTrue(appel.has_parts) - self.assertEqual(appel.supplied_part_count, 3) + self.assertEqual(appel.supplied_part_count, 4) self.assertTrue(zerg.has_parts) self.assertEqual(zerg.supplied_part_count, 2) diff --git a/InvenTree/config_template.yaml b/InvenTree/config_template.yaml index 1333b876b8..0e6232d270 100644 --- a/InvenTree/config_template.yaml +++ b/InvenTree/config_template.yaml @@ -129,9 +129,9 @@ cors: media_root: '/home/inventree/data/media' # STATIC_ROOT is the local filesystem location for storing static files -# By default, it is stored under /home/inventree +# By default, it is stored under /home/inventree/data/static # Use environment variable INVENTREE_STATIC_ROOT -static_root: '/home/inventree/static' +static_root: '/home/inventree/data/static' # Optional URL schemes to allow in URL fields # By default, only the following schemes are allowed: ['http', 'https', 'ftp', 'ftps'] diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po index 34d056cc8a..9eeedee291 100644 --- a/InvenTree/locale/de/LC_MESSAGES/django.po +++ b/InvenTree/locale/de/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-01 23:57\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:41\n" "Last-Translator: \n" "Language-Team: German\n" "Language: de_DE\n" @@ -77,7 +77,7 @@ msgstr "Kategorie auswählen" msgid "Duplicate serial: {n}" msgstr "Doppelte Seriennummer: {n}" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "Keine gültige Menge" @@ -106,7 +106,7 @@ msgstr "Keine Seriennummern gefunden" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "Anzahl der eindeutigen Seriennummern ({s}) muss mit der Anzahl ({q}) übereinstimmen" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "Anhang" @@ -124,7 +124,7 @@ msgstr "Datei-Kommentar" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "Benutzer" @@ -136,7 +136,7 @@ msgstr "Hochladedatum" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "Name" @@ -146,7 +146,7 @@ msgstr "Name" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "Name" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "Beschreibung" @@ -372,27 +372,27 @@ msgstr "Überschuss darf 100% nicht überschreiten" msgid "Overage must be an integer value or a percentage" msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "Element löschen" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "Häkchen setzen um Löschung von Objekt zu bestätigen" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "Benutzerinformationen bearbeiten" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "Passwort eingeben" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "Passwörter stimmen nicht überein" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "Systeminformationen" @@ -458,17 +458,17 @@ msgstr "Zieldatum" msgid "Target date for build completion. Build will be overdue after this date." msgstr "Zieldatum für Bauauftrag-Fertigstellung." -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "Zieldatum für Bauauftrag-Fertigstellung." #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "Zieldatum für Bauauftrag-Fertigstellung." #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "Anzahl" @@ -534,7 +534,7 @@ msgstr "Bauauftrag als vollständig markieren" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "Lagerort" @@ -543,13 +543,13 @@ msgid "Location of completed parts" msgstr "Lagerort der Endprodukte" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "Status" @@ -602,8 +602,8 @@ msgstr "Bauaufträge" msgid "Build Order Reference" msgstr "Bauauftragsreferenz" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "Teil" @@ -702,7 +702,7 @@ msgstr "Bauauftrags-Status" msgid "Build status code" msgstr "Bau-Statuscode" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "Losnummer" @@ -710,16 +710,16 @@ msgstr "Losnummer" msgid "Batch code for this build output" msgstr "Losnummer für dieses Endprodukt" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "Erstelldatum" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "geplantes Fertigstellungsdatum" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "Fertigstellungsdatum" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "Nutzer der diesen Bauauftrag erstellt hat" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "Nutzer der für diesen Bauauftrag zuständig ist" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "Externer Link" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "Link zu einer externen URL" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "Notizen" @@ -809,11 +809,11 @@ msgstr "Bauauftragsposition muss ein Endprodukt festlegen, da der übergeordnete msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "Reserviermenge ({n}) muss kleiner Bestandsmenge ({q}) sein. Zugewiesene Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "Zu viele BestandsObjekt zugewiesen" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "Reserviermenge muss größer null sein" @@ -826,17 +826,17 @@ msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "Ausgewähltes BestandsObjekt nicht Stückliste für Teil '{p}' gefunden" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "Bauauftrag" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "Bauauftrag starten um Teile zuzuweisen" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "Bauauftrag starten um Teile zuzuweisen" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "BestandsObjekt" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "Quell-BestandsObjekt" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "BestandsObjekt-Anzahl dem Bauauftrag zuweisen" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "Installiere in" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "Ziel-BestandsObjekt" @@ -916,7 +916,7 @@ msgstr "Dieser Bauauftrag hat keine zugeordneten Stücklisten-Einträge" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "Seriennummer" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "Fortschritt" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "Ziel-Lagerort nicht angegeben" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Losnummer" @@ -1250,7 +1250,7 @@ msgstr "Bauauftrag-details" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "Details" @@ -1898,7 +1898,7 @@ msgstr "Hersteller-Teilenummer" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "MPN" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "Anlaufstelle" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "ist Hersteller" msgid "Does this company manufacture parts?" msgstr "Produziert diese Firma Teile?" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "Basisteil" @@ -2022,7 +2022,7 @@ msgstr "Teilbeschreibung des Herstellers" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "Zulieferer auswählen" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "SKU (Lagerbestandseinheit)" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "Mindestpreis" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "Verpackungen" @@ -2166,11 +2166,11 @@ msgstr "Keine Website angegeben" msgid "Uses default currency" msgstr "verwendet Standard-Währung" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "Kunde" @@ -2216,7 +2216,7 @@ msgstr "Teile löschen" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "Neues Teil" @@ -2263,7 +2263,7 @@ msgstr "Neues Zuliefererteil anlegen" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "Neues Zuliefererteil" @@ -2386,7 +2386,7 @@ msgstr "Zuliefererteile" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "Teilbestand" @@ -2442,7 +2442,7 @@ msgid "New Sales Order" msgstr "Neuer Auftrag" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "Zuliefererteil" @@ -2599,7 +2599,7 @@ msgstr "Herstellerteil löschen" msgid "Edit Supplier Part" msgstr "Zuliefererteil bearbeiten" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "Neues Zuliefererteil anlegen" @@ -2713,7 +2713,7 @@ msgstr "Zieldatum für Auftrags-Lieferung." msgid "Enter sales order number" msgstr "Auftrag-Nummer eingeben" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "Zieldatum für Auftrags-Fertigstellung." @@ -2725,209 +2725,209 @@ msgstr "Seriennummern für BestandsObjekt eingeben" msgid "Enter quantity of stock items" msgstr "Menge der BestandsObjekt eingeben" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "Bestell-Referenz" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "Bestellungs-Beschreibung" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "Link auf externe Seite" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "Erstellt von" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "Nutzer oder Gruppe der/die für diesen Auftrag zuständig ist/sind" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "Bestell-Notizen" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "Bestellungs-Status" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "Firma bei der die Teile bestellt werden" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "Zulieferer-Referenz" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "Zulieferer Bestellreferenz" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "Empfangen von" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "Aufgabedatum" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "Datum an dem die Bestellung aufgegeben wurde" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "Ziel-Versanddatum" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "Geplantes Lieferdatum für Auftrag." -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "Datum an dem der Auftrag fertigstellt wurde" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "Anzahl muss größer Null sein" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "Teile-Zulieferer muss dem Zulieferer der Bestellung entsprechen" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "Nur Teile aufgegebener Bestllungen können empfangen werden" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "Anzahl muss eine Ganzzahl sein" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "Anzahl muss eine positive Zahl sein" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "Firma an die die Teile verkauft werden" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "Kundenreferenz" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "Bestellreferenz" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "Versanddatum" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "Versand von" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "Bestellung kann nicht versendet werden weil er nicht anhängig ist" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "Anzahl" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "Position - Referenz" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "Position - Notizen" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "Bestellung" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "Bestellung" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "Zuliefererteil" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "Empfangen" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "Empfangene Objekt-Anzahl" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "Preis" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "Preis pro Einheit" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "Verkaufspreis" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "Stückverkaufspreis" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "BestandsObjekt wurde nicht zugewiesen" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "Kann BestandsObjekt keiner Zeile mit einem anderen Teil hinzufügen" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "Kann BestandsObjekt keiner Zeile ohne Teil hinzufügen" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "Die zugeordnete Anzahl darf nicht die verfügbare Anzahl überschreiten" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "Anzahl für BestandsObjekt mit Seriennummer muss 1 sein" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "Position" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "Position" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "BestandsObjekt für Zuordnung auswählen" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "Anzahl für Bestandszuordnung eingeben" @@ -2978,8 +2978,8 @@ msgstr "Aufgegeben" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "Neuer Lagerort" @@ -3163,21 +3163,25 @@ msgstr "Position hinzufügen" msgid "No line items found" msgstr "Keine Positionen gefunden" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "Stück-Preis" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "Position bearbeiten" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "Position löschen" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "Position empfangen" @@ -4065,7 +4069,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "Lagerbestand von Varianten kann für diese Stücklisten-Position verwendet werden" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "Menge muss eine Ganzzahl sein" @@ -4174,7 +4178,7 @@ msgid "All selected BOM items will be deleted" msgstr "Alle ausgewählte Stücklistenpositionen werden gelöscht" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "Neues Teil anlegen" @@ -4315,7 +4319,7 @@ msgid "View grid display" msgstr "Rasteransicht anzeigen" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "Neuen Lagerort anlegen" @@ -4409,7 +4413,7 @@ msgstr "%(full_name)s - %(desc)s (%(match_per)s%% übereinstimmend)" msgid "Part Details" msgstr "Teil Details" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "letzte Seriennummer" @@ -4552,51 +4556,51 @@ msgid "Pricing ranges" msgstr "Preisspannen" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "Zulieferer-Preise" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "Stückpreis" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "Gesamtkosten" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "Keine Zulieferer-Preise verfügbar" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "Stücklistenpreise" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "Anmerkung: Stücklistenbepreisung für dieses Teil ist unvollständig" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "Keine Stücklisten-Preise verfügbar" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "Keine Preise für dieses Teil verfügbar" @@ -4635,7 +4639,7 @@ msgstr "Neuer Parameter" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "Wert" @@ -4741,7 +4745,7 @@ msgstr "Herstellbar" msgid "Building" msgstr "Im Bau" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "Berechnen" @@ -4850,7 +4854,7 @@ msgstr "Neue Variante anlegen" msgid "New Variant" msgstr "neue Variante anlegen" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "Unbekannte Datenbank" @@ -5161,17 +5165,17 @@ msgid "Test Results" msgstr "Testergebnisse" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "Test" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "Ergebnis" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "Datum" @@ -5193,7 +5197,7 @@ msgstr "Bestand für {n} Objekte geändert" msgid "Moved {n} parts to {loc}" msgstr "{n} Teile nach {loc} bewegt" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "Ablaufdatum" @@ -5283,187 +5287,187 @@ msgstr "Standard-Lagerort ändern" msgid "Set the destination as the default location for selected parts" msgstr "Setze das Ziel als Standard-Lagerort für ausgewählte Teile" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "Besitzer" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "Besitzer auswählen" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "Ein BestandsObjekt mit dieser Seriennummer existiert bereits" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "Teile-Typ ('{pf}') muss {pe} sein" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "Anzahl muss für Objekte mit Seriennummer 1 sein" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "Seriennummer kann nicht gesetzt werden wenn die Anzahl größer als 1 ist" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "Teil kann nicht zu sich selbst gehören" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "Teil muss eine Referenz haben wenn is_building wahr ist" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "Referenz verweist nicht auf das gleiche Teil" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "Eltern-BestandsObjekt" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "Basis-Teil" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "Passendes Zuliefererteil für dieses BestandsObjekt auswählen" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "Bestand-Lagerort" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "Die Verpackung dieses BestandsObjekt ist gelagert in" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "verbaut in" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "Ist dieses Teil in einem anderen verbaut?" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "Seriennummer für dieses Teil" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "Losnummer für dieses BestandsObjekt" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "Bestand" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "Quellbau" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "Bauauftrag für dieses BestandsObjekt" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "Quelle Bestellung" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "Bestellung für dieses BestandsObjekt" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "Ziel-Auftrag" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "Ablaufdatum für BestandsObjekt. Bestand wird danach als abgelaufen gekennzeichnet" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "Löschen wenn leer" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "Dieses BestandsObjekt löschen wenn Bestand aufgebraucht" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "BestandsObjekt-Notizen" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "Preis für eine Einheit bei Einkauf" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "Teil ist nicht verfolgbar" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "Anzahl muss eine Ganzzahl sein" -#: stock/models.py:1021 +#: stock/models.py:1023 #, 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:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "Seriennummern muss eine Liste von Ganzzahlen sein" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "Anzahl stimmt nicht mit den Seriennummern überein" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "Seriennummern {exists} existieren bereits" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "BestandsObjekt kann nicht bewegt werden, da kein Bestand vorhanden ist" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "Eintrags-Notizen" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "Wert muss für diesen Test angegeben werden" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "Anhang muss für diesen Test hochgeladen werden" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "Name des Tests" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "Testergebnis" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "Test Ausgabe Wert" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "Test Ergebnis Anhang" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "Test Notizen" @@ -6584,7 +6588,7 @@ msgid "No builds matching query" msgstr "Keine Bauaufträge passen zur Anfrage" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "Auswählen" @@ -6835,7 +6839,7 @@ msgstr "Keine Kategorie" msgid "Low stock" msgstr "Bestand niedrig" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "Pfad" @@ -7033,75 +7037,75 @@ msgstr "gelöscht" msgid "Stocktake" msgstr "Inventur" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "Status" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "Status setzen" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "Status Code setzen" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "Status Code muss ausgewählt werden" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "Ungültiges Datum" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "Standort nicht mehr vorhanden" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "Bestellung existiert nicht mehr" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "Kunde existiert nicht mehr" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "Lagerbestand existiert nicht mehr" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "Hinzugefügt" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "Entfernt" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "Keine Benutzerinformation" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "Tracking-Eintrag bearbeiten" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "Tracking-Eintrag löschen" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "Neuen Lagerort anlegen" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "Keine installierten Elemente" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "Seriennummer" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "Lagerbestand entfernen" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index bf52611870..ab3c93408d 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: 2021-06-01 10:07+0000\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -78,7 +78,7 @@ msgstr "" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -107,7 +107,7 @@ msgstr "" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "" @@ -125,7 +125,7 @@ msgstr "" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "" @@ -137,7 +137,7 @@ msgstr "" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "" @@ -147,7 +147,7 @@ msgstr "" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -159,8 +159,8 @@ msgstr "" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "" @@ -373,27 +373,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -459,17 +459,17 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -478,7 +478,7 @@ msgstr "" #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -488,8 +488,8 @@ msgstr "" #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "" @@ -535,7 +535,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "" @@ -544,13 +544,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "" @@ -603,8 +603,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -628,15 +628,15 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -647,7 +647,7 @@ msgstr "" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "" @@ -703,7 +703,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "" @@ -711,16 +711,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "" @@ -737,7 +737,7 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -754,30 +754,30 @@ msgstr "" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "" @@ -810,11 +810,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -827,17 +827,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -845,23 +845,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "" @@ -917,7 +917,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "" @@ -1038,7 +1038,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1196,7 +1196,7 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" @@ -1251,7 +1251,7 @@ msgstr "" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "" @@ -1899,7 +1899,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1954,7 +1954,7 @@ msgid "Point of contact" msgstr "" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1993,7 +1993,7 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" @@ -2023,7 +2023,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2038,7 +2038,7 @@ msgstr "" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2082,8 +2082,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "" @@ -2167,11 +2167,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "" @@ -2217,7 +2217,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "" @@ -2264,7 +2264,7 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "" @@ -2387,7 +2387,7 @@ msgstr "" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2443,7 +2443,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2600,7 +2600,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2714,7 +2714,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2726,209 +2726,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2979,8 +2979,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "" @@ -3164,21 +3164,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4066,7 +4070,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4175,7 +4179,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4316,7 +4320,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4410,7 +4414,7 @@ msgstr "" msgid "Part Details" msgstr "" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "" @@ -4553,51 +4557,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4636,7 +4640,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4742,7 +4746,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4851,7 +4855,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5162,17 +5166,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5194,7 +5198,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5284,187 +5288,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6583,7 +6587,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6834,7 +6838,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7032,75 +7036,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po index f411242796..6d0f3375c4 100644 --- a/InvenTree/locale/es/LC_MESSAGES/django.po +++ b/InvenTree/locale/es/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-01 10:22\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:40\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -77,7 +77,7 @@ msgstr "" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -106,7 +106,7 @@ msgstr "" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "" @@ -124,7 +124,7 @@ msgstr "" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "Usuario" @@ -136,7 +136,7 @@ msgstr "" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "Nombre" @@ -146,7 +146,7 @@ msgstr "Nombre" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "Nombre" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "Descripción" @@ -372,27 +372,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "Eliminar elemento" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "Configurar Contraseña" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "Información del sistema" @@ -458,17 +458,17 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "" #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "" #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "Cantidad" @@ -534,7 +534,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "Unicación" @@ -543,13 +543,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "Estado" @@ -602,8 +602,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "Parte" @@ -702,7 +702,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "" @@ -710,16 +710,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "Notas" @@ -809,11 +809,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -826,17 +826,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "" @@ -916,7 +916,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "Número de serie" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "Progreso" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Lote" @@ -1250,7 +1250,7 @@ msgstr "" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "Detalles" @@ -1898,7 +1898,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" @@ -2022,7 +2022,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "" @@ -2165,11 +2165,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "Cliente" @@ -2215,7 +2215,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "" @@ -2262,7 +2262,7 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "" @@ -2385,7 +2385,7 @@ msgstr "" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2441,7 +2441,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2598,7 +2598,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2712,7 +2712,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2724,209 +2724,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2977,8 +2977,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "" @@ -3162,21 +3162,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4064,7 +4068,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4173,7 +4177,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4314,7 +4318,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4408,7 +4412,7 @@ msgstr "" msgid "Part Details" msgstr "" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "" @@ -4551,51 +4555,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4634,7 +4638,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4740,7 +4744,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4849,7 +4853,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5160,17 +5164,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5192,7 +5196,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5282,187 +5286,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6580,7 +6584,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6831,7 +6835,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7029,75 +7033,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/locale/fr/LC_MESSAGES/django.po b/InvenTree/locale/fr/LC_MESSAGES/django.po index a266da7266..97617764a4 100644 --- a/InvenTree/locale/fr/LC_MESSAGES/django.po +++ b/InvenTree/locale/fr/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-02 19:11\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:40\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -77,7 +77,7 @@ msgstr "Sélectionnez une catégorie" msgid "Duplicate serial: {n}" msgstr "Dupliquer le numéro de série: {n}" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "Quantité fournie invalide" @@ -106,7 +106,7 @@ msgstr "Aucun numéro de série trouvé" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "Le nombre de numéros de série uniques ({s}) doit correspondre à la quantité ({q})" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "Pièce jointe" @@ -124,7 +124,7 @@ msgstr "Commentaire du fichier" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "Utilisateur" @@ -136,7 +136,7 @@ msgstr "date de chargement" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "Nom" @@ -146,7 +146,7 @@ msgstr "Nom" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "Nom" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "Description" @@ -372,27 +372,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "Supprimer cet élément" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "Modifier les informations utilisateur" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "Informations système" @@ -458,17 +458,17 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "" #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "" #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "Quantité" @@ -534,7 +534,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "" @@ -543,13 +543,13 @@ msgid "Location of completed parts" msgstr "Emplacement des pièces terminées" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "" @@ -602,8 +602,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "Pièce" @@ -702,7 +702,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "" @@ -710,16 +710,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "Date de création" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "Lien Externe" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "Notes" @@ -809,11 +809,11 @@ msgstr "L'élément de construction doit spécifier une sortie de construction, msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -826,17 +826,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "L'article en stock sélectionné n'a pas été trouvé dans la BOM pour la pièce '{p}'" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "" @@ -916,7 +916,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" @@ -1250,7 +1250,7 @@ msgstr "" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "Détails" @@ -1898,7 +1898,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" @@ -2022,7 +2022,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "" @@ -2165,11 +2165,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "" @@ -2215,7 +2215,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "" @@ -2262,7 +2262,7 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "" @@ -2385,7 +2385,7 @@ msgstr "" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2441,7 +2441,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2598,7 +2598,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2712,7 +2712,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2724,209 +2724,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2977,8 +2977,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "" @@ -3162,21 +3162,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4064,7 +4068,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4173,7 +4177,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4314,7 +4318,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4408,7 +4412,7 @@ msgstr "" msgid "Part Details" msgstr "" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "" @@ -4551,51 +4555,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4634,7 +4638,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4740,7 +4744,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4849,7 +4853,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5160,17 +5164,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5192,7 +5196,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5282,187 +5286,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6580,7 +6584,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6831,7 +6835,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7029,75 +7033,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/locale/it/LC_MESSAGES/django.po b/InvenTree/locale/it/LC_MESSAGES/django.po index 851cd87378..6caf5cb88d 100644 --- a/InvenTree/locale/it/LC_MESSAGES/django.po +++ b/InvenTree/locale/it/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-01 10:22\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:40\n" "Last-Translator: \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -77,7 +77,7 @@ msgstr "" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -106,7 +106,7 @@ msgstr "" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "" @@ -124,7 +124,7 @@ msgstr "" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "" @@ -136,7 +136,7 @@ msgstr "" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "" @@ -146,7 +146,7 @@ msgstr "" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "" @@ -372,27 +372,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -458,17 +458,17 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "" #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "" #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "" @@ -534,7 +534,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "" @@ -543,13 +543,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "" @@ -602,8 +602,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "" @@ -702,7 +702,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "" @@ -710,16 +710,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "" @@ -809,11 +809,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -826,17 +826,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "" @@ -916,7 +916,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" @@ -1250,7 +1250,7 @@ msgstr "" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "" @@ -1898,7 +1898,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" @@ -2022,7 +2022,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "" @@ -2165,11 +2165,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "" @@ -2215,7 +2215,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "" @@ -2262,7 +2262,7 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "" @@ -2385,7 +2385,7 @@ msgstr "" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2441,7 +2441,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2598,7 +2598,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2712,7 +2712,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2724,209 +2724,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2977,8 +2977,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "" @@ -3162,21 +3162,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4064,7 +4068,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4173,7 +4177,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4314,7 +4318,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4408,7 +4412,7 @@ msgstr "" msgid "Part Details" msgstr "" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "" @@ -4551,51 +4555,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4634,7 +4638,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4740,7 +4744,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4849,7 +4853,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5160,17 +5164,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5192,7 +5196,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5282,187 +5286,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6580,7 +6584,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6831,7 +6835,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7029,75 +7033,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/locale/ja/LC_MESSAGES/django.po b/InvenTree/locale/ja/LC_MESSAGES/django.po index 5febd2102f..f5afd1b0fe 100644 --- a/InvenTree/locale/ja/LC_MESSAGES/django.po +++ b/InvenTree/locale/ja/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-01 10:22\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:41\n" "Last-Translator: \n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -77,7 +77,7 @@ msgstr "" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -106,7 +106,7 @@ msgstr "" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "" @@ -124,7 +124,7 @@ msgstr "" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "" @@ -136,7 +136,7 @@ msgstr "" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "" @@ -146,7 +146,7 @@ msgstr "" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "" @@ -372,27 +372,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -458,17 +458,17 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "" #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "" #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "" @@ -534,7 +534,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "" @@ -543,13 +543,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "" @@ -602,8 +602,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "" @@ -702,7 +702,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "" @@ -710,16 +710,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "" @@ -809,11 +809,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -826,17 +826,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "" @@ -916,7 +916,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" @@ -1250,7 +1250,7 @@ msgstr "" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "" @@ -1898,7 +1898,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" @@ -2022,7 +2022,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "" @@ -2165,11 +2165,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "" @@ -2215,7 +2215,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "" @@ -2262,7 +2262,7 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "" @@ -2385,7 +2385,7 @@ msgstr "" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2441,7 +2441,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2598,7 +2598,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2712,7 +2712,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2724,209 +2724,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2977,8 +2977,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "" @@ -3162,21 +3162,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4064,7 +4068,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4173,7 +4177,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4314,7 +4318,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4408,7 +4412,7 @@ msgstr "" msgid "Part Details" msgstr "" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "" @@ -4551,51 +4555,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4634,7 +4638,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4740,7 +4744,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4849,7 +4853,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5160,17 +5164,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5192,7 +5196,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5282,187 +5286,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6580,7 +6584,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6831,7 +6835,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7029,75 +7033,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/locale/pl/LC_MESSAGES/django.po b/InvenTree/locale/pl/LC_MESSAGES/django.po index 64f5af067b..9b4e347ff7 100644 --- a/InvenTree/locale/pl/LC_MESSAGES/django.po +++ b/InvenTree/locale/pl/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-01 10:22\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:40\n" "Last-Translator: \n" "Language-Team: Polish\n" "Language: pl_PL\n" @@ -77,7 +77,7 @@ msgstr "Wybierz kategorię" msgid "Duplicate serial: {n}" msgstr "Powtórzony numer seryjny: {n}" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "Podano nieprawidłową ilość" @@ -106,7 +106,7 @@ msgstr "Nie znaleziono numerów seryjnych" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "Ilość numerów seryjnych ({s}) musi odpowiadać ilości ({q})" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "Załącznik" @@ -124,7 +124,7 @@ msgstr "Komentarz pliku" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "Użytkownik" @@ -136,7 +136,7 @@ msgstr "data przesłania" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "Nazwa" @@ -146,7 +146,7 @@ msgstr "Nazwa" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "Nazwa" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "Opis" @@ -372,27 +372,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "Usuń element" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "Zaznacz pole aby potwierdzić usunięcie elementu" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "Edytuj informacje użytkownika" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "Ustaw hasło" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "Hasła muszą być zgodne" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "Informacja systemowa" @@ -458,17 +458,17 @@ msgstr "Data docelowa" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "" #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "" #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "Ilość" @@ -534,7 +534,7 @@ msgstr "Oznacz budowę jako ukończoną" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "Lokalizacja" @@ -543,13 +543,13 @@ msgid "Location of completed parts" msgstr "Lokalizacja ukończonych części" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "Status" @@ -602,8 +602,8 @@ msgstr "Zlecenia budowy" msgid "Build Order Reference" msgstr "Odwołanie do zamówienia wykonania" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "Zamówienie budowy, do którego budowa jest przypisana" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "Zamówienie budowy, do którego budowa jest przypisana" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "Część" @@ -702,7 +702,7 @@ msgstr "Status budowania" msgid "Build status code" msgstr "Kod statusu budowania" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "Kod partii" @@ -710,16 +710,16 @@ msgstr "Kod partii" msgid "Batch code for this build output" msgstr "Kod partii dla wyjścia budowy" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "Data utworzenia" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "Docelowy termin zakończenia" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "Data zakończenia" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "Użytkownik, który wydał to zamówienie" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "Użytkownik odpowiedzialny za to zamówienie budowy" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "Link Zewnętrzny" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "Link do zewnętrznego adresu URL" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "Uwagi" @@ -809,11 +809,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -826,17 +826,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "Budowa" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "Element magazynowy" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "Lokalizacja magazynowania przedmiotu" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "Zainstaluj do" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "Docelowa lokalizacja magazynowa przedmiotu" @@ -916,7 +916,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "Numer Seryjny" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "Postęp" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "Nie określono lokalizacji docelowej" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Partia" @@ -1250,7 +1250,7 @@ msgstr "Szczegóły zlecenia budowy" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "Szczegóły" @@ -1898,7 +1898,7 @@ msgstr "Numer producenta" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "MPN" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "Punkt kontaktowy" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "jest producentem" msgid "Does this company manufacture parts?" msgstr "Czy to przedsiębiorstwo produkuje części?" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "Część bazowa" @@ -2022,7 +2022,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "Wybierz dostawcę" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "SKU" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "Opakowanie" @@ -2165,11 +2165,11 @@ msgstr "Nie określono strony internetowej" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "Klient" @@ -2215,7 +2215,7 @@ msgstr "Usuń części" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "Nowy komponent" @@ -2262,7 +2262,7 @@ msgstr "Utwórz nowego dostawcę części" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "Now dostawca części" @@ -2385,7 +2385,7 @@ msgstr "Dostarczone części" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2441,7 +2441,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2598,7 +2598,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2712,7 +2712,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2724,209 +2724,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "Wprowadź ilość produktów magazynowych" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "Odniesienie zamówienia" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "Opis Zamówienia" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "Link do zewnętrznej witryny" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "Utworzony przez" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "Użytkownik lub grupa odpowiedzialna za to zamówienie" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "Notatki do zamówienia" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "odebrane przez" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "Data wydania" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "Data wysyłki" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "wysłane przez" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "Ilość elementów" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "Zamówienie" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "Odebrane" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "Cena zakupu" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "Cena zakupu jednostkowego" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "Cena sprzedaży" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "Jednostkowa cena sprzedaży" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "Linia" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "Komponent" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2977,8 +2977,8 @@ msgstr "Wydany" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "Nowa lokalizacja" @@ -3162,21 +3162,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "Cena jednostkowa" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4064,7 +4068,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4173,7 +4177,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4314,7 +4318,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4408,7 +4412,7 @@ msgstr "" msgid "Part Details" msgstr "Szczegóły części" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "Ostatni numer seryjny" @@ -4551,51 +4555,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4634,7 +4638,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4740,7 +4744,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4849,7 +4853,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5160,17 +5164,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5192,7 +5196,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5282,187 +5286,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6580,7 +6584,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6831,7 +6835,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7029,75 +7033,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/locale/ru/LC_MESSAGES/django.po b/InvenTree/locale/ru/LC_MESSAGES/django.po index 02ea1794d6..d61e19d068 100644 --- a/InvenTree/locale/ru/LC_MESSAGES/django.po +++ b/InvenTree/locale/ru/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-03 17:03\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:41\n" "Last-Translator: \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -77,7 +77,7 @@ msgstr "Выбрать категорию" msgid "Duplicate serial: {n}" msgstr "Дублировать серийный номер: {n}" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "недопустимое количество" @@ -106,7 +106,7 @@ msgstr "Серийных номеров не найдено" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "Число уникальных серийных номеров ({s}) должно соответствовать количеству ({q})" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "Вложения" @@ -124,7 +124,7 @@ msgstr "Комментарий к файлу" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "Пользователь" @@ -136,7 +136,7 @@ msgstr "дата загрузки" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "Название" @@ -146,7 +146,7 @@ msgstr "Название" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "Название" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "Описание" @@ -372,27 +372,27 @@ msgstr "Перегрузка не может превысить 100%" msgid "Overage must be an integer value or a percentage" msgstr "Превышение должно быть целым числом или процентом" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "Удалить элемент" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "Установите флажок для подтверждения удаления элемента" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "Редактировать информацию о пользователе" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "Установить пароль" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "Пароли должны совпадать" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "Информация о системе" @@ -458,17 +458,17 @@ msgstr "Целевая дата" msgid "Target date for build completion. Build will be overdue after this date." msgstr "Целевая дата для сборки. Сборка будет просрочена после этой даты." -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "Целевая дата для сборки. Сборка будет п #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "Целевая дата для сборки. Сборка будет п #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "Количество" @@ -522,7 +522,7 @@ msgstr "Подтвердите снятие со склада" #: build/forms.py:169 msgid "Confirm stock allocation" -msgstr "" +msgstr "Подтвердите выделение запасов" #: build/forms.py:186 msgid "Mark build as complete" @@ -534,7 +534,7 @@ msgstr "Пометить сборку как завершенную" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "Расположение" @@ -543,19 +543,19 @@ msgid "Location of completed parts" msgstr "Расположение укомплектованных частей" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "Статус" #: build/forms.py:216 msgid "Build output stock status" -msgstr "" +msgstr "Создать статус склада вывода" #: build/forms.py:223 msgid "Confirm incomplete" @@ -563,30 +563,30 @@ msgstr "Подтвердите незавершенность" #: build/forms.py:224 msgid "Confirm completion with incomplete stock allocation" -msgstr "" +msgstr "Подтвердите завершение с неполным выделением запасов" #: build/forms.py:227 msgid "Confirm build completion" -msgstr "" +msgstr "Подтвердите завершение сборки" #: build/forms.py:252 msgid "Confirm cancel" -msgstr "" +msgstr "Подтвердите отмену" #: build/forms.py:252 build/views.py:66 msgid "Confirm build cancellation" -msgstr "" +msgstr "Подтвердите отмену сборки" #: build/forms.py:266 msgid "Select quantity of stock to allocate" -msgstr "" +msgstr "Выберите количество запасов для распределения" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 msgid "Build Order" -msgstr "" +msgstr "Порядок сборки" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 @@ -596,14 +596,14 @@ msgstr "" #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" -msgstr "" +msgstr "Порядок сборки" #: build/models.py:127 msgid "Build Order Reference" -msgstr "" +msgstr "Ссылка на заказ" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "" @@ -702,7 +702,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "" @@ -710,16 +710,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "" @@ -809,11 +809,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -826,17 +826,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "" @@ -916,7 +916,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" @@ -1250,7 +1250,7 @@ msgstr "" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "" @@ -1898,7 +1898,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" @@ -2022,7 +2022,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "" @@ -2165,11 +2165,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "" @@ -2215,7 +2215,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "" @@ -2262,7 +2262,7 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "" @@ -2385,7 +2385,7 @@ msgstr "" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2441,7 +2441,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2598,7 +2598,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2712,7 +2712,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2724,209 +2724,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2977,8 +2977,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "" @@ -3162,21 +3162,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4064,7 +4068,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4173,7 +4177,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4314,7 +4318,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4408,7 +4412,7 @@ msgstr "" msgid "Part Details" msgstr "" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "" @@ -4551,51 +4555,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4634,7 +4638,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4740,7 +4744,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4849,7 +4853,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5160,17 +5164,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5192,7 +5196,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5282,187 +5286,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6580,7 +6584,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6831,7 +6835,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7029,75 +7033,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/locale/tr/LC_MESSAGES/django.po b/InvenTree/locale/tr/LC_MESSAGES/django.po index 6934e3e8c4..e30c1ed591 100644 --- a/InvenTree/locale/tr/LC_MESSAGES/django.po +++ b/InvenTree/locale/tr/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-01 10:22\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:41\n" "Last-Translator: \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -77,7 +77,7 @@ msgstr "Kategori Seçin" msgid "Duplicate serial: {n}" msgstr "Tekrarlanan seri {n}" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "Geçersiz veri sağlandı" @@ -106,7 +106,7 @@ msgstr "Seri numarası bulunamadı" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "Benzersiz serinin numaraları ({s}) miktarla eşleşmeli ({q})" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "Ek" @@ -124,7 +124,7 @@ msgstr "Yorum" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "Kullanıcı" @@ -136,7 +136,7 @@ msgstr "Yükleme tarihi" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "Adı" @@ -146,7 +146,7 @@ msgstr "Adı" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "Adı" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "Açıklama" @@ -372,27 +372,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -458,17 +458,17 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "" #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "" #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "" @@ -534,7 +534,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "" @@ -543,13 +543,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "" @@ -602,8 +602,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "" @@ -702,7 +702,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "" @@ -710,16 +710,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "" @@ -809,11 +809,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -826,17 +826,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "" @@ -916,7 +916,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" @@ -1250,7 +1250,7 @@ msgstr "" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "" @@ -1898,7 +1898,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" @@ -2022,7 +2022,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "" @@ -2165,11 +2165,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "" @@ -2215,7 +2215,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "" @@ -2262,7 +2262,7 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "" @@ -2385,7 +2385,7 @@ msgstr "" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2441,7 +2441,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2598,7 +2598,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2712,7 +2712,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2724,209 +2724,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2977,8 +2977,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "" @@ -3162,21 +3162,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4064,7 +4068,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4173,7 +4177,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4314,7 +4318,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4408,7 +4412,7 @@ msgstr "" msgid "Part Details" msgstr "" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "" @@ -4551,51 +4555,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4634,7 +4638,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4740,7 +4744,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4849,7 +4853,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5160,17 +5164,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5192,7 +5196,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5282,187 +5286,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6580,7 +6584,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6831,7 +6835,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7029,75 +7033,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/locale/zh/LC_MESSAGES/django.po b/InvenTree/locale/zh/LC_MESSAGES/django.po index b1ea2924c9..9892439445 100644 --- a/InvenTree/locale/zh/LC_MESSAGES/django.po +++ b/InvenTree/locale/zh/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-01 10:07+0000\n" -"PO-Revision-Date: 2021-06-01 10:22\n" +"POT-Creation-Date: 2021-06-16 22:40+0000\n" +"PO-Revision-Date: 2021-06-16 22:41\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -77,7 +77,7 @@ msgstr "选择分类" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:245 order/models.py:355 +#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -106,7 +106,7 @@ msgstr "未找到序列号" msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1761 +#: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" msgstr "附件" @@ -124,7 +124,7 @@ msgstr "文件注释" #: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1149 +#: templates/js/stock.js:1154 msgid "User" msgstr "用户" @@ -136,7 +136,7 @@ msgstr "上传日期" #: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 #: report/models.py:179 templates/InvenTree/search.html:137 #: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:942 +#: templates/js/part.js:641 templates/js/stock.js:947 msgid "Name" msgstr "名称" @@ -146,7 +146,7 @@ msgstr "名称" #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:101 order/templates/order/purchase_order_detail.html:143 +#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 #: part/models.py:710 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:192 #: report/models.py:505 report/models.py:544 @@ -158,8 +158,8 @@ msgstr "名称" #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:954 -#: templates/js/stock.js:999 +#: templates/js/stock.js:552 templates/js/stock.js:959 +#: templates/js/stock.js:1004 msgid "Description" msgstr "" @@ -372,27 +372,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:592 +#: InvenTree/views.py:605 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:641 +#: InvenTree/views.py:654 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:656 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:667 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:686 +#: InvenTree/views.py:699 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:937 templates/navbar.html:95 +#: InvenTree/views.py:950 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -458,17 +458,17 @@ msgstr "" msgid "Target date for build completion. Build will be overdue after this date." msgstr "" -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1333 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 #: build/templates/build/detail.html:31 common/models.py:699 #: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 #: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:614 order/models.py:815 +#: order/forms.py:279 order/models.py:616 order/models.py:817 #: order/templates/order/order_wizard/match_parts.html:29 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:175 +#: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 @@ -477,7 +477,7 @@ msgstr "" #: part/templates/part/allocation.html:19 #: part/templates/part/allocation.html:53 #: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:12 +#: part/templates/part/part_pricing.html:13 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,8 +487,8 @@ msgstr "" #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 #: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1134 -#: templates/js/stock.js:1353 +#: templates/js/part.js:795 templates/js/stock.js:1139 +#: templates/js/stock.js:1358 msgid "Quantity" msgstr "" @@ -534,7 +534,7 @@ msgstr "" #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1026 +#: templates/js/stock.js:639 templates/js/stock.js:1031 msgid "Location" msgstr "" @@ -543,13 +543,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:466 +#: build/templates/build/detail.html:59 order/models.py:468 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 #: templates/js/barcode.js:119 templates/js/build.js:780 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1103 -#: templates/js/stock.js:1369 +#: templates/js/stock.js:626 templates/js/stock.js:1108 +#: templates/js/stock.js:1374 msgid "Status" msgstr "" @@ -602,8 +602,8 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:99 order/models.py:616 -#: order/templates/order/purchase_order_detail.html:170 +#: build/models.py:128 order/models.py:101 order/models.py:618 +#: order/templates/order/purchase_order_detail.html:174 #: order/templates/order/sales_order_detail.html:225 part/models.py:2279 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 @@ -627,15 +627,15 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 #: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:658 order/models.py:691 +#: order/models.py:660 order/models.py:693 #: order/templates/order/order_wizard/select_parts.html:30 -#: order/templates/order/purchase_order_detail.html:131 +#: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 #: order/templates/order/sales_order_detail.html:213 part/models.py:321 #: part/models.py:1967 part/models.py:1979 part/models.py:1997 #: part/models.py:2072 part/models.py:2168 part/models.py:2254 #: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:8 part/templates/part/related.html:29 +#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 @@ -646,7 +646,7 @@ msgstr "" #: templates/js/build.js:991 templates/js/company.js:140 #: templates/js/company.js:238 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1346 msgid "Part" msgstr "" @@ -702,7 +702,7 @@ msgstr "" msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:464 +#: build/models.py:213 stock/models.py:466 msgid "Batch Code" msgstr "" @@ -710,16 +710,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:105 part/models.py:882 +#: build/models.py:220 order/models.py:107 part/models.py:882 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:472 +#: build/models.py:224 order/models.py:474 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:218 templates/js/build.js:798 +#: build/models.py:228 order/models.py:220 templates/js/build.js:798 msgid "Completion Date" msgstr "" @@ -736,7 +736,7 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:119 +#: build/templates/build/detail.html:105 order/models.py:121 #: order/templates/order/order_base.html:138 #: order/templates/order/sales_order_base.html:140 part/models.py:886 #: report/templates/report/inventree_build_order_base.html:159 @@ -753,30 +753,30 @@ msgstr "" #: company/templates/company/supplier_part_base.html:78 #: company/templates/company/supplier_part_detail.html:28 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 -#: stock/models.py:458 stock/templates/stock/item_base.html:345 +#: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:460 +#: build/models.py:258 part/models.py:744 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 #: company/models.py:132 company/models.py:498 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:123 -#: order/models.py:618 order/templates/order/po_navbar.html:29 +#: company/templates/company/navbar.html:73 order/models.py:125 +#: order/models.py:620 order/templates/order/po_navbar.html:29 #: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:209 +#: order/templates/order/purchase_order_detail.html:239 #: order/templates/order/sales_order_detail.html:278 #: order/templates/order/so_navbar.html:33 #: order/templates/order/so_navbar.html:36 part/models.py:871 #: part/templates/part/navbar.html:134 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:530 stock/models.py:1665 stock/models.py:1767 +#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:669 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 msgid "Notes" msgstr "" @@ -809,11 +809,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:789 +#: build/models.py:1188 order/models.py:791 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:792 +#: build/models.py:1192 order/models.py:794 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -826,17 +826,17 @@ msgstr "" msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1303 stock/templates/stock/item_base.html:317 +#: build/models.py:1316 stock/templates/stock/item_base.html:317 #: templates/InvenTree/search.html:183 templates/js/build.js:724 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1304 +#: build/models.py:1317 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1320 part/templates/part/allocation.html:18 +#: build/models.py:1333 part/templates/part/allocation.html:18 #: part/templates/part/allocation.html:24 #: part/templates/part/allocation.html:31 #: part/templates/part/allocation.html:49 @@ -844,23 +844,23 @@ msgstr "" #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1085 +#: templates/js/stock.js:1090 msgid "Stock Item" msgstr "" -#: build/models.py:1321 +#: build/models.py:1334 msgid "Source stock item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1347 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1342 +#: build/models.py:1355 msgid "Install into" msgstr "" -#: build/models.py:1343 +#: build/models.py:1356 msgid "Destination stock item" msgstr "" @@ -916,7 +916,7 @@ msgstr "" #: order/templates/order/sales_order_detail.html:75 #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:452 stock/templates/stock/item_base.html:249 +#: stock/models.py:454 stock/templates/stock/item_base.html:249 #: templates/js/build.js:484 msgid "Serial Number" msgstr "" @@ -1037,7 +1037,7 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:689 +#: build/templates/build/detail.html:84 order/models.py:691 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 @@ -1195,7 +1195,7 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1376 templates/js/table_filters.js:112 +#: templates/js/stock.js:1381 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" @@ -1250,7 +1250,7 @@ msgstr "" #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:14 #: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1014 +#: templates/js/stock.js:1019 msgid "Details" msgstr "" @@ -1898,7 +1898,7 @@ msgstr "" #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:158 part/bom.py:171 +#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 #: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 msgid "MPN" msgstr "" @@ -1953,7 +1953,7 @@ msgid "Point of contact" msgstr "" #: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:103 part/models.py:743 +#: order/models.py:105 part/models.py:743 #: report/templates/report/inventree_build_order_base.html:165 #: templates/js/company.js:188 templates/js/company.js:318 #: templates/js/part.js:497 @@ -1992,7 +1992,7 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:405 +#: company/models.py:305 company/models.py:456 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" @@ -2022,7 +2022,7 @@ msgstr "" #: company/models.py:466 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:190 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 #: part/bom.py:286 stock/templates/stock/item_base.html:364 @@ -2037,7 +2037,7 @@ msgstr "" #: company/models.py:472 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:149 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" @@ -2081,8 +2081,8 @@ msgid "Minimum charge (e.g. stocking fee)" msgstr "" #: company/models.py:503 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:429 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:665 +#: stock/models.py:431 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:670 msgid "Packaging" msgstr "" @@ -2165,11 +2165,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:461 -#: order/templates/order/sales_order_base.html:94 stock/models.py:447 -#: stock/models.py:448 stock/templates/stock/item_base.html:262 +#: company/templates/company/detail.html:67 order/models.py:463 +#: order/templates/order/sales_order_base.html:94 stock/models.py:449 +#: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1067 +#: templates/js/stock.js:1072 msgid "Customer" msgstr "" @@ -2215,7 +2215,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1282 +#: templates/js/stock.js:1287 msgid "New Part" msgstr "" @@ -2262,7 +2262,7 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1288 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 msgid "New Supplier Part" msgstr "" @@ -2385,7 +2385,7 @@ msgstr "" #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:966 +#: templates/InvenTree/search.html:198 templates/js/stock.js:971 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2441,7 +2441,7 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:414 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 #: stock/templates/stock/item_base.html:369 templates/js/company.js:279 msgid "Supplier Part" msgstr "" @@ -2598,7 +2598,7 @@ msgstr "" msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1289 +#: company/views.py:578 templates/js/stock.js:1294 msgid "Create new Supplier Part" msgstr "" @@ -2712,7 +2712,7 @@ msgstr "" msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:473 +#: order/forms.py:145 order/models.py:475 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" @@ -2724,209 +2724,209 @@ msgstr "" msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:99 +#: order/models.py:101 msgid "Order reference" msgstr "" -#: order/models.py:101 +#: order/models.py:103 msgid "Order description" msgstr "" -#: order/models.py:103 +#: order/models.py:105 msgid "Link to external page" msgstr "" -#: order/models.py:111 part/templates/part/detail.html:132 +#: order/models.py:113 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:118 +#: order/models.py:120 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:123 +#: order/models.py:125 msgid "Order notes" msgstr "" -#: order/models.py:182 order/models.py:466 +#: order/models.py:184 order/models.py:468 msgid "Purchase order status" msgstr "" -#: order/models.py:191 +#: order/models.py:193 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:194 order/templates/order/order_base.html:98 +#: order/models.py:196 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:194 +#: order/models.py:196 msgid "Supplier order reference code" msgstr "" -#: order/models.py:201 +#: order/models.py:203 msgid "received by" msgstr "" -#: order/models.py:206 +#: order/models.py:208 msgid "Issue Date" msgstr "" -#: order/models.py:207 +#: order/models.py:209 msgid "Date order was issued" msgstr "" -#: order/models.py:212 +#: order/models.py:214 msgid "Target Delivery Date" msgstr "" -#: order/models.py:213 +#: order/models.py:215 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:219 +#: order/models.py:221 msgid "Date order was completed" msgstr "" -#: order/models.py:243 part/views.py:1675 stock/models.py:302 -#: stock/models.py:1018 +#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:248 +#: order/models.py:250 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:346 +#: order/models.py:348 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:350 +#: order/models.py:352 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:352 +#: order/models.py:354 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:462 +#: order/models.py:464 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer Reference " msgstr "" -#: order/models.py:468 +#: order/models.py:470 msgid "Customer order reference code" msgstr "" -#: order/models.py:476 templates/js/order.js:303 +#: order/models.py:478 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:483 +#: order/models.py:485 msgid "shipped by" msgstr "" -#: order/models.py:527 +#: order/models.py:529 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:614 +#: order/models.py:616 msgid "Item quantity" msgstr "" -#: order/models.py:616 +#: order/models.py:618 msgid "Line item reference" msgstr "" -#: order/models.py:618 +#: order/models.py:620 msgid "Line item notes" msgstr "" -#: order/models.py:644 order/models.py:689 +#: order/models.py:646 order/models.py:691 #: part/templates/part/allocation.html:17 #: part/templates/part/allocation.html:45 msgid "Order" msgstr "" -#: order/models.py:645 order/templates/order/order_base.html:9 +#: order/models.py:647 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1048 +#: templates/js/stock.js:1053 msgid "Purchase Order" msgstr "" -#: order/models.py:659 +#: order/models.py:661 msgid "Supplier part" msgstr "" -#: order/models.py:662 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:189 +#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:662 +#: order/models.py:664 msgid "Number of items received" msgstr "" -#: order/models.py:669 stock/models.py:540 -#: stock/templates/stock/item_base.html:331 +#: order/models.py:671 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 msgid "Purchase Price" msgstr "" -#: order/models.py:670 +#: order/models.py:672 msgid "Unit purchase price" msgstr "" -#: order/models.py:698 part/templates/part/navbar.html:101 +#: order/models.py:700 part/templates/part/navbar.html:101 #: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:77 +#: part/templates/part/part_pricing.html:78 msgid "Sale Price" msgstr "" -#: order/models.py:699 +#: order/models.py:701 msgid "Unit sale price" msgstr "" -#: order/models.py:774 order/models.py:776 +#: order/models.py:776 order/models.py:778 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:780 +#: order/models.py:782 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:782 +#: order/models.py:784 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:785 +#: order/models.py:787 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:795 +#: order/models.py:797 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:800 +#: order/models.py:802 msgid "Line" msgstr "" -#: order/models.py:811 +#: order/models.py:813 msgid "Item" msgstr "" -#: order/models.py:812 +#: order/models.py:814 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:815 +#: order/models.py:817 msgid "Enter stock allocation quantity" msgstr "" @@ -2977,8 +2977,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:706 -#: templates/js/stock.js:1294 +#: stock/templates/stock/location.html:191 templates/js/stock.js:711 +#: templates/js/stock.js:1299 msgid "New Location" msgstr "" @@ -3162,21 +3162,25 @@ msgstr "" msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:180 +#: order/templates/order/purchase_order_detail.html:191 #: order/templates/order/sales_order_detail.html:235 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:221 +#: order/templates/order/purchase_order_detail.html:198 +msgid "Total price" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:251 #: order/templates/order/sales_order_detail.html:328 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:222 +#: order/templates/order/purchase_order_detail.html:252 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:227 +#: order/templates/order/purchase_order_detail.html:257 msgid "Receive line item" msgstr "" @@ -4064,7 +4068,7 @@ msgid "Stock items for variant parts can be used for this BOM item" msgstr "" #: part/models.py:2371 part/views.py:1681 part/views.py:1733 -#: stock/models.py:292 +#: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" @@ -4173,7 +4177,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1283 +#: templates/js/stock.js:1288 msgid "Create New Part" msgstr "" @@ -4314,7 +4318,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:707 +#: stock/templates/stock/location.html:192 templates/js/stock.js:712 msgid "Create new location" msgstr "" @@ -4408,7 +4412,7 @@ msgstr "" msgid "Part Details" msgstr "" -#: part/templates/part/detail.html:42 +#: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" msgstr "" @@ -4551,51 +4555,51 @@ msgid "Pricing ranges" msgstr "" #: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:18 +#: part/templates/part/part_pricing.html:19 msgid "Supplier Pricing" msgstr "" #: part/templates/part/order_prices.html:27 #: part/templates/part/order_prices.html:52 #: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:22 -#: part/templates/part/part_pricing.html:48 -#: part/templates/part/part_pricing.html:80 +#: part/templates/part/part_pricing.html:23 +#: part/templates/part/part_pricing.html:49 +#: part/templates/part/part_pricing.html:81 msgid "Unit Cost" msgstr "" #: part/templates/part/order_prices.html:34 #: part/templates/part/order_prices.html:59 #: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:28 -#: part/templates/part/part_pricing.html:54 -#: part/templates/part/part_pricing.html:84 +#: part/templates/part/part_pricing.html:29 +#: part/templates/part/part_pricing.html:55 +#: part/templates/part/part_pricing.html:85 msgid "Total Cost" msgstr "" #: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:36 +#: part/templates/part/part_pricing.html:37 msgid "No supplier pricing available" msgstr "" #: part/templates/part/order_prices.html:51 #: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:44 +#: part/templates/part/part_pricing.html:45 msgid "BOM Pricing" msgstr "" #: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:62 +#: part/templates/part/part_pricing.html:63 msgid "Note: BOM pricing is incomplete for this part" msgstr "" #: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:69 +#: part/templates/part/part_pricing.html:70 msgid "No BOM pricing available" msgstr "" #: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:93 +#: part/templates/part/part_pricing.html:94 msgid "No pricing information is available for this part." msgstr "" @@ -4634,7 +4638,7 @@ msgstr "" #: part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1754 templates/InvenTree/settings/header.html:8 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 #: templates/js/stock.js:137 msgid "Value" msgstr "" @@ -4740,7 +4744,7 @@ msgstr "" msgid "Building" msgstr "" -#: part/templates/part/part_base.html:257 +#: part/templates/part/part_base.html:265 msgid "Calculate" msgstr "" @@ -4849,7 +4853,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:97 +#: part/templatetags/inventree_extras.py:98 msgid "Unknown database" msgstr "" @@ -5160,17 +5164,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1742 +#: stock/models.py:1744 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1748 +#: stock/models.py:1750 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:982 +#: templates/js/order.js:195 templates/js/stock.js:987 msgid "Date" msgstr "" @@ -5192,7 +5196,7 @@ msgstr "" msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:507 +#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 #: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 msgid "Expiry Date" msgstr "" @@ -5282,187 +5286,187 @@ msgstr "" msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:54 stock/models.py:545 +#: stock/models.py:56 stock/models.py:547 msgid "Owner" msgstr "" -#: stock/models.py:55 stock/models.py:546 +#: stock/models.py:57 stock/models.py:548 msgid "Select Owner" msgstr "" -#: stock/models.py:273 +#: stock/models.py:275 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:309 +#: stock/models.py:311 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:319 stock/models.py:328 +#: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:320 +#: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:342 +#: stock/models.py:344 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:348 +#: stock/models.py:350 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:355 +#: stock/models.py:357 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:397 +#: stock/models.py:399 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:406 +#: stock/models.py:408 msgid "Base part" msgstr "" -#: stock/models.py:415 +#: stock/models.py:417 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:420 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:423 +#: stock/models.py:425 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:430 +#: stock/models.py:432 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:435 stock/templates/stock/item_base.html:270 +#: stock/models.py:437 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:438 +#: stock/models.py:440 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:454 +#: stock/models.py:456 msgid "Serial number for this item" msgstr "" -#: stock/models.py:466 +#: stock/models.py:468 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:470 +#: stock/models.py:472 msgid "Stock Quantity" msgstr "" -#: stock/models.py:479 +#: stock/models.py:481 msgid "Source Build" msgstr "" -#: stock/models.py:481 +#: stock/models.py:483 msgid "Build for this stock item" msgstr "" -#: stock/models.py:492 +#: stock/models.py:494 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:495 +#: stock/models.py:497 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:501 +#: stock/models.py:503 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:508 +#: stock/models.py:510 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete on deplete" msgstr "" -#: stock/models.py:521 +#: stock/models.py:523 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:531 stock/templates/stock/item_notes.html:13 +#: stock/models.py:533 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:541 +#: stock/models.py:543 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1009 +#: stock/models.py:1011 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1015 +#: stock/models.py:1017 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1021 +#: stock/models.py:1023 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1024 +#: stock/models.py:1026 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1027 +#: stock/models.py:1029 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1034 +#: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1192 +#: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1666 +#: stock/models.py:1668 msgid "Entry notes" msgstr "" -#: stock/models.py:1719 +#: stock/models.py:1721 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1725 +#: stock/models.py:1727 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1743 +#: stock/models.py:1745 msgid "Test name" msgstr "" -#: stock/models.py:1749 templates/js/table_filters.js:217 +#: stock/models.py:1751 templates/js/table_filters.js:217 msgid "Test result" msgstr "" -#: stock/models.py:1755 +#: stock/models.py:1757 msgid "Test output value" msgstr "" -#: stock/models.py:1762 +#: stock/models.py:1764 msgid "Test result attachment" msgstr "" -#: stock/models.py:1768 +#: stock/models.py:1770 msgid "Test notes" msgstr "" @@ -6580,7 +6584,7 @@ msgid "No builds matching query" msgstr "" #: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:936 +#: templates/js/stock.js:509 templates/js/stock.js:941 msgid "Select" msgstr "" @@ -6831,7 +6835,7 @@ msgstr "" msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:960 +#: templates/js/part.js:659 templates/js/stock.js:965 msgid "Path" msgstr "" @@ -7029,75 +7033,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:823 +#: templates/js/stock.js:828 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:838 +#: templates/js/stock.js:843 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:852 +#: templates/js/stock.js:857 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:858 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:992 +#: templates/js/stock.js:997 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1039 +#: templates/js/stock.js:1044 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1058 +#: templates/js/stock.js:1063 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1077 +#: templates/js/stock.js:1082 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1095 +#: templates/js/stock.js:1100 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1118 +#: templates/js/stock.js:1123 msgid "Added" msgstr "" -#: templates/js/stock.js:1126 +#: templates/js/stock.js:1131 msgid "Removed" msgstr "" -#: templates/js/stock.js:1158 +#: templates/js/stock.js:1163 msgid "No user information" msgstr "" -#: templates/js/stock.js:1170 +#: templates/js/stock.js:1175 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1171 +#: templates/js/stock.js:1176 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1295 +#: templates/js/stock.js:1300 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1336 +#: templates/js/stock.js:1341 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1359 +#: templates/js/stock.js:1364 msgid "Serial" msgstr "" -#: templates/js/stock.js:1387 +#: templates/js/stock.js:1392 msgid "Uninstall Stock Item" msgstr "" diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index 7eda59eacb..6661bd568b 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -22,9 +22,10 @@ from .models import PurchaseOrder, PurchaseOrderLineItem from .models import PurchaseOrderAttachment from .serializers import POSerializer, POLineItemSerializer, POAttachmentSerializer -from .models import SalesOrder, SalesOrderLineItem +from .models import SalesOrder, SalesOrderLineItem, SalesOrderAllocation from .models import SalesOrderAttachment from .serializers import SalesOrderSerializer, SOLineItemSerializer, SOAttachmentSerializer +from .serializers import SalesOrderAllocationSerializer class POList(generics.ListCreateAPIView): @@ -422,17 +423,11 @@ class SOLineItemList(generics.ListCreateAPIView): def get_serializer(self, *args, **kwargs): try: - kwargs['part_detail'] = str2bool(self.request.query_params.get('part_detail', False)) - except AttributeError: - pass + params = self.request.query_params - try: - kwargs['order_detail'] = str2bool(self.request.query_params.get('order_detail', False)) - except AttributeError: - pass - - try: - kwargs['allocations'] = str2bool(self.request.query_params.get('allocations', False)) + kwargs['part_detail'] = str2bool(params.get('part_detail', False)) + kwargs['order_detail'] = str2bool(params.get('order_detail', False)) + kwargs['allocations'] = str2bool(params.get('allocations', False)) except AttributeError: pass @@ -486,6 +481,70 @@ class SOLineItemDetail(generics.RetrieveUpdateAPIView): serializer_class = SOLineItemSerializer +class SOAllocationList(generics.ListCreateAPIView): + """ + API endpoint for listing SalesOrderAllocation objects + """ + + queryset = SalesOrderAllocation.objects.all() + serializer_class = SalesOrderAllocationSerializer + + def get_serializer(self, *args, **kwargs): + + try: + params = self.request.query_params + + kwargs['part_detail'] = str2bool(params.get('part_detail', False)) + kwargs['item_detail'] = str2bool(params.get('item_detail', False)) + kwargs['order_detail'] = str2bool(params.get('order_detail', False)) + kwargs['location_detail'] = str2bool(params.get('location_detail', False)) + except AttributeError: + pass + + return self.serializer_class(*args, **kwargs) + + def filter_queryset(self, queryset): + + queryset = super().filter_queryset(queryset) + + # Filter by order + params = self.request.query_params + + # Filter by "part" reference + part = params.get('part', None) + + if part is not None: + queryset = queryset.filter(item__part=part) + + # Filter by "order" reference + order = params.get('order', None) + + if order is not None: + queryset = queryset.filter(line__order=order) + + # Filter by "outstanding" order status + outstanding = params.get('outstanding', None) + + if outstanding is not None: + outstanding = str2bool(outstanding) + + if outstanding: + queryset = queryset.filter(line__order__status__in=SalesOrderStatus.OPEN) + else: + queryset = queryset.exclude(line__order__status__in=SalesOrderStatus.OPEN) + + return queryset + + filter_backends = [ + DjangoFilterBackend, + ] + + # Default filterable fields + filter_fields = [ + 'item', + ] + + class POAttachmentList(generics.ListCreateAPIView, AttachmentMixin): """ API endpoint for listing (and creating) a PurchaseOrderAttachment (file upload) @@ -494,10 +553,6 @@ class POAttachmentList(generics.ListCreateAPIView, AttachmentMixin): queryset = PurchaseOrderAttachment.objects.all() serializer_class = POAttachmentSerializer - filter_fields = [ - 'order', - ] - order_api_urls = [ # API endpoints for purchase orders @@ -512,14 +567,26 @@ order_api_urls = [ url(r'^po-line/$', POLineItemList.as_view(), name='api-po-line-list'), # API endpoints for sales ordesr - url(r'^so/(?P\d+)/$', SODetail.as_view(), name='api-so-detail'), - url(r'so/attachment/', include([ - url(r'^.*$', SOAttachmentList.as_view(), name='api-so-attachment-list'), + url(r'^so/', include([ + url(r'^(?P\d+)/$', SODetail.as_view(), name='api-so-detail'), + url(r'attachment/', include([ + url(r'^.*$', SOAttachmentList.as_view(), name='api-so-attachment-list'), + ])), + + # List all sales orders + url(r'^.*$', SOList.as_view(), name='api-so-list'), ])), - url(r'^so/.*$', SOList.as_view(), name='api-so-list'), - # API endpoints for sales order line items - url(r'^so-line/(?P\d+)/$', SOLineItemDetail.as_view(), name='api-so-line-detail'), - url(r'^so-line/$', SOLineItemList.as_view(), name='api-so-line-list'), + url(r'^so-line/', include([ + url(r'^(?P\d+)/$', SOLineItemDetail.as_view(), name='api-so-line-detail'), + url(r'^$', SOLineItemList.as_view(), name='api-so-line-list'), + ])), + + # API endpoints for sales order allocations + url(r'^so-allocation', include([ + + # List all sales order allocations + url(r'^.*$', SOAllocationList.as_view(), name='api-so-allocation-list'), + ])), ] diff --git a/InvenTree/order/fixtures/order.yaml b/InvenTree/order/fixtures/order.yaml index 6b65c20786..769f7702e5 100644 --- a/InvenTree/order/fixtures/order.yaml +++ b/InvenTree/order/fixtures/order.yaml @@ -68,6 +68,7 @@ order: 1 part: 1 quantity: 100 + destination: 5 # Desk/Drawer_1 # 250 x ACME0002 (M2x4 LPHS) # Partially received (50) @@ -95,3 +96,10 @@ part: 3 quantity: 100 +# 1 x R_4K7_0603 +- model: order.purchaseorderlineitem + pk: 23 + fields: + order: 1 + part: 5 + quantity: 1 diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index ceb633688a..48b5245a5f 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -86,12 +86,17 @@ class ShipSalesOrderForm(HelperForm): class ReceivePurchaseOrderForm(HelperForm): - location = TreeNodeChoiceField(queryset=StockLocation.objects.all(), required=True, label=_('Location'), help_text=_('Receive parts to this location')) + location = TreeNodeChoiceField( + queryset=StockLocation.objects.all(), + required=True, + label=_("Destination"), + help_text=_("Receive parts to this location"), + ) class Meta: model = PurchaseOrder fields = [ - 'location', + "location", ] @@ -202,6 +207,7 @@ class EditPurchaseOrderLineItemForm(HelperForm): 'quantity', 'reference', 'purchase_price', + 'destination', 'notes', ] diff --git a/InvenTree/order/migrations/0046_purchaseorderlineitem_destination.py b/InvenTree/order/migrations/0046_purchaseorderlineitem_destination.py new file mode 100644 index 0000000000..fa08c91e0d --- /dev/null +++ b/InvenTree/order/migrations/0046_purchaseorderlineitem_destination.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2 on 2021-05-13 22:38 + +from django.db import migrations +import django.db.models.deletion +import mptt.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ("stock", "0063_auto_20210511_2343"), + ("order", "0045_auto_20210504_1946"), + ] + + operations = [ + migrations.AddField( + model_name="purchaseorderlineitem", + name="destination", + field=mptt.fields.TreeForeignKey( + blank=True, + help_text="Where does the Purchaser want this item to be stored?", + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="po_lines", + to="stock.stocklocation", + verbose_name="Destination", + ), + ), + ] diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 49504b6d89..c150331f94 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -20,6 +20,7 @@ from django.utils.translation import ugettext_lazy as _ from common.settings import currency_code_default from markdownx.models import MarkdownxField +from mptt.models import TreeForeignKey from djmoney.models.fields import MoneyField @@ -672,6 +673,29 @@ class PurchaseOrderLineItem(OrderLineItem): help_text=_('Unit purchase price'), ) + destination = TreeForeignKey( + 'stock.StockLocation', on_delete=models.DO_NOTHING, + verbose_name=_('Destination'), + related_name='po_lines', + blank=True, null=True, + help_text=_('Where does the Purchaser want this item to be stored?') + ) + + def get_destination(self): + """Show where the line item is or should be placed""" + # NOTE: If a line item gets split when recieved, only an arbitrary + # stock items location will be reported as the location for the + # entire line. + for stock in stock_models.StockItem.objects.filter( + supplier_part=self.part, purchase_order=self.order + ): + if stock.location: + return stock.location + if self.destination: + return self.destination + if self.part and self.part.part and self.part.part.default_location: + return self.part.part.default_location + def remaining(self): """ Calculate the number of items remaining to be received """ r = self.quantity - self.received diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index 6091140313..9efbf947bb 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -17,6 +17,8 @@ from InvenTree.serializers import InvenTreeAttachmentSerializerField from company.serializers import CompanyBriefSerializer, SupplierPartSerializer from part.serializers import PartBriefSerializer +from stock.serializers import LocationBriefSerializer +from stock.serializers import StockItemSerializer, LocationSerializer from .models import PurchaseOrder, PurchaseOrderLineItem from .models import PurchaseOrderAttachment, SalesOrderAttachment @@ -41,7 +43,7 @@ class POSerializer(InvenTreeModelSerializer): """ Add extra information to the queryset - - Number of liens in the PurchaseOrder + - Number of lines in the PurchaseOrder - Overdue status of the PurchaseOrder """ @@ -116,6 +118,8 @@ class POLineItemSerializer(InvenTreeModelSerializer): purchase_price_string = serializers.CharField(source='purchase_price', read_only=True) + destination = LocationBriefSerializer(source='get_destination', read_only=True) + class Meta: model = PurchaseOrderLineItem @@ -132,6 +136,7 @@ class POLineItemSerializer(InvenTreeModelSerializer): 'purchase_price', 'purchase_price_currency', 'purchase_price_string', + 'destination', ] @@ -232,11 +237,38 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer): This includes some fields from the related model objects. """ - location_path = serializers.CharField(source='get_location_path') - location_id = serializers.IntegerField(source='get_location') - serial = serializers.CharField(source='get_serial') - po = serializers.CharField(source='get_po') - quantity = serializers.FloatField() + part = serializers.PrimaryKeyRelatedField(source='item.part', read_only=True) + order = serializers.PrimaryKeyRelatedField(source='line.order', many=False, read_only=True) + serial = serializers.CharField(source='get_serial', read_only=True) + quantity = serializers.FloatField(read_only=True) + location = serializers.PrimaryKeyRelatedField(source='item.location', many=False, read_only=True) + + # Extra detail fields + order_detail = SalesOrderSerializer(source='line.order', many=False, read_only=True) + part_detail = PartBriefSerializer(source='item.part', many=False, read_only=True) + item_detail = StockItemSerializer(source='item', many=False, read_only=True) + location_detail = LocationSerializer(source='item.location', many=False, read_only=True) + + def __init__(self, *args, **kwargs): + + order_detail = kwargs.pop('order_detail', False) + part_detail = kwargs.pop('part_detail', False) + item_detail = kwargs.pop('item_detail', False) + location_detail = kwargs.pop('location_detail', False) + + super().__init__(*args, **kwargs) + + if not order_detail: + self.fields.pop('order_detail') + + if not part_detail: + self.fields.pop('part_detail') + + if not item_detail: + self.fields.pop('item_detail') + + if not location_detail: + self.fields.pop('location_detail') class Meta: model = SalesOrderAllocation @@ -246,10 +278,14 @@ class SalesOrderAllocationSerializer(InvenTreeModelSerializer): 'line', 'serial', 'quantity', - 'location_id', - 'location_path', - 'po', + 'location', + 'location_detail', 'item', + 'item_detail', + 'order', + 'order_detail', + 'part', + 'part_detail', ] diff --git a/InvenTree/order/templates/order/purchase_order_detail.html b/InvenTree/order/templates/order/purchase_order_detail.html index ef844409fd..0ad73923a2 100644 --- a/InvenTree/order/templates/order/purchase_order_detail.html +++ b/InvenTree/order/templates/order/purchase_order_detail.html @@ -117,6 +117,7 @@ $("#po-table").inventreeTable({ part_detail: true, }, url: "{% url 'api-po-line-list' %}", + showFooter: true, columns: [ { field: 'pk', @@ -137,6 +138,9 @@ $("#po-table").inventreeTable({ return '-'; } }, + footerFormatter: function() { + return '{% trans "Total" %}' + } }, { field: 'part_detail.description', @@ -172,7 +176,14 @@ $("#po-table").inventreeTable({ { sortable: true, field: 'quantity', - title: '{% trans "Quantity" %}' + title: '{% trans "Quantity" %}', + footerFormatter: function(data) { + return data.map(function (row) { + return +row['quantity'] + }).reduce(function (sum, i) { + return sum + i + }, 0) + } }, { sortable: true, @@ -182,6 +193,25 @@ $("#po-table").inventreeTable({ return row.purchase_price_string || row.purchase_price; } }, + { + sortable: true, + title: '{% trans "Total price" %}', + formatter: function(value, row) { + var total = row.purchase_price * row.quantity; + var formatter = new Intl.NumberFormat('en-US', {style: 'currency', currency: row.purchase_price_currency}); + return formatter.format(total) + }, + footerFormatter: function(data) { + var total = data.map(function (row) { + return +row['purchase_price']*row['quantity'] + }).reduce(function (sum, i) { + return sum + i + }, 0) + var currency = (data.slice(-1)[0] && data.slice(-1)[0].purchase_price_currency) || 'USD'; + var formatter = new Intl.NumberFormat('en-US', {style: 'currency', currency: currency}); + return formatter.format(total) + } + }, { sortable: true, field: 'received', @@ -204,6 +234,10 @@ $("#po-table").inventreeTable({ return (progressA < progressB) ? 1 : -1; } }, + { + field: 'destination.pathstring', + title: '{% trans "Destination" %}', + }, { field: 'notes', title: '{% trans "Notes" %}', diff --git a/InvenTree/order/templates/order/receive_parts.html b/InvenTree/order/templates/order/receive_parts.html index 35ce4b6513..bfddf01ce9 100644 --- a/InvenTree/order/templates/order/receive_parts.html +++ b/InvenTree/order/templates/order/receive_parts.html @@ -22,6 +22,7 @@ {% trans "Received" %} {% trans "Receive" %} {% trans "Status" %} + {% trans "Destination" %} {% for line in lines %} @@ -53,6 +54,9 @@ + + {{ line.get_destination }} + + + + +
      + +{% else %} +
      +

      {% trans "Permission Denied" %}

      + +
      + {% trans "You do not have permission to view this page." %} +
      +
      +{% endif %} +{% endblock %} + +{% block js_ready %} +{{ block.super }} + +{% settings_value "PART_INTERNAL_PRICE" as show_internal_price %} +{% if show_internal_price and roles.sales_order.view %} +function reloadPriceBreaks() { + $("#internal-price-break-table").bootstrapTable("refresh"); +} + +$('#new-internal-price-break').click(function() { + launchModalForm("{% url 'internal-price-break-create' %}", + { + success: reloadPriceBreaks, + data: { + part: {{ part.id }}, + } + } + ); +}); + +$('#internal-price-break-table').inventreeTable({ + name: 'internalprice', + formatNoMatches: function() { return "{% trans 'No internal price break information found' %}"; }, + queryParams: { + part: {{ part.id }}, + }, + url: "{% url 'api-part-internal-price-list' %}", + onPostBody: function() { + var table = $('#internal-price-break-table'); + + table.find('.button-internal-price-break-delete').click(function() { + var pk = $(this).attr('pk'); + + launchModalForm( + `/part/internal-price/${pk}/delete/`, + { + success: reloadPriceBreaks + } + ); + }); + + table.find('.button-internal-price-break-edit').click(function() { + var pk = $(this).attr('pk'); + + launchModalForm( + `/part/internal-price/${pk}/edit/`, + { + success: reloadPriceBreaks + } + ); + }); + }, + columns: [ + { + field: 'pk', + title: 'ID', + visible: false, + switchable: false, + }, + { + field: 'quantity', + title: '{% trans "Quantity" %}', + sortable: true, + }, + { + field: 'price', + title: '{% trans "Price" %}', + sortable: true, + formatter: function(value, row, index) { + var html = value; + + html += `
      ` + + html += makeIconButton('fa-edit icon-blue', 'button-internal-price-break-edit', row.pk, '{% trans "Edit internal price break" %}'); + html += makeIconButton('fa-trash-alt icon-red', 'button-internal-price-break-delete', row.pk, '{% trans "Delete internal price break" %}'); + + html += `
      `; + + return html; + } + }, + ] +}) + +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/navbar.html b/InvenTree/part/templates/part/navbar.html index d1ed7e3d21..c0bc4c96a3 100644 --- a/InvenTree/part/templates/part/navbar.html +++ b/InvenTree/part/templates/part/navbar.html @@ -2,6 +2,8 @@ {% load static %} {% load inventree_extras %} +{% settings_value "PART_INTERNAL_PRICE" as show_internal_price %} +
      • @@ -94,7 +96,13 @@
      • {% endif %} - {% if part.salable and roles.sales_order.view %} + {% if show_internal_price and roles.sales_order.view %} +
      • + + + {% trans "Internal Price" %} + +
      • diff --git a/InvenTree/part/templates/part/order_prices.html b/InvenTree/part/templates/part/order_prices.html index e165ee9c74..a9da632a33 100644 --- a/InvenTree/part/templates/part/order_prices.html +++ b/InvenTree/part/templates/part/order_prices.html @@ -14,8 +14,18 @@ {% block details %} {% default_currency as currency %} +{% settings_value "PART_INTERNAL_PRICE" as show_internal_price %} -{% crispy form %} + + {% csrf_token %} +
        +
        {{ form|crispy }}
        +
        + +
        +
        + +

        {% trans "Pricing ranges" %}

        @@ -77,6 +87,21 @@ {% endif %} {% endif %} +{% if show_internal_price and roles.sales_order.view %} +{% if total_internal_part_price %} + + {% trans 'Internal Price' %} + {% trans 'Unit Cost' %} + {% include "price.html" with price=unit_internal_part_price %} + + + + {% trans 'Total Cost' %} + {% include "price.html" with price=total_internal_part_price %} + +{% endif %} +{% endif %} + {% if total_part_price %} {% trans 'Sale Price' %} @@ -110,8 +135,8 @@ {% if price_history %}
        -

        {% trans 'Stock Pricing' %}

        +

        {% trans 'Stock Pricing' %}

        {% if price_history|length > 1 %}
        @@ -157,7 +182,8 @@ the part single price shown is the current price for that supplier part"> + + + {% trans "Latest Serial Number" %} + {{ part.getLatestSerialNumber }}{% include "clip.html"%} + + {% endif %}
        +{% block pre_content_panel %} + +{% endblock %} +
        +

        {% block heading %} @@ -202,7 +215,11 @@ {% endblock %}

        +
        +{% block post_content_panel %} + +{% endblock %} {% endblock %} diff --git a/InvenTree/part/templates/part/part_pricing.html b/InvenTree/part/templates/part/part_pricing.html index e035a77162..ce55124bd9 100644 --- a/InvenTree/part/templates/part/part_pricing.html +++ b/InvenTree/part/templates/part/part_pricing.html @@ -3,7 +3,10 @@ {% load i18n inventree_extras %} {% block pre_form_content %} + {% default_currency as currency %} +{% settings_value "PART_INTERNAL_PRICE" as show_internal_price %} + @@ -74,6 +77,22 @@
        {% trans 'Part' %}
        {% endif %} +{% if show_internal_price and roles.sales_order.view %} +{% if total_internal_part_price %} +

        {% trans 'Internal Price' %}

        + + + + + + + + + +
        {% trans 'Unit Cost' %}{% include "price.html" with price=unit_internal_part_price %}
        {% trans 'Total Cost' %}{% include "price.html" with price=total_internal_part_price %}
        +{% endif %} +{% endif %} + {% if total_part_price %}

        {% trans 'Sale Price' %}

        diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index 37cdb7106b..90e91e167f 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -210,9 +210,27 @@ def get_color_theme_css(username): @register.filter def keyvalue(dict, key): + """ + access to key of supplied dict + + usage: + {% mydict|keyvalue:mykey %} + """ return dict[key] +@register.simple_tag() +def call_method(obj, method_name, *args): + """ + enables calling model methods / functions from templates with arguments + + usage: + {% call_method model_object 'fnc_name' argument1 %} + """ + method = getattr(obj, method_name) + return method(*args) + + @register.simple_tag() def authorized_owners(group): """ Return authorized owners """ diff --git a/InvenTree/part/test_bom_item.py b/InvenTree/part/test_bom_item.py index 7e553be73a..66897b28fc 100644 --- a/InvenTree/part/test_bom_item.py +++ b/InvenTree/part/test_bom_item.py @@ -1,5 +1,6 @@ from django.test import TestCase import django.core.exceptions as django_exceptions +from decimal import Decimal from .models import Part, BomItem @@ -11,11 +12,16 @@ class BomItemTest(TestCase): 'part', 'location', 'bom', + 'company', + 'supplier_part', + 'part_pricebreaks', + 'price_breaks', ] def setUp(self): self.bob = Part.objects.get(id=100) self.orphan = Part.objects.get(name='Orphan') + self.r1 = Part.objects.get(name='R_2K2_0805') def test_str(self): b = BomItem.objects.get(id=1) @@ -111,3 +117,10 @@ class BomItemTest(TestCase): item.validate_hash() self.assertNotEqual(h1, h2) + + def test_pricing(self): + self.bob.get_price(1) + self.assertEqual(self.bob.get_bom_price_range(1, internal=True), (Decimal(84.5), Decimal(89.5))) + # remove internal price for R_2K2_0805 + self.r1.internal_price_breaks.delete() + self.assertEqual(self.bob.get_bom_price_range(1, internal=True), (Decimal(82.5), Decimal(87.5))) diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index cd8726ccf4..2bc24c3a99 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -51,6 +51,7 @@ class PartTest(TestCase): 'category', 'part', 'location', + 'part_pricebreaks' ] def setUp(self): @@ -113,6 +114,22 @@ class PartTest(TestCase): self.assertTrue(len(matches) > 0) + def test_sell_pricing(self): + # check that the sell pricebreaks were loaded + self.assertTrue(self.r1.has_price_breaks) + self.assertEqual(self.r1.price_breaks.count(), 2) + # check that the sell pricebreaks work + self.assertEqual(float(self.r1.get_price(1)), 0.15) + self.assertEqual(float(self.r1.get_price(10)), 1.0) + + def test_internal_pricing(self): + # check that the sell pricebreaks were loaded + self.assertTrue(self.r1.has_internal_price_breaks) + self.assertEqual(self.r1.internal_price_breaks.count(), 2) + # check that the sell pricebreaks work + self.assertEqual(float(self.r1.get_internal_price(1)), 0.08) + self.assertEqual(float(self.r1.get_internal_price(10)), 0.5) + class TestTemplateTest(TestCase): diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index a6ea35c37b..c35786e5d3 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -29,6 +29,12 @@ sale_price_break_urls = [ url(r'^(?P\d+)/delete/', views.PartSalePriceBreakDelete.as_view(), name='sale-price-break-delete'), ] +internal_price_break_urls = [ + url(r'^new/', views.PartInternalPriceBreakCreate.as_view(), name='internal-price-break-create'), + url(r'^(?P\d+)/edit/', views.PartInternalPriceBreakEdit.as_view(), name='internal-price-break-edit'), + url(r'^(?P\d+)/delete/', views.PartInternalPriceBreakDelete.as_view(), name='internal-price-break-delete'), +] + part_parameter_urls = [ url(r'^template/new/', views.PartParameterTemplateCreate.as_view(), name='part-param-template-create'), url(r'^template/(?P\d+)/edit/', views.PartParameterTemplateEdit.as_view(), name='part-param-template-edit'), @@ -65,6 +71,7 @@ part_detail_urls = [ url(r'^orders/?', views.PartDetail.as_view(template_name='part/orders.html'), name='part-orders'), url(r'^sales-orders/', views.PartDetail.as_view(template_name='part/sales_orders.html'), name='part-sales-orders'), url(r'^sale-prices/', views.PartDetail.as_view(template_name='part/sale_prices.html'), name='part-sale-prices'), + url(r'^internal-prices/', views.PartDetail.as_view(template_name='part/internal_prices.html'), name='part-internal-prices'), url(r'^tests/', views.PartDetail.as_view(template_name='part/part_tests.html'), name='part-test-templates'), url(r'^track/?', views.PartDetail.as_view(template_name='part/track.html'), name='part-track'), url(r'^related-parts/?', views.PartDetail.as_view(template_name='part/related.html'), name='part-related'), @@ -149,6 +156,9 @@ part_urls = [ # Part price breaks url(r'^sale-price/', include(sale_price_break_urls)), + # Part internal price breaks + url(r'^internal-price/', include(internal_price_break_urls)), + # Part test templates url(r'^test-template/', include([ url(r'^new/', views.PartTestTemplateCreate.as_view(), name='part-test-template-create'), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 4c5e3d78f0..c41f54c058 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -37,7 +37,7 @@ from .models import PartCategoryParameterTemplate from .models import BomItem from .models import match_part_names from .models import PartTestTemplate -from .models import PartSellPriceBreak +from .models import PartSellPriceBreak, PartInternalPriceBreak from common.models import InvenTreeSetting from company.models import SupplierPart @@ -1013,17 +1013,26 @@ class PartPricingView(PartDetail): ctx['price_history'] = ret # BOM Information for Pie-Chart - bom_items = [{'name': str(a.sub_part), 'price': a.sub_part.get_price_range(quantity), 'q': a.quantity} for a in part.bom_items.all()] - if [True for a in bom_items if len(set(a['price'])) == 2]: - ctx['bom_parts'] = [{ - 'name': a['name'], - 'min_price': str((a['price'][0] * a['q']) / quantity), - 'max_price': str((a['price'][1] * a['q']) / quantity)} for a in bom_items] - ctx['bom_pie_min'] = True - else: - ctx['bom_parts'] = [{ - 'name': a['name'], - 'price': str((a['price'][0] * a['q']) / quantity)} for a in bom_items] + if part.has_bom: + ctx_bom_parts = [] + # iterate over all bom-items + for item in part.bom_items.all(): + ctx_item = {'name': str(item.sub_part)} + price, qty = item.sub_part.get_price_range(quantity), item.quantity + + price_min, price_max = 0, 0 + if price: # check if price available + price_min = str((price[0] * qty) / quantity) + if len(set(price)) == 2: # min and max-price present + price_max = str((price[1] * qty) / quantity) + ctx['bom_pie_max'] = True # enable showing max prices in bom + + ctx_item['max_price'] = price_min + ctx_item['min_price'] = price_max if price_max else price_min + ctx_bom_parts.append(ctx_item) + + # add to global context + ctx['bom_parts'] = ctx_bom_parts return ctx @@ -2272,7 +2281,8 @@ class PartPricing(AjaxView): # BOM pricing information if part.bom_count > 0: - bom_price = part.get_bom_price_range(quantity) + use_internal = InvenTreeSetting.get_setting('PART_BOM_USE_INTERNAL_PRICE', False) + bom_price = part.get_bom_price_range(quantity, internal=use_internal) if bom_price is not None: min_bom_price, max_bom_price = bom_price @@ -2294,6 +2304,12 @@ class PartPricing(AjaxView): ctx['max_total_bom_price'] = max_bom_price ctx['max_unit_bom_price'] = max_unit_bom_price + # internal part pricing information + internal_part_price = part.get_internal_price(quantity) + if internal_part_price is not None: + ctx['total_internal_part_price'] = round(internal_part_price, 3) + ctx['unit_internal_part_price'] = round(internal_part_price / quantity, 3) + # part pricing information part_price = part.get_price(quantity) if part_price is not None: @@ -2961,3 +2977,29 @@ class PartSalePriceBreakDelete(AjaxDeleteView): model = PartSellPriceBreak ajax_form_title = _("Delete Price Break") ajax_template_name = "modal_delete_form.html" + + +class PartInternalPriceBreakCreate(PartSalePriceBreakCreate): + """ View for creating a internal price break for a part """ + + model = PartInternalPriceBreak + form_class = part_forms.EditPartInternalPriceBreakForm + ajax_form_title = _('Add Internal Price Break') + permission_required = 'roles.sales_order.add' + + +class PartInternalPriceBreakEdit(PartSalePriceBreakEdit): + """ View for editing a internal price break """ + + model = PartInternalPriceBreak + form_class = part_forms.EditPartInternalPriceBreakForm + ajax_form_title = _('Edit Internal Price Break') + permission_required = 'roles.sales_order.change' + + +class PartInternalPriceBreakDelete(PartSalePriceBreakDelete): + """ View for deleting a internal price break """ + + model = PartInternalPriceBreak + ajax_form_title = _("Delete Internal Price Break") + permission_required = 'roles.sales_order.delete' diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index 9bcdc5182e..d60689ccef 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -161,6 +161,13 @@ class StockItemSerializer(InvenTreeModelSerializer): required_tests = serializers.IntegerField(source='required_test_count', read_only=True, required=False) + purchase_price = serializers.SerializerMethodField() + + def get_purchase_price(self, obj): + """ Return purchase_price (Money field) as string (includes currency) """ + + return str(obj.purchase_price) if obj.purchase_price else '-' + def __init__(self, *args, **kwargs): part_detail = kwargs.pop('part_detail', False) @@ -215,6 +222,7 @@ class StockItemSerializer(InvenTreeModelSerializer): 'tracking_items', 'uid', 'updated', + 'purchase_price', ] """ These fields are read-only in this context. diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index 6502d920e3..c49e0c86d6 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -34,6 +34,9 @@ {% include "InvenTree/settings/setting.html" with key="PART_COPY_PARAMETERS" %} {% include "InvenTree/settings/setting.html" with key="PART_COPY_TESTS" %} {% include "InvenTree/settings/setting.html" with key="PART_CATEGORY_PARAMETERS" %} + + {% include "InvenTree/settings/setting.html" with key="PART_INTERNAL_PRICE" %} + {% include "InvenTree/settings/setting.html" with key="PART_BOM_USE_INTERNAL_PRICE" %}
        diff --git a/InvenTree/templates/js/build.js b/InvenTree/templates/js/build.js index 9523d24d39..e8af981817 100644 --- a/InvenTree/templates/js/build.js +++ b/InvenTree/templates/js/build.js @@ -155,6 +155,88 @@ function makeBuildOutputActionButtons(output, buildInfo, lines) { } +function loadBuildOrderAllocationTable(table, options={}) { + /** + * Load a table showing all the BuildOrder allocations for a given part + */ + + options.params['part_detail'] = true; + options.params['build_detail'] = true; + options.params['location_detail'] = true; + + var filters = loadTableFilters("buildorderallocation"); + + for (var key in options.params) { + filters[key] = options.params[key]; + } + + setupFilterList("buildorderallocation", $(table)); + + $(table).inventreeTable({ + url: '{% url "api-build-item-list" %}', + queryParams: filters, + name: 'buildorderallocation', + groupBy: false, + search: false, + paginationVAlign: 'bottom', + original: options.params, + formatNoMatches: function() { + return '{% trans "No build order allocations found" %}' + }, + columns: [ + { + field: 'pk', + visible: false, + switchable: false, + }, + { + field: 'build', + switchable: false, + title: '{% trans "Build Order" %}', + formatter: function(value, row) { + var prefix = "{% settings_value 'BUILDORDER_REFERENCE_PREFIX' %}"; + + var ref = `${prefix}${row.build_detail.reference}`; + + return renderLink(ref, `/build/${row.build}/`); + } + }, + { + field: 'item', + title: '{% trans "Stock Item" %}', + formatter: function(value, row) { + // Render a link to the particular stock item + + var link = `/stock/item/${row.stock_item}/`; + var text = `{% trans "Stock Item" %} ${row.stock_item}`; + + return renderLink(text, link); + } + }, + { + field: 'location', + title: '{% trans "Location" %}', + formatter: function(value, row) { + + if (!value) { + return '{% trans "Location not specified" %}'; + } + + var link = `/stock/location/${value}`; + var text = row.location_detail.description; + + return renderLink(text, link); + } + }, + { + field: 'quantity', + title: '{% trans "Quantity" %}', + } + ] + }); +} + + function loadBuildOutputAllocationTable(buildInfo, output, options={}) { /* * Load the "allocation table" for a particular build output. @@ -347,6 +429,8 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { var params = { build: buildId, + part_detail: true, + location_detail: true, } if (output) { @@ -466,8 +550,8 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { title: '{% trans "Part" %}', formatter: function(value, row) { - var html = imageHoverIcon(row.part_thumb); - html += renderLink(row.part_name, `/part/${value}/`); + var html = imageHoverIcon(row.part_detail.thumbnail); + html += renderLink(row.part_detail.full_name, `/part/${value}/`); return html; } }, diff --git a/InvenTree/templates/js/modals.js b/InvenTree/templates/js/modals.js index 033ac635da..03893a47b8 100644 --- a/InvenTree/templates/js/modals.js +++ b/InvenTree/templates/js/modals.js @@ -775,7 +775,9 @@ function handleModalForm(url, options) { } // Form was returned, invalid! else { - if (!response.hideErrorMessage && !options.hideErrorMessage) { + + // Disable error message with option or response + if (!options.hideErrorMessage && !response.hideErrorMessage) { var warningDiv = $(modal).find('#form-validation-warning'); warningDiv.css('display', 'block'); } @@ -791,13 +793,16 @@ function handleModalForm(url, options) { attachSecondaries(modal, options.secondary); } + // Set modal title with response if (response.title) { modalSetTitle(modal, response.title); } + // Clean custom action buttons + $(modal).find('#modal-footer-buttons').html(''); + + // Add custom action buttons with response if (response.buttons) { - // Clean custom action buttons - $(modal).find('#modal-footer-buttons').html(''); attachButtons(modal, response.buttons); } } @@ -846,6 +851,7 @@ function launchModalForm(url, options = {}) { * secondary - List of secondary modals to attach * callback - List of callback functions to attach to inputs * focus - Select which field to focus on by default + * buttons - additional buttons that should be added as array with [name, title] */ var modal = options.modal || '#modal-form'; @@ -905,6 +911,11 @@ function launchModalForm(url, options = {}) { attachButtons(modal, options.buttons); } + // Add custom buttons from response + if (response.buttons) { + attachButtons(modal, response.buttons); + } + } else { $(modal).modal('hide'); showAlertDialog('{% trans "Invalid server response" %}', '{% trans "JSON response missing form data" %}'); diff --git a/InvenTree/templates/js/order.js b/InvenTree/templates/js/order.js index fa60ebdf6d..649357b083 100644 --- a/InvenTree/templates/js/order.js +++ b/InvenTree/templates/js/order.js @@ -310,3 +310,88 @@ function loadSalesOrderTable(table, options) { ], }); } + + +function loadSalesOrderAllocationTable(table, options={}) { + /** + * Load a table with SalesOrderAllocation items + */ + + options.params = options.params || {}; + + options.params['location_detail'] = true; + options.params['part_detail'] = true; + options.params['item_detail'] = true; + options.params['order_detail'] = true; + + var filters = loadTableFilters("salesorderallocation"); + + for (var key in options.params) { + filters[key] = options.params[key]; + } + + setupFilterList("salesorderallocation", $(table)); + + $(table).inventreeTable({ + url: '{% url "api-so-allocation-list" %}', + queryParams: filters, + name: 'salesorderallocation', + groupBy: false, + search: false, + paginationVAlign: 'bottom', + original: options.params, + formatNoMatches: function() { return '{% trans "No sales order allocations found" %}'; }, + columns: [ + { + field: 'pk', + visible: false, + switchable: false, + }, + { + field: 'order', + switchable: false, + title: '{% trans "Order" %}', + switchable: false, + formatter: function(value, row) { + + var prefix = "{% settings_value 'SALESORDER_REFERENCE_PREFIX' %}"; + + var ref = `${prefix}${row.order_detail.reference}`; + + return renderLink(ref, `/order/sales-order/${row.order}/`); + } + }, + { + field: 'item', + title: '{% trans "Stock Item" %}', + formatter: function(value, row) { + // Render a link to the particular stock item + + var link = `/stock/item/${row.item}/`; + var text = `{% trans "Stock Item" %} ${row.item}`; + + return renderLink(text, link); + } + }, + { + field: 'location', + title: '{% trans "Location" %}', + formatter: function(value, row) { + + if (!value) { + return '{% trans "Location not specified" %}'; + } + + var link = `/stock/location/${value}`; + var text = row.location_detail.description; + + return renderLink(text, link); + } + }, + { + field: 'quantity', + title: '{% trans "Quantity" %}', + } + ] + }); +} \ No newline at end of file diff --git a/InvenTree/templates/js/stock.js b/InvenTree/templates/js/stock.js index 151265a3ae..4e992df67f 100644 --- a/InvenTree/templates/js/stock.js +++ b/InvenTree/templates/js/stock.js @@ -159,7 +159,7 @@ function loadStockTestResultsTable(table, options) { // Set "parent" for each existing row tableData.forEach(function(item, idx) { - tableData[idx].parent = options.stock_item; + tableData[idx].parent = parent_node; }); // Once the test template data are loaded, query for test results @@ -660,6 +660,11 @@ function loadStockTable(table, options) { title: '{% trans "Last Updated" %}', sortable: true, }, + { + field: 'purchase_price', + title: '{% trans "Purchase Price" %}', + sortable: true, + }, { field: 'packaging', title: '{% trans "Packaging" %}', diff --git a/InvenTree/templates/js/tables.js b/InvenTree/templates/js/tables.js index 26d7ee4da9..645e54fcbb 100644 --- a/InvenTree/templates/js/tables.js +++ b/InvenTree/templates/js/tables.js @@ -135,7 +135,7 @@ $.fn.inventreeTable = function(options) { // Pagingation options (can be server-side or client-side as specified by the caller) options.pagination = true; - options.paginationVAlign = 'both'; + options.paginationVAlign = options.paginationVAlign || 'both'; options.pageSize = inventreeLoad(varName, 25); options.pageList = [25, 50, 100, 250, 'all']; options.totalField = 'count'; diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index f26a7ee64b..0902b04ccd 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -77,6 +77,7 @@ class RuleSet(models.Model): 'part_bomitem', 'part_partattachment', 'part_partsellpricebreak', + 'part_partinternalpricebreak', 'part_parttesttemplate', 'part_partparametertemplate', 'part_partparameter', diff --git a/docker/Dockerfile b/docker/Dockerfile index 5c5d1dc32a..e27bd5591a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -7,6 +7,8 @@ ARG branch="master" ENV PYTHONUNBUFFERED 1 # InvenTree key settings + +# The INVENTREE_HOME directory is where the InvenTree source repository will be located ENV INVENTREE_HOME="/home/inventree" # GitHub settings @@ -17,10 +19,9 @@ ENV INVENTREE_LOG_LEVEL="INFO" ENV INVENTREE_DOCKER="true" # InvenTree paths -ENV INVENTREE_SRC_DIR="${INVENTREE_HOME}/src" -ENV INVENTREE_MNG_DIR="${INVENTREE_SRC_DIR}/InvenTree" +ENV INVENTREE_MNG_DIR="${INVENTREE_HOME}/InvenTree" ENV INVENTREE_DATA_DIR="${INVENTREE_HOME}/data" -ENV INVENTREE_STATIC_ROOT="${INVENTREE_HOME}/static" +ENV INVENTREE_STATIC_ROOT="${INVENTREE_DATA_DIR}/static" ENV INVENTREE_MEDIA_ROOT="${INVENTREE_DATA_DIR}/media" ENV INVENTREE_CONFIG_FILE="${INVENTREE_DATA_DIR}/config.yaml" @@ -44,8 +45,6 @@ RUN addgroup -S inventreegroup && adduser -S inventree -G inventreegroup WORKDIR ${INVENTREE_HOME} -RUN mkdir -p ${INVENTREE_STATIC_ROOT} - # Install required system packages RUN apk add --no-cache git make bash \ gcc libgcc g++ libstdc++ \ @@ -78,37 +77,40 @@ RUN pip install --no-cache-dir -U gunicorn FROM base as production # Clone source code RUN echo "Downloading InvenTree from ${INVENTREE_REPO}" -RUN git clone --branch ${INVENTREE_BRANCH} --depth 1 ${INVENTREE_REPO} ${INVENTREE_SRC_DIR} +RUN git clone --branch ${INVENTREE_BRANCH} --depth 1 ${INVENTREE_REPO} ${INVENTREE_HOME} # Install InvenTree packages -RUN pip install --no-cache-dir -U -r ${INVENTREE_SRC_DIR}/requirements.txt +RUN pip install --no-cache-dir -U -r ${INVENTREE_HOME}/requirements.txt # Copy gunicorn config file COPY gunicorn.conf.py ${INVENTREE_HOME}/gunicorn.conf.py # Copy startup scripts -COPY start_prod_server.sh ${INVENTREE_SRC_DIR}/start_prod_server.sh -COPY start_worker.sh ${INVENTREE_SRC_DIR}/start_worker.sh +COPY start_prod_server.sh ${INVENTREE_HOME}/start_prod_server.sh +COPY start_prod_worker.sh ${INVENTREE_HOME}/start_prod_worker.sh -RUN chmod 755 ${INVENTREE_SRC_DIR}/start_prod_server.sh -RUN chmod 755 ${INVENTREE_SRC_DIR}/start_worker.sh +RUN chmod 755 ${INVENTREE_HOME}/start_prod_server.sh +RUN chmod 755 ${INVENTREE_HOME}/start_prod_worker.sh -# exec commands should be executed from the "src" directory -WORKDIR ${INVENTREE_SRC_DIR} +WORKDIR ${INVENTREE_HOME} # Let us begin CMD ["bash", "./start_prod_server.sh"] FROM base as dev -# The development image requires the source code to be mounted to /home/inventree/src/ -# So from here, we don't actually "do" anything +# The development image requires the source code to be mounted to /home/inventree/ +# So from here, we don't actually "do" anything, apart from some file management -WORKDIR ${INVENTREE_SRC_DIR} +ENV INVENTREE_DEV_DIR = "${INVENTREE_HOME}/dev" -COPY start_dev_server.sh ${INVENTREE_HOME}/start_dev_server.sh -COPY start_dev_worker.sh ${INVENTREE_HOME}/start_dev_worker.sh -RUN chmod 755 ${INVENTREE_HOME}/start_dev_server.sh -RUN chmod 755 ${INVENTREE_HOME}/start_dev_worker.sh +# Override default path settings +ENV INVENTREE_STATIC_ROOT="${INVENTREE_DEV_DIR}/static" +ENV INVENTREE_MEDIA_ROOT="${INVENTREE_DEV_DIR}/media" +ENV INVENTREE_CONFIG_FILE="${INVENTREE_DEV_DIR}/config.yaml" +ENV INVENTREE_SECRET_KEY_FILE="${INVENTREE_DEV_DIR}/secret_key.txt" -CMD ["bash", "/home/inventree/start_dev_server.sh"] +WORKDIR ${INVENTREE_HOME} + +# Launch the development server +CMD ["bash", "/home/inventree/docker/start_dev_server.sh"] diff --git a/docker/dev-config.env b/docker/dev-config.env index 200c3db479..fe1f073633 100644 --- a/docker/dev-config.env +++ b/docker/dev-config.env @@ -1,7 +1,9 @@ INVENTREE_DB_ENGINE=sqlite3 -INVENTREE_DB_NAME=/home/inventree/src/inventree_docker_dev.sqlite3 -INVENTREE_MEDIA_ROOT=/home/inventree/src/inventree_media -INVENTREE_STATIC_ROOT=/home/inventree/src/inventree_static -INVENTREE_CONFIG_FILE=/home/inventree/src/config.yaml -INVENTREE_SECRET_KEY_FILE=/home/inventree/src/secret_key.txt -INVENTREE_DEBUG=true \ No newline at end of file +INVENTREE_DB_NAME=/home/inventree/dev/inventree_db.sqlite3 +INVENTREE_MEDIA_ROOT=/home/inventree/dev/media +INVENTREE_STATIC_ROOT=/home/inventree/dev/static +INVENTREE_CONFIG_FILE=/home/inventree/dev/config.yaml +INVENTREE_SECRET_KEY_FILE=/home/inventree/dev/secret_key.txt +INVENTREE_DEBUG=true +INVENTREE_WEB_ADDR=0.0.0.0 +INVENTREE_WEB_PORT=8000 \ No newline at end of file diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index ddf50135c9..29eccc26c6 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -13,8 +13,8 @@ version: "3.8" services: # InvenTree web server services # Uses gunicorn as the web server - inventree-server: - container_name: inventree-server + inventree-dev-server: + container_name: inventree-dev-server build: context: . target: dev @@ -22,7 +22,7 @@ services: - 8000:8000 volumes: # Ensure you specify the location of the 'src' directory at the end of this file - - src:/home/inventree/src + - src:/home/inventree env_file: # Environment variables required for the dev server are configured in dev-config.env - dev-config.env @@ -30,24 +30,24 @@ services: restart: unless-stopped # Background worker process handles long-running or periodic tasks - inventree-worker: - container_name: inventree-worker + inventree-dev-worker: + container_name: inventree-dev-worker build: context: . target: dev - entrypoint: /home/inventree/start_dev_worker.sh + entrypoint: /home/inventree/docker/start_dev_worker.sh depends_on: - - inventree-server + - inventree-dev-server volumes: # Ensure you specify the location of the 'src' directory at the end of this file - - src:/home/inventree/src + - src:/home/inventree env_file: # Environment variables required for the dev server are configured in dev-config.env - dev-config.env restart: unless-stopped volumes: - # NOTE: Change /path/to/src to a directory on your local machine, where the InvenTree source code is located + # NOTE: Change "../" to a directory on your local machine, where the InvenTree source code is located # Persistent data, stored external to the container(s) src: driver: local @@ -55,5 +55,5 @@ volumes: type: none o: bind # This directory specified where InvenTree source code is stored "outside" the docker containers - # Note: This directory must conatin the file *manage.py* - device: /path/to/inventree/src + # By default, this directory is one level above the "docker" directory + device: ../ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9e77dd1181..dcd35af148 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -30,6 +30,7 @@ services: - POSTGRES_USER=pguser - POSTGRES_PASSWORD=pgpassword volumes: + # Map 'data' volume such that postgres database is stored externally - data:/var/lib/postgresql/data/ restart: unless-stopped @@ -43,8 +44,8 @@ services: depends_on: - inventree-db volumes: + # Data volume must map to /home/inventree/data - data:/home/inventree/data - - static:/home/inventree/static environment: # Default environment variables are configured to match the 'db' container # Note: If you change the database image, these will need to be adjusted @@ -61,13 +62,13 @@ services: inventree-worker: container_name: inventree-worker image: inventree/inventree:latest - entrypoint: ./start_worker.sh + entrypoint: ./start_prod_worker.sh depends_on: - inventree-db - inventree-server volumes: + # Data volume must map to /home/inventree/data - data:/home/inventree/data - - static:/home/inventree/static environment: # Default environment variables are configured to match the 'db' container # Note: If you change the database image, these will need to be adjusted @@ -81,7 +82,8 @@ services: restart: unless-stopped # nginx acts as a reverse proxy - # static files are served by nginx + # static files are served directly by nginx + # media files are served by nginx, although authentication is redirected to inventree-server # web requests are redirected to gunicorn # NOTE: You will need to provide a working nginx.conf file! inventree-proxy: @@ -93,11 +95,11 @@ services: # Change "1337" to the port that you want InvenTree web server to be available on - 1337:80 volumes: - # Provide nginx.conf file to the container + # Provide ./nginx.conf file to the container # Refer to the provided example file as a starting point - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro - # Static data volume is mounted to /var/www/static - - static:/var/www/static:ro + # nginx proxy needs access to static and media files + - data:/var/www restart: unless-stopped volumes: @@ -110,6 +112,4 @@ volumes: o: bind # This directory specified where InvenTree data are stored "outside" the docker containers # Change this path to a local system path where you want InvenTree data stored - device: /path/to/data - # Static files, shared between containers - static: \ No newline at end of file + device: /path/to/data \ No newline at end of file diff --git a/docker/nginx.conf b/docker/nginx.conf index 754a7321bb..270378735e 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -1,3 +1,4 @@ + server { # Listen for connection on (internal) port 80 @@ -34,4 +35,23 @@ server { add_header Cache-Control "public"; } + # Redirect any requests for media files + location /media/ { + alias /var/www/media/; + + # Media files require user authentication + auth_request /auth; + } + + # Use the 'user' API endpoint for auth + location /auth { + internal; + + proxy_pass http://inventree-server:8000/auth/; + + proxy_pass_request_body off; + proxy_set_header Content-Length ""; + proxy_set_header X-Original-URI $request_uri; + } + } \ No newline at end of file diff --git a/docker/start_dev_server.sh b/docker/start_dev_server.sh index d4e33a79a5..ad12ec023a 100644 --- a/docker/start_dev_server.sh +++ b/docker/start_dev_server.sh @@ -16,21 +16,22 @@ if test -f "$INVENTREE_CONFIG_FILE"; then echo "$INVENTREE_CONFIG_FILE exists - skipping" else echo "Copying config file to $INVENTREE_CONFIG_FILE" - cp $INVENTREE_SRC_DIR/InvenTree/config_template.yaml $INVENTREE_CONFIG_FILE + cp $INVENTREE_HOME/InvenTree/config_template.yaml $INVENTREE_CONFIG_FILE fi -# Setup a virtual environment -python3 -m venv inventree-docker-dev +# Setup a virtual environment (within the "dev" directory) +python3 -m venv ./dev/env -source inventree-docker-dev/bin/activate +# Activate the virtual environment +source ./dev/env/bin/activate echo "Installing required packages..." -pip install --no-cache-dir -U -r ${INVENTREE_SRC_DIR}/requirements.txt +pip install --no-cache-dir -U -r ${INVENTREE_HOME}/requirements.txt echo "Starting InvenTree server..." # Wait for the database to be ready -cd $INVENTREE_MNG_DIR +cd ${INVENTREE_HOME}/InvenTree python manage.py wait_for_db sleep 10 @@ -45,4 +46,4 @@ python manage.py migrate --run-syncdb || exit 1 python manage.py clearsessions || exit 1 # Launch a development server -python manage.py runserver 0.0.0.0:$INVENTREE_WEB_PORT +python manage.py runserver ${INVENTREE_WEB_ADDR}:${INVENTREE_WEB_PORT} diff --git a/docker/start_dev_worker.sh b/docker/start_dev_worker.sh index 099f447a9c..bfadc1f49a 100644 --- a/docker/start_dev_worker.sh +++ b/docker/start_dev_worker.sh @@ -2,15 +2,15 @@ echo "Starting InvenTree worker..." -cd $INVENTREE_SRC_DIR +cd $INVENTREE_HOME # Activate virtual environment -source inventree-docker-dev/bin/activate +source ./dev/env/bin/activate sleep 5 # Wait for the database to be ready -cd $INVENTREE_MNG_DIR +cd InvenTree python manage.py wait_for_db sleep 10 diff --git a/docker/start_prod_server.sh b/docker/start_prod_server.sh index 2e5acb5c9d..9d86b331eb 100644 --- a/docker/start_prod_server.sh +++ b/docker/start_prod_server.sh @@ -16,7 +16,7 @@ if test -f "$INVENTREE_CONFIG_FILE"; then echo "$INVENTREE_CONFIG_FILE exists - skipping" else echo "Copying config file to $INVENTREE_CONFIG_FILE" - cp $INVENTREE_SRC_DIR/InvenTree/config_template.yaml $INVENTREE_CONFIG_FILE + cp $INVENTREE_HOME/InvenTree/config_template.yaml $INVENTREE_CONFIG_FILE fi echo "Starting InvenTree server..." diff --git a/docker/start_worker.sh b/docker/start_prod_worker.sh similarity index 100% rename from docker/start_worker.sh rename to docker/start_prod_worker.sh diff --git a/requirements.txt b/requirements.txt index 5600221c94..abcf2cb098 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ invoke>=1.4.0 # Invoke build tool wheel>=0.34.2 # Wheel -Django==3.2.1 # Django package -pillow==8.1.1 # Image manipulation +Django==3.2.4 # Django package +pillow==8.2.0 # Image manipulation djangorestframework==3.12.4 # DRF framework django-cors-headers==3.2.0 # CORS headers extension for DRF django-filter==2.4.0 # Extended filtering options diff --git a/tasks.py b/tasks.py index 88bd5e42e4..3c4a2175e1 100644 --- a/tasks.py +++ b/tasks.py @@ -129,6 +129,14 @@ def wait(c): manage(c, "wait_for_db") +@task +def rebuild(c): + """ + Rebuild database models with MPTT structures + """ + + manage(c, "rebuild_models") + @task def migrate(c): """ @@ -282,7 +290,7 @@ def export_records(c, filename='data.json'): tmpfile = f"{filename}.tmp" - cmd = f"dumpdata --indent 2 --output {tmpfile} {content_excludes()}" + cmd = f"dumpdata --indent 2 --output '{tmpfile}' {content_excludes()}" # Dump data to temporary file manage(c, cmd, pty=True) @@ -311,7 +319,7 @@ def export_records(c, filename='data.json'): print("Data export completed") -@task(help={'filename': 'Input filename'}) +@task(help={'filename': 'Input filename'}, post=[rebuild]) def import_records(c, filename='data.json'): """ Import database records from a file @@ -348,13 +356,13 @@ def import_records(c, filename='data.json'): with open(tmpfile, "w") as f_out: f_out.write(json.dumps(data, indent=2)) - cmd = f"loaddata {tmpfile} -i {content_excludes()}" + cmd = f"loaddata '{tmpfile}' -i {content_excludes()}" manage(c, cmd, pty=True) print("Data import completed") -@task +@task(post=[rebuild]) def import_fixtures(c): """ Import fixture data into the database. From 452d2004ce81535a6de54080b6f99f5982da2d95 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 19 Jun 2021 23:46:31 +0200 Subject: [PATCH 055/110] added handling for no supplier price --- InvenTree/order/templates/order/order_wizard/select_parts.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/order/templates/order/order_wizard/select_parts.html b/InvenTree/order/templates/order/order_wizard/select_parts.html index 99a6fe1b54..5bd67a4baa 100644 --- a/InvenTree/order/templates/order/order_wizard/select_parts.html +++ b/InvenTree/order/templates/order/order_wizard/select_parts.html @@ -54,7 +54,7 @@ From b4412ef575a4142dd0fd3653c72035f464b6764b Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 20 Jun 2021 13:32:52 +0200 Subject: [PATCH 056/110] also show prices of the value 0 --- InvenTree/order/templates/order/order_wizard/select_parts.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/order/templates/order/order_wizard/select_parts.html b/InvenTree/order/templates/order/order_wizard/select_parts.html index 5bd67a4baa..a02113fa18 100644 --- a/InvenTree/order/templates/order/order_wizard/select_parts.html +++ b/InvenTree/order/templates/order/order_wizard/select_parts.html @@ -54,7 +54,7 @@ From a3517b9313b28c462df901efc8ad6669daebabbf Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 20 Jun 2021 18:52:55 +0200 Subject: [PATCH 057/110] fixes: response data stays persistent throughout views --- InvenTree/InvenTree/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index 06aec54c18..17caeb872d 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -337,7 +337,7 @@ class AjaxMixin(InvenTreeRoleMixin): # Do nothing by default pass - def renderJsonResponse(self, request, form=None, data={}, context=None): + def renderJsonResponse(self, request, form=None, data=None, context=None): """ Render a JSON response based on specific class context. Args: @@ -349,6 +349,9 @@ class AjaxMixin(InvenTreeRoleMixin): Returns: JSON response object """ + # a empty dict as default can be dangerous - set it here if empty + if not data: + data = {} if not request.is_ajax(): return HttpResponseRedirect('/') From 8fd41f5ecf36f47a685e7a53f787b9cbe015361f Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 21 Jun 2021 21:46:22 +1000 Subject: [PATCH 058/110] Unit testing for default values --- InvenTree/part/test_api.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 0f5f59d3a3..5c39c3dce5 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -292,6 +292,29 @@ class PartAPITest(InvenTreeAPITestCase): self.assertEqual(len(data['results']), n) + def test_default_values(self): + """ + Tests for 'default' values: + + Ensure that unspecified fields revert to "default" values + (as specified in the model field definition) + """ + + url = reverse('api-part-list') + + response = self.client.post(url, { + 'name': 'all defaults', + 'description': 'my test part', + 'category': 1, + }) + + data = response.data + + # Check that the un-specified fields have used correct default values + self.assertTrue(data['active']) + self.assertFalse(data['virtual']) + self.assertTrue(data['purchaseable']) + class PartAPIAggregationTest(InvenTreeAPITestCase): """ From d1a2ed9af17801aceec415fa56d343ff527ff29d Mon Sep 17 00:00:00 2001 From: Adam Walsh Date: Mon, 21 Jun 2021 11:20:43 -0400 Subject: [PATCH 059/110] Fix supplier part view/edit without a manufacturer Fixes the following issues when a supplier part was created with an MPN but no manufacturer was assigned: - Viewing a supplier part stock item - Editing a supplier part stock item --- InvenTree/company/views.py | 3 ++- InvenTree/stock/templates/stock/item_base.html | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py index b2f655737f..74a583710a 100644 --- a/InvenTree/company/views.py +++ b/InvenTree/company/views.py @@ -623,7 +623,8 @@ class SupplierPartEdit(AjaxUpdateView): supplier_part = self.get_object() if supplier_part.manufacturer_part: - initials['manufacturer'] = supplier_part.manufacturer_part.manufacturer.id + if supplier_part.manufacturer_part.manufacturer: + initials['manufacturer'] = supplier_part.manufacturer_part.manufacturer.id initials['MPN'] = supplier_part.manufacturer_part.MPN return initials diff --git a/InvenTree/stock/templates/stock/item_base.html b/InvenTree/stock/templates/stock/item_base.html index 7aebd51452..bf9d10590f 100644 --- a/InvenTree/stock/templates/stock/item_base.html +++ b/InvenTree/stock/templates/stock/item_base.html @@ -350,7 +350,12 @@ {% trans "Manufacturer" %} -
        {{ item.supplier_part.manufacturer_part.manufacturer.name }} + {% if item.supplier_part.manufacturer_part.manufacturer %} + {{ item.supplier_part.manufacturer_part.manufacturer.name }} + {% else %} + {% trans "No manufacturer set" %} + {% endif %} + From 40fcfe1f475705c4f13ee891fdc4b5fed662f0bd Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 08:53:44 +1000 Subject: [PATCH 060/110] Reduce noise in logs --- InvenTree/build/migrations/0029_auto_20210601_1525.py | 3 ++- InvenTree/company/migrations/0026_auto_20201110_1011.py | 3 ++- InvenTree/part/migrations/0056_auto_20201110_1125.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/InvenTree/build/migrations/0029_auto_20210601_1525.py b/InvenTree/build/migrations/0029_auto_20210601_1525.py index c5ea04b5c9..e8b2d58947 100644 --- a/InvenTree/build/migrations/0029_auto_20210601_1525.py +++ b/InvenTree/build/migrations/0029_auto_20210601_1525.py @@ -40,7 +40,8 @@ def assign_bom_items(apps, schema_editor): except BomItem.DoesNotExist: pass - print(f"Assigned BomItem for {count_valid}/{count_total} entries") + if count_total > 0: + print(f"Assigned BomItem for {count_valid}/{count_total} entries") def unassign_bom_items(apps, schema_editor): diff --git a/InvenTree/company/migrations/0026_auto_20201110_1011.py b/InvenTree/company/migrations/0026_auto_20201110_1011.py index c6be37b967..20ec7d2f6f 100644 --- a/InvenTree/company/migrations/0026_auto_20201110_1011.py +++ b/InvenTree/company/migrations/0026_auto_20201110_1011.py @@ -71,7 +71,8 @@ def migrate_currencies(apps, schema_editor): count += 1 - print(f"Updated {count} SupplierPriceBreak rows") + if count > 0: + print(f"Updated {count} SupplierPriceBreak rows") def reverse_currencies(apps, schema_editor): """ diff --git a/InvenTree/part/migrations/0056_auto_20201110_1125.py b/InvenTree/part/migrations/0056_auto_20201110_1125.py index b382dded71..862f9411c8 100644 --- a/InvenTree/part/migrations/0056_auto_20201110_1125.py +++ b/InvenTree/part/migrations/0056_auto_20201110_1125.py @@ -71,7 +71,8 @@ def migrate_currencies(apps, schema_editor): count += 1 - print(f"Updated {count} SupplierPriceBreak rows") + if count > 0: + print(f"Updated {count} SupplierPriceBreak rows") def reverse_currencies(apps, schema_editor): """ From a38835022a63645e8d0dda51bdab85364bbc373c Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 09:33:07 +1000 Subject: [PATCH 061/110] Better management of unique constraint for Part --- .../part/migrations/0068_part_unique_part.py | 17 ++++++++++++++ InvenTree/part/models.py | 22 +++---------------- 2 files changed, 20 insertions(+), 19 deletions(-) create mode 100644 InvenTree/part/migrations/0068_part_unique_part.py diff --git a/InvenTree/part/migrations/0068_part_unique_part.py b/InvenTree/part/migrations/0068_part_unique_part.py new file mode 100644 index 0000000000..2e87fc7b2a --- /dev/null +++ b/InvenTree/part/migrations/0068_part_unique_part.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.4 on 2021-06-21 23:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0067_partinternalpricebreak'), + ] + + operations = [ + migrations.AddConstraint( + model_name='part', + constraint=models.UniqueConstraint(fields=('name', 'IPN', 'revision'), name='unique_part'), + ), + ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 8aa370a7ae..43e54baf91 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -321,6 +321,9 @@ class Part(MPTTModel): verbose_name = _("Part") verbose_name_plural = _("Parts") ordering = ['name', ] + constraints = [ + UniqueConstraint(fields=['name', 'IPN', 'revision'], name='unique_part') + ] class MPTTMeta: # For legacy reasons the 'variant_of' field is used to indicate the MPTT parent @@ -642,23 +645,6 @@ class Part(MPTTModel): 'IPN': _('Duplicate IPN not allowed in part settings'), }) - # Part name uniqueness should be case insensitive - try: - parts = Part.objects.exclude(id=self.id).filter( - name__iexact=self.name, - IPN__iexact=self.IPN, - revision__iexact=self.revision) - - if parts.exists(): - msg = _("Part must be unique for name, IPN and revision") - raise ValidationError({ - "name": msg, - "IPN": msg, - "revision": msg, - }) - except Part.DoesNotExist: - pass - def clean(self): """ Perform cleaning operations for the Part model @@ -671,8 +657,6 @@ class Part(MPTTModel): super().clean() - self.validate_unique() - if self.trackable: for part in self.get_used_in().all(): From c3fc04e872a7c25dca69c543f9eb712eb77c0fb0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 09:33:20 +1000 Subject: [PATCH 062/110] Unit testing for part duplication --- InvenTree/part/test_part.py | 49 ++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index 2bc24c3a99..bcae74a0be 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -11,7 +11,7 @@ from django.core.exceptions import ValidationError import os -from .models import Part, PartTestTemplate +from .models import Part, PartCategory, PartTestTemplate from .models import rename_part_image, match_part_names from .templatetags import inventree_extras @@ -78,6 +78,53 @@ class PartTest(TestCase): p = Part.objects.get(pk=100) self.assertEqual(str(p), "BOB | Bob | A2 - Can we build it?") + def test_duplicate(self): + """ + Test that we cannot create a "duplicate" Part + """ + + n = Part.objects.count() + + cat = PartCategory.objects.get(pk=1) + + Part.objects.create( + category=cat, + name='part', + description='description', + IPN='IPN', + revision='A', + ) + + self.assertEqual(Part.objects.count(), n + 1) + + part = Part(category=cat, + name='part', + description='description', + IPN='IPN', + revision='A', + ) + + with self.assertRaises(ValidationError): + part.validate_unique() + + try: + part.save() + assert(False) + except: + pass + + self.assertEqual(Part.objects.count(), n + 1) + + Part.objects.create( + category=cat, + name='part', + description='description', + IPN='IPN', + revision='B', + ) + + self.assertEqual(Part.objects.count(), n + 2) + def test_metadata(self): self.assertEqual(self.r1.name, 'R_2K2_0805') self.assertEqual(self.r1.get_absolute_url(), '/part/3/') From c62ba5eb1246eda9ecf29db33763fc39b43a3c95 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 10:09:19 +1000 Subject: [PATCH 063/110] Perform a "full_clean" on serialized model - DRF does not by deault run validate_unique on the model - Need to check if we are "creating" or "updating" a model - Catch and re-throw errors in the correct format - Unit tests --- InvenTree/InvenTree/serializers.py | 31 +++- InvenTree/part/test_api.py | 164 ++++++++++++++++++ InvenTree/part/test_part.py | 11 +- .../migrations/0061_auto_20210511_0911.py | 3 +- .../migrations/0064_auto_20210621_1724.py | 6 +- 5 files changed, 204 insertions(+), 11 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index fa7674723c..00be9949f4 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -6,12 +6,15 @@ Serializers used in various InvenTree apps # -*- coding: utf-8 -*- from __future__ import unicode_literals -from rest_framework import serializers - import os from django.conf import settings from django.contrib.auth.models import User +from django.core.exceptions import ValidationError as DjangoValidationError + +from rest_framework import serializers +from rest_framework.fields import empty +from rest_framework.exceptions import ValidationError class UserSerializer(serializers.ModelSerializer): @@ -39,18 +42,34 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): but also ensures that the underlying model class data are checked on validation. """ - def validate(self, data): + def run_validation(self, data=empty): """ Perform serializer validation. In addition to running validators on the serializer fields, this class ensures that the underlying model is also validated. """ # Run any native validation checks first (may throw an ValidationError) - data = super(serializers.ModelSerializer, self).validate(data) + data = super().run_validation(data) # Now ensure the underlying model is correct - instance = self.Meta.model(**data) - instance.clean() + + if not hasattr(self, 'instance') or self.instance is None: + # No instance exists (we are creating a new one) + instance = self.Meta.model(**data) + else: + # Instance already exists (we are updating!) + instance = self.instance + + # Update instance fields + for attr, value in data.items(): + setattr(instance, attr, value) + + # Run a 'full_clean' on the model. + # Note that by default, DRF does *not* perform full model validation! + try: + instance.full_clean() + except (ValidationError, DjangoValidationError) as exc: + raise ValidationError(detail=serializers.as_serializer_error(exc)) return data diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 0f5f59d3a3..b7472a3b1c 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -1,3 +1,4 @@ +from django.db import models from rest_framework import status from django.urls import reverse @@ -293,6 +294,169 @@ class PartAPITest(InvenTreeAPITestCase): self.assertEqual(len(data['results']), n) +class PartDetailTests(InvenTreeAPITestCase): + """ + Test that we can create / edit / delete Part objects via the API + """ + + fixtures = [ + 'category', + 'part', + 'location', + 'bom', + 'test_templates', + ] + + roles = [ + 'part.change', + 'part.add', + 'part.delete', + 'part_category.change', + 'part_category.add', + ] + + def setUp(self): + super().setUp() + + def test_part_operations(self): + n = Part.objects.count() + + # Create a part + response = self.client.post( + reverse('api-part-list'), + { + 'name': 'my test api part', + 'description': 'a part created with the API', + 'category': 1, + } + ) + + self.assertEqual(response.status_code, 201) + + pk = response.data['pk'] + + # Check that a new part has been added + self.assertEqual(Part.objects.count(), n + 1) + + part = Part.objects.get(pk=pk) + + self.assertEqual(part.name, 'my test api part') + + # Edit the part + url = reverse('api-part-detail', kwargs={'pk': pk}) + + # Let's change the name of the part + + response = self.client.patch(url, { + 'name': 'a new better name', + }) + + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data['pk'], pk) + self.assertEqual(response.data['name'], 'a new better name') + + part = Part.objects.get(pk=pk) + + # Name has been altered + self.assertEqual(part.name, 'a new better name') + + # Part count should not have changed + self.assertEqual(Part.objects.count(), n + 1) + + # Now, try to set the name to the *same* value + # 2021-06-22 this test is to check that the "duplicate part" checks don't do strange things + response = self.client.patch(url, { + 'name': 'a new better name', + }) + + self.assertEqual(response.status_code, 200) + + # Try to remove the part + response = self.client.delete(url) + + self.assertEqual(response.status_code, 204) + + # Part count should have reduced + self.assertEqual(Part.objects.count(), n) + + def test_duplicates(self): + """ + Check that trying to create 'duplicate' parts results in errors + """ + + # Create a part + response = self.client.post(reverse('api-part-list'), { + 'name': 'part', + 'description': 'description', + 'IPN': 'IPN-123', + 'category': 1, + 'revision': 'A', + }) + + self.assertEqual(response.status_code, 201) + + n = Part.objects.count() + + # Check that we cannot create a duplicate in a different category + response = self.client.post(reverse('api-part-list'), { + 'name': 'part', + 'description': 'description', + 'IPN': 'IPN-123', + 'category': 2, + 'revision': 'A', + }) + + self.assertEqual(response.status_code, 400) + + # Check that only 1 matching part exists + parts = Part.objects.filter( + name='part', + description='description', + IPN='IPN-123' + ) + + self.assertEqual(parts.count(), 1) + + # A new part should *not* have been created + self.assertEqual(Part.objects.count(), n) + + # But a different 'revision' *can* be created + response = self.client.post(reverse('api-part-list'), { + 'name': 'part', + 'description': 'description', + 'IPN': 'IPN-123', + 'category': 2, + 'revision': 'B', + }) + + self.assertEqual(response.status_code, 201) + self.assertEqual(Part.objects.count(), n + 1) + + # Now, check that we cannot *change* an existing part to conflict + pk = response.data['pk'] + + url = reverse('api-part-detail', kwargs={'pk': pk}) + + # Attempt to alter the revision code + response = self.client.patch(url, + { + 'revision': 'A', + }, + format='json', + ) + + self.assertEqual(response.status_code, 400) + + # But we *can* change it to a unique revision code + response = self.client.patch(url, + { + 'revision': 'C', + } + ) + + self.assertEqual(response.status_code, 200) + + class PartAPIAggregationTest(InvenTreeAPITestCase): """ Tests to ensure that the various aggregation annotations are working correctly... diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index bcae74a0be..cdbf19f485 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -109,13 +109,14 @@ class PartTest(TestCase): try: part.save() - assert(False) + self.assertTrue(False) except: pass self.assertEqual(Part.objects.count(), n + 1) - Part.objects.create( + # But we should be able to create a part with a different revision + part_2 = Part.objects.create( category=cat, name='part', description='description', @@ -125,6 +126,12 @@ class PartTest(TestCase): self.assertEqual(Part.objects.count(), n + 2) + # Now, check that we cannot *change* part_2 to conflict + part_2.revision = 'A' + + with self.assertRaises(ValidationError): + part_2.validate_unique() + def test_metadata(self): self.assertEqual(self.r1.name, 'R_2K2_0805') self.assertEqual(self.r1.get_absolute_url(), '/part/3/') diff --git a/InvenTree/stock/migrations/0061_auto_20210511_0911.py b/InvenTree/stock/migrations/0061_auto_20210511_0911.py index 0ab37250c8..ba0ecc5207 100644 --- a/InvenTree/stock/migrations/0061_auto_20210511_0911.py +++ b/InvenTree/stock/migrations/0061_auto_20210511_0911.py @@ -199,7 +199,8 @@ def update_history(apps, schema_editor): update_count += 1 - print(f"\n==========================\nUpdated {update_count} StockItemHistory entries") + if update_count > 0: + print(f"\n==========================\nUpdated {update_count} StockItemHistory entries") def reverse_update(apps, schema_editor): diff --git a/InvenTree/stock/migrations/0064_auto_20210621_1724.py b/InvenTree/stock/migrations/0064_auto_20210621_1724.py index 71314f366c..361ad02c80 100644 --- a/InvenTree/stock/migrations/0064_auto_20210621_1724.py +++ b/InvenTree/stock/migrations/0064_auto_20210621_1724.py @@ -26,7 +26,8 @@ def extract_purchase_price(apps, schema_editor): # Find all the StockItem objects without a purchase_price which point to a PurchaseOrder items = StockItem.objects.filter(purchase_price=None).exclude(purchase_order=None) - print(f"Found {items.count()} stock items with missing purchase price information") + if items.count() > 0: + print(f"Found {items.count()} stock items with missing purchase price information") update_count = 0 @@ -56,7 +57,8 @@ def extract_purchase_price(apps, schema_editor): break - print(f"Updated pricing for {update_count} stock items") + if update_count > 0: + print(f"Updated pricing for {update_count} stock items") def reverse_operation(apps, schema_editor): """ From 9475af62ae92ee7e405ce2d558109bb1d3f45f97 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 10:12:44 +1000 Subject: [PATCH 064/110] Style fixes --- InvenTree/InvenTree/serializers.py | 2 +- InvenTree/part/test_api.py | 9 ++++++--- InvenTree/part/test_part.py | 11 ++++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 00be9949f4..2bc89ef637 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -48,7 +48,7 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): this class ensures that the underlying model is also validated. """ - # Run any native validation checks first (may throw an ValidationError) + # Run any native validation checks first (may raise a ValidationError) data = super().run_validation(data) # Now ensure the underlying model is correct diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index b7472a3b1c..6695e8725c 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -1,4 +1,5 @@ -from django.db import models +# -*- coding: utf-8 -*- + from rest_framework import status from django.urls import reverse @@ -438,7 +439,8 @@ class PartDetailTests(InvenTreeAPITestCase): url = reverse('api-part-detail', kwargs={'pk': pk}) # Attempt to alter the revision code - response = self.client.patch(url, + response = self.client.patch( + url, { 'revision': 'A', }, @@ -448,7 +450,8 @@ class PartDetailTests(InvenTreeAPITestCase): self.assertEqual(response.status_code, 400) # But we *can* change it to a unique revision code - response = self.client.patch(url, + response = self.client.patch( + url, { 'revision': 'C', } diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index cdbf19f485..b8a379d241 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -97,11 +97,12 @@ class PartTest(TestCase): self.assertEqual(Part.objects.count(), n + 1) - part = Part(category=cat, - name='part', - description='description', - IPN='IPN', - revision='A', + part = Part( + category=cat, + name='part', + description='description', + IPN='IPN', + revision='A', ) with self.assertRaises(ValidationError): From 6886570d0fa5c9c59dc5617180c119bfaa91aade Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 10:30:15 +1000 Subject: [PATCH 065/110] Bug fix for build order allocation sorting --- InvenTree/templates/js/build.js | 12 +++++++----- InvenTree/templates/js/tables.js | 14 ++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/InvenTree/templates/js/build.js b/InvenTree/templates/js/build.js index e8af981817..22d8ea7ea3 100644 --- a/InvenTree/templates/js/build.js +++ b/InvenTree/templates/js/build.js @@ -418,6 +418,7 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { sub_part_detail: true, sub_part_trackable: trackable, }, + disablePagination: true, formatNoMatches: function() { return '{% trans "No BOM items found" %}'; }, @@ -667,6 +668,7 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { { field: 'sub_part_detail.stock', title: '{% trans "Available" %}', + sortable: true, }, { field: 'allocated', @@ -686,14 +688,12 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { return makeProgressBar(allocated, required); }, sorter: function(valA, valB, rowA, rowB) { + console.log("sorting!"); var aA = sumAllocations(rowA); var aB = sumAllocations(rowB); - var qA = rowA.quantity; - var qB = rowB.quantity; - - qA *= output.quantity; - qB *= output.quantity; + var qA = requiredQuantity(rowA); + var qB = requiredQuantity(rowB); // Handle the case where both numerators are zero if ((aA == 0) && (aB == 0)) { @@ -713,6 +713,8 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { return (qA < qB) ? 1 : -1; } + if (progressA == progressB) return 0; + return (progressA < progressB) ? 1 : -1; } }, diff --git a/InvenTree/templates/js/tables.js b/InvenTree/templates/js/tables.js index 645e54fcbb..96eb3f8123 100644 --- a/InvenTree/templates/js/tables.js +++ b/InvenTree/templates/js/tables.js @@ -134,12 +134,14 @@ $.fn.inventreeTable = function(options) { var varName = tableName + '-pagesize'; // Pagingation options (can be server-side or client-side as specified by the caller) - options.pagination = true; - options.paginationVAlign = options.paginationVAlign || 'both'; - options.pageSize = inventreeLoad(varName, 25); - options.pageList = [25, 50, 100, 250, 'all']; - options.totalField = 'count'; - options.dataField = 'results'; + if (!options.disablePagination) { + options.pagination = true; + options.paginationVAlign = options.paginationVAlign || 'both'; + options.pageSize = inventreeLoad(varName, 25); + options.pageList = [25, 50, 100, 250, 'all']; + options.totalField = 'count'; + options.dataField = 'results'; + } // Extract query params var filters = options.queryParams || options.filters || {}; From 6d2cd78d292427b191684deff5ed8a31ab7a0001 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 10:36:04 +1000 Subject: [PATCH 066/110] Fixes for unit tests --- InvenTree/part/models.py | 2 +- InvenTree/part/test_part.py | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 43e54baf91..8ddf049216 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -382,7 +382,7 @@ class Part(MPTTModel): logger.info(f"Deleting unused image file '{previous.image}'") previous.image.delete(save=False) - self.clean() + self.full_clean() super().save(*args, **kwargs) diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index b8a379d241..e30c80549f 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -332,21 +332,24 @@ class PartSettingsTest(TestCase): """ # Create a part - Part.objects.create(name='Hello', description='A thing', IPN='IPN123') + Part.objects.create(name='Hello', description='A thing', IPN='IPN123', revision='A') # Attempt to create a duplicate item (should fail) with self.assertRaises(ValidationError): - Part.objects.create(name='Hello', description='A thing', IPN='IPN123') + part = Part(name='Hello', description='A thing', IPN='IPN123', revision='A') + part.validate_unique() # Attempt to create item with duplicate IPN (should be allowed by default) Part.objects.create(name='Hello', description='A thing', IPN='IPN123', revision='B') # And attempt again with the same values (should fail) with self.assertRaises(ValidationError): - Part.objects.create(name='Hello', description='A thing', IPN='IPN123', revision='B') + part = Part(name='Hello', description='A thing', IPN='IPN123', revision='B') + part.validate_unique() # Now update the settings so duplicate IPN values are *not* allowed InvenTreeSetting.set_setting('PART_ALLOW_DUPLICATE_IPN', False, self.user) with self.assertRaises(ValidationError): - Part.objects.create(name='Hello', description='A thing', IPN='IPN123', revision='C') + part = Part(name='Hello', description='A thing', IPN='IPN123', revision='C') + part.full_clean() From 650d31ae32fd30ac8212c57a4dcb3d696382cc98 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 10:43:00 +1000 Subject: [PATCH 067/110] Remove debug statements --- InvenTree/order/templates/order/po_attachments.html | 2 -- InvenTree/templates/js/build.js | 3 ++- InvenTree/templates/js/stock.js | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/InvenTree/order/templates/order/po_attachments.html b/InvenTree/order/templates/order/po_attachments.html index a0ab77975a..40052c1ec6 100644 --- a/InvenTree/order/templates/order/po_attachments.html +++ b/InvenTree/order/templates/order/po_attachments.html @@ -57,8 +57,6 @@ $("#attachment-table").on('click', '.attachment-delete-button', function() { var url = `/order/purchase-order/attachment/${button.attr('pk')}/delete/`; - console.log("url: " + url); - launchModalForm(url, { reload: true, }); diff --git a/InvenTree/templates/js/build.js b/InvenTree/templates/js/build.js index 22d8ea7ea3..3e5e438add 100644 --- a/InvenTree/templates/js/build.js +++ b/InvenTree/templates/js/build.js @@ -688,7 +688,8 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { return makeProgressBar(allocated, required); }, sorter: function(valA, valB, rowA, rowB) { - console.log("sorting!"); + // Custom sorting function for progress bars + var aA = sumAllocations(rowA); var aB = sumAllocations(rowB); diff --git a/InvenTree/templates/js/stock.js b/InvenTree/templates/js/stock.js index 4dd2093896..06bbb7c20e 100644 --- a/InvenTree/templates/js/stock.js +++ b/InvenTree/templates/js/stock.js @@ -603,7 +603,6 @@ function loadStockTable(table, options) { // REJECTED if (row.status == {{ StockStatus.REJECTED }}) { - console.log("REJECTED - {{ StockStatus.REJECTED }}"); html += makeIconBadge('fa-times-circle icon-red', '{% trans "Stock item has been rejected" %}'); } // LOST From eae9ff7d1db004cbee6987687e93c376eb62017f Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 11:54:18 +1000 Subject: [PATCH 068/110] More unit test fixes --- InvenTree/part/test_api.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 6695e8725c..176149c880 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -4,7 +4,7 @@ from rest_framework import status from django.urls import reverse -from part.models import Part +from part.models import Part, PartCategory from stock.models import StockItem from company.models import Company @@ -232,6 +232,18 @@ class PartAPITest(InvenTreeAPITestCase): response = self.client.get(url, data={'part': 10004}) self.assertEqual(len(response.data), 7) + # Try to post a new object (missing description) + response = self.client.post( + url, + data={ + 'part': 10000, + 'test_name': 'My very first test', + 'required': False, + } + ) + + self.assertEqual(response.status_code, 400) + # Try to post a new object (should succeed) response = self.client.post( url, @@ -239,6 +251,7 @@ class PartAPITest(InvenTreeAPITestCase): 'part': 10000, 'test_name': 'New Test', 'required': True, + 'description': 'a test description' }, format='json', ) @@ -250,7 +263,8 @@ class PartAPITest(InvenTreeAPITestCase): url, data={ 'part': 10004, - 'test_name': " newtest" + 'test_name': " newtest", + 'description': 'dafsdf', }, format='json', ) @@ -486,6 +500,8 @@ class PartAPIAggregationTest(InvenTreeAPITestCase): # Add a new part self.part = Part.objects.create( name='Banana', + description='This is a banana', + category=PartCategory.objects.get(pk=1), ) # Create some stock items associated with the part From 979ef674d6e7aeb17b19acaebcb23e1bff11cae1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 13:24:03 +1000 Subject: [PATCH 069/110] Update data for unit test fixtures --- InvenTree/company/test_api.py | 2 ++ InvenTree/part/fixtures/part.yaml | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/InvenTree/company/test_api.py b/InvenTree/company/test_api.py index c43280c76c..d5cb573f47 100644 --- a/InvenTree/company/test_api.py +++ b/InvenTree/company/test_api.py @@ -119,7 +119,9 @@ class ManufacturerTest(InvenTreeAPITestCase): data = { 'MPN': 'MPN-TEST-123', } + response = self.client.patch(url, data, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['MPN'], 'MPN-TEST-123') diff --git a/InvenTree/part/fixtures/part.yaml b/InvenTree/part/fixtures/part.yaml index 508a1577bb..3c24690efc 100644 --- a/InvenTree/part/fixtures/part.yaml +++ b/InvenTree/part/fixtures/part.yaml @@ -6,7 +6,7 @@ name: 'M2x4 LPHS' description: 'M2x4 low profile head screw' category: 8 - link: www.acme.com/parts/m2x4lphs + link: http://www.acme.com/parts/m2x4lphs tree_id: 0 purchaseable: True level: 0 @@ -56,6 +56,7 @@ fields: name: 'C_22N_0805' description: '22nF capacitor in 0805 package' + purchaseable: true category: 3 tree_id: 0 level: 0 From 3fa3ce06a1cd12ac42d58abfb69b45f79bc72cd2 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 16:28:42 +1000 Subject: [PATCH 070/110] Fixes for PurchaseOrder API interface - Allow DELETE endpoint for PurchaseOrder - Remove 'read_only' attribute for 'reference' field - Add extra functionality to API test class - Add unit testing --- InvenTree/InvenTree/api_tester.py | 34 ++++++++++++-- InvenTree/order/api.py | 2 +- InvenTree/order/serializers.py | 4 +- InvenTree/order/test_api.py | 78 +++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 5 deletions(-) diff --git a/InvenTree/InvenTree/api_tester.py b/InvenTree/InvenTree/api_tester.py index eb92bd80c1..f0f33ad1a5 100644 --- a/InvenTree/InvenTree/api_tester.py +++ b/InvenTree/InvenTree/api_tester.py @@ -73,22 +73,50 @@ class InvenTreeAPITestCase(APITestCase): ruleset.save() break - def get(self, url, data={}, code=200): + def get(self, url, data={}, expected_code=200): """ Issue a GET request """ response = self.client.get(url, data, format='json') - self.assertEqual(response.status_code, code) + if expected_code is not None: + self.assertEqual(response.status_code, expected_code) return response - def post(self, url, data): + def post(self, url, data, expected_code=None): """ Issue a POST request """ response = self.client.post(url, data=data, format='json') + if expected_code is not None: + self.assertEqual(response.status_code, expected_code) + + return response + + def delete(self, url, expected_code=None): + """ + Issue a DELETE request + """ + + response = self.client.delete(url) + + if expected_code is not None: + self.assertEqual(response.status_code, expected_code) + + return response + + def patch(self, url, data, expected_code=None): + """ + Issue a PATCH request + """ + + response = self.client.patch(url, data=data, format='json') + + if expected_code is not None: + self.assertEqual(response.status_code, expected_code) + return response diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index 6661bd568b..5933bf9ab8 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -157,7 +157,7 @@ class POList(generics.ListCreateAPIView): ordering = '-creation_date' -class PODetail(generics.RetrieveUpdateAPIView): +class PODetail(generics.RetrieveUpdateDestroyAPIView): """ API endpoint for detail view of a PurchaseOrder object """ queryset = PurchaseOrder.objects.all() diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index 9efbf947bb..aaed0fa134 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -93,8 +93,10 @@ class POSerializer(InvenTreeModelSerializer): ] read_only_fields = [ - 'reference', 'status' + 'issue_date', + 'complete_date', + 'creation_date', ] diff --git a/InvenTree/order/test_api.py b/InvenTree/order/test_api.py index ee77f429e1..e4851efedc 100644 --- a/InvenTree/order/test_api.py +++ b/InvenTree/order/test_api.py @@ -110,6 +110,84 @@ class PurchaseOrderTest(OrderTest): self.assertEqual(response.status_code, status.HTTP_200_OK) + def test_po_create(self): + """ + Test that we can create and delete a PurchaseOrder via the API + """ + + n = PurchaseOrder.objects.count() + + url = reverse('api-po-list') + + # Initially we do not have "add" permission for the PurchaseOrder model, + # so this POST request should return 403 + response = self.post( + url, + { + 'supplier': 1, + 'reference': '123456789-xyz', + 'description': 'PO created via the API', + }, + expected_code=403 + ) + + # And no new PurchaseOrder objects should have been created + self.assertEqual(PurchaseOrder.objects.count(), n) + + # Ok, now let's give this user the correct permission + self.assignRole('purchase_order.add') + + # Initially we do not have "add" permission for the PurchaseOrder model, + # so this POST request should return 403 + response = self.post( + url, + { + 'supplier': 1, + 'reference': '123456789-xyz', + 'description': 'PO created via the API', + }, + expected_code=201 + ) + + self.assertEqual(PurchaseOrder.objects.count(), n+1) + + pk = response.data['pk'] + + # Try to create a PO with identical reference (should fail!) + response = self.post( + url, + { + 'supplier': 1, + 'reference': '123456789-xyz', + 'description': 'A different description', + }, + expected_code=400 + ) + + self.assertEqual(PurchaseOrder.objects.count(), n+1) + + url = reverse('api-po-detail', kwargs={'pk': pk}) + + # Get detail info! + response = self.get(url) + self.assertEqual(response.data['pk'], pk) + self.assertEqual(response.data['reference'], '123456789-xyz') + + # Now, let's try to delete it! + # Initially, we do *not* have the required permission! + response = self.delete(url, expected_code=403) + + # Now, add the "delete" permission! + self.assignRole("purchase_order.delete") + + response = self.delete(url, expected_code=204) + + # Number of PurchaseOrder objects should have decreased + self.assertEqual(PurchaseOrder.objects.count(), n) + + # And if we try to access the detail view again, it has gone + response = self.get(url, expected_code=404) + class SalesOrderTest(OrderTest): """ From 26dd9c10a4bd131dcedfb5bafc00d8f6d1381d36 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 16:43:38 +1000 Subject: [PATCH 071/110] Fixes for SalesOrder API --- InvenTree/order/api.py | 2 +- InvenTree/order/serializers.py | 5 +- InvenTree/order/test_api.py | 108 ++++++++++++++++++++++++++++++--- 3 files changed, 104 insertions(+), 11 deletions(-) diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index 5933bf9ab8..c22d76a52e 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -382,7 +382,7 @@ class SOList(generics.ListCreateAPIView): ordering = '-creation_date' -class SODetail(generics.RetrieveUpdateAPIView): +class SODetail(generics.RetrieveUpdateDestroyAPIView): """ API endpoint for detail view of a SalesOrder object. """ diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index aaed0fa134..bc3d72e739 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -228,8 +228,9 @@ class SalesOrderSerializer(InvenTreeModelSerializer): ] read_only_fields = [ - 'reference', - 'status' + 'status', + 'creation_date', + 'shipment_date', ] diff --git a/InvenTree/order/test_api.py b/InvenTree/order/test_api.py index e4851efedc..0fb161cf67 100644 --- a/InvenTree/order/test_api.py +++ b/InvenTree/order/test_api.py @@ -110,9 +110,9 @@ class PurchaseOrderTest(OrderTest): self.assertEqual(response.status_code, status.HTTP_200_OK) - def test_po_create(self): + def test_po_operations(self): """ - Test that we can create and delete a PurchaseOrder via the API + Test that we can create / edit and delete a PurchaseOrder via the API """ n = PurchaseOrder.objects.count() @@ -149,7 +149,7 @@ class PurchaseOrderTest(OrderTest): expected_code=201 ) - self.assertEqual(PurchaseOrder.objects.count(), n+1) + self.assertEqual(PurchaseOrder.objects.count(), n + 1) pk = response.data['pk'] @@ -164,7 +164,7 @@ class PurchaseOrderTest(OrderTest): expected_code=400 ) - self.assertEqual(PurchaseOrder.objects.count(), n+1) + self.assertEqual(PurchaseOrder.objects.count(), n + 1) url = reverse('api-po-detail', kwargs={'pk': pk}) @@ -173,6 +173,18 @@ class PurchaseOrderTest(OrderTest): self.assertEqual(response.data['pk'], pk) self.assertEqual(response.data['reference'], '123456789-xyz') + # Try to alter (edit) the PurchaseOrder + response = self.patch( + url, + { + 'reference': '12345-abc', + }, + expected_code=200 + ) + + # Reference should have changed + self.assertEqual(response.data['reference'], '12345-abc') + # Now, let's try to delete it! # Initially, we do *not* have the required permission! response = self.delete(url, expected_code=403) @@ -236,8 +248,6 @@ class SalesOrderTest(OrderTest): response = self.get(url) - self.assertEqual(response.status_code, 200) - data = response.data self.assertEqual(data['pk'], 1) @@ -246,6 +256,88 @@ class SalesOrderTest(OrderTest): url = reverse('api-so-attachment-list') - response = self.get(url) + self.get(url) - self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_so_operations(self): + """ + Test that we can create / edit and delete a SalesOrder via the API + """ + + n = SalesOrder.objects.count() + + url = reverse('api-so-list') + + # Initially we do not have "add" permission for the SalesOrder model, + # so this POST request should return 403 (denied) + response = self.post( + url, + { + 'customer': 4, + 'reference': '12345', + 'description': 'Sales order', + }, + expected_code=403, + ) + + self.assignRole('sales_order.add') + + # Now we should be able to create a SalesOrder via the API + response = self.post( + url, + { + 'customer': 4, + 'reference': '12345', + 'description': 'Sales order', + }, + expected_code=201 + ) + + # Check that the new order has been created + self.assertEqual(SalesOrder.objects.count(), n + 1) + + # Grab the PK for the newly created SalesOrder + pk = response.data['pk'] + + # Try to create a SO with identical reference (should fail) + response = self.post( + url, + { + 'customer': 4, + 'reference': '12345', + 'description': 'Another sales order', + }, + expected_code=400 + ) + + url = reverse('api-so-detail', kwargs={'pk': pk}) + + # Extract detail info for the SalesOrder + response = self.get(url) + self.assertEqual(response.data['reference'], '12345') + + # Try to alter (edit) the SalesOrder + response = self.patch( + url, + { + 'reference': '12345-a', + }, + expected_code=200 + ) + + # Reference should have changed + self.assertEqual(response.data['reference'], '12345-a') + + # Now, let's try to delete this SalesOrder + # Initially, we do not have the required permission + response = self.delete(url, expected_code=403) + + self.assignRole('sales_order.delete') + + response = self.delete(url, expected_code=204) + + # Check that the number of sales orders has decreased + self.assertEqual(SalesOrder.objects.count(), n) + + # And the resource should no longer be available + response = self.get(url, expected_code=404) From 4fe6562d29b73c870d4d02d761ef4b36697dbc7c Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 16:43:49 +1000 Subject: [PATCH 072/110] PEP fixes --- InvenTree/order/test_api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/InvenTree/order/test_api.py b/InvenTree/order/test_api.py index 0fb161cf67..24ca8581d9 100644 --- a/InvenTree/order/test_api.py +++ b/InvenTree/order/test_api.py @@ -258,7 +258,6 @@ class SalesOrderTest(OrderTest): self.get(url) - def test_so_operations(self): """ Test that we can create / edit and delete a SalesOrder via the API From 1456868d0309e45f0082971b1e9fc43dcfd99267 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 17:03:21 +1000 Subject: [PATCH 073/110] Add default values for line item serializers - Once https://github.com/inventree/InvenTree/issues/1687 is fixed, remove default values --- InvenTree/order/serializers.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index bc3d72e739..821e8bf343 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -112,8 +112,9 @@ class POLineItemSerializer(InvenTreeModelSerializer): self.fields.pop('part_detail') self.fields.pop('supplier_part_detail') - quantity = serializers.FloatField() - received = serializers.FloatField() + # TODO: Once https://github.com/inventree/InvenTree/issues/1687 is fixed, remove default values + quantity = serializers.FloatField(default=1) + received = serializers.FloatField(default=0) part_detail = PartBriefSerializer(source='get_base_part', many=False, read_only=True) supplier_part_detail = SupplierPartSerializer(source='part', many=False, read_only=True) @@ -316,7 +317,9 @@ class SOLineItemSerializer(InvenTreeModelSerializer): part_detail = PartBriefSerializer(source='part', many=False, read_only=True) allocations = SalesOrderAllocationSerializer(many=True, read_only=True) - quantity = serializers.FloatField() + # TODO: Once https://github.com/inventree/InvenTree/issues/1687 is fixed, remove default values + quantity = serializers.FloatField(default=1) + allocated = serializers.FloatField(source='allocated_quantity', read_only=True) fulfilled = serializers.FloatField(source='fulfilled_quantity', read_only=True) sale_price_string = serializers.CharField(source='sale_price', read_only=True) From fcd38c16d8896b17a2fb1ab59e96832aa98a695b Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 20:26:55 +1000 Subject: [PATCH 074/110] Add workflow to ensure that the python bindings build whenever there's a push to master --- .github/workflows/python.yaml | 45 +++++++++++++++++++++++++++++++++++ InvenTree/InvenTree/tasks.py | 6 +++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/python.yaml diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml new file mode 100644 index 0000000000..478b05c9f8 --- /dev/null +++ b/.github/workflows/python.yaml @@ -0,0 +1,45 @@ +# Run python library tests whenever code is pushed to master + +name: Python Bindings + +on: + push: + branches: + - 'master' + +jobs: + + python: + runs-on: ubuntu-latest + + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + INVENTREE_DB_NAME: './test_db.sqlite' + INVENTREE_DB_ENGINE: 'sqlite3' + INVENTREE_DEBUG: info + INVENTREE_MEDIA_ROOT: ./media + INVENTREE_STATIC_ROOT: ./static + + steps: + - name: Checkout Code + uses: actions/checkout@v2 + - name: Install InvenTree + run: | + sudo apt-get update + sudo apt-get install python3-dev python3-pip python3-venv + pip3 install invoke + invoke install + invoke migrate + - name: Download Python Code + run: | + git clone --depth 1 https://github.com/inventee/inventree-python ./inventree-python + - name: Start Server + run: | + invoke import-records -f ./inventree-python/test/test_data.json + invoke server -a 127.0.0.1:8000 & + sleep 60 + - name: Run Tests + run: | + cd inventree-python + invoke test + \ No newline at end of file diff --git a/InvenTree/InvenTree/tasks.py b/InvenTree/InvenTree/tasks.py index d45df99152..4fb78cfbab 100644 --- a/InvenTree/InvenTree/tasks.py +++ b/InvenTree/InvenTree/tasks.py @@ -80,7 +80,7 @@ def heartbeat(): try: from django_q.models import Success - logger.warning("Could not perform heartbeat task - App registry not ready") + logger.info("Could not perform heartbeat task - App registry not ready") except AppRegistryNotReady: return @@ -105,7 +105,7 @@ def delete_successful_tasks(): try: from django_q.models import Success except AppRegistryNotReady: - logger.warning("Could not perform 'delete_successful_tasks' - App registry not ready") + logger.info("Could not perform 'delete_successful_tasks' - App registry not ready") return threshold = datetime.now() - timedelta(days=30) @@ -126,6 +126,7 @@ def check_for_updates(): import common.models except AppRegistryNotReady: # Apps not yet loaded! + logger.info("Could not perform 'check_for_updates' - App registry not ready") return response = requests.get('https://api.github.com/repos/inventree/inventree/releases/latest') @@ -172,6 +173,7 @@ def update_exchange_rates(): from django.conf import settings except AppRegistryNotReady: # Apps not yet loaded! + logger.info("Could not perform 'update_exchange_rates' - App registry not ready") return except: # Other error? From 691888ec1e865f17c9087ec1ed9267facd34d4cf Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 20:49:49 +1000 Subject: [PATCH 075/110] Fixes for python integration --- .github/workflows/python.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index 478b05c9f8..caf374864e 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -2,10 +2,11 @@ name: Python Bindings -on: - push: - branches: - - 'master' +#on: +# push: +# branches: +# - 'master' +on: ["pull_request"] jobs: @@ -32,7 +33,7 @@ jobs: invoke migrate - name: Download Python Code run: | - git clone --depth 1 https://github.com/inventee/inventree-python ./inventree-python + git clone --depth 1 https://github.com/inventree/inventree-python ./inventree-python - name: Start Server run: | invoke import-records -f ./inventree-python/test/test_data.json From 3884ab0df2c47ab6d2077f6acf06a684e3222a62 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 20:58:29 +1000 Subject: [PATCH 076/110] Change workflow target --- .github/workflows/python.yaml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/python.yaml b/.github/workflows/python.yaml index caf374864e..7e32685af1 100644 --- a/.github/workflows/python.yaml +++ b/.github/workflows/python.yaml @@ -2,11 +2,14 @@ name: Python Bindings -#on: -# push: -# branches: -# - 'master' -on: ["pull_request"] +on: + push: + branches: + - master + + pull_request: + branches-ignore: + - l10* jobs: From e29594811baecb9fa4b7db41a8938f7a6f500418 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 22:09:30 +1000 Subject: [PATCH 077/110] Allow direct upload of images via the API --- InvenTree/InvenTree/serializers.py | 14 ++++++++++++++ InvenTree/part/serializers.py | 12 ++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 2bc89ef637..14e78f94b1 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -101,3 +101,17 @@ class InvenTreeAttachmentSerializerField(serializers.FileField): return None return os.path.join(str(settings.MEDIA_URL), str(value)) + + +class InvenTreeImageSerializierField(serializers.FileField): + """ + Custom image serializer. + On upload, validate that the file is a valid image file + """ + + def to_representation(self, value): + + if not value: + return None + + return os.path.join(str(settings.MEDIA_URL), str(value)) diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 76275bd5e1..7d70a843d8 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -7,12 +7,15 @@ from decimal import Decimal from django.db import models from django.db.models import Q from django.db.models.functions import Coalesce -from InvenTree.serializers import (InvenTreeAttachmentSerializerField, - InvenTreeModelSerializer) -from InvenTree.status_codes import BuildStatus, PurchaseOrderStatus + from rest_framework import serializers from sql_util.utils import SubqueryCount, SubquerySum from djmoney.contrib.django_rest_framework import MoneyField + +from InvenTree.serializers import (InvenTreeAttachmentSerializerField, + InvenTreeImageSerializierField, + InvenTreeModelSerializer) +from InvenTree.status_codes import BuildStatus, PurchaseOrderStatus from stock.models import StockItem from .models import (BomItem, Part, PartAttachment, PartCategory, @@ -300,7 +303,8 @@ class PartSerializer(InvenTreeModelSerializer): stock_item_count = serializers.IntegerField(read_only=True) suppliers = serializers.IntegerField(read_only=True) - image = serializers.CharField(source='get_image_url', read_only=True) + image = InvenTreeImageSerializerField(required=False) + # image = serializers.CharField(source='get_image_url', read_only=True) thumbnail = serializers.CharField(source='get_thumbnail_url', read_only=True) starred = serializers.SerializerMethodField() From 2fc7c3d88330709b59e226b6d79bb37aa9df73fe Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 22:16:11 +1000 Subject: [PATCH 078/110] fix typo --- InvenTree/InvenTree/serializers.py | 2 +- InvenTree/part/serializers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 14e78f94b1..032e10bf81 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -103,7 +103,7 @@ class InvenTreeAttachmentSerializerField(serializers.FileField): return os.path.join(str(settings.MEDIA_URL), str(value)) -class InvenTreeImageSerializierField(serializers.FileField): +class InvenTreeImageSerializerField(serializers.FileField): """ Custom image serializer. On upload, validate that the file is a valid image file diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 7d70a843d8..294a5e5918 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -13,7 +13,7 @@ from sql_util.utils import SubqueryCount, SubquerySum from djmoney.contrib.django_rest_framework import MoneyField from InvenTree.serializers import (InvenTreeAttachmentSerializerField, - InvenTreeImageSerializierField, + InvenTreeImageSerializerField, InvenTreeModelSerializer) from InvenTree.status_codes import BuildStatus, PurchaseOrderStatus from stock.models import StockItem From b8e4b58df00e8ea061412d2901eeef9ad6c05daf Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 22 Jun 2021 22:19:22 +1000 Subject: [PATCH 079/110] Catch potential error updating image that does not exist... --- InvenTree/InvenTree/tasks.py | 2 +- InvenTree/company/apps.py | 2 -- InvenTree/part/apps.py | 6 +++--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/InvenTree/InvenTree/tasks.py b/InvenTree/InvenTree/tasks.py index 4fb78cfbab..f0fe504072 100644 --- a/InvenTree/InvenTree/tasks.py +++ b/InvenTree/InvenTree/tasks.py @@ -28,7 +28,7 @@ def schedule_task(taskname, **kwargs): try: from django_q.models import Schedule except (AppRegistryNotReady): - logger.warning("Could not start background tasks - App registry not ready") + logger.info("Could not start background tasks - App registry not ready") return try: diff --git a/InvenTree/company/apps.py b/InvenTree/company/apps.py index 4366f63434..76798c5ad4 100644 --- a/InvenTree/company/apps.py +++ b/InvenTree/company/apps.py @@ -44,8 +44,6 @@ class CompanyConfig(AppConfig): company.image.render_variations(replace=False) except FileNotFoundError: logger.warning(f"Image file '{company.image}' missing") - company.image = None - company.save() except UnidentifiedImageError: logger.warning(f"Image file '{company.image}' is invalid") except (OperationalError, ProgrammingError): diff --git a/InvenTree/part/apps.py b/InvenTree/part/apps.py index 1b233bccac..0c57e2c1ab 100644 --- a/InvenTree/part/apps.py +++ b/InvenTree/part/apps.py @@ -39,7 +39,8 @@ class PartConfig(AppConfig): logger.debug("InvenTree: Checking Part image thumbnails") try: - for part in Part.objects.all(): + # Only check parts which have images + for part in Part.objects.exclude(image=None): if part.image: url = part.image.thumbnail.name loc = os.path.join(settings.MEDIA_ROOT, url) @@ -50,8 +51,7 @@ class PartConfig(AppConfig): part.image.render_variations(replace=False) except FileNotFoundError: logger.warning(f"Image file '{part.image}' missing") - part.image = None - part.save() + pass except UnidentifiedImageError: logger.warning(f"Image file '{part.image}' is invalid") except (OperationalError, ProgrammingError): From f199feb8d90ad2aa2d3a426c5468f2c358ef78c7 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Jun 2021 08:34:45 +1000 Subject: [PATCH 080/110] Use the part detail API for uploading a new image --- InvenTree/InvenTree/static/script/inventree/api.js | 2 +- InvenTree/InvenTree/static/script/inventree/inventree.js | 4 +++- InvenTree/part/templates/part/part_base.html | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/InvenTree/InvenTree/static/script/inventree/api.js b/InvenTree/InvenTree/static/script/inventree/api.js index 52aba80ef5..b43bcc8419 100644 --- a/InvenTree/InvenTree/static/script/inventree/api.js +++ b/InvenTree/InvenTree/static/script/inventree/api.js @@ -58,7 +58,7 @@ function inventreeFormDataUpload(url, data, options={}) { xhr.setRequestHeader('X-CSRFToken', csrftoken); }, url: url, - method: 'POST', + method: options.method || 'POST', data: data, processData: false, contentType: false, diff --git a/InvenTree/InvenTree/static/script/inventree/inventree.js b/InvenTree/InvenTree/static/script/inventree/inventree.js index 1a6fdec47a..79e02d7da5 100644 --- a/InvenTree/InvenTree/static/script/inventree/inventree.js +++ b/InvenTree/InvenTree/static/script/inventree/inventree.js @@ -219,6 +219,7 @@ function enableDragAndDrop(element, url, options) { data - Other form data to upload success - Callback function in case of success error - Callback function in case of error + method - HTTP method */ data = options.data || {}; @@ -254,7 +255,8 @@ function enableDragAndDrop(element, url, options) { if (options.error) { options.error(xhr, status, error); } - } + }, + method: options.method || 'POST', } ); } else { diff --git a/InvenTree/part/templates/part/part_base.html b/InvenTree/part/templates/part/part_base.html index 7e1d33bdea..6bb1320e5a 100644 --- a/InvenTree/part/templates/part/part_base.html +++ b/InvenTree/part/templates/part/part_base.html @@ -239,9 +239,10 @@ enableDragAndDrop( '#part-thumb', - "{% url 'part-image-upload' part.id %}", + "{% url 'api-part-detail' part.id %}", { label: 'image', + method: 'PATCH', success: function(data, status, xhr) { location.reload(); } From 878f26c77095e8c45a8477098d7b79c4f909506b Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Jun 2021 08:39:06 +1000 Subject: [PATCH 081/110] Enable upload of company image via the API --- InvenTree/company/serializers.py | 3 ++- InvenTree/company/templates/company/company_base.html | 3 ++- InvenTree/part/serializers.py | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 471d26bd3f..8fc6941504 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -11,6 +11,7 @@ from .models import ManufacturerPart, ManufacturerPartParameter from .models import SupplierPart, SupplierPriceBreak from InvenTree.serializers import InvenTreeModelSerializer +from InvenTree.serializers import InvenTreeImageSerializerField from part.serializers import PartBriefSerializer @@ -52,7 +53,7 @@ class CompanySerializer(InvenTreeModelSerializer): url = serializers.CharField(source='get_absolute_url', read_only=True) - image = serializers.CharField(source='get_thumbnail_url', read_only=True) + image = InvenTreeImageSerializerField(required=False) parts_supplied = serializers.IntegerField(read_only=True) parts_manufactured = serializers.IntegerField(read_only=True) diff --git a/InvenTree/company/templates/company/company_base.html b/InvenTree/company/templates/company/company_base.html index 1eefade272..70af753d66 100644 --- a/InvenTree/company/templates/company/company_base.html +++ b/InvenTree/company/templates/company/company_base.html @@ -139,9 +139,10 @@ enableDragAndDrop( "#company-thumb", - "{% url 'company-image' company.id %}", + "{% url 'api-company-detail' company.id %}", { label: 'image', + method: 'PATCH', success: function(data, status, xhr) { location.reload(); } diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 294a5e5918..fe0ceea560 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -304,7 +304,6 @@ class PartSerializer(InvenTreeModelSerializer): suppliers = serializers.IntegerField(read_only=True) image = InvenTreeImageSerializerField(required=False) - # image = serializers.CharField(source='get_image_url', read_only=True) thumbnail = serializers.CharField(source='get_thumbnail_url', read_only=True) starred = serializers.SerializerMethodField() From a866001ffe164f001317e4695963cf2a4258c37f Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Jun 2021 08:40:51 +1000 Subject: [PATCH 082/110] Bump API version to 6 --- InvenTree/InvenTree/version.py | 15 ++++++++++----- InvenTree/company/serializers.py | 8 ++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index a47ef3b667..3681be0f0b 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -10,22 +10,27 @@ import common.models INVENTREE_SW_VERSION = "0.2.4 pre" +INVENTREE_API_VERSION = 6 + """ Increment thi API version number whenever there is a significant change to the API that any clients need to know about -v3 -> 2021-05-22: - - The updated StockItem "history tracking" now uses a different interface +v6 -> 2021-06-23 + - Part and Company images can now be directly uploaded via the REST API + +v5 -> 2021-06-21 + - Adds API interface for manufacturer part parameters v4 -> 2021-06-01 - BOM items can now accept "variant stock" to be assigned against them - Many slight API tweaks were needed to get this to work properly! -v5 -> 2021-06-21 - - Adds API interface for manufacturer part parameters +v3 -> 2021-05-22: + - The updated StockItem "history tracking" now uses a different interface """ -INVENTREE_API_VERSION = 5 + def inventreeInstanceName(): diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 8fc6941504..11daf8898b 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -6,15 +6,15 @@ from rest_framework import serializers from sql_util.utils import SubqueryCount -from .models import Company -from .models import ManufacturerPart, ManufacturerPartParameter -from .models import SupplierPart, SupplierPriceBreak - from InvenTree.serializers import InvenTreeModelSerializer from InvenTree.serializers import InvenTreeImageSerializerField from part.serializers import PartBriefSerializer +from .models import Company +from .models import ManufacturerPart, ManufacturerPartParameter +from .models import SupplierPart, SupplierPriceBreak + class CompanyBriefSerializer(InvenTreeModelSerializer): """ Serializer for Company object (limited detail) """ From 5ba7aeaa277b14a2c4ce7ef1f3d97adad9307bb6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Jun 2021 10:28:21 +1000 Subject: [PATCH 083/110] Fixes: - Use DRF ImageField, not FileField - Ensure that permissions get updated correctly in 'test' mode - Allow file upload in the APITester class --- .gitignore | 3 ++ InvenTree/InvenTree/api_tester.py | 4 +- InvenTree/InvenTree/ready.py | 6 ++- InvenTree/InvenTree/serializers.py | 2 +- InvenTree/InvenTree/version.py | 2 - InvenTree/part/test_api.py | 79 ++++++++++++++++++++++++++++-- InvenTree/users/apps.py | 2 +- InvenTree/users/models.py | 2 +- 8 files changed, 88 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 5dd3580ef6..c53a837e24 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,9 @@ local_settings.py *.backup *.old +# Files used for testing +dummy_image.* + # Sphinx files docs/_build diff --git a/InvenTree/InvenTree/api_tester.py b/InvenTree/InvenTree/api_tester.py index f0f33ad1a5..a803e6797f 100644 --- a/InvenTree/InvenTree/api_tester.py +++ b/InvenTree/InvenTree/api_tester.py @@ -109,12 +109,12 @@ class InvenTreeAPITestCase(APITestCase): return response - def patch(self, url, data, expected_code=None): + def patch(self, url, data, files=None, expected_code=None): """ Issue a PATCH request """ - response = self.client.patch(url, data=data, format='json') + response = self.client.patch(url, data=data, files=files, format='json') if expected_code is not None: self.assertEqual(response.status_code, expected_code) diff --git a/InvenTree/InvenTree/ready.py b/InvenTree/InvenTree/ready.py index 4acbcae9af..7d63861f4b 100644 --- a/InvenTree/InvenTree/ready.py +++ b/InvenTree/InvenTree/ready.py @@ -12,7 +12,7 @@ def isInTestMode(): return False -def canAppAccessDatabase(): +def canAppAccessDatabase(allow_test=False): """ Returns True if the apps.py file can access database records. @@ -39,6 +39,10 @@ def canAppAccessDatabase(): 'compilemessages', ] + if not allow_test: + # Override for testing mode? + excluded_commands.append('test') + for cmd in excluded_commands: if cmd in sys.argv: return False diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 032e10bf81..f093255ff0 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -103,7 +103,7 @@ class InvenTreeAttachmentSerializerField(serializers.FileField): return os.path.join(str(settings.MEDIA_URL), str(value)) -class InvenTreeImageSerializerField(serializers.FileField): +class InvenTreeImageSerializerField(serializers.ImageField): """ Custom image serializer. On upload, validate that the file is a valid image file diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index 3681be0f0b..08fa5e0ae4 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -31,8 +31,6 @@ v3 -> 2021-05-22: """ - - def inventreeInstanceName(): """ Returns the InstanceName settings for the current database """ return common.models.InvenTreeSetting.get_setting("INVENTREE_INSTANCE", "") diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 176149c880..d606b12637 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -1,16 +1,19 @@ # -*- coding: utf-8 -*- -from rest_framework import status +import PIL from django.urls import reverse +from rest_framework import status +from rest_framework.test import APIClient + +from InvenTree.api_tester import InvenTreeAPITestCase +from InvenTree.status_codes import StockStatus + from part.models import Part, PartCategory from stock.models import StockItem from company.models import Company -from InvenTree.api_tester import InvenTreeAPITestCase -from InvenTree.status_codes import StockStatus - class PartAPITest(InvenTreeAPITestCase): """ @@ -473,6 +476,74 @@ class PartDetailTests(InvenTreeAPITestCase): self.assertEqual(response.status_code, 200) + def test_image_upload(self): + """ + Test that we can upload an image to the part API + """ + + self.assignRole('part.add') + + # Create a new part + response = self.client.post( + reverse('api-part-list'), + { + 'name': 'imagine', + 'description': 'All the people', + 'category': 1, + }, + expected_code=201 + ) + + pk = response.data['pk'] + + url = reverse('api-part-detail', kwargs={'pk': pk}) + + p = Part.objects.get(pk=pk) + + # Part should not have an image! + with self.assertRaises(ValueError): + print(p.image.file) + + # Create a custom APIClient for file uploads + # Ref: https://stackoverflow.com/questions/40453947/how-to-generate-a-file-upload-test-request-with-django-rest-frameworks-apireq + upload_client = APIClient() + upload_client.force_authenticate(user=self.user) + + # Try to upload a non-image file + with open('dummy_image.txt', 'w') as dummy_image: + dummy_image.write('hello world') + + with open('dummy_image.txt', 'rb') as dummy_image: + response = upload_client.patch( + url, + { + 'image': dummy_image, + }, + format='multipart', + ) + + self.assertEqual(response.status_code, 400) + + # Now try to upload a valid image file + img = PIL.Image.new('RGB', (128, 128), color='red') + img.save('dummy_image.jpg') + + with open('dummy_image.jpg', 'rb') as dummy_image: + response = upload_client.patch( + url, + { + 'image': dummy_image, + }, + format='multipart', + ) + + self.assertEqual(response.status_code, 200) + + # And now check that the image has been set + p = Part.objects.get(pk=pk) + + print("Image:", p.image.file) + class PartAPIAggregationTest(InvenTreeAPITestCase): """ diff --git a/InvenTree/users/apps.py b/InvenTree/users/apps.py index a9f671895d..f6666e3a94 100644 --- a/InvenTree/users/apps.py +++ b/InvenTree/users/apps.py @@ -13,7 +13,7 @@ class UsersConfig(AppConfig): def ready(self): - if canAppAccessDatabase(): + if canAppAccessDatabase(allow_test=True): try: self.assign_permissions() diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index 09d70c3501..2763ba0e10 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -276,7 +276,7 @@ def update_group_roles(group, debug=False): """ - if not canAppAccessDatabase(): + if not canAppAccessDatabase(allow_test=True): return # List of permissions already associated with this group From 36e6b9f164b5f6980c60ace3717afbd80d24e23f Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Jun 2021 11:40:37 +1000 Subject: [PATCH 084/110] Set allow_null flag on image fields --- InvenTree/company/serializers.py | 2 +- InvenTree/company/test_api.py | 9 +++++++-- InvenTree/part/serializers.py | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 11daf8898b..1e97756987 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -53,7 +53,7 @@ class CompanySerializer(InvenTreeModelSerializer): url = serializers.CharField(source='get_absolute_url', read_only=True) - image = InvenTreeImageSerializerField(required=False) + image = InvenTreeImageSerializerField(required=False, allow_null=True) parts_supplied = serializers.IntegerField(read_only=True) parts_manufactured = serializers.IntegerField(read_only=True) diff --git a/InvenTree/company/test_api.py b/InvenTree/company/test_api.py index d5cb573f47..dd42b97801 100644 --- a/InvenTree/company/test_api.py +++ b/InvenTree/company/test_api.py @@ -50,10 +50,15 @@ class CompanyTest(InvenTreeAPITestCase): self.assertEqual(response.data['name'], 'ACME') # Change the name of the company + # Note we should not have the correct permissions (yet) data = response.data data['name'] = 'ACMOO' - response = self.client.patch(url, data, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) + response = self.client.patch(url, data, format='json', expected_code=400) + + self.assignRole('company.change') + + response = self.client.patch(url, data, format='json', expected_code=200) + self.assertEqual(response.data['name'], 'ACMOO') def test_company_search(self): diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index fe0ceea560..6c47f1310f 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -303,7 +303,7 @@ class PartSerializer(InvenTreeModelSerializer): stock_item_count = serializers.IntegerField(read_only=True) suppliers = serializers.IntegerField(read_only=True) - image = InvenTreeImageSerializerField(required=False) + image = InvenTreeImageSerializerField(required=False, allow_null=True) thumbnail = serializers.CharField(source='get_thumbnail_url', read_only=True) starred = serializers.SerializerMethodField() From 2e1ad0c2458394a57a1da7b4302321162d25768c Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Jun 2021 18:54:01 +1000 Subject: [PATCH 085/110] Change some warnings to infos --- InvenTree/InvenTree/status.py | 6 +++--- InvenTree/InvenTree/test_api.py | 2 +- InvenTree/part/test_param.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/InvenTree/InvenTree/status.py b/InvenTree/InvenTree/status.py index 93b904d55b..512c68e93b 100644 --- a/InvenTree/InvenTree/status.py +++ b/InvenTree/InvenTree/status.py @@ -61,21 +61,21 @@ def is_email_configured(): # Display warning unless in test mode if not settings.TESTING: - logger.warning("EMAIL_HOST is not configured") + logger.debug("EMAIL_HOST is not configured") if not settings.EMAIL_HOST_USER: configured = False # Display warning unless in test mode if not settings.TESTING: - logger.warning("EMAIL_HOST_USER is not configured") + logger.debug("EMAIL_HOST_USER is not configured") if not settings.EMAIL_HOST_PASSWORD: configured = False # Display warning unless in test mode if not settings.TESTING: - logger.warning("EMAIL_HOST_PASSWORD is not configured") + logger.debug("EMAIL_HOST_PASSWORD is not configured") return configured diff --git a/InvenTree/InvenTree/test_api.py b/InvenTree/InvenTree/test_api.py index 8435d756fb..f196006df9 100644 --- a/InvenTree/InvenTree/test_api.py +++ b/InvenTree/InvenTree/test_api.py @@ -77,7 +77,7 @@ class APITests(InvenTreeAPITestCase): self.assertIn('version', data) self.assertIn('instance', data) - self.assertEquals('InvenTree', data['server']) + self.assertEqual('InvenTree', data['server']) def test_role_view(self): """ diff --git a/InvenTree/part/test_param.py b/InvenTree/part/test_param.py index 4e6556e63d..85eea7ee57 100644 --- a/InvenTree/part/test_param.py +++ b/InvenTree/part/test_param.py @@ -23,7 +23,7 @@ class TestParams(TestCase): def test_str(self): t1 = PartParameterTemplate.objects.get(pk=1) - self.assertEquals(str(t1), 'Length (mm)') + self.assertEqual(str(t1), 'Length (mm)') p1 = PartParameter.objects.get(pk=1) self.assertEqual(str(p1), 'M2x4 LPHS : Length = 4mm') From 70a073be21c08c1cf4a9b461866cc05d81cdb828 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Jun 2021 19:28:23 +1000 Subject: [PATCH 086/110] Live update part image --- InvenTree/part/templates/part/part_base.html | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/InvenTree/part/templates/part/part_base.html b/InvenTree/part/templates/part/part_base.html index 6bb1320e5a..b486e2c589 100644 --- a/InvenTree/part/templates/part/part_base.html +++ b/InvenTree/part/templates/part/part_base.html @@ -244,7 +244,14 @@ label: 'image', method: 'PATCH', success: function(data, status, xhr) { - location.reload(); + + // If image / thumbnail data present, live update + if (data.image) { + $('#part-image').attr('src', data.image); + } else { + // Otherwise, reload the page + location.reload(); + } } } ); From f0db9bc3d572de31fa14cf82aa7566cd17a266c2 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 23 Jun 2021 19:29:41 +1000 Subject: [PATCH 087/110] Live update of Company image --- InvenTree/company/templates/company/company_base.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/InvenTree/company/templates/company/company_base.html b/InvenTree/company/templates/company/company_base.html index 70af753d66..a276f5df4f 100644 --- a/InvenTree/company/templates/company/company_base.html +++ b/InvenTree/company/templates/company/company_base.html @@ -144,7 +144,12 @@ label: 'image', method: 'PATCH', success: function(data, status, xhr) { - location.reload(); + + if (data.image) { + $('#company-image').attr('src', data.image); + } else { + location.reload(); + } } } ); From a12790d5ca6241127dbdfea64a7f68e8d29a5a4c Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 24 Jun 2021 13:23:12 +1000 Subject: [PATCH 088/110] Fixes table data nesting Sometimes you just need a quick break --- InvenTree/templates/js/stock.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/InvenTree/templates/js/stock.js b/InvenTree/templates/js/stock.js index 06bbb7c20e..b557f0c327 100644 --- a/InvenTree/templates/js/stock.js +++ b/InvenTree/templates/js/stock.js @@ -179,27 +179,32 @@ function loadStockTestResultsTable(table, options) { var match = false; var override = false; + // Extract the simplified test key var key = item.key; // Attempt to associate this result with an existing test - tableData.forEach(function(row, index) { + for (var idx = 0; idx < tableData.length; idx++) { + + var row = tableData[idx]; if (key == row.key) { item.test_name = row.test_name; item.required = row.required; - match = true; - if (row.result == null) { item.parent = parent_node; - tableData[index] = item; + tableData[idx] = item; override = true; } else { item.parent = row.pk; } + + match = true; + + break; } - }); + } // No match could be found if (!match) { From abe00232f3fbc571a811ee49f3a0e4a2781b769b Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 24 Jun 2021 21:47:11 +0200 Subject: [PATCH 089/110] use internal price in more places --- InvenTree/part/models.py | 9 ++++++--- InvenTree/part/views.py | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 8ddf049216..77ec693a3d 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -1479,16 +1479,17 @@ class Part(MPTTModel): return True - def get_price_info(self, quantity=1, buy=True, bom=True): + def get_price_info(self, quantity=1, buy=True, bom=True, internal=False): """ Return a simplified pricing string for this part Args: quantity: Number of units to calculate price for buy: Include supplier pricing (default = True) bom: Include BOM pricing (default = True) + internal: Include internal pricing (default = False) """ - price_range = self.get_price_range(quantity, buy, bom) + price_range = self.get_price_range(quantity, buy, bom, internal) if price_range is None: return None @@ -2499,7 +2500,9 @@ class BomItem(models.Model): def price_range(self): """ Return the price-range for this BOM item. """ - prange = self.sub_part.get_price_range(self.quantity) + # get internal price setting + use_internal = common.models.InvenTreeSetting.get_setting('PART_BOM_USE_INTERNAL_PRICE', False) + prange = self.sub_part.get_price_range(self.quantity, intenal=use_internal) if prange is None: return prange diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 39e0f13b45..743b3a36b9 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -847,11 +847,13 @@ class PartPricingView(PartDetail): # BOM Information for Pie-Chart if part.has_bom: + # get internal price setting + use_internal = InvenTreeSetting.get_setting('PART_BOM_USE_INTERNAL_PRICE', False) ctx_bom_parts = [] # iterate over all bom-items for item in part.bom_items.all(): ctx_item = {'name': str(item.sub_part)} - price, qty = item.sub_part.get_price_range(quantity), item.quantity + price, qty = item.sub_part.get_price_range(quantity, internal=use_internal), item.quantity price_min, price_max = 0, 0 if price: # check if price available From 9ce5a9823e5dc40143c1750824e200c2ac61870b Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 24 Jun 2021 21:48:00 +0200 Subject: [PATCH 090/110] added doc for internal price --- InvenTree/part/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 77ec693a3d..2b97fde596 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -1577,9 +1577,10 @@ class Part(MPTTModel): - Supplier price (if purchased from suppliers) - BOM price (if built from other parts) + - Internal price (if set for the part) Returns: - Minimum of the supplier price or BOM price. If no pricing available, returns None + Minimum of the supplier, BOM or internal price. If no pricing available, returns None """ # only get internal price if set and should be used From 3f1aca9e94e49764a7aec49ac2c940a3d576f0e7 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 26 Jun 2021 20:18:25 +1000 Subject: [PATCH 091/110] Translation merge (#1724) * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * updated translation base * updated translation base * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * New Crowdin updates (#1670) * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * updated translation base * updated translation base * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * updated translation base * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin * Fix: New translations django.po from Crowdin Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- InvenTree/locale/de/LC_MESSAGES/django.po | 1624 ++++++------ InvenTree/locale/en/LC_MESSAGES/django.po | 1624 ++++++------ InvenTree/locale/es/LC_MESSAGES/django.po | 1678 +++++++------ InvenTree/locale/fr/LC_MESSAGES/django.po | 1626 ++++++------ InvenTree/locale/it/LC_MESSAGES/django.po | 1626 ++++++------ InvenTree/locale/ja/LC_MESSAGES/django.po | 1626 ++++++------ InvenTree/locale/pl/LC_MESSAGES/django.po | 1630 ++++++------ InvenTree/locale/ru/LC_MESSAGES/django.po | 1626 ++++++------ InvenTree/locale/tr/LC_MESSAGES/django.po | 2768 +++++++++++---------- InvenTree/locale/zh/LC_MESSAGES/django.po | 1626 ++++++------ 10 files changed, 9447 insertions(+), 8007 deletions(-) diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po index 9eeedee291..3ce90dc928 100644 --- a/InvenTree/locale/de/LC_MESSAGES/django.po +++ b/InvenTree/locale/de/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:41\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-24 21:40\n" "Last-Translator: \n" "Language-Team: German\n" "Language: de_DE\n" @@ -77,7 +77,7 @@ msgstr "Kategorie auswählen" msgid "Duplicate serial: {n}" msgstr "Doppelte Seriennummer: {n}" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "Keine gültige Menge" @@ -122,9 +122,9 @@ msgstr "Kommentar" msgid "File comment" msgstr "Datei-Kommentar" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "Benutzer" @@ -132,34 +132,35 @@ msgstr "Benutzer" msgid "upload date" msgstr "Hochladedatum" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "Name" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "Beschreibung" @@ -191,15 +192,15 @@ msgstr "Polnisch" msgid "Turkish" msgstr "Türkisch" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "Hintergrund-Prozess-Kontrolle fehlgeschlagen" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "E-Mail-Backend nicht konfiguriert" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "InvenTree Status-Überprüfung fehlgeschlagen" @@ -372,27 +373,27 @@ msgstr "Überschuss darf 100% nicht überschreiten" msgid "Overage must be an integer value or a percentage" msgstr "Überschuss muss eine Ganzzahl oder ein Prozentwert sein" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "Element löschen" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "Häkchen setzen um Löschung von Objekt zu bestätigen" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "Benutzerinformationen bearbeiten" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "Passwort eingeben" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "Passwörter stimmen nicht überein" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "Systeminformationen" @@ -445,11 +446,11 @@ msgid "Order target date" msgstr "geplantes Bestelldatum" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "Zieldatum" @@ -462,22 +463,21 @@ msgstr "Zieldatum für Bauauftrag-Fertigstellung." #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,9 +486,10 @@ msgstr "Zieldatum für Bauauftrag-Fertigstellung." #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "Anzahl" @@ -500,7 +501,7 @@ msgstr "Anzahl der zu bauenden Teile" msgid "Enter quantity for build output" msgstr "Menge der Endprodukte angeben" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "Seriennummer" @@ -529,12 +530,12 @@ msgid "Mark build as complete" msgstr "Bauauftrag als vollständig markieren" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "Lagerort" @@ -543,13 +544,13 @@ msgid "Location of completed parts" msgstr "Lagerort der Endprodukte" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "Status" @@ -583,16 +584,16 @@ msgstr "Menge der BestandsObjekte für Zuordnung auswählen" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "Bauauftrag" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -602,12 +603,12 @@ msgstr "Bauaufträge" msgid "Build Order Reference" msgstr "Bauauftragsreferenz" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "Referenz" @@ -626,27 +627,27 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "Teil" @@ -710,16 +711,16 @@ msgstr "Losnummer" msgid "Batch code for this build output" msgstr "Losnummer für dieses Endprodukt" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "Erstelldatum" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "geplantes Fertigstellungsdatum" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "Fertigstellungsdatum" @@ -736,9 +737,9 @@ msgid "User who issued this build order" msgstr "Nutzer der diesen Bauauftrag erstellt hat" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "Verantwortlicher Benutzer" @@ -757,26 +758,26 @@ msgstr "Nutzer der für diesen Bauauftrag zuständig ist" msgid "External Link" msgstr "Externer Link" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "Link zu einer externen URL" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "Notizen" @@ -809,11 +810,11 @@ msgstr "Bauauftragsposition muss ein Endprodukt festlegen, da der übergeordnete msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "Reserviermenge ({n}) muss kleiner Bestandsmenge ({q}) sein. Zugewiesene Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "Zu viele BestandsObjekt zugewiesen" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "Reserviermenge muss größer null sein" @@ -827,7 +828,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "Ausgewähltes BestandsObjekt nicht Stückliste für Teil '{p}' gefunden" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "Bauauftrag" @@ -836,15 +837,13 @@ msgstr "Bauauftrag" msgid "Build to allocate parts" msgstr "Bauauftrag starten um Teile zuzuweisen" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "BestandsObjekt" @@ -880,7 +879,7 @@ msgstr "Lagerbestand Bauauftrag zuweisen" msgid "Auto Allocate" msgstr "Automatisch zuweisen" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "Bestandszuordnung aufheben" @@ -917,15 +916,15 @@ msgstr "Dieser Bauauftrag hat keine zugeordneten Stücklisten-Einträge" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "Seriennummer" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "Anhänge" @@ -1037,11 +1036,10 @@ msgid "Progress" msgstr "Fortschritt" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1185,7 +1183,10 @@ msgstr "Ausgangs-Lager" msgid "Stock can be taken from any available location." msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden." -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "Ziel-Lager" @@ -1194,15 +1195,15 @@ msgid "Destination location not specified" msgstr "Ziel-Lagerort nicht angegeben" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Losnummer" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "Erstellt" @@ -1210,7 +1211,7 @@ msgstr "Erstellt" msgid "No target date set" msgstr "Kein Ziel-Datum gesetzt" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "Fertig" @@ -1248,9 +1249,9 @@ msgstr "Bauauftrag-details" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "Details" @@ -1285,8 +1286,8 @@ msgstr "Bermerkungen bearbeiten" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Speichern" @@ -1411,8 +1412,8 @@ msgstr "Teil muss aktuell im Bestand sein" msgid "Stock item is over-allocated" msgstr "BestandObjekt ist zu oft zugewiesen" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "Verfügbar" @@ -1598,8 +1599,8 @@ msgstr "Aktuelle Teile-Stände" msgid "Number of recent parts to display on index page" msgstr "Anzahl der neusten Teile auf der Startseite" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "Vorlage" @@ -1608,7 +1609,7 @@ msgstr "Vorlage" msgid "Parts are templates by default" msgstr "Teile sind standardmäßig Vorlagen" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "Baugruppe" @@ -1617,7 +1618,7 @@ msgstr "Baugruppe" msgid "Parts can be assembled from other components by default" msgstr "Teile können standardmäßig aus anderen Teilen angefertigt werden" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "Komponente" @@ -1626,7 +1627,7 @@ msgstr "Komponente" msgid "Parts can be used as sub-components by default" msgstr "Teile können standardmäßig in Baugruppen benutzt werden" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "Kaufbar" @@ -1634,7 +1635,7 @@ msgstr "Kaufbar" msgid "Parts are purchaseable by default" msgstr "Artikel sind grundsätzlich kaufbar" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "Verkäuflich" @@ -1643,7 +1644,7 @@ msgstr "Verkäuflich" msgid "Parts are salable by default" msgstr "Artikel sind grundsätzlich verkaufbar" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "Nachverfolgbar" @@ -1652,7 +1653,7 @@ msgstr "Nachverfolgbar" msgid "Parts are trackable by default" msgstr "Artikel sind grundsätzlich verfolgbar" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "Virtuell" @@ -1669,160 +1670,185 @@ msgstr "zeige Bestand in Eingabemasken" msgid "Display available part quantity in some forms" msgstr "Zeige den verfügbaren Bestand in einigen Eingabemasken" -#: common/models.py:209 templates/stats.html:25 +#: common/models.py:209 +msgid "Show Price in Forms" +msgstr "" + +#: common/models.py:210 +msgid "Display part price in some forms" +msgstr "" + +#: common/models.py:216 +msgid "Internal Prices" +msgstr "" + +#: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 msgid "Debug Mode" msgstr "Entwickler-Modus" -#: common/models.py:210 +#: common/models.py:231 msgid "Generate reports in debug mode (HTML output)" msgstr "Berichte im Entwickler-Modus generieren (als HTML)" -#: common/models.py:216 +#: common/models.py:237 msgid "Page Size" msgstr "Seitengröße" -#: common/models.py:217 +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "Standardseitenformat für PDF-Bericht" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "Test-Berichte" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "Erstellung von Test-Berichten aktivieren" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "Bestands-Ablauf" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "Ablaufen von Bestand ermöglichen" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "Abgelaufenen Bestand verkaufen" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "Verkauf von abgelaufenem Bestand erlaubt" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "Bestands-Stehzeit" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "Anzahl an Tagen, an denen Bestand als abgestanden markiert wird, bevor sie ablaufen" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "Tage" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "Abgelaufenen Bestand verbauen" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "Verbauen von abgelaufenen Bestand erlaubt" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "Bestands-Eigentümerkontrolle" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "Eigentümerkontrolle für Lagerorte und Teile aktivieren" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "Gruppieren nach Teil" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "Bestand in Tabellen anhand von Teil-Referenz gruppieren" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "aktueller Bestand" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "Anzahl des geänderten Bestands auf der Startseite" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "Bauauftrag-Referenz Präfix" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "Präfix für Bauauftrag-Referenz" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "Bauauftrag-Referenz RegEx" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "RegEx Muster für die Zuordnung von Bauauftrag-Referenzen" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "Auftrags-Referenz Präfix" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "Präfix für Auftrags-Referenz" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "Bestellungs-Referenz Präfix" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "Präfix für Bestellungs-Referenz" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird nicht beachtet)" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "Einstellungs-Wert" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "Nur Ganzzahl eingeben" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "Wahrheitswert erforderlich" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "Nur Ganzzahl eingeben" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "Schlüsseltext muss eindeutig sein" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "Preisstaffelungs Anzahl" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "Preis" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "Stückpreis für die angegebene Anzahl" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "Standard" @@ -1843,7 +1869,9 @@ msgid "Supplied value must be a boolean" msgstr "Angegebener Wert muss ein Wahrheitswert sein" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" msgstr "Datei hochgeladen" @@ -1877,29 +1905,29 @@ msgstr "URL" msgid "Image URL" msgstr "Bild-URL" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "Einzelpreis" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "Preis für eine Einheit" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "Hersteller auswählen" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "Hersteller-Teilenummer" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "MPN" @@ -1952,11 +1980,11 @@ msgstr "Kontakt" msgid "Point of contact" msgstr "Anlaufstelle" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "Link" @@ -1964,7 +1992,7 @@ msgstr "Link" msgid "Link to external company information" msgstr "Link auf externe Firmeninformation" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "Bild" @@ -1992,12 +2020,12 @@ msgstr "ist Hersteller" msgid "Does this company manufacture parts?" msgstr "Produziert diese Firma Teile?" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "Basisteil" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "Teil auswählen" @@ -2008,7 +2036,7 @@ msgstr "Teil auswählen" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "Hersteller" @@ -2020,87 +2048,112 @@ msgstr "Externe URL für das Herstellerteil" msgid "Manufacturer part description" msgstr "Teilbeschreibung des Herstellers" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "Herstellerteil" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "Wert" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "Einheiten" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "Zulieferer" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "Zulieferer auswählen" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "SKU (Lagerbestandseinheit)" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "Lagerbestandseinheit (SKU) des Zulieferers" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "Herstellerteil" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "Herstellerteil auswählen" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "Teil-URL des Zulieferers" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "Zuliefererbeschreibung des Teils" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "Notiz" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "Basiskosten" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "Mindestpreis" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "Verpackungen" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "Teile-Verpackungen" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "Vielfache" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "Mehrere bestellen" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "Zugeordneter Bestand" @@ -2166,11 +2219,11 @@ msgstr "Keine Website angegeben" msgid "Uses default currency" msgstr "verwendet Standard-Währung" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "Kunde" @@ -2216,7 +2269,7 @@ msgstr "Teile löschen" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "Neues Teil" @@ -2249,13 +2302,12 @@ msgstr "Exportieren" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "Zuliefererteile" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "Neues Zuliefererteil anlegen" @@ -2263,12 +2315,12 @@ msgstr "Neues Zuliefererteil anlegen" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "Neues Zuliefererteil" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2320,8 +2372,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "Für dieses Herstellerteil sind %(count)s Lieferanten definiert. Wenn Sie es löschen, werden die folgenden Lieferantenteile ebenfalls gelöscht:" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "Zulieferer" @@ -2333,13 +2386,13 @@ msgstr "Herstellerteil-Bestand" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "Lagerbestand" @@ -2361,11 +2414,25 @@ msgstr "Zuliefererteil entfernen" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "Löschen" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "Parameter" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "Neuer Parameter" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "Neuen Zulieferer anlegen" @@ -2380,13 +2447,13 @@ msgstr "Hergestellte Teile" msgid "Supplied Parts" msgstr "Zuliefererteile" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "Teilbestand" @@ -2397,7 +2464,7 @@ msgstr "Teilbestand" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2409,7 +2476,7 @@ msgstr "Aufträge" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2443,7 +2510,7 @@ msgstr "Neuer Auftrag" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "Zuliefererteil" @@ -2491,8 +2558,8 @@ msgstr "Teil bestellen" msgid "Pricing Information" msgstr "Preisinformationen ansehen" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "Preisstaffel hinzufügen" @@ -2511,8 +2578,8 @@ msgstr "Preisstaffel bearbeiten" msgid "Delete price break" msgstr "Preisstaffel löschen" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "Hersteller" @@ -2534,20 +2601,20 @@ msgstr "Firmen" msgid "New Company" msgstr "Neue Firma" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "Bild herunterladen" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "Bildgröße überschreitet maximal-erlaubte Größe für Downloads" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "Ungültige Antwort {code}" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "Angegebene URL ist kein gültiges Bild" @@ -2595,27 +2662,35 @@ msgstr "Neues Herstellerteil anlegen" msgid "Delete Manufacturer Part" msgstr "Herstellerteil löschen" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "Zuliefererteil bearbeiten" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "Neues Zuliefererteil anlegen" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "Zuliefererteil entfernen" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "neue Preisstaffel hinzufügt" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "Preisstaffel bearbeiten" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "Preisstaffel löschen" @@ -2639,7 +2714,7 @@ msgstr "Label" msgid "Label template file" msgstr "Label-Vorlage-Datei" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "Aktiviert" @@ -2663,7 +2738,7 @@ msgstr "Höhe [mm]" msgid "Label height, specified in mm" msgstr "Label-Höhe in mm" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "Dateinamen-Muster" @@ -2675,8 +2750,8 @@ msgstr "Muster für die Erstellung von Label-Dateinamen" msgid "Query filters (comma-separated list of key=value pairs" msgstr "Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "Filter" @@ -2697,237 +2772,239 @@ msgstr "Bestellung stornieren" msgid "Ship order" msgstr "Bestellung versenden" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "Teile in diesen Lagerort empfangen" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "Bestellungs-Referenz" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "Zieldatum für Auftrags-Lieferung." -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "Auftrag-Nummer eingeben" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "Zieldatum für Auftrags-Fertigstellung." -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "Seriennummern für BestandsObjekt eingeben" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "Menge der BestandsObjekt eingeben" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "Bestell-Referenz" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "Bestellungs-Beschreibung" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "Link auf externe Seite" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "Erstellt von" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "Nutzer oder Gruppe der/die für diesen Auftrag zuständig ist/sind" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "Bestell-Notizen" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "Bestellungs-Status" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "Firma bei der die Teile bestellt werden" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "Zulieferer-Referenz" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "Zulieferer Bestellreferenz" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "Empfangen von" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "Aufgabedatum" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "Datum an dem die Bestellung aufgegeben wurde" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "Ziel-Versanddatum" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "Geplantes Lieferdatum für Auftrag." -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "Datum an dem der Auftrag fertigstellt wurde" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "Anzahl muss größer Null sein" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "Teile-Zulieferer muss dem Zulieferer der Bestellung entsprechen" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "Nur Teile aufgegebener Bestllungen können empfangen werden" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "Anzahl muss eine Ganzzahl sein" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "Anzahl muss eine positive Zahl sein" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "Firma an die die Teile verkauft werden" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "Kundenreferenz" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "Bestellreferenz" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "Versanddatum" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "Versand von" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "Bestellung kann nicht versendet werden weil er nicht anhängig ist" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "Anzahl" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "Position - Referenz" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "Position - Notizen" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "Bestellung" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "Bestellung" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "Zuliefererteil" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "Empfangen" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "Empfangene Objekt-Anzahl" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "Preis" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "Preis pro Einheit" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "Wo möchte der Käufer diesen Artikel gelagert haben?" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "Verkaufspreis" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "Stückverkaufspreis" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "BestandsObjekt wurde nicht zugewiesen" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "Kann BestandsObjekt keiner Zeile mit einem anderen Teil hinzufügen" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "Kann BestandsObjekt keiner Zeile ohne Teil hinzufügen" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "Die zugeordnete Anzahl darf nicht die verfügbare Anzahl überschreiten" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "Anzahl für BestandsObjekt mit Seriennummer muss 1 sein" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "Position" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "Position" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "BestandsObjekt für Zuordnung auswählen" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "Anzahl für Bestandszuordnung eingeben" @@ -2956,7 +3033,7 @@ msgid "Export order to file" msgstr "Exportiere Bestellung in Datei" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "Bestellungs-Details" @@ -2978,8 +3055,8 @@ msgstr "Aufgegeben" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "Neuer Lagerort" @@ -3082,28 +3159,32 @@ msgstr "Schritt %(step)s von %(count)s" msgid "Order is already processed. Files cannot be uploaded." msgstr "Bestellung ist bereits verarbeitet. Dateien können nicht hochgeladen werden." -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "Schritt 1 von 2 - Zulieferer auswählen" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "Zulieferer auswählen" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "Keine kaufbaren Teile ausgewählt" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "Zulieferer auswählen" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "Zulieferer auswählen für %(name)s" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "Teil entfernen" @@ -3136,15 +3217,20 @@ msgid "Select a purchase order for %(name)s" msgstr "Bestellung für %(name)s auswählen" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "Bestellungs-Anhänge" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "Sind Sie sicher, dass Sie diese Position löschen möchten?" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "BestandsObjekte empfangen" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "Empfangene Teile" @@ -3154,8 +3240,8 @@ msgid "Purchase Order Items" msgstr "Bestellungs-Positionen" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "Position hinzufügen" @@ -3163,25 +3249,31 @@ msgstr "Position hinzufügen" msgid "No line items found" msgstr "Keine Positionen gefunden" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "Summe" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "Stück-Preis" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" -msgstr "" +msgstr "Gesamtpreis" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "Position bearbeiten" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "Position löschen" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "Position empfangen" @@ -3202,7 +3294,7 @@ msgstr "Ausstehende Teile für %(order)s - %(desc)s empfangen" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3217,7 +3309,7 @@ msgid "Order Code" msgstr "Bestellnummer" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "Bestellt" @@ -3225,11 +3317,11 @@ msgstr "Bestellt" msgid "Receive" msgstr "Empfangen" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "Fehler: verknüpftes Teil wurde gelöscht" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "Position entfernen" @@ -3266,17 +3358,17 @@ msgid "Sales Order Items" msgstr "Auftrags-Positionen" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "Aktionen" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "Bestands-Zuordnung bearbeiten" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "Bestands-Zuordnung löschen" @@ -3284,50 +3376,50 @@ msgstr "Bestands-Zuordnung löschen" msgid "No matching line items" msgstr "Keine passenden Positionen gefunden" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "ID" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "Zugeordnet" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "Erledigt" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "PO" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "Seriennummern zuweisen" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "Lagerbestand zuweisen" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "Lagerbestand kaufen" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "Lagerbestand bauen" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "Preis berechnen" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "Position löschen " -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "Stückpreis aktualisieren" @@ -3368,10 +3460,6 @@ msgstr "Diese Aktion wird die folgenden BestandsObjekt vom Auftrag entfernen" msgid "Sales Order Attachments" msgstr "Auftrags-Anhänge" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "Sind Sie sicher, dass Sie diese Position löschen möchten?" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "Bestellungs-Anhang hinzufügen" @@ -3472,90 +3560,94 @@ msgstr "Anzahl kleiner null empfangen" msgid "No lines specified" msgstr "Keine Zeilen angegeben" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "{n} Teile bestellt" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "Zuliefererteil muss ausgewählt werden" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "Zulieferer muss zu Teil und Bestellung passen" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "Position bearbeiten" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "Position löschen" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "Position gelöscht" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "Seriennummern zuweisen" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "{n} Positionen zugeordnet" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "Position auswählen" -#: order/views.py:1613 +#: order/views.py:1623 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "Kein passends Teil für Seriennummer {serial} gefunden" -#: order/views.py:1623 +#: order/views.py:1633 #, python-brace-format msgid "{serial} is not in stock" msgstr "{serial} ist nicht auf Lager" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "{serial} bereits einem Auftrag zugeordnet" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "Lagerbestand dem Auftrag zuweisen" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "Zuordnung bearbeiten" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "Zuordnung entfernen" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "Auftrag nicht gefunden" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "Preis nicht gefunden" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "Stückpreis für {part} auf {price} aktualisiert" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "{part} Stückpreis auf {price} und Menge auf {qty} aktualisiert" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "Standard-Lagerort" @@ -3633,7 +3725,7 @@ msgstr "Zulieferer einschließen" msgid "Include part supplier data in exported BOM" msgstr "Zulieferer-Daten in Stückliste-Export einschließen" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "Ausgangsteil" @@ -3709,7 +3801,7 @@ msgstr "Parameter-Vorlage zu Kategorien dieser Ebene hinzufügen" msgid "Add parameter template to all categories" msgstr "Parameter-Vorlage zu allen Kategorien hinzufügen" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "Untergeordnetes Teil" @@ -3729,7 +3821,7 @@ msgstr "Standard Stichwörter" msgid "Default keywords for parts in this category" msgstr "Standard-Stichworte für Teile dieser Kategorie" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "Teil-Kategorie" @@ -3740,366 +3832,361 @@ msgstr "Teil-Kategorie" msgid "Part Categories" msgstr "Teil-Kategorien" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, 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:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "Nächste verfügbare Seriennummern wären" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "Nächste verfügbare Seriennummer ist" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "Die neuste Seriennummer ist" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "Doppelte IPN in den Teil-Einstellungen nicht erlaubt" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "Namen, Teile- und Revisionsnummern müssen eindeutig sein" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "Name des Teils" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "Ist eine Vorlage" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "Ist dieses Teil eine Vorlage?" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "Ist dieses Teil eine Variante eines anderen Teils?" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "Variante von" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "Beschreibung des Teils" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "Schlüsselwörter" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "Schlüsselworte um die Sichtbarkeit in Suchergebnissen zu verbessern" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "Kategorie" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "Teile-Kategorie" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "IPN (Interne Produktnummer)" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "Interne Teilenummer" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "Revisions- oder Versionsnummer" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "Revision" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "Standard Zulieferer" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "Standard Zuliefererteil" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "Standard Ablaufzeit" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "Ablauf-Zeit (in Tagen) für Lagerbestand dieses Teils" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "Minimaler Lagerbestand" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "Minimal zulässiger Lagerbestand" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "Einheiten" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "Stock Keeping Units (SKU) für dieses Teil" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "Kann dieses Teil aus anderen Teilen angefertigt werden?" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "Kann dieses Teil zum Bauauftrag von anderen genutzt werden?" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "Hat dieses Teil Tracking für einzelne Objekte?" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "Kann dieses Teil von externen Zulieferern gekauft werden?" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "Kann dieses Teil an Kunden verkauft werden?" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "Aktiv" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "Ist dieses Teil aktiv?" -#: part/models.py:867 +#: part/models.py:852 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:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "Bemerkungen - unterstüzt Markdown-Formatierung" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "Prüfsumme der Stückliste" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "Prüfsumme der Stückliste gespeichert" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "Stückliste kontrolliert von" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "BOM Kontrolldatum" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "Erstellungs-Nutzer" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "Mehrere verkaufen" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "Test-Vorlagen können nur für verfolgbare Teile angelegt werden" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "Ein Test mit diesem Namen besteht bereits für dieses Teil" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "Test-Name" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "Namen für diesen Test eingeben" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "Test-Beschreibung" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "Beschreibung für diesen Test eingeben" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "Benötigt" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "Muss dieser Test erfolgreich sein?" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "Erfordert Wert" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "Muss für diesen Test ein Wert für das Test-Ergebnis eingetragen werden?" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "Anhang muss eingegeben werden" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "Muss für diesen Test ein Anhang für das Test-Ergebnis hinzugefügt werden?" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "Vorlagen-Name des Parameters muss eindeutig sein" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "Name des Parameters" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "Einheit des Parameters" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "Parameter Vorlage" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "Wert" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "Parameter Wert" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "Standard-Wert" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "Standard Parameter Wert" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "Ausgangsteil auswählen" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "Teil für die Nutzung in der Stückliste auswählen" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "Optional" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "Diese Stücklisten-Position ist optional" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "Überschuss" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "Geschätzter Ausschuss (absolut oder prozentual)" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "Referenz der Postion auf der Stückliste" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "Notizen zur Stücklisten-Position" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "Prüfsumme" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "Prüfsumme der Stückliste" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "Geerbt" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "Diese Stücklisten-Position wird in die Stücklisten von Teil-Varianten vererbt" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "Varianten zulassen" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "Lagerbestand von Varianten kann für diese Stücklisten-Position verwendet werden" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "Menge muss eine Ganzzahl sein" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "Zuliefererteil muss festgelegt sein" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "Stücklisten-Position" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "Teil 1" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "Teil 2" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "verknüpftes Teil auswählen" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "Fehler bei Verwandschaft: Ist das Teil mit sich selbst verwandt oder ist das die Verwandtschaft nicht eindeutig?" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" -msgstr "Teil-Bestandszuordnungen" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" +msgstr "" #: part/templates/part/attachments.html:10 msgid "Part Attachments" @@ -4113,8 +4200,8 @@ msgstr "Sind Sie sicher, dass Sie diese Stücklisten-Position löschen wollen?" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "Die Löschung dieses Eintrags wird das Stücklisten-Position vom folgenden Teil entfernen" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "Stückliste" @@ -4161,7 +4248,7 @@ msgstr "Stückliste bearbeiten" msgid "Validate Bill of Materials" msgstr "Stückliste kontrollieren" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "Stückliste exportieren" @@ -4178,7 +4265,7 @@ msgid "All selected BOM items will be deleted" msgstr "Alle ausgewählte Stücklistenpositionen werden gelöscht" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "Neues Teil anlegen" @@ -4259,7 +4346,7 @@ msgstr "Neuen Bauauftrag beginnen" msgid "All parts" msgstr "Alle Teile" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "Teil-Kategorie anlegen" @@ -4319,7 +4406,7 @@ msgid "View grid display" msgstr "Rasteransicht anzeigen" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "Neuen Lagerort anlegen" @@ -4374,14 +4461,8 @@ msgstr "Wenn diese Kat. gelöscht wird, werden diese Teile in die übergeordnete msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "Wenn diese Kat. gelöscht wird, werden diese Teile in die oberste Kat. verschoben" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "Parameter" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "Teilparameter" @@ -4409,7 +4490,7 @@ msgstr "Teil evtl. Duplikat dieser Teile" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "%(full_name)s - %(desc)s (%(match_per)s%% übereinstimmend)" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "Teil Details" @@ -4489,6 +4570,36 @@ msgstr "Teil ist aktiv" msgid "Part is not active" msgstr "Teil ist nicht aktiv" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "Zugriff verweigert" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "Keine Berechtigung zum Anzeigen dieser Seite." + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "Teil-Hersteller" @@ -4502,127 +4613,141 @@ msgstr "Herstellerteile löschen" msgid "Create new manufacturer" msgstr "Neuen Hersteller anlegen" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "Teil Varianten" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "Varianten" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "Lagerbestand zuweisen" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "Zuweisungen" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "Benutzt in" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "Bestellpreisinformationen" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "Bestellpreis" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "Interner Preis" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "Preisinformationen ansehen" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "Teil Test-Vorlagen" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "Tests" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "Verknüpfte Teile" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "Teil-Bemerkungen" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "Berechnen" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "Preisspannen" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "Zulieferer-Preise" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "Stückpreis" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "Gesamtkosten" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "Keine Zulieferer-Preise verfügbar" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "Stücklistenpreise" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "Anmerkung: Stücklistenbepreisung für dieses Teil ist unvollständig" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "Keine Stücklisten-Preise verfügbar" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "Keine Preise für dieses Teil verfügbar" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "Bestandspreise" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "Für dieses Teil sind keine Bestandspreise verfügbar." -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "Einzelpreis - %(currency)s" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "Einzelpreisdifferenz - %(currency)s" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "Einzelpreis für Zuliefererteil- %(currency)s" @@ -4631,19 +4756,6 @@ msgstr "Einzelpreis für Zuliefererteil- %(currency)s" msgid "Add new parameter" msgstr "Parameter hinzufügen" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "Neuer Parameter" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "Wert" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "Bearbeiten" @@ -4661,7 +4773,7 @@ msgid "Part List" msgstr "Teileliste" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "Inaktiv" @@ -4741,14 +4853,10 @@ msgid "Can Build" msgstr "Herstellbar" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "Im Bau" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "Berechnen" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "Test Vorlage hinzufügen" @@ -4817,7 +4925,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "Lagerbestand aller Varianten von %(full_name)s" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "Kein Bestand" @@ -4854,7 +4962,7 @@ msgstr "Neue Variante anlegen" msgid "New Variant" msgstr "neue Variante anlegen" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "Unbekannte Datenbank" @@ -4923,227 +5031,239 @@ msgstr "Übereinstimmung gefunden - Teil trotzdem anlegen" msgid "Created new part" msgstr "Neues Teil angelegt" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "Teil-QR-Code" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "Teilbild hochladen" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "Teilbild aktualisiert" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "Teilbild auswählen" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "Teilbild nicht gefunden" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "Teileigenschaften bearbeiten" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "Stückliste duplizieren" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "bestätige Duplizierung Stückliste von übergeordneter Stückliste" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "Stückliste überprüfen" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "Bestätigen, dass Stückliste korrekt ist" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "überprüfte Stückliste" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "Keine Stückliste angegeben" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "Bitte eine gültige Anzahl eingeben" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "Bitte ein gültiges Teil auswählen" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "Teil doppelt ausgewählt" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "Teil auswählen" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "gewähltes Teil erzeugt rekursive Stückliste" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "Anzahl angeben" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "Löschen des Teils bestätigen" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "Teil wurde gelöscht" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "Teilbepreisung" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "Teilparametervorlage anlegen" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "Teilparametervorlage bearbeiten" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "Teilparametervorlage löschen" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "Teilparameter anlegen" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "Teilparameter bearbeiten" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "Teilparameter löschen" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "Teil-Kategorie bearbeiten" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "Teil-Kategorie löschen" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "Teil-Kategorie wurde gelöscht" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "Kategorieparametervorlage anlegen" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "Kategorieparametervorlage bearbeiten" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "Kategorieparametervorlage löschen" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "Stücklisten-Position anlegen" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "Stücklisten-Position bearbeiten" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "löschen von Stücklisten-Position bestätigen" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "Vorlagen Name" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "Bericht-Vorlage Datei" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "Bericht-Vorlage Beschreibung" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "Bericht Revisionsnummer (autom. erhöht)" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "Muster für die Erstellung von Berichtsdateinamen" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "Bericht-Vorlage ist ein" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "BestandsObjekte-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "einfügen Installiert in Tests" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "Test-Ergebnisse für BestandsObjekte in Baugruppen einschließen" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "Bauauftrag Filter" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "Bau-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "Teil Filter" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "Teile-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "Bestellungs-Abfragefilter" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "Auftrags-Abfragefilter" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "Snippet" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "Berichts-Snippet" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "Snippet-Beschreibung" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "Ressource" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "Berichts-Ressource" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "Ressource-Beschreibung" @@ -5175,7 +5295,7 @@ msgid "Result" msgstr "Ergebnis" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "Datum" @@ -5198,7 +5318,7 @@ msgid "Moved {n} parts to {loc}" msgstr "{n} Teile nach {loc} bewegt" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "Ablaufdatum" @@ -5484,12 +5604,12 @@ msgid "Stock Item Attachments" msgstr "BestandsObjekt-Anhang" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "abgelaufen" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "überfällig" @@ -5619,7 +5739,7 @@ msgstr "Dieses BestandsObjekt wird automatisch gelöscht wenn der Lagerbestand a msgid "Stock Item Details" msgstr "BestandsObjekt-Details" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "Kein Lagerort gesetzt" @@ -5631,25 +5751,29 @@ msgstr "Barcode-Bezeichner" msgid "Parent Item" msgstr "Elternposition" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "Dieses BestandsObjekt lief am %(item.expiry_date)s ab" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "Dieses BestandsObjekt läuft am %(item.expiry_date)s ab" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "Zuletzt aktualisiert" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "Letzte Inventur" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "Keine Inventur ausgeführt" @@ -5946,7 +6070,7 @@ msgstr "Entfernen" msgid "Add Stock Items" msgstr "BestandsObjekte hinzufügen" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "Hinzufügen" @@ -6012,7 +6136,7 @@ msgstr "BestandsObjekt bearbeiten" msgid "Serialize Stock" msgstr "Lagerbestand erfassen" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "Neues BestandsObjekt hinzufügen" @@ -6044,14 +6168,6 @@ msgstr "Lagerbestands-Tracking-Eintrag bearbeiten" msgid "Add Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag hinzufügen" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "Zugriff verweigert" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "Keine Berechtigung zum Anzeigen dieser Seite." - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "Seite nicht gefunden" @@ -6120,11 +6236,11 @@ msgstr "Suchergebnisse" msgid "Enter a search query" msgstr "Eine Sucheanfrage eingeben" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "an Kunde versand" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "Kein Lagerort gesetzt" @@ -6172,12 +6288,12 @@ msgid "No category parameter templates found" msgstr "Keine Kategorie-Parametervorlagen gefunden" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "Vorlage bearbeiten" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "Vorlage löschen" @@ -6225,11 +6341,11 @@ msgstr "Teil-Einstellungen" msgid "Part Options" msgstr "Teil-Optionen" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "Teil-Parametervorlage" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "Keine Teilparametervorlagen gefunden" @@ -6345,47 +6461,51 @@ msgid "API Version" msgstr "API-Version" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "Django-Version" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "Commit-Hash" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "Commit-Datum" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "InvenTree-Dokumentation" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "Code auf GitHub ansehen" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "Danksagung" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "Mobile App" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "Fehlerbericht senden" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "In die Zwischenablage kopieren" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "Versionsinformationen kopieren" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "Schliessen" @@ -6446,7 +6566,7 @@ msgstr "Server-Fehler" msgid "Unknown response from server" msgstr "Unbekannte Antwort von Server erhalten" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "Ungültige Antwort von Server" @@ -6510,7 +6630,7 @@ msgstr "In Lagerorten buchen" msgid "Barcode does not match a valid location" msgstr "Barcode entspricht keinem Lagerort" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "Unterbaugruppe öffnen" @@ -6546,7 +6666,7 @@ msgstr "Stücklisten-Position bearbeiten" msgid "Delete BOM Item" msgstr "Stücklisten-Position löschen" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "Keine Stücklisten-Position(en) gefunden" @@ -6566,37 +6686,45 @@ msgstr "Endprodukt fertigstellen" msgid "Delete build output" msgstr "Endprodukt entfernen" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "Standort nicht angegeben" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "Neues BestandsObjekt" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "benötigtes Teil" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "Anzahl pro" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "Bestand bestellen" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "Keine Bauaufträge passen zur Anfrage" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "Auswählen" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "Bauauftrag ist überfällig" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "Keine Teile zugeordnet zu" @@ -6616,17 +6744,29 @@ msgstr "Keine Firmeninformation gefunden" msgid "No manufacturer parts found" msgstr "Keine Herstellerteile gefunden" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "Vorlagenteil" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "Baugruppe" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "Keine Zuliefererteile gefunden" @@ -6714,76 +6854,76 @@ msgstr "abbrechen" msgid "Loading Data" msgstr "Lade Daten" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "Abschicken" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "ungültige Antwort vom Server" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "Formulardaten fehlen bei Serverantwort" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "Formulardaten fehlerhaft" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "JSON Antwort enthält keine Formulardaten" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "Keine Antwort" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "keine Antwort vom InvenTree Server" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "Fehler 400: Ungültige Anfrage" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "Fehler 400 von Server erhalten" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "Fehler 401: Nicht Angemeldet" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "Authentication Kredentials nicht angegeben" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "Fehler 403: keine Berechtigung" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "Fehlende Berechtigung für diese Aktion" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "Fehler 404: Ressource nicht gefunden" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "Die angefragte Ressource kann auf diesem Server nicht gefunden werden" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "Fehler 408: Zeitüberschreitung" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "Verbindungszeitüberschreitung bei der Datenanforderung" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "Fehler bei Formulardaten-Anfrage" @@ -6799,6 +6939,10 @@ msgstr "Bestellung überfällig" msgid "No sales orders found" msgstr "Keine Aufträge gefunden" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "JA" @@ -6827,39 +6971,39 @@ msgstr "Verkäufliches Teil" msgid "No variants found" msgstr "Keine Varianten gefunden" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "Keine Teile gefunden" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "Keine Kategorie" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "Bestand niedrig" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "Pfad" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "Keine zur Anfrage passenden Testvorlagen" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "Testergebnis bearbeiten" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "Testergebnis löschen" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "Dieses Testergebnis ist für ein Hauptteil" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "Einzelpreisdifferenz" @@ -6957,155 +7101,155 @@ msgstr "Keine Testergebnisse gefunden" msgid "Test Date" msgstr "Testdatum" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "In Arbeit" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "In BestandsObjekt installiert" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "Auftrag zugewiesen" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "Keine zur Anfrage passenden BestandsObjekte" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "Teile" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "lose" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "Lagerorte" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "unbekannter Lagerort" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "BestandsObjekt wird produziert" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "BestandsObjekt wurde Auftrag zugewiesen" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "BestandsObjekt wurde Kunden zugewiesen" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "BestandsObjekt ist abgelaufen" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "BestandsObjekt läuft demnächst ab" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "BestandsObjekt zugewiesen" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "BestandsObjekt in anderem Element verbaut" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "BestandsObjekt abgewiesen" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "BestandsObjekt verloren" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "BestandsObjekt zerstört" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "gelöscht" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "Inventur" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "Status" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "Status setzen" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "Status Code setzen" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "Status Code muss ausgewählt werden" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "Ungültiges Datum" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "Standort nicht mehr vorhanden" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "Bestellung existiert nicht mehr" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "Kunde existiert nicht mehr" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "Lagerbestand existiert nicht mehr" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "Hinzugefügt" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "Entfernt" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "Keine Benutzerinformation" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "Tracking-Eintrag bearbeiten" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "Tracking-Eintrag löschen" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "Neuen Lagerort anlegen" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "Keine installierten Elemente" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "Seriennummer" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "Lagerbestand entfernen" @@ -7271,56 +7415,56 @@ msgstr "Favorit" msgid "Purchasable" msgstr "Käuflich" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "Lade Daten" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "Zeilen pro Seite" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "zeige" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "bis" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "von" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "Zeilen" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "Suche" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "Keine passenden Ergebnisse gefunden" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "Zeige/Verstecke Pagination" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "Neu laden" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "umschalten" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "Spalten" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "Alle" @@ -7564,35 +7708,35 @@ msgstr "Berechtigungen" msgid "Important dates" msgstr "wichtige Daten" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "Berechtigung geändert" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "Gruppe" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "Ansicht" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "Berechtigung Einträge anzuzeigen" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "Berechtigung Einträge zu erstellen" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "Ändern" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "Berechtigungen Einträge zu ändern" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "Berechtigung Einträge zu löschen" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index ab3c93408d..792cf22fc2 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: 2021-06-16 22:40+0000\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -78,7 +78,7 @@ msgstr "" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -123,9 +123,9 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "" @@ -133,34 +133,35 @@ msgstr "" msgid "upload date" msgstr "" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "" @@ -192,15 +193,15 @@ msgstr "" msgid "Turkish" msgstr "" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "" @@ -373,27 +374,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -446,11 +447,11 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "" @@ -463,22 +464,21 @@ msgstr "" #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -487,9 +487,10 @@ msgstr "" #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "" @@ -501,7 +502,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "" @@ -530,12 +531,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "" @@ -544,13 +545,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "" @@ -584,16 +585,16 @@ msgstr "" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -603,12 +604,12 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "" @@ -627,27 +628,27 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "" @@ -711,16 +712,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "" @@ -737,9 +738,9 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" @@ -758,26 +759,26 @@ msgstr "" msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "" @@ -810,11 +811,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -828,7 +829,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "" @@ -837,15 +838,13 @@ msgstr "" msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "" @@ -881,7 +880,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "" @@ -918,15 +917,15 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" @@ -1038,11 +1037,10 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1186,7 +1184,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "" @@ -1195,15 +1196,15 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "" @@ -1211,7 +1212,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "" @@ -1249,9 +1250,9 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "" @@ -1286,8 +1287,8 @@ msgstr "" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1412,8 +1413,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "" @@ -1599,8 +1600,8 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "" @@ -1609,7 +1610,7 @@ msgstr "" msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "" @@ -1618,7 +1619,7 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "" @@ -1627,7 +1628,7 @@ msgstr "" msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" @@ -1635,7 +1636,7 @@ msgstr "" msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "" @@ -1644,7 +1645,7 @@ msgstr "" msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "" @@ -1653,7 +1654,7 @@ msgstr "" msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" @@ -1670,160 +1671,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:209 +msgid "Show Price in Forms" msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 +msgid "Page Size" +msgstr "" + +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "" @@ -1844,7 +1870,9 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" msgstr "" @@ -1878,29 +1906,29 @@ msgstr "" msgid "Image URL" msgstr "" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "" @@ -1953,11 +1981,11 @@ msgstr "" msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "" @@ -1965,7 +1993,7 @@ msgstr "" msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "" @@ -1993,12 +2021,12 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "" @@ -2009,7 +2037,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "" @@ -2021,87 +2049,112 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "" @@ -2167,11 +2220,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "" @@ -2217,7 +2270,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "" @@ -2250,13 +2303,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" @@ -2264,12 +2316,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2321,8 +2373,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2334,13 +2387,13 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2362,11 +2415,25 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" @@ -2381,13 +2448,13 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2398,7 +2465,7 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2410,7 +2477,7 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2444,7 +2511,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "" @@ -2492,8 +2559,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2512,8 +2579,8 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "" @@ -2535,20 +2602,20 @@ msgstr "" msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "" @@ -2596,27 +2663,35 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" @@ -2640,7 +2715,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "" @@ -2664,7 +2739,7 @@ msgstr "" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "" @@ -2676,8 +2751,8 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" @@ -2698,237 +2773,239 @@ msgstr "" msgid "Ship order" msgstr "" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "" @@ -2957,7 +3034,7 @@ msgid "Export order to file" msgstr "" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2979,8 +3056,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "" @@ -3083,28 +3160,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "" @@ -3137,15 +3218,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "" @@ -3155,8 +3241,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3164,25 +3250,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3203,7 +3295,7 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3218,7 +3310,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3226,11 +3318,11 @@ msgstr "" msgid "Receive" msgstr "" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "" @@ -3267,17 +3359,17 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "" @@ -3285,50 +3377,50 @@ msgstr "" msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3369,10 +3461,6 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3473,90 +3561,94 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format +msgid "No matching item for serial {serial}" +msgstr "" + +#: order/views.py:1633 +#, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3634,7 +3726,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "" @@ -3710,7 +3802,7 @@ msgstr "" msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "" @@ -3730,7 +3822,7 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3741,365 +3833,360 @@ msgstr "" msgid "Part Categories" msgstr "" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4114,8 +4201,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "" @@ -4162,7 +4249,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4179,7 +4266,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4260,7 +4347,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "" @@ -4320,7 +4407,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "" @@ -4375,14 +4462,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" @@ -4410,7 +4491,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "" @@ -4490,6 +4571,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4503,127 +4614,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4632,19 +4757,6 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" @@ -4662,7 +4774,7 @@ msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4742,14 +4854,10 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" @@ -4818,7 +4926,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "" @@ -4855,7 +4963,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4924,227 +5032,239 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" @@ -5176,7 +5296,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5199,7 +5319,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" @@ -5485,12 +5605,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5620,7 +5740,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "" @@ -5632,25 +5752,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5947,7 +6071,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -6013,7 +6137,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6045,14 +6169,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6121,11 +6237,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "" @@ -6171,12 +6287,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "" @@ -6224,11 +6340,11 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "" @@ -6344,47 +6460,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6445,7 +6565,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6509,7 +6629,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6545,7 +6665,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6565,37 +6685,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6615,17 +6743,29 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" @@ -6713,76 +6853,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6798,6 +6938,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6826,39 +6970,39 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6956,155 +7100,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7270,56 +7414,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7563,34 +7707,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po index 6d0f3375c4..1bbb282835 100644 --- a/InvenTree/locale/es/LC_MESSAGES/django.po +++ b/InvenTree/locale/es/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:40\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-25 14:06\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -19,19 +19,19 @@ msgstr "" #: InvenTree/api.py:64 msgid "API endpoint not found" -msgstr "" +msgstr "endpoint API no encontrado" #: InvenTree/api.py:110 msgid "No action specified" -msgstr "" +msgstr "No se especificó ninguna acción" #: InvenTree/api.py:124 msgid "No matching action found" -msgstr "" +msgstr "No se encontró ninguna acción coincidente" #: InvenTree/fields.py:44 msgid "Enter date" -msgstr "" +msgstr "Ingrese la fecha" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 @@ -42,19 +42,19 @@ msgstr "Confirmar" #: InvenTree/forms.py:128 msgid "Confirm delete" -msgstr "" +msgstr "Confirmar eliminación" #: InvenTree/forms.py:129 msgid "Confirm item deletion" -msgstr "" +msgstr "Confirmar borrado de artículo" #: InvenTree/forms.py:161 templates/registration/login.html:76 msgid "Enter password" -msgstr "" +msgstr "Introduzca contraseña" #: InvenTree/forms.py:162 msgid "Enter new password" -msgstr "" +msgstr "Ingrese su nueva contraseña" #: InvenTree/forms.py:169 msgid "Confirm password" @@ -66,21 +66,21 @@ msgstr "Confirmar contraseña nueva" #: InvenTree/forms.py:205 msgid "Apply Theme" -msgstr "" +msgstr "Aplicar tema" #: InvenTree/forms.py:235 msgid "Select Category" -msgstr "" +msgstr "Seleccionar Categoría" #: InvenTree/helpers.py:377 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" -msgstr "" +msgstr "Cantidad proporcionada no válida" #: InvenTree/helpers.py:387 msgid "Empty serial number string" @@ -90,7 +90,7 @@ msgstr "" #: InvenTree/helpers.py:440 #, python-brace-format msgid "Invalid group: {g}" -msgstr "" +msgstr "Grupo no válido: un {g}" #: InvenTree/helpers.py:445 #, python-brace-format @@ -99,7 +99,7 @@ msgstr "" #: InvenTree/helpers.py:453 msgid "No serial numbers found" -msgstr "" +msgstr "Numeros de serie no encontrados" #: InvenTree/helpers.py:457 #, python-brace-format @@ -122,9 +122,9 @@ msgstr "Comentario" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "Usuario" @@ -132,34 +132,35 @@ msgstr "Usuario" msgid "upload date" msgstr "" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "Nombre" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "Descripción" @@ -191,26 +192,26 @@ msgstr "Polaco" msgid "Turkish" msgstr "Turco" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "" #: InvenTree/status_codes.py:104 InvenTree/status_codes.py:145 #: InvenTree/status_codes.py:314 msgid "Pending" -msgstr "" +msgstr "Pendiente" #: InvenTree/status_codes.py:105 msgid "Placed" -msgstr "" +msgstr "Colocado" #: InvenTree/status_codes.py:106 InvenTree/status_codes.py:317 msgid "Complete" @@ -234,7 +235,7 @@ msgstr "" #: InvenTree/status_codes.py:146 #: order/templates/order/sales_order_base.html:126 msgid "Shipped" -msgstr "" +msgstr "Enviado" #: InvenTree/status_codes.py:186 msgid "OK" @@ -254,7 +255,7 @@ msgstr "Destruido" #: InvenTree/status_codes.py:191 msgid "Rejected" -msgstr "" +msgstr "Rechazado" #: InvenTree/status_codes.py:272 msgid "Legacy stock tracking entry" @@ -262,31 +263,31 @@ msgstr "" #: InvenTree/status_codes.py:274 msgid "Stock item created" -msgstr "" +msgstr "Artículo de stock creado" #: InvenTree/status_codes.py:276 msgid "Edited stock item" -msgstr "" +msgstr "Elemento de stock editado" #: InvenTree/status_codes.py:277 msgid "Assigned serial number" -msgstr "" +msgstr "Número de serie asignado" #: InvenTree/status_codes.py:279 msgid "Stock counted" -msgstr "" +msgstr "Stock contado" #: InvenTree/status_codes.py:280 msgid "Stock manually added" -msgstr "" +msgstr "Stock añadido manualmente" #: InvenTree/status_codes.py:281 msgid "Stock manually removed" -msgstr "" +msgstr "Stock eliminado manualmente" #: InvenTree/status_codes.py:283 msgid "Location changed" -msgstr "" +msgstr "Ubicación cambiada" #: InvenTree/status_codes.py:285 msgid "Installed into assembly" @@ -326,11 +327,11 @@ msgstr "" #: InvenTree/status_codes.py:298 msgid "Build order output completed" -msgstr "" +msgstr "Construir orden de salida completado" #: InvenTree/status_codes.py:300 msgid "Received against purchase order" -msgstr "" +msgstr "Recibido contra la orden de compra" #: InvenTree/status_codes.py:315 msgid "Production" @@ -372,27 +373,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "Eliminar elemento" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "Configurar Contraseña" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "Información del sistema" @@ -445,11 +446,11 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "" @@ -462,22 +463,21 @@ msgstr "" #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,9 +486,10 @@ msgstr "" #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "Cantidad" @@ -500,7 +501,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "Números de serie" @@ -529,12 +530,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "Unicación" @@ -543,13 +544,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "Estado" @@ -583,16 +584,16 @@ msgstr "" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -602,12 +603,12 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "Referencia" @@ -626,27 +627,27 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "Parte" @@ -710,16 +711,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "" @@ -736,9 +737,9 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "Responsable" @@ -757,26 +758,26 @@ msgstr "" msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "Notas" @@ -809,11 +810,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -827,7 +828,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "" @@ -836,15 +837,13 @@ msgstr "" msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "" @@ -880,7 +879,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "" @@ -917,15 +916,15 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "Número de serie" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" @@ -1037,11 +1036,10 @@ msgid "Progress" msgstr "Progreso" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1185,7 +1183,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "Destinación" @@ -1194,15 +1195,15 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Lote" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "" @@ -1210,7 +1211,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "Completados" @@ -1248,9 +1249,9 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "Detalles" @@ -1285,8 +1286,8 @@ msgstr "" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Guardar" @@ -1411,8 +1412,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "" @@ -1598,8 +1599,8 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "" @@ -1608,7 +1609,7 @@ msgstr "" msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "" @@ -1617,7 +1618,7 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "" @@ -1626,7 +1627,7 @@ msgstr "" msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" @@ -1634,7 +1635,7 @@ msgstr "" msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "" @@ -1643,7 +1644,7 @@ msgstr "" msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "" @@ -1652,7 +1653,7 @@ msgstr "" msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" @@ -1669,160 +1670,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:209 +msgid "Show Price in Forms" msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 +msgid "Page Size" +msgstr "" + +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "días" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "" @@ -1843,7 +1869,9 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" msgstr "" @@ -1877,29 +1905,29 @@ msgstr "" msgid "Image URL" msgstr "" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "" @@ -1952,11 +1980,11 @@ msgstr "Contacto" msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "" @@ -1964,7 +1992,7 @@ msgstr "" msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "" @@ -1992,12 +2020,12 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "" @@ -2008,7 +2036,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "Fabricante" @@ -2020,87 +2048,112 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "Proveedor" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "Nota" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "" @@ -2165,11 +2218,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "Cliente" @@ -2215,7 +2268,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "" @@ -2248,13 +2301,12 @@ msgstr "Exportar" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" @@ -2262,12 +2314,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2319,8 +2371,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2332,13 +2385,13 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2360,11 +2413,25 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "Eliminar" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" @@ -2379,13 +2446,13 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2396,7 +2463,7 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2408,7 +2475,7 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2442,7 +2509,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "" @@ -2490,8 +2557,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2510,8 +2577,8 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "Fabricantes" @@ -2533,20 +2600,20 @@ msgstr "" msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "" @@ -2594,27 +2661,35 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" @@ -2638,7 +2713,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "" @@ -2662,7 +2737,7 @@ msgstr "" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "" @@ -2674,8 +2749,8 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" @@ -2696,237 +2771,239 @@ msgstr "" msgid "Ship order" msgstr "" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "" @@ -2955,7 +3032,7 @@ msgid "Export order to file" msgstr "" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2977,8 +3054,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "" @@ -3081,28 +3158,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "" @@ -3135,15 +3216,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "" @@ -3153,8 +3239,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3162,25 +3248,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3201,7 +3293,7 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3216,7 +3308,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3224,11 +3316,11 @@ msgstr "" msgid "Receive" msgstr "" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "" @@ -3265,17 +3357,17 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "" @@ -3283,50 +3375,50 @@ msgstr "" msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3367,10 +3459,6 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3471,90 +3559,94 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format +msgid "No matching item for serial {serial}" +msgstr "" + +#: order/views.py:1633 +#, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3632,7 +3724,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "" @@ -3708,7 +3800,7 @@ msgstr "" msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "" @@ -3728,7 +3820,7 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3739,365 +3831,360 @@ msgstr "" msgid "Part Categories" msgstr "" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4112,8 +4199,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "" @@ -4160,7 +4247,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4177,7 +4264,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4258,7 +4345,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "" @@ -4318,7 +4405,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "" @@ -4373,14 +4460,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" @@ -4408,7 +4489,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "" @@ -4488,6 +4569,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4501,127 +4612,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4630,19 +4755,6 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" @@ -4660,7 +4772,7 @@ msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4740,14 +4852,10 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" @@ -4816,7 +4924,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "" @@ -4853,7 +4961,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4922,227 +5030,239 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" @@ -5174,7 +5294,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5197,7 +5317,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" @@ -5483,12 +5603,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5618,7 +5738,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "" @@ -5630,25 +5750,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5945,7 +6069,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -6011,7 +6135,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6043,14 +6167,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6119,11 +6235,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "" @@ -6168,12 +6284,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "" @@ -6221,11 +6337,11 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "" @@ -6341,47 +6457,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6442,7 +6562,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6506,7 +6626,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6542,7 +6662,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6562,37 +6682,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6612,17 +6740,29 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" @@ -6710,76 +6850,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6795,6 +6935,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6823,39 +6967,39 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6953,155 +7097,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7267,56 +7411,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7560,35 +7704,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/fr/LC_MESSAGES/django.po b/InvenTree/locale/fr/LC_MESSAGES/django.po index 97617764a4..61f43d466b 100644 --- a/InvenTree/locale/fr/LC_MESSAGES/django.po +++ b/InvenTree/locale/fr/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:40\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-24 21:40\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -77,7 +77,7 @@ msgstr "Sélectionnez une catégorie" msgid "Duplicate serial: {n}" msgstr "Dupliquer le numéro de série: {n}" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "Quantité fournie invalide" @@ -122,9 +122,9 @@ msgstr "Commentaire" msgid "File comment" msgstr "Commentaire du fichier" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "Utilisateur" @@ -132,34 +132,35 @@ msgstr "Utilisateur" msgid "upload date" msgstr "date de chargement" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "Nom" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "Description" @@ -191,15 +192,15 @@ msgstr "Polonais" msgid "Turkish" msgstr "Turc" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "Échec de la vérification du processus d'arrière-plan" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "Backend d'email non configuré" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "Échec des contrôles de santé du système" @@ -372,27 +373,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "Supprimer cet élément" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "Modifier les informations utilisateur" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "Informations système" @@ -445,11 +446,11 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "" @@ -462,22 +463,21 @@ msgstr "" #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,9 +486,10 @@ msgstr "" #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "Quantité" @@ -500,7 +501,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "Numéros de série" @@ -529,12 +530,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "" @@ -543,13 +544,13 @@ msgid "Location of completed parts" msgstr "Emplacement des pièces terminées" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "" @@ -583,16 +584,16 @@ msgstr "" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -602,12 +603,12 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "Référence" @@ -626,27 +627,27 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "Pièce" @@ -710,16 +711,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "Date de création" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "" @@ -736,9 +737,9 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" @@ -757,26 +758,26 @@ msgstr "" msgid "External Link" msgstr "Lien Externe" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "Notes" @@ -809,11 +810,11 @@ msgstr "L'élément de construction doit spécifier une sortie de construction, msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -827,7 +828,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "L'article en stock sélectionné n'a pas été trouvé dans la BOM pour la pièce '{p}'" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "" @@ -836,15 +837,13 @@ msgstr "" msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "" @@ -880,7 +879,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "" @@ -917,15 +916,15 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "Pieces jointes" @@ -1037,11 +1036,10 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1185,7 +1183,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "" @@ -1194,15 +1195,15 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "" @@ -1210,7 +1211,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "" @@ -1248,9 +1249,9 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "Détails" @@ -1285,8 +1286,8 @@ msgstr "" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Enregistrer" @@ -1411,8 +1412,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "Disponible" @@ -1598,8 +1599,8 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "" @@ -1608,7 +1609,7 @@ msgstr "" msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "" @@ -1617,7 +1618,7 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "" @@ -1626,7 +1627,7 @@ msgstr "" msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" @@ -1634,7 +1635,7 @@ msgstr "" msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "" @@ -1643,7 +1644,7 @@ msgstr "" msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "" @@ -1652,7 +1653,7 @@ msgstr "" msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" @@ -1669,160 +1670,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:209 +msgid "Show Price in Forms" msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 +msgid "Page Size" +msgstr "" + +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "jours" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "" @@ -1843,7 +1869,9 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" msgstr "" @@ -1877,29 +1905,29 @@ msgstr "" msgid "Image URL" msgstr "" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "" @@ -1952,11 +1980,11 @@ msgstr "" msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "" @@ -1964,7 +1992,7 @@ msgstr "" msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "" @@ -1992,12 +2020,12 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "" @@ -2008,7 +2036,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "" @@ -2020,87 +2048,112 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "" @@ -2165,11 +2218,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "" @@ -2215,7 +2268,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "" @@ -2248,13 +2301,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" @@ -2262,12 +2314,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2319,8 +2371,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2332,13 +2385,13 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2360,11 +2413,25 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" @@ -2379,13 +2446,13 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2396,7 +2463,7 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2408,7 +2475,7 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2442,7 +2509,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "" @@ -2490,8 +2557,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2510,8 +2577,8 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "" @@ -2533,20 +2600,20 @@ msgstr "" msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "" @@ -2594,27 +2661,35 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" @@ -2638,7 +2713,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "" @@ -2662,7 +2737,7 @@ msgstr "" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "" @@ -2674,8 +2749,8 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" @@ -2696,237 +2771,239 @@ msgstr "" msgid "Ship order" msgstr "" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "" @@ -2955,7 +3032,7 @@ msgid "Export order to file" msgstr "" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2977,8 +3054,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "" @@ -3081,28 +3158,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "" @@ -3135,15 +3216,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "" @@ -3153,8 +3239,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3162,25 +3248,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3201,7 +3293,7 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3216,7 +3308,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3224,11 +3316,11 @@ msgstr "" msgid "Receive" msgstr "" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "" @@ -3265,17 +3357,17 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "" @@ -3283,50 +3375,50 @@ msgstr "" msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3367,10 +3459,6 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3471,90 +3559,94 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format +msgid "No matching item for serial {serial}" +msgstr "" + +#: order/views.py:1633 +#, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3632,7 +3724,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "" @@ -3708,7 +3800,7 @@ msgstr "" msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "" @@ -3728,7 +3820,7 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3739,365 +3831,360 @@ msgstr "" msgid "Part Categories" msgstr "" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "IPN dupliqué non autorisé dans les paramètres de la pièce" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "La pièce doit être unique par son nom, son IPN et sa révision" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "IPN" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4112,8 +4199,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "" @@ -4160,7 +4247,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4177,7 +4264,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4258,7 +4345,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "" @@ -4318,7 +4405,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "" @@ -4373,14 +4460,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" @@ -4408,7 +4489,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "" @@ -4488,6 +4569,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4501,127 +4612,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4630,19 +4755,6 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" @@ -4660,7 +4772,7 @@ msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4740,14 +4852,10 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" @@ -4816,7 +4924,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "" @@ -4853,7 +4961,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4922,227 +5030,239 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" @@ -5174,7 +5294,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5197,7 +5317,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" @@ -5483,12 +5603,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5618,7 +5738,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "" @@ -5630,25 +5750,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5945,7 +6069,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -6011,7 +6135,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6043,14 +6167,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6119,11 +6235,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "" @@ -6168,12 +6284,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "" @@ -6221,11 +6337,11 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "" @@ -6341,47 +6457,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6442,7 +6562,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6506,7 +6626,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6542,7 +6662,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6562,37 +6682,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6612,17 +6740,29 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" @@ -6710,76 +6850,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6795,6 +6935,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6823,39 +6967,39 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6953,155 +7097,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7267,56 +7411,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7560,35 +7704,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/it/LC_MESSAGES/django.po b/InvenTree/locale/it/LC_MESSAGES/django.po index 6caf5cb88d..87d69fb09a 100644 --- a/InvenTree/locale/it/LC_MESSAGES/django.po +++ b/InvenTree/locale/it/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:40\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-24 21:40\n" "Last-Translator: \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -77,7 +77,7 @@ msgstr "" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -122,9 +122,9 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "" @@ -132,34 +132,35 @@ msgstr "" msgid "upload date" msgstr "" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "" @@ -191,15 +192,15 @@ msgstr "" msgid "Turkish" msgstr "" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "" @@ -372,27 +373,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -445,11 +446,11 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "" @@ -462,22 +463,21 @@ msgstr "" #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,9 +486,10 @@ msgstr "" #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "" @@ -500,7 +501,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "" @@ -529,12 +530,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "" @@ -543,13 +544,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "" @@ -583,16 +584,16 @@ msgstr "" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -602,12 +603,12 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "" @@ -626,27 +627,27 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "" @@ -710,16 +711,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "" @@ -736,9 +737,9 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" @@ -757,26 +758,26 @@ msgstr "" msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "" @@ -809,11 +810,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -827,7 +828,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "" @@ -836,15 +837,13 @@ msgstr "" msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "" @@ -880,7 +879,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "" @@ -917,15 +916,15 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" @@ -1037,11 +1036,10 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1185,7 +1183,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "" @@ -1194,15 +1195,15 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "" @@ -1210,7 +1211,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "" @@ -1248,9 +1249,9 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "" @@ -1285,8 +1286,8 @@ msgstr "" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1411,8 +1412,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "" @@ -1598,8 +1599,8 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "" @@ -1608,7 +1609,7 @@ msgstr "" msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "" @@ -1617,7 +1618,7 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "" @@ -1626,7 +1627,7 @@ msgstr "" msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" @@ -1634,7 +1635,7 @@ msgstr "" msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "" @@ -1643,7 +1644,7 @@ msgstr "" msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "" @@ -1652,7 +1653,7 @@ msgstr "" msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" @@ -1669,160 +1670,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:209 +msgid "Show Price in Forms" msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 +msgid "Page Size" +msgstr "" + +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "" @@ -1843,7 +1869,9 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" msgstr "" @@ -1877,29 +1905,29 @@ msgstr "" msgid "Image URL" msgstr "" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "" @@ -1952,11 +1980,11 @@ msgstr "" msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "" @@ -1964,7 +1992,7 @@ msgstr "" msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "" @@ -1992,12 +2020,12 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "" @@ -2008,7 +2036,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "" @@ -2020,87 +2048,112 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "" @@ -2165,11 +2218,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "" @@ -2215,7 +2268,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "" @@ -2248,13 +2301,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" @@ -2262,12 +2314,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2319,8 +2371,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2332,13 +2385,13 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2360,11 +2413,25 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" @@ -2379,13 +2446,13 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2396,7 +2463,7 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2408,7 +2475,7 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2442,7 +2509,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "" @@ -2490,8 +2557,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2510,8 +2577,8 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "" @@ -2533,20 +2600,20 @@ msgstr "" msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "" @@ -2594,27 +2661,35 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" @@ -2638,7 +2713,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "" @@ -2662,7 +2737,7 @@ msgstr "" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "" @@ -2674,8 +2749,8 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" @@ -2696,237 +2771,239 @@ msgstr "" msgid "Ship order" msgstr "" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "" @@ -2955,7 +3032,7 @@ msgid "Export order to file" msgstr "" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2977,8 +3054,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "" @@ -3081,28 +3158,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "" @@ -3135,15 +3216,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "" @@ -3153,8 +3239,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3162,25 +3248,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3201,7 +3293,7 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3216,7 +3308,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3224,11 +3316,11 @@ msgstr "" msgid "Receive" msgstr "" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "" @@ -3265,17 +3357,17 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "" @@ -3283,50 +3375,50 @@ msgstr "" msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3367,10 +3459,6 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3471,90 +3559,94 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format +msgid "No matching item for serial {serial}" +msgstr "" + +#: order/views.py:1633 +#, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3632,7 +3724,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "" @@ -3708,7 +3800,7 @@ msgstr "" msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "" @@ -3728,7 +3820,7 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3739,365 +3831,360 @@ msgstr "" msgid "Part Categories" msgstr "" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4112,8 +4199,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "" @@ -4160,7 +4247,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4177,7 +4264,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4258,7 +4345,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "" @@ -4318,7 +4405,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "" @@ -4373,14 +4460,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" @@ -4408,7 +4489,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "" @@ -4488,6 +4569,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4501,127 +4612,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4630,19 +4755,6 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" @@ -4660,7 +4772,7 @@ msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4740,14 +4852,10 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" @@ -4816,7 +4924,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "" @@ -4853,7 +4961,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4922,227 +5030,239 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" @@ -5174,7 +5294,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5197,7 +5317,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" @@ -5483,12 +5603,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5618,7 +5738,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "" @@ -5630,25 +5750,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5945,7 +6069,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -6011,7 +6135,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6043,14 +6167,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6119,11 +6235,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "" @@ -6168,12 +6284,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "" @@ -6221,11 +6337,11 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "" @@ -6341,47 +6457,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6442,7 +6562,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6506,7 +6626,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6542,7 +6662,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6562,37 +6682,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6612,17 +6740,29 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" @@ -6710,76 +6850,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6795,6 +6935,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6823,39 +6967,39 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6953,155 +7097,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7267,56 +7411,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7560,35 +7704,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/ja/LC_MESSAGES/django.po b/InvenTree/locale/ja/LC_MESSAGES/django.po index f5afd1b0fe..fa6df1a934 100644 --- a/InvenTree/locale/ja/LC_MESSAGES/django.po +++ b/InvenTree/locale/ja/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:41\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-24 21:40\n" "Last-Translator: \n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -77,7 +77,7 @@ msgstr "" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -122,9 +122,9 @@ msgstr "" msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "" @@ -132,34 +132,35 @@ msgstr "" msgid "upload date" msgstr "" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "" @@ -191,15 +192,15 @@ msgstr "" msgid "Turkish" msgstr "" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "" @@ -372,27 +373,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -445,11 +446,11 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "" @@ -462,22 +463,21 @@ msgstr "" #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,9 +486,10 @@ msgstr "" #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "" @@ -500,7 +501,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "" @@ -529,12 +530,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "" @@ -543,13 +544,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "" @@ -583,16 +584,16 @@ msgstr "" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -602,12 +603,12 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "" @@ -626,27 +627,27 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "" @@ -710,16 +711,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "" @@ -736,9 +737,9 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" @@ -757,26 +758,26 @@ msgstr "" msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "" @@ -809,11 +810,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -827,7 +828,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "" @@ -836,15 +837,13 @@ msgstr "" msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "" @@ -880,7 +879,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "" @@ -917,15 +916,15 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" @@ -1037,11 +1036,10 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1185,7 +1183,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "" @@ -1194,15 +1195,15 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "" @@ -1210,7 +1211,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "" @@ -1248,9 +1249,9 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "" @@ -1285,8 +1286,8 @@ msgstr "" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1411,8 +1412,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "" @@ -1598,8 +1599,8 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "" @@ -1608,7 +1609,7 @@ msgstr "" msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "" @@ -1617,7 +1618,7 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "" @@ -1626,7 +1627,7 @@ msgstr "" msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" @@ -1634,7 +1635,7 @@ msgstr "" msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "" @@ -1643,7 +1644,7 @@ msgstr "" msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "" @@ -1652,7 +1653,7 @@ msgstr "" msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" @@ -1669,160 +1670,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:209 +msgid "Show Price in Forms" msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 +msgid "Page Size" +msgstr "" + +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "" @@ -1843,7 +1869,9 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" msgstr "" @@ -1877,29 +1905,29 @@ msgstr "" msgid "Image URL" msgstr "" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "" @@ -1952,11 +1980,11 @@ msgstr "" msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "" @@ -1964,7 +1992,7 @@ msgstr "" msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "" @@ -1992,12 +2020,12 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "" @@ -2008,7 +2036,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "" @@ -2020,87 +2048,112 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "" @@ -2165,11 +2218,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "" @@ -2215,7 +2268,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "" @@ -2248,13 +2301,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" @@ -2262,12 +2314,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2319,8 +2371,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2332,13 +2385,13 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2360,11 +2413,25 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" @@ -2379,13 +2446,13 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2396,7 +2463,7 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2408,7 +2475,7 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2442,7 +2509,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "" @@ -2490,8 +2557,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2510,8 +2577,8 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "" @@ -2533,20 +2600,20 @@ msgstr "" msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "" @@ -2594,27 +2661,35 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" @@ -2638,7 +2713,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "" @@ -2662,7 +2737,7 @@ msgstr "" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "" @@ -2674,8 +2749,8 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" @@ -2696,237 +2771,239 @@ msgstr "" msgid "Ship order" msgstr "" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "" @@ -2955,7 +3032,7 @@ msgid "Export order to file" msgstr "" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2977,8 +3054,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "" @@ -3081,28 +3158,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "" @@ -3135,15 +3216,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "" @@ -3153,8 +3239,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3162,25 +3248,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3201,7 +3293,7 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3216,7 +3308,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3224,11 +3316,11 @@ msgstr "" msgid "Receive" msgstr "" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "" @@ -3265,17 +3357,17 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "" @@ -3283,50 +3375,50 @@ msgstr "" msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3367,10 +3459,6 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3471,90 +3559,94 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format +msgid "No matching item for serial {serial}" +msgstr "" + +#: order/views.py:1633 +#, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3632,7 +3724,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "" @@ -3708,7 +3800,7 @@ msgstr "" msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "" @@ -3728,7 +3820,7 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3739,365 +3831,360 @@ msgstr "" msgid "Part Categories" msgstr "" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4112,8 +4199,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "" @@ -4160,7 +4247,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4177,7 +4264,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4258,7 +4345,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "" @@ -4318,7 +4405,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "" @@ -4373,14 +4460,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" @@ -4408,7 +4489,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "" @@ -4488,6 +4569,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4501,127 +4612,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4630,19 +4755,6 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" @@ -4660,7 +4772,7 @@ msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4740,14 +4852,10 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" @@ -4816,7 +4924,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "" @@ -4853,7 +4961,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4922,227 +5030,239 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" @@ -5174,7 +5294,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5197,7 +5317,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" @@ -5483,12 +5603,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5618,7 +5738,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "" @@ -5630,25 +5750,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5945,7 +6069,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -6011,7 +6135,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6043,14 +6167,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6119,11 +6235,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "" @@ -6168,12 +6284,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "" @@ -6221,11 +6337,11 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "" @@ -6341,47 +6457,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6442,7 +6562,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6506,7 +6626,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6542,7 +6662,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6562,37 +6682,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6612,17 +6740,29 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" @@ -6710,76 +6850,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6795,6 +6935,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6823,39 +6967,39 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6953,155 +7097,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7267,56 +7411,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7560,35 +7704,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/pl/LC_MESSAGES/django.po b/InvenTree/locale/pl/LC_MESSAGES/django.po index 9b4e347ff7..4bc233a127 100644 --- a/InvenTree/locale/pl/LC_MESSAGES/django.po +++ b/InvenTree/locale/pl/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:40\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-24 21:40\n" "Last-Translator: \n" "Language-Team: Polish\n" "Language: pl_PL\n" @@ -77,7 +77,7 @@ msgstr "Wybierz kategorię" msgid "Duplicate serial: {n}" msgstr "Powtórzony numer seryjny: {n}" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "Podano nieprawidłową ilość" @@ -122,9 +122,9 @@ msgstr "Komentarz" msgid "File comment" msgstr "Komentarz pliku" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "Użytkownik" @@ -132,34 +132,35 @@ msgstr "Użytkownik" msgid "upload date" msgstr "data przesłania" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "Nazwa" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "Opis" @@ -191,15 +192,15 @@ msgstr "Polski" msgid "Turkish" msgstr "Turecki" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "Nie skonfigurowano backendu e-mail" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "" @@ -372,27 +373,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "Usuń element" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "Zaznacz pole aby potwierdzić usunięcie elementu" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "Edytuj informacje użytkownika" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "Ustaw hasło" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "Hasła muszą być zgodne" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "Informacja systemowa" @@ -445,11 +446,11 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "Data docelowa" @@ -462,22 +463,21 @@ msgstr "" #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,9 +486,10 @@ msgstr "" #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "Ilość" @@ -500,7 +501,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "Numer seryjny" @@ -529,12 +530,12 @@ msgid "Mark build as complete" msgstr "Oznacz budowę jako ukończoną" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "Lokalizacja" @@ -543,13 +544,13 @@ msgid "Location of completed parts" msgstr "Lokalizacja ukończonych części" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "Status" @@ -583,16 +584,16 @@ msgstr "" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "Zlecenie Budowy" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -602,12 +603,12 @@ msgstr "Zlecenia budowy" msgid "Build Order Reference" msgstr "Odwołanie do zamówienia wykonania" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "Referencja" @@ -626,27 +627,27 @@ msgstr "Zamówienie budowy, do którego budowa jest przypisana" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "Część" @@ -710,16 +711,16 @@ msgstr "Kod partii" msgid "Batch code for this build output" msgstr "Kod partii dla wyjścia budowy" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "Data utworzenia" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "Docelowy termin zakończenia" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "Data zakończenia" @@ -736,9 +737,9 @@ msgid "User who issued this build order" msgstr "Użytkownik, który wydał to zamówienie" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "Odpowiedzialny" @@ -757,26 +758,26 @@ msgstr "Użytkownik odpowiedzialny za to zamówienie budowy" msgid "External Link" msgstr "Link Zewnętrzny" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "Link do zewnętrznego adresu URL" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "Uwagi" @@ -809,11 +810,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -827,7 +828,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "Budowa" @@ -836,15 +837,13 @@ msgstr "Budowa" msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "Element magazynowy" @@ -880,7 +879,7 @@ msgstr "Przydziel zapasy do budowy" msgid "Auto Allocate" msgstr "Automatyczne przypisywanie" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "Cofnij przydział zapasów" @@ -917,15 +916,15 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "Numer Seryjny" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "Załączniki" @@ -1037,11 +1036,10 @@ msgid "Progress" msgstr "Postęp" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1185,7 +1183,10 @@ msgstr "Źródło magazynu" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "Przeznaczenie" @@ -1194,15 +1195,15 @@ msgid "Destination location not specified" msgstr "Nie określono lokalizacji docelowej" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Partia" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "Utworzony" @@ -1210,7 +1211,7 @@ msgstr "Utworzony" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "Zakończone" @@ -1248,9 +1249,9 @@ msgstr "Szczegóły zlecenia budowy" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "Szczegóły" @@ -1285,8 +1286,8 @@ msgstr "Edytuj uwagi" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Zapisz" @@ -1411,8 +1412,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "Dostępne" @@ -1598,8 +1599,8 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "Szablon" @@ -1608,7 +1609,7 @@ msgstr "Szablon" msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "Złożenie" @@ -1617,7 +1618,7 @@ msgstr "Złożenie" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "Komponent" @@ -1626,7 +1627,7 @@ msgstr "Komponent" msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "Możliwość zakupu" @@ -1634,7 +1635,7 @@ msgstr "Możliwość zakupu" msgid "Parts are purchaseable by default" msgstr "Części są domyślnie z możliwością zakupu" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "Możliwość sprzedaży" @@ -1643,7 +1644,7 @@ msgstr "Możliwość sprzedaży" msgid "Parts are salable by default" msgstr "Części są domyślnie z możliwością sprzedaży" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "Możliwość śledzenia" @@ -1652,7 +1653,7 @@ msgstr "Możliwość śledzenia" msgid "Parts are trackable by default" msgstr "Części są domyślnie z możliwością śledzenia" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "Wirtualny" @@ -1669,160 +1670,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" -msgstr "Tryb Debugowania" +#: common/models.py:209 +msgid "Show Price in Forms" +msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 +msgid "Internal Prices" +msgstr "" + +#: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "Tryb Debugowania" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 msgid "Page Size" msgstr "Rozmiar strony" -#: common/models.py:217 +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "Raporty testów" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "Włącz generowanie raportów testów" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "dni" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "Grupuj według komponentu" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "Ustawienia wartości" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "Cena" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "Domyślny" @@ -1843,9 +1869,11 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" -msgstr "Wyślik plik" +msgstr "Wyślij plik" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 #: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 @@ -1877,29 +1905,29 @@ msgstr "URL" msgid "Image URL" msgstr "URL zdjęcia" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "Cena jednostkowa" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "Cena jednostkowa" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "Wybierz producenta" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "Numer producenta" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "MPN" @@ -1952,11 +1980,11 @@ msgstr "Kontakt" msgid "Point of contact" msgstr "Punkt kontaktowy" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "Łącze" @@ -1964,7 +1992,7 @@ msgstr "Łącze" msgid "Link to external company information" msgstr "Link do informacji o zewnętrznym przedsiębiorstwie" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "Obraz" @@ -1992,12 +2020,12 @@ msgstr "jest producentem" msgid "Does this company manufacture parts?" msgstr "Czy to przedsiębiorstwo produkuje części?" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "Część bazowa" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "Wybierz część" @@ -2008,7 +2036,7 @@ msgstr "Wybierz część" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "Producent" @@ -2020,87 +2048,112 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "Część producenta" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "Jednostki" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "Dostawca" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "Wybierz dostawcę" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "SKU" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "Część producenta" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "Uwaga" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "koszt podstawowy" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "Opakowanie" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "Opakowanie części" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "wielokrotność" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "" @@ -2165,11 +2218,11 @@ msgstr "Nie określono strony internetowej" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "Klient" @@ -2215,7 +2268,7 @@ msgstr "Usuń części" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "Nowy komponent" @@ -2248,13 +2301,12 @@ msgstr "Eksportuj" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "Komponenty dostawcy" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "Utwórz nowego dostawcę części" @@ -2262,12 +2314,12 @@ msgstr "Utwórz nowego dostawcę części" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "Now dostawca części" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2319,8 +2371,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "Dostawcy" @@ -2332,13 +2385,13 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "Stan" @@ -2360,11 +2413,25 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "Usuń" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "Parametry" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "Utwórz nowego dostawcę" @@ -2379,13 +2446,13 @@ msgstr "" msgid "Supplied Parts" msgstr "Dostarczone części" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2396,7 +2463,7 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2408,7 +2475,7 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2442,7 +2509,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "" @@ -2490,8 +2557,8 @@ msgstr "" msgid "Pricing Information" msgstr "Informacja cenowa" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2510,8 +2577,8 @@ msgstr "Edytuj przedział cenowy" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "Producenci" @@ -2533,20 +2600,20 @@ msgstr "Firmy" msgid "New Company" msgstr "Nowa firma" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "Pobierz obraz" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "" @@ -2594,27 +2661,35 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "Edytuj przedział cenowy" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" @@ -2638,7 +2713,7 @@ msgstr "Etykieta" msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "Aktywne" @@ -2662,7 +2737,7 @@ msgstr "Wysokość [mm]" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "" @@ -2674,8 +2749,8 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "Filtry" @@ -2696,237 +2771,239 @@ msgstr "Anuluj zamówienie" msgid "Ship order" msgstr "Wyślij zamówienie" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "Wprowadź ilość produktów magazynowych" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "Odniesienie zamówienia" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "Opis Zamówienia" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "Link do zewnętrznej witryny" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "Utworzony przez" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "Użytkownik lub grupa odpowiedzialna za to zamówienie" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "Notatki do zamówienia" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "odebrane przez" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "Data wydania" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "Data wysyłki" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "wysłane przez" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "Ilość elementów" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "Zamówienie" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "Odebrane" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "Cena zakupu" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "Cena zakupu jednostkowego" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "Cena sprzedaży" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "Jednostkowa cena sprzedaży" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "Linia" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "Komponent" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "" @@ -2955,7 +3032,7 @@ msgid "Export order to file" msgstr "" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2977,8 +3054,8 @@ msgstr "Wydany" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "Nowa lokalizacja" @@ -3081,28 +3158,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "Wybierz dostawcę" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "Usuń część" @@ -3135,15 +3216,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "Otrzymane elementy" @@ -3153,8 +3239,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3162,25 +3248,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "Cena jednostkowa" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3201,7 +3293,7 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3216,7 +3308,7 @@ msgid "Order Code" msgstr "Kod zamówienia" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3224,11 +3316,11 @@ msgstr "" msgid "Receive" msgstr "Odbierz" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "Usuń linie" @@ -3265,17 +3357,17 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "Akcje" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "" @@ -3283,50 +3375,50 @@ msgstr "" msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "Numer ID" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "Przydzielono" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "Oblicz cenę" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3367,10 +3459,6 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3471,90 +3559,94 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format +msgid "No matching item for serial {serial}" +msgstr "" + +#: order/views.py:1633 +#, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "Nie znaleziono ceny" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "Domyślna lokalizacja" @@ -3632,7 +3724,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "Część nadrzędna" @@ -3708,7 +3800,7 @@ msgstr "" msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "Podczęść" @@ -3728,7 +3820,7 @@ msgstr "Domyślne słowa kluczowe" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3739,365 +3831,360 @@ msgstr "" msgid "Part Categories" msgstr "" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "Wariant" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "Opis części" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "Słowa kluczowe" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "Kategoria" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "IPN" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "Wersja" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "Minimalny stan magazynowy" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "Jednostki" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "Aktywny" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "Czy ta część jest aktywna?" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "Sprzedaj wiele" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "Nazwa testu" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "Wymagane" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "Dane" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "Wartość domyślna" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "Suma kontrolna" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "Część 1" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "Część 2" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "Wybierz powiązaną część" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4112,8 +4199,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "Zestawienie materiałowe" @@ -4160,7 +4247,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4177,7 +4264,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4258,7 +4345,7 @@ msgstr "" msgid "All parts" msgstr "Wszystkie części" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "Stwórz nową kategorię komponentów" @@ -4318,7 +4405,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "" @@ -4373,14 +4460,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "Parametry" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "Parametry części" @@ -4408,7 +4489,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "Szczegóły części" @@ -4488,6 +4569,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4501,127 +4612,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4630,19 +4755,6 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" @@ -4660,7 +4772,7 @@ msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4740,14 +4852,10 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" @@ -4816,7 +4924,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "" @@ -4853,7 +4961,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4922,227 +5030,239 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" @@ -5174,7 +5294,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5197,7 +5317,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" @@ -5483,12 +5603,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5618,7 +5738,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "" @@ -5630,25 +5750,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5945,7 +6069,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -6011,7 +6135,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6043,14 +6167,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6119,11 +6235,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "" @@ -6168,12 +6284,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "" @@ -6221,11 +6337,11 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "" @@ -6341,47 +6457,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6442,7 +6562,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6506,7 +6626,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6542,7 +6662,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6562,37 +6682,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6612,17 +6740,29 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" @@ -6710,76 +6850,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6795,6 +6935,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6823,39 +6967,39 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6953,155 +7097,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7267,56 +7411,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7560,35 +7704,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/ru/LC_MESSAGES/django.po b/InvenTree/locale/ru/LC_MESSAGES/django.po index d61e19d068..0b04ba9921 100644 --- a/InvenTree/locale/ru/LC_MESSAGES/django.po +++ b/InvenTree/locale/ru/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:41\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-24 21:40\n" "Last-Translator: \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -77,7 +77,7 @@ msgstr "Выбрать категорию" msgid "Duplicate serial: {n}" msgstr "Дублировать серийный номер: {n}" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "недопустимое количество" @@ -122,9 +122,9 @@ msgstr "Комментарий" msgid "File comment" msgstr "Комментарий к файлу" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "Пользователь" @@ -132,34 +132,35 @@ msgstr "Пользователь" msgid "upload date" msgstr "дата загрузки" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "Название" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "Описание" @@ -191,15 +192,15 @@ msgstr "Польский" msgid "Turkish" msgstr "Турецкий" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "Проверка фонового работника не удалась" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "Сервер электронной почты не настроен" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "Ошибка проверки состояния системы InvenTree" @@ -372,27 +373,27 @@ msgstr "Перегрузка не может превысить 100%" msgid "Overage must be an integer value or a percentage" msgstr "Превышение должно быть целым числом или процентом" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "Удалить элемент" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "Установите флажок для подтверждения удаления элемента" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "Редактировать информацию о пользователе" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "Установить пароль" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "Пароли должны совпадать" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "Информация о системе" @@ -445,11 +446,11 @@ msgid "Order target date" msgstr "Срок выполнения заказа" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "Целевая дата" @@ -462,22 +463,21 @@ msgstr "Целевая дата для сборки. Сборка будет п #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,9 +486,10 @@ msgstr "Целевая дата для сборки. Сборка будет п #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "Количество" @@ -500,7 +501,7 @@ msgstr "Количество элементов для сборки" msgid "Enter quantity for build output" msgstr "Введите количество для вывода сборки" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "Серийные номера" @@ -529,12 +530,12 @@ msgid "Mark build as complete" msgstr "Пометить сборку как завершенную" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "Расположение" @@ -543,13 +544,13 @@ msgid "Location of completed parts" msgstr "Расположение укомплектованных частей" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "Статус" @@ -583,16 +584,16 @@ msgstr "Выберите количество запасов для распре #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "Порядок сборки" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -602,12 +603,12 @@ msgstr "Порядок сборки" msgid "Build Order Reference" msgstr "Ссылка на заказ" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "" @@ -626,27 +627,27 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "" @@ -710,16 +711,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "" @@ -736,9 +737,9 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" @@ -757,26 +758,26 @@ msgstr "" msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "" @@ -809,11 +810,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -827,7 +828,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "" @@ -836,15 +837,13 @@ msgstr "" msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "" @@ -880,7 +879,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "" @@ -917,15 +916,15 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" @@ -1037,11 +1036,10 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1185,7 +1183,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "" @@ -1194,15 +1195,15 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "" @@ -1210,7 +1211,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "" @@ -1248,9 +1249,9 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "" @@ -1285,8 +1286,8 @@ msgstr "" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1411,8 +1412,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "" @@ -1598,8 +1599,8 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "" @@ -1608,7 +1609,7 @@ msgstr "" msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "" @@ -1617,7 +1618,7 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "" @@ -1626,7 +1627,7 @@ msgstr "" msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" @@ -1634,7 +1635,7 @@ msgstr "" msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "" @@ -1643,7 +1644,7 @@ msgstr "" msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "" @@ -1652,7 +1653,7 @@ msgstr "" msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" @@ -1669,160 +1670,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:209 +msgid "Show Price in Forms" msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 +msgid "Page Size" +msgstr "" + +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "" @@ -1843,7 +1869,9 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" msgstr "" @@ -1877,29 +1905,29 @@ msgstr "" msgid "Image URL" msgstr "" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "" @@ -1952,11 +1980,11 @@ msgstr "" msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "" @@ -1964,7 +1992,7 @@ msgstr "" msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "" @@ -1992,12 +2020,12 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "" @@ -2008,7 +2036,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "" @@ -2020,87 +2048,112 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "" @@ -2165,11 +2218,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "" @@ -2215,7 +2268,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "" @@ -2248,13 +2301,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" @@ -2262,12 +2314,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2319,8 +2371,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2332,13 +2385,13 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2360,11 +2413,25 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" @@ -2379,13 +2446,13 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2396,7 +2463,7 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2408,7 +2475,7 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2442,7 +2509,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "" @@ -2490,8 +2557,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2510,8 +2577,8 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "" @@ -2533,20 +2600,20 @@ msgstr "" msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "" @@ -2594,27 +2661,35 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" @@ -2638,7 +2713,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "" @@ -2662,7 +2737,7 @@ msgstr "" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "" @@ -2674,8 +2749,8 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" @@ -2696,237 +2771,239 @@ msgstr "" msgid "Ship order" msgstr "" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "" @@ -2955,7 +3032,7 @@ msgid "Export order to file" msgstr "" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2977,8 +3054,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "" @@ -3081,28 +3158,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "" @@ -3135,15 +3216,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "" @@ -3153,8 +3239,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3162,25 +3248,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3201,7 +3293,7 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3216,7 +3308,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3224,11 +3316,11 @@ msgstr "" msgid "Receive" msgstr "" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "" @@ -3265,17 +3357,17 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "" @@ -3283,50 +3375,50 @@ msgstr "" msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3367,10 +3459,6 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3471,90 +3559,94 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format +msgid "No matching item for serial {serial}" +msgstr "" + +#: order/views.py:1633 +#, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3632,7 +3724,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "" @@ -3708,7 +3800,7 @@ msgstr "" msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "" @@ -3728,7 +3820,7 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3739,365 +3831,360 @@ msgstr "" msgid "Part Categories" msgstr "" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4112,8 +4199,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "" @@ -4160,7 +4247,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4177,7 +4264,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4258,7 +4345,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "" @@ -4318,7 +4405,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "" @@ -4373,14 +4460,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" @@ -4408,7 +4489,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "" @@ -4488,6 +4569,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4501,127 +4612,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4630,19 +4755,6 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" @@ -4660,7 +4772,7 @@ msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4740,14 +4852,10 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" @@ -4816,7 +4924,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "" @@ -4853,7 +4961,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4922,227 +5030,239 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" @@ -5174,7 +5294,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5197,7 +5317,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" @@ -5483,12 +5603,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5618,7 +5738,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "" @@ -5630,25 +5750,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5945,7 +6069,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -6011,7 +6135,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6043,14 +6167,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6119,11 +6235,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "" @@ -6168,12 +6284,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "" @@ -6221,11 +6337,11 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "" @@ -6341,47 +6457,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6442,7 +6562,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6506,7 +6626,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6542,7 +6662,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6562,37 +6682,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6612,17 +6740,29 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" @@ -6710,76 +6850,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6795,6 +6935,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6823,39 +6967,39 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6953,155 +7097,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7267,56 +7411,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7560,35 +7704,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/tr/LC_MESSAGES/django.po b/InvenTree/locale/tr/LC_MESSAGES/django.po index e30c1ed591..20d48e6e5b 100644 --- a/InvenTree/locale/tr/LC_MESSAGES/django.po +++ b/InvenTree/locale/tr/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:41\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-24 21:40\n" "Last-Translator: \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -19,11 +19,11 @@ msgstr "" #: InvenTree/api.py:64 msgid "API endpoint not found" -msgstr "API uçnoktası bulunmadı" +msgstr "API uç noktası bulunamadı" #: InvenTree/api.py:110 msgid "No action specified" -msgstr "Hiçbir eylem belirtilmedi" +msgstr "İşlem belirtilmedi" #: InvenTree/api.py:124 msgid "No matching action found" @@ -77,7 +77,7 @@ msgstr "Kategori Seçin" msgid "Duplicate serial: {n}" msgstr "Tekrarlanan seri {n}" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "Geçersiz veri sağlandı" @@ -104,7 +104,7 @@ msgstr "Seri numarası bulunamadı" #: InvenTree/helpers.py:457 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" -msgstr "Benzersiz serinin numaraları ({s}) miktarla eşleşmeli ({q})" +msgstr "Benzersiz seri numaralarının sayısı ({s}) girilen miktarla eşleşmeli ({q})" #: InvenTree/models.py:59 stock/models.py:1763 msgid "Attachment" @@ -120,56 +120,57 @@ msgstr "Yorum" #: InvenTree/models.py:62 msgid "File comment" -msgstr "Yorum" +msgstr "Dosya yorumu" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "Kullanıcı" #: InvenTree/models.py:72 msgid "upload date" -msgstr "Yükleme tarihi" +msgstr "yükleme tarihi" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "Adı" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "Açıklama" #: InvenTree/models.py:115 msgid "Description (optional)" -msgstr "Açıklama(opsiyonel)" +msgstr "Açıklama (isteğe bağlı)" #: InvenTree/models.py:123 msgid "parent" -msgstr "ebeveyn" +msgstr "üst" #: InvenTree/settings.py:503 msgid "English" @@ -191,15 +192,15 @@ msgstr "Polonyaca" msgid "Turkish" msgstr "Türkçe" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "Arka plan çalışanı kontrolü başarısız oldu" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "E-posta arka ucu yapılandırılmadı" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "InvenTree sistem sağlık kontrolü başarısız" @@ -258,79 +259,79 @@ msgstr "Reddedildi" #: InvenTree/status_codes.py:272 msgid "Legacy stock tracking entry" -msgstr "" +msgstr "Eski stok izleme girişi" #: InvenTree/status_codes.py:274 msgid "Stock item created" -msgstr "" +msgstr "Stok kalemi oluşturuldu" #: InvenTree/status_codes.py:276 msgid "Edited stock item" -msgstr "" +msgstr "Düzenlenen stok kalemi" #: InvenTree/status_codes.py:277 msgid "Assigned serial number" -msgstr "" +msgstr "Atanan seri numarası" #: InvenTree/status_codes.py:279 msgid "Stock counted" -msgstr "" +msgstr "Stok sayıldı" #: InvenTree/status_codes.py:280 msgid "Stock manually added" -msgstr "" +msgstr "Stok manuel olarak eklendi" #: InvenTree/status_codes.py:281 msgid "Stock manually removed" -msgstr "" +msgstr "Stok manuel olarak çıkarıldı" #: InvenTree/status_codes.py:283 msgid "Location changed" -msgstr "" +msgstr "Konum değişti" #: InvenTree/status_codes.py:285 msgid "Installed into assembly" -msgstr "" +msgstr "Montajda kullanıldı" #: InvenTree/status_codes.py:286 msgid "Removed from assembly" -msgstr "" +msgstr "Montajdan çıkarıldı" #: InvenTree/status_codes.py:288 msgid "Installed component item" -msgstr "" +msgstr "Bileşen ögesinde kullanıldı" #: InvenTree/status_codes.py:289 msgid "Removed component item" -msgstr "" +msgstr "Bileşen ögesinden çıkarıldı" #: InvenTree/status_codes.py:291 msgid "Split from parent item" -msgstr "" +msgstr "Üst ögeden ayır" #: InvenTree/status_codes.py:292 msgid "Split child item" -msgstr "" +msgstr "Alt ögeyi ayır" #: InvenTree/status_codes.py:294 templates/js/table_filters.js:181 msgid "Sent to customer" -msgstr "" +msgstr "Müşteriye gönderildi" #: InvenTree/status_codes.py:295 msgid "Returned from customer" -msgstr "" +msgstr "Müşteriden geri döndü" #: InvenTree/status_codes.py:297 msgid "Build order output created" -msgstr "" +msgstr "Yapım emri çıktısı oluşturuldu" #: InvenTree/status_codes.py:298 msgid "Build order output completed" -msgstr "" +msgstr "Yapım emri çıktısı tamamlandı" #: InvenTree/status_codes.py:300 msgid "Received against purchase order" -msgstr "" +msgstr "Satın alma emri karşılığında alındı" #: InvenTree/status_codes.py:315 msgid "Production" @@ -338,11 +339,11 @@ msgstr "Üretim" #: InvenTree/validators.py:22 msgid "Not a valid currency code" -msgstr "Geçerli para birimi yok" +msgstr "Geçerli bir para birimi kodu değil" #: InvenTree/validators.py:50 msgid "Invalid character in part name" -msgstr "Parça adında geçersiniz karakter bulunuyor" +msgstr "Parça adında geçersiz karakter" #: InvenTree/validators.py:63 #, python-brace-format @@ -353,131 +354,130 @@ msgstr "IPN regex kalıbıyla eşleşmelidir {pat}" #: InvenTree/validators.py:105 #, python-brace-format msgid "Reference must match pattern {pattern}" -msgstr "" +msgstr "Referans {pattern} deseniyle mutlaka eşleşmeli" #: InvenTree/validators.py:113 #, python-brace-format msgid "Illegal character in name ({x})" -msgstr "" +msgstr "({x}) adında geçersiz karakter" #: InvenTree/validators.py:132 InvenTree/validators.py:148 msgid "Overage value must not be negative" -msgstr "" +msgstr "Fazlalık değeri negatif olmamalıdır" #: InvenTree/validators.py:150 msgid "Overage must not exceed 100%" -msgstr "" +msgstr "Fazlalık %100'ü geçmemelidir" #: InvenTree/validators.py:157 msgid "Overage must be an integer value or a percentage" -msgstr "" +msgstr "Fazlalık bir tamsayı veya yüzde olmalıdır" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" -msgstr "" +msgstr "Ögeyi Sil" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" -msgstr "" +msgstr "Öge silme işlemini onaylamak için kutuyu işaretleyin" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" -msgstr "" +msgstr "Kullanıcı Bilgisini Düzenle" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" -msgstr "" +msgstr "Şifre Belirle" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" -msgstr "" +msgstr "Parola alanları eşleşmelidir" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" -msgstr "" +msgstr "Sistem Bilgisi" #: barcodes/api.py:53 barcodes/api.py:150 msgid "Must provide barcode_data parameter" -msgstr "" +msgstr "Barcode_data parametresini sağlamalıdır" #: barcodes/api.py:126 msgid "No match found for barcode data" -msgstr "" +msgstr "Barkod verisi için eşleşme bulunamadı" #: barcodes/api.py:128 msgid "Match found for barcode data" -msgstr "" +msgstr "Barkod verisi için eşleşme bulundu" #: barcodes/api.py:153 msgid "Must provide stockitem parameter" -msgstr "" +msgstr "Stok kalemi parametresi sağlamalıdır" #: barcodes/api.py:160 msgid "No matching stock item found" -msgstr "" +msgstr "Eşleşen stok kalemi bulunamadı" #: barcodes/api.py:190 msgid "Barcode already matches StockItem object" -msgstr "" +msgstr "Barkod başka bir stok kalemi nesnesi ile eşleşmektedir" #: barcodes/api.py:194 msgid "Barcode already matches StockLocation object" -msgstr "" +msgstr "Barkod başka bir stok konumu nesnesi ile eşleşmektedir" #: barcodes/api.py:198 msgid "Barcode already matches Part object" -msgstr "" +msgstr "Barkod başka bir parça nesnesi ile eşleşmektedir" #: barcodes/api.py:204 barcodes/api.py:216 msgid "Barcode hash already matches StockItem object" -msgstr "" +msgstr "Barkod karması (hash) zaten stok kalemi nesnesiyle eşleşiyor" #: barcodes/api.py:222 msgid "Barcode associated with StockItem" -msgstr "" +msgstr "Barkod başka bir stok kalemiyle ilişkili" #: build/forms.py:37 msgid "Build Order reference" -msgstr "" +msgstr "Yapım İşi Emri referansı" #: build/forms.py:38 msgid "Order target date" -msgstr "" +msgstr "Emir hedef tarihi" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" -msgstr "" +msgstr "Hedeflenen tarih" #: build/forms.py:43 build/models.py:225 msgid "Target date for build completion. Build will be overdue after this date." -msgstr "" +msgstr "Yapım işinin tamamlanması için hedef tarih. Bu tarihten sonra yapım işi gecikmiş olacak." #: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,266 +486,267 @@ msgstr "" #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" -msgstr "" +msgstr "Miktar" #: build/forms.py:49 msgid "Number of items to build" -msgstr "" +msgstr "Yapılacak öge sayısı" #: build/forms.py:91 msgid "Enter quantity for build output" -msgstr "" +msgstr "Yapım işi çıktısı için miktarını girin" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" -msgstr "" +msgstr "Seri Numaraları" #: build/forms.py:97 msgid "Enter serial numbers for build outputs" -msgstr "" +msgstr "Yapım işi çıktısı için seri numaraları girin" #: build/forms.py:103 msgid "Confirm creation of build output" -msgstr "" +msgstr "Yapım işi çıktısının oluşturulmasını onaylayın" #: build/forms.py:124 msgid "Confirm deletion of build output" -msgstr "" +msgstr "Yapım işi çıktısının silinmesini onaylayın" #: build/forms.py:145 msgid "Confirm unallocation of stock" -msgstr "" +msgstr "Stok tahsisinin iptalini onayla" #: build/forms.py:169 msgid "Confirm stock allocation" -msgstr "" +msgstr "Stok tahsisini onayla" #: build/forms.py:186 msgid "Mark build as complete" -msgstr "" +msgstr "Yapım işini tamamlandı olarak işaretle" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" -msgstr "" +msgstr "Konum" #: build/forms.py:211 msgid "Location of completed parts" -msgstr "" +msgstr "Tamamlanmış parçaların konumu" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" -msgstr "" +msgstr "Durum" #: build/forms.py:216 msgid "Build output stock status" -msgstr "" +msgstr "Yapım işi çıktısı stok durumu" #: build/forms.py:223 msgid "Confirm incomplete" -msgstr "" +msgstr "Eksik olarak onayla" #: build/forms.py:224 msgid "Confirm completion with incomplete stock allocation" -msgstr "" +msgstr "Eksik parça tahsisi ile tamamlamayı onayla" #: build/forms.py:227 msgid "Confirm build completion" -msgstr "" +msgstr "Yapım işinin tamamlandığını onaylayın" #: build/forms.py:252 msgid "Confirm cancel" -msgstr "" +msgstr "İptali Onayla" #: build/forms.py:252 build/views.py:66 msgid "Confirm build cancellation" -msgstr "" +msgstr "Yapım işi iptalini onayla" #: build/forms.py:266 msgid "Select quantity of stock to allocate" -msgstr "" +msgstr "Tahsis edilecek stok miktarını seçiniz" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" -msgstr "" +msgstr "Yapım İşi Emri" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" -msgstr "" +msgstr "Yapım İşi Emirleri" #: build/models.py:127 msgid "Build Order Reference" -msgstr "" +msgstr "Yapım İşi Emri Referansı" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" -msgstr "" +msgstr "Referans" #: build/models.py:138 msgid "Brief description of the build" -msgstr "" +msgstr "Yapım işinin kısa açıklaması" #: build/models.py:147 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" -msgstr "" +msgstr "Üst Yapım İşi" #: build/models.py:148 msgid "BuildOrder to which this build is allocated" -msgstr "" +msgstr "Bu yapım işinin tahsis edildiği yapım işi emri" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" -msgstr "" +msgstr "Parça" #: build/models.py:161 msgid "Select part to build" -msgstr "" +msgstr "Yapım işi için parça seçin" #: build/models.py:166 msgid "Sales Order Reference" -msgstr "" +msgstr "Satış Emri Referansı" #: build/models.py:170 msgid "SalesOrder to which this build is allocated" -msgstr "" +msgstr "Bu yapım işinin tahsis edildiği satış emri" #: build/models.py:175 msgid "Source Location" -msgstr "" +msgstr "Kaynak Konum" #: build/models.py:179 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" -msgstr "" +msgstr "Bu yapım işi için stok alınacak konumu seçin (her hangi bir stok konumundan alınması için boş bırakın)" #: build/models.py:184 msgid "Destination Location" -msgstr "" +msgstr "Hedef Konum" #: build/models.py:188 msgid "Select location where the completed items will be stored" -msgstr "" +msgstr "Tamamlanmış ögelerin saklanacağı konumu seçiniz" #: build/models.py:192 msgid "Build Quantity" -msgstr "" +msgstr "Yapım İşi Miktarı" #: build/models.py:195 msgid "Number of stock items to build" -msgstr "" +msgstr "Yapım işi stok kalemlerinin sayısı" #: build/models.py:199 msgid "Completed items" -msgstr "" +msgstr "Tamamlanmış ögeler" #: build/models.py:201 msgid "Number of stock items which have been completed" -msgstr "" +msgstr "Tamamlanan stok kalemlerinin sayısı" #: build/models.py:205 part/templates/part/part_base.html:167 msgid "Build Status" -msgstr "" +msgstr "Yapım İşi Durumu" #: build/models.py:209 msgid "Build status code" -msgstr "" +msgstr "Yapım işi durum kodu" #: build/models.py:213 stock/models.py:466 msgid "Batch Code" -msgstr "" +msgstr "Sıra numarası" #: build/models.py:217 msgid "Batch code for this build output" -msgstr "" +msgstr "Yapım işi çıktısı için sıra numarası" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" -msgstr "" +msgstr "Oluşturulma tarihi" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" -msgstr "" +msgstr "Hedef tamamlama tarihi" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" -msgstr "" +msgstr "Tamamlama tarihi" #: build/models.py:234 msgid "completed by" -msgstr "" +msgstr "tamamlayan" #: build/models.py:242 msgid "Issued by" -msgstr "" +msgstr "Veren" #: build/models.py:243 msgid "User who issued this build order" -msgstr "" +msgstr "Bu yapım işi emrini veren kullanıcı" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" -msgstr "" +msgstr "Sorumlu" #: build/models.py:252 msgid "User responsible for this build order" -msgstr "" +msgstr "Bu yapım işi emrinden sorumlu kullanıcı" #: build/models.py:257 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 @@ -755,161 +756,159 @@ msgstr "" #: part/templates/part/detail.html:83 part/templates/part/part_base.html:94 #: stock/models.py:460 stock/templates/stock/item_base.html:345 msgid "External Link" -msgstr "" +msgstr "Harici Bağlantı" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" -msgstr "" +msgstr "Harici URL'ye bağlantı" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" -msgstr "" +msgstr "Notlar" #: build/models.py:263 msgid "Extra build notes" -msgstr "" +msgstr "Yapım işi için ekstra notlar" #: build/models.py:740 msgid "No build output specified" -msgstr "" +msgstr "Yapım işi çıktısı belirtilmedi" #: build/models.py:743 msgid "Build output is already completed" -msgstr "" +msgstr "Yapım işi çıktısı zaten tamamlanmış" #: build/models.py:746 msgid "Build output does not match Build Order" -msgstr "" +msgstr "Yapım işi çıktısı, yapım işi emri ile eşleşmiyor" #: build/models.py:1152 msgid "BuildItem must be unique for build, stock_item and install_into" -msgstr "" +msgstr "Yapım işi ögesi; yapım işi, stok kalemi ve kurulacak yer için benzersiz olmalıdır" #: build/models.py:1177 msgid "Build item must specify a build output, as master part is marked as trackable" -msgstr "" +msgstr "Ana parça izlenebilir olarak işaretlendiğinden, yapım işi çıktısı için bir yapım işi ögesi belirtmelidir" #: build/models.py:1181 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" -msgstr "" +msgstr "Tahsis edilecek miktar ({n}) mevcut miktarı ({q}) geçmemeli" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" -msgstr "" +msgstr "Stok kalemi fazladan tahsis edilmiş" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" -msgstr "" +msgstr "Tahsis edilen miktar sıfırdan büyük olmalıdır" #: build/models.py:1196 msgid "Quantity must be 1 for serialized stock" -msgstr "" +msgstr "Seri numaralı stok için miktar bir olmalı" #: build/models.py:1256 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" -msgstr "" +msgstr "{p} parçasının malzeme listesindeki seçili stok kalemi bulunamadı" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" -msgstr "" +msgstr "Yapım İşi" #: build/models.py:1317 msgid "Build to allocate parts" -msgstr "" +msgstr "Yapım işi için tahsis edilen parçalar" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" -msgstr "" +msgstr "Stok Kalemi" #: build/models.py:1334 msgid "Source stock item" -msgstr "" +msgstr "Kaynak stok kalemi" #: build/models.py:1347 msgid "Stock quantity to allocate to build" -msgstr "" +msgstr "Yapım işi için tahsis edilen stok miktarı" #: build/models.py:1355 msgid "Install into" -msgstr "" +msgstr "Kurulduğu yer" #: build/models.py:1356 msgid "Destination stock item" -msgstr "" +msgstr "Hedef stok kalemi" #: build/templates/build/allocate.html:7 msgid "Allocate Parts" -msgstr "" +msgstr "Parçaları Tahsis Et" #: build/templates/build/allocate.html:15 msgid "Allocate Stock to Build" -msgstr "" +msgstr "Yapım İşi için Stok Tahsis Et" #: build/templates/build/allocate.html:22 msgid "Allocate stock to build" -msgstr "" +msgstr "Yapım işi için stok tahsis et" #: build/templates/build/allocate.html:23 msgid "Auto Allocate" -msgstr "" +msgstr "Otomatik Tahsis Et" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" -msgstr "" +msgstr "Stok tahsisini kaldır" #: build/templates/build/allocate.html:26 build/views.py:319 build/views.py:805 msgid "Unallocate Stock" -msgstr "" +msgstr "Stok Tahsisini Kaldır" #: build/templates/build/allocate.html:29 msgid "Order required parts" -msgstr "" +msgstr "Gerekli parçaları sipariş edin" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 order/views.py:986 #: part/templates/part/category.html:127 msgid "Order Parts" -msgstr "" +msgstr "Parça Siparişi" #: build/templates/build/allocate.html:36 msgid "Untracked stock has been fully allocated for this Build Order" -msgstr "" +msgstr "Takip edilmeyen stok yapım işi emri için tamamen tahsis edildi" #: build/templates/build/allocate.html:40 msgid "Untracked stock has not been fully allocated for this Build Order" -msgstr "" +msgstr "Takip edilmeyen stok yapım işi emri için tamamen tahsis edilemedi" #: build/templates/build/allocate.html:47 msgid "This Build Order does not have any associated untracked BOM items" -msgstr "" +msgstr "Bu yapım işi emri, herhangi bir takip edilmeyen malzeme listesi öğesine sahip değil" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 @@ -917,60 +916,60 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" -msgstr "" +msgstr "Seri Numara" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" -msgstr "" +msgstr "Ekler" #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" -msgstr "" +msgstr "Stoku Otomatik Olarak Tahsis Et" #: build/templates/build/auto_allocate.html:10 msgid "The following stock items will be allocated to the specified build output" -msgstr "" +msgstr "Aşağıdaki stok kalemleri, belirtilen yapım işi çıktısı için tahsis edilecek" #: build/templates/build/auto_allocate.html:37 msgid "No stock items found that can be automatically allocated to this build" -msgstr "" +msgstr "Bu yapım işi için otomatik tahsis edilecek stok kalemleri bulunamadı" #: build/templates/build/auto_allocate.html:39 msgid "Stock items will have to be manually allocated" -msgstr "" +msgstr "Stok kalemleri manuel olarak tahsis edilecek" #: build/templates/build/build_base.html:18 #, python-format msgid "This Build Order is allocated to Sales Order %(link)s" -msgstr "" +msgstr "Bu yapım işi emri, %(link)s sipariş emrine tahsis edilmiştir" #: build/templates/build/build_base.html:25 #, python-format msgid "This Build Order is a child of Build Order %(link)s" -msgstr "" +msgstr "Bu yapım işi emri, %(link)s yapım iş emrinin altıdır" #: build/templates/build/build_base.html:32 msgid "Build Order is ready to mark as completed" -msgstr "" +msgstr "Yapım işi tamamlandı olarak işaretlenmeye hazır" #: build/templates/build/build_base.html:37 msgid "Build Order cannot be completed as outstanding outputs remain" -msgstr "" +msgstr "Bekleyen çıktılar kaldığı için yapım işi emri tamamlanamıyor" #: build/templates/build/build_base.html:42 msgid "Required build quantity has not yet been completed" -msgstr "" +msgstr "Gerekli yapım işi miktarı henüz tamamlanmadı" #: build/templates/build/build_base.html:47 msgid "Stock has not been fully allocated to this Build Order" -msgstr "" +msgstr "Stok, yapım işi emri için tamamen tahsis edilemedi" #: build/templates/build/build_base.html:75 #: company/templates/company/company_base.html:40 @@ -982,7 +981,7 @@ msgstr "" #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" -msgstr "" +msgstr "Yönetici görünümü" #: build/templates/build/build_base.html:81 #: build/templates/build/build_base.html:150 @@ -993,115 +992,114 @@ msgstr "" #: templates/js/table_filters.js:245 templates/js/table_filters.js:264 #: templates/js/table_filters.js:281 msgid "Overdue" -msgstr "" +msgstr "Vadesi geçmiş" #: build/templates/build/build_base.html:90 msgid "Print actions" -msgstr "" +msgstr "Yazdırma işlemleri" #: build/templates/build/build_base.html:94 msgid "Print Build Order" -msgstr "" +msgstr "Yapım İşi Emrini Yazdır" #: build/templates/build/build_base.html:100 #: build/templates/build/build_base.html:225 msgid "Complete Build" -msgstr "" +msgstr "Tamamlanmış Yapım İşi" #: build/templates/build/build_base.html:105 msgid "Build actions" -msgstr "" +msgstr "Yapım İşi işlemleri" #: build/templates/build/build_base.html:109 msgid "Edit Build" -msgstr "" +msgstr "Yapım İşini Düzenle" #: build/templates/build/build_base.html:111 #: build/templates/build/build_base.html:209 build/views.py:57 msgid "Cancel Build" -msgstr "" +msgstr "Yapım İşini İptal Et" #: build/templates/build/build_base.html:124 #: build/templates/build/detail.html:11 msgid "Build Details" -msgstr "" +msgstr "Yapım İşi Detayları" #: build/templates/build/build_base.html:150 #, python-format msgid "This build was due on %(target)s" -msgstr "" +msgstr "Bu yapım işinin %(target)s tarihinde süresi doluyor" #: build/templates/build/build_base.html:157 #: build/templates/build/detail.html:64 msgid "Progress" -msgstr "" +msgstr "İlerleme" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 msgid "Sales Order" -msgstr "" +msgstr "Sipariş Emri" #: build/templates/build/build_base.html:177 #: build/templates/build/detail.html:98 #: report/templates/report/inventree_build_order_base.html:153 msgid "Issued By" -msgstr "" +msgstr "Veren" #: build/templates/build/build_base.html:217 msgid "Incomplete Outputs" -msgstr "" +msgstr "Tamamlanmamış Çıktılar" #: build/templates/build/build_base.html:218 msgid "Build Order cannot be completed as incomplete build outputs remain" -msgstr "" +msgstr "Tamamlanmamış yapım işi çıktıları kaldığı için yapım işi emri tamamlanamıyor" #: build/templates/build/build_children.html:10 #: build/templates/build/navbar.html:36 msgid "Child Build Orders" -msgstr "" +msgstr "Alt Yapım İşi Emrileri" #: build/templates/build/build_output.html:15 msgid "Incomplete Build Outputs" -msgstr "" +msgstr "Tamamlanmamış Yapım İşi Çıktıları" #: build/templates/build/build_output.html:22 msgid "Create new build output" -msgstr "" +msgstr "Yeni yapım işi çıktısı oluştur" #: build/templates/build/build_output.html:23 msgid "Create New Output" -msgstr "" +msgstr "Yeni Çıktı Oluştur" #: build/templates/build/build_output.html:36 msgid "Create a new build output" -msgstr "" +msgstr "Yeni bir yapım işi çıktısı oluştur" #: build/templates/build/build_output.html:37 msgid "No incomplete build outputs remain." -msgstr "" +msgstr "Tamamlanmamış yapım işi çıktısı kalmadı." #: build/templates/build/build_output.html:38 msgid "Create a new build output using the button above" -msgstr "" +msgstr "Yukarıdaki düğmeyi kullanarak yeni bir yapım işi çıktısı oluştur" #: build/templates/build/build_output.html:49 msgid "Completed Build Outputs" -msgstr "" +msgstr "Tamamlanmış Yapım İşi Çıktıları" #: build/templates/build/build_output_create.html:7 msgid "The Bill of Materials contains trackable parts" -msgstr "" +msgstr "Bu Malzeme Listesi takip edilebilir parçalar içeriyor" #: build/templates/build/build_output_create.html:8 msgid "Build outputs must be generated individually." -msgstr "" +msgstr "Yapım işi çıktıları ayrı ayrı oluşturulmalıdır." #: build/templates/build/build_output_create.html:9 msgid "Multiple build outputs will be created based on the quantity specified." @@ -1109,11 +1107,11 @@ msgstr "" #: build/templates/build/build_output_create.html:15 msgid "Trackable parts can have serial numbers specified" -msgstr "" +msgstr "Takip edilebilir parçaların seri numaraları belirtilmiş olmalı" #: build/templates/build/build_output_create.html:16 msgid "Enter serial numbers to generate multiple single build outputs" -msgstr "" +msgstr "Birden çok tek yapım işi çıktısı oluşturmak için seri numaraları girin" #: build/templates/build/cancel.html:5 msgid "Are you sure you wish to cancel this build?" @@ -1121,312 +1119,315 @@ msgstr "" #: build/templates/build/complete.html:8 msgid "Build Order is complete" -msgstr "" +msgstr "Yapım işi emri tamamlandı" #: build/templates/build/complete.html:12 msgid "Build Order is incomplete" -msgstr "" +msgstr "Yapım işi emri eksik" #: build/templates/build/complete.html:15 msgid "Incompleted build outputs remain" -msgstr "" +msgstr "Eksik yapım işi çıktıları kaldı" #: build/templates/build/complete.html:18 msgid "Required build quantity has not been completed" -msgstr "" +msgstr "Gerekli yapım işi miktarı tamamlanmadı" #: build/templates/build/complete.html:21 msgid "Required stock has not been fully allocated" -msgstr "" +msgstr "Gerekli stok tamamen tahsis edilemedi" #: build/templates/build/complete_output.html:10 msgid "Stock allocation is complete for this output" -msgstr "" +msgstr "Bu çıktı için stok tahsisi tamamlandı" #: build/templates/build/complete_output.html:14 msgid "Stock allocation is incomplete" -msgstr "" +msgstr "Stok tahsisi tamamlanmamış" #: build/templates/build/complete_output.html:20 msgid "tracked parts have not been fully allocated" -msgstr "" +msgstr "takip edilebilir parçalar tamamen tahsis edilemedi" #: build/templates/build/complete_output.html:41 msgid "The following items will be created" -msgstr "" +msgstr "Aşağıdaki ögeler oluşturulacak" #: build/templates/build/create_build_item.html:7 msgid "Select a stock item to allocate to the selected build output" -msgstr "" +msgstr "Seçili yapım işi emri için tahsis edilecek bir stok kalemi seçiniz" #: build/templates/build/create_build_item.html:11 #, python-format msgid "The allocated stock will be installed into the following build output:
        %(output)s" -msgstr "" +msgstr "Tahsis edilen stok bu yapım işi çıktısının kurulmasında kullanılacak:
        %(output)s" #: build/templates/build/create_build_item.html:17 #, python-format msgid "No stock available for %(part)s" -msgstr "" +msgstr "%(part)s için mevcut stok yok" #: build/templates/build/delete_build_item.html:8 msgid "Are you sure you want to unallocate this stock?" -msgstr "" +msgstr "Bu stokun tahsisinin iptal etmek istediğinizden emin misiniz?" #: build/templates/build/delete_build_item.html:11 msgid "The selected stock will be unallocated from the build output" -msgstr "" +msgstr "Bu yapım işi için seçili stok tahsisi iptal edilecek" #: build/templates/build/detail.html:35 msgid "Stock Source" -msgstr "" +msgstr "Stok Kaynağı" #: build/templates/build/detail.html:40 msgid "Stock can be taken from any available location." -msgstr "" +msgstr "Stok herhangi bir konumdan alınabilir." -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" -msgstr "" +msgstr "Hedef" #: build/templates/build/detail.html:53 msgid "Destination location not specified" -msgstr "" +msgstr "Hedef konumu belirtilmedi" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" -msgstr "" +msgstr "Toplu" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" -msgstr "" +msgstr "Oluşturuldu" #: build/templates/build/detail.html:127 msgid "No target date set" -msgstr "" +msgstr "Hedef tarih ayarlanmadı" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" -msgstr "" +msgstr "Tamamlandı" #: build/templates/build/detail.html:136 msgid "Build not complete" -msgstr "" +msgstr "Yapım İşi tamamlanmadı" #: build/templates/build/edit_build_item.html:7 msgid "Alter the quantity of stock allocated to the build output" -msgstr "" +msgstr "Yapım işi çıktısına tahsis edilen stok miktarını değiştir" #: build/templates/build/index.html:28 build/views.py:678 msgid "New Build Order" -msgstr "" +msgstr "Yeni Yapım İşi Emri" #: build/templates/build/index.html:37 build/templates/build/index.html:38 msgid "Print Build Orders" -msgstr "" +msgstr "Yapım İşi Emirlerini Yazdır" #: build/templates/build/index.html:43 #: order/templates/order/purchase_orders.html:27 #: order/templates/order/sales_orders.html:27 msgid "Display calendar view" -msgstr "" +msgstr "Takvim görünümünü görüntüle" #: build/templates/build/index.html:46 #: order/templates/order/purchase_orders.html:30 #: order/templates/order/sales_orders.html:30 msgid "Display list view" -msgstr "" +msgstr "Liste görünümünü görüntüle" #: build/templates/build/navbar.html:12 msgid "Build Order Details" -msgstr "" +msgstr "Yapım İşi Emri Detayları" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" -msgstr "" +msgstr "Detaylar" #: build/templates/build/navbar.html:21 build/templates/build/navbar.html:24 #: build/views.py:91 msgid "Allocate Stock" -msgstr "" +msgstr "Stok Tahsis Et" #: build/templates/build/navbar.html:29 build/templates/build/navbar.html:32 msgid "Build Outputs" -msgstr "" +msgstr "Yapım İşi Çıktıları" #: build/templates/build/navbar.html:39 msgid "Child Builds" -msgstr "" +msgstr "Alt Yapım İşleri" #: build/templates/build/navbar.html:50 msgid "Build Order Notes" -msgstr "" +msgstr "Yapım İşi Emri Notları" #: build/templates/build/notes.html:12 msgid "Build Notes" -msgstr "" +msgstr "Yapım İşi Notları" #: build/templates/build/notes.html:14 company/templates/company/notes.html:13 #: order/templates/order/order_notes.html:15 #: order/templates/order/sales_order_notes.html:16 #: part/templates/part/notes.html:14 stock/templates/stock/item_notes.html:15 msgid "Edit notes" -msgstr "" +msgstr "Notları Düzenle" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" -msgstr "" +msgstr "Kaydet" #: build/templates/build/unallocate.html:10 msgid "Are you sure you wish to unallocate all stock for this build?" -msgstr "" +msgstr "Bu yapım işi için tahsis edilen tüm stokları kaldırmak istediğinizden emin misiniz?" #: build/templates/build/unallocate.html:12 msgid "All incomplete stock allocations will be removed from the build" -msgstr "" +msgstr "Tüm eksik stok tahsisleri yapım işinden kaldırılacak" #: build/views.py:77 msgid "Build was cancelled" -msgstr "" +msgstr "Yapım işi iptal edildi" #: build/views.py:138 msgid "Allocated stock to build output" -msgstr "" +msgstr "Yapım işi çıktısına stok tahsis edildi" #: build/views.py:150 msgid "Create Build Output" -msgstr "" +msgstr "Yapım İşi Çıktısı Oluştur" #: build/views.py:168 msgid "Maximum output quantity is " -msgstr "" +msgstr "Maksimum çıktı miktarı " #: build/views.py:184 stock/views.py:1821 msgid "Serial numbers already exist" -msgstr "" +msgstr "Seri numaraları zaten mevcut" #: build/views.py:193 msgid "Serial numbers required for trackable build output" -msgstr "" +msgstr "Seri numaraları takip edilebilir yapım işi çıktıları için gerekli" #: build/views.py:259 msgid "Delete Build Output" -msgstr "" +msgstr "Yapım İşi Çıktısı Sil" #: build/views.py:280 build/views.py:370 msgid "Confirm unallocation of build stock" -msgstr "" +msgstr "Yapım işi stoku tahsisinin iptalini onayla" #: build/views.py:281 build/views.py:371 stock/views.py:425 msgid "Check the confirmation box" -msgstr "" +msgstr "Onay kutusunu işaretleyin" #: build/views.py:293 msgid "Build output does not match build" -msgstr "" +msgstr "Yapım işi çıktısı yapım işi ile eşleşmiyor" #: build/views.py:295 build/views.py:496 msgid "Build output must be specified" -msgstr "" +msgstr "Yapım işi çıktısı belirtilmeli" #: build/views.py:307 msgid "Build output deleted" -msgstr "" +msgstr "Yapım işi çıktısı silindi" #: build/views.py:405 msgid "Complete Build Order" -msgstr "" +msgstr "Tamamlanmış Yapım İşi Emri" #: build/views.py:411 msgid "Build order cannot be completed - incomplete outputs remain" -msgstr "" +msgstr "Yapım işi emri tamamlanamadı - eksik çıktılar kaldı" #: build/views.py:422 msgid "Completed build order" -msgstr "" +msgstr "Tamamlanmış yapım işi emri" #: build/views.py:438 msgid "Complete Build Output" -msgstr "" +msgstr "Tamamlanmış Yapım İşi Çıktısı" #: build/views.py:480 msgid "Invalid stock status value selected" -msgstr "" +msgstr "Geçersiz stok durum değeri seçildi" #: build/views.py:487 msgid "Quantity to complete cannot exceed build output quantity" -msgstr "" +msgstr "Tamamlanacak miktar yapım işi çıktı miktarını aşamaz" #: build/views.py:493 msgid "Confirm completion of incomplete build" -msgstr "" +msgstr "Eksik yapım işinin tamamlandığını onaylayın" #: build/views.py:592 msgid "Build output completed" -msgstr "" +msgstr "Yapım işi çıktısı tamamlandı" #: build/views.py:732 msgid "Created new build" -msgstr "" +msgstr "Yeni yapım işi oluşturuldu" #: build/views.py:753 msgid "Edit Build Order Details" -msgstr "" +msgstr "Yapım İşi Emri Detaylarını Düzenle" #: build/views.py:786 msgid "Edited build" -msgstr "" +msgstr "Yapım işi düzenlendi" #: build/views.py:795 msgid "Delete Build Order" -msgstr "" +msgstr "Yapım İşi Emrini Sil" #: build/views.py:810 msgid "Removed parts from build allocation" -msgstr "" +msgstr "Yapım işinden tahsis edilen parçalar çıkarıldı" #: build/views.py:822 msgid "Allocate stock to build output" -msgstr "" +msgstr "Yapım işi çıktısına stok tahsis edildi" #: build/views.py:865 msgid "Item must be currently in stock" -msgstr "" +msgstr "Öge stokta bulunmalı" #: build/views.py:871 msgid "Stock item is over-allocated" -msgstr "" +msgstr "Stok kalemi fazladan tahsis edilmiş" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" -msgstr "" +msgstr "Mevcut" #: build/views.py:874 msgid "Stock item must be selected" -msgstr "" +msgstr "Stok kalemi seçilmeli" #: build/views.py:1037 msgid "Edit Stock Allocation" -msgstr "" +msgstr "Stok Tahsisini Düzenle" #: build/views.py:1041 msgid "Updated Build Item" -msgstr "" +msgstr "Yapım İşi Ögesini Güncelle" #: build/views.py:1070 msgid "Add Build Order Attachment" @@ -1435,56 +1436,56 @@ msgstr "" #: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 #: stock/views.py:277 msgid "Added attachment" -msgstr "" +msgstr "Ek eklendi" #: build/views.py:1119 order/views.py:194 order/views.py:215 msgid "Edit Attachment" -msgstr "" +msgstr "Ek Düzenle" #: build/views.py:1129 order/views.py:198 order/views.py:219 msgid "Attachment updated" -msgstr "" +msgstr "Ek güncellendi" #: build/views.py:1139 order/views.py:234 order/views.py:248 msgid "Delete Attachment" -msgstr "" +msgstr "Eki Sil" #: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 msgid "Deleted attachment" -msgstr "" +msgstr "Eki sil" #: common/files.py:64 msgid "Unsupported file format: {ext.upper()}" -msgstr "" +msgstr "Desteklenmeyen dosya formatı: {ext.upper()}" #: common/files.py:69 msgid "Error reading file (invalid format)" -msgstr "" +msgstr "Dosya okurken hata (geçersiz biçim)" #: common/files.py:71 msgid "Error reading file (incorrect dimension)" -msgstr "" +msgstr "Dosya okurken hata (hatalı ölçüler)" #: common/files.py:73 msgid "Error reading file (data could be corrupted)" -msgstr "" +msgstr "Dosya okurken hata (veri bozulmuş olabilir)" #: common/forms.py:39 templates/attachment_table.html:15 msgid "File" -msgstr "" +msgstr "Dosya" #: common/forms.py:40 msgid "Select file to upload" -msgstr "" +msgstr "Yüklenecek dosyayı seç" #: common/forms.py:55 msgid "{name.title()} File" -msgstr "" +msgstr "{name.title()} Dosya" #: common/forms.py:56 #, python-brace-format msgid "Select {name} file to upload" -msgstr "" +msgstr "{name} dosyasını yüklemek için seçin" #: common/models.py:59 msgid "InvenTree Instance Name" @@ -1524,7 +1525,7 @@ msgstr "" #: common/models.py:86 msgid "Allow download of remote images and files from external URL" -msgstr "" +msgstr "Harici URL'den resim ve dosyaların indirilmesine izin ver" #: common/models.py:92 msgid "Barcode Support" @@ -1536,27 +1537,27 @@ msgstr "" #: common/models.py:99 msgid "IPN Regex" -msgstr "" +msgstr "DPN Regex" #: common/models.py:100 msgid "Regular expression pattern for matching Part IPN" -msgstr "" +msgstr "Parça DPN eşleştirmesi için Düzenli İfade Kalıbı (Regex)" #: common/models.py:104 msgid "Allow Duplicate IPN" -msgstr "" +msgstr "Yinelenen DPN'ye İzin Ver" #: common/models.py:105 msgid "Allow multiple parts to share the same IPN" -msgstr "" +msgstr "Birden çok parçanın aynı DPN'yi paylaşmasına izin ver" #: common/models.py:111 msgid "Allow Editing IPN" -msgstr "" +msgstr "DPN Düzenlemeye İzin Ver" #: common/models.py:112 msgid "Allow changing the IPN value while editing a part" -msgstr "" +msgstr "Parçayı düzenlerken DPN değiştirmeye izin ver" #: common/models.py:118 msgid "Copy Part BOM Data" @@ -1584,11 +1585,11 @@ msgstr "" #: common/models.py:139 msgid "Copy Category Parameter Templates" -msgstr "" +msgstr "Kategori Paremetre Sablonu Kopyala" #: common/models.py:140 msgid "Copy category parameter templates when creating a part" -msgstr "" +msgstr "Parça oluştururken kategori parametre şablonlarını kopyala" #: common/models.py:146 msgid "Recent Part Count" @@ -1598,68 +1599,68 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" -msgstr "" +msgstr "Şablon" #: common/models.py:154 msgid "Parts are templates by default" -msgstr "" +msgstr "Parçaları varsayılan olan şablondur" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" -msgstr "" +msgstr "Montaj" #: common/models.py:161 msgid "Parts can be assembled from other components by default" -msgstr "" +msgstr "Parçalar varsayılan olarak başka bileşenlerden monte edilebilir" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" -msgstr "" +msgstr "Bileşen" #: common/models.py:168 msgid "Parts can be used as sub-components by default" -msgstr "" +msgstr "Parçalar varsayılan olarak alt bileşen olarak kullanılabilir" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" -msgstr "" +msgstr "Satın Alınabilir" #: common/models.py:175 msgid "Parts are purchaseable by default" -msgstr "" +msgstr "Parçalar varsayılan olarak satın alınabilir" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" -msgstr "" +msgstr "Satılabilir" #: common/models.py:182 msgid "Parts are salable by default" -msgstr "" +msgstr "Parçalar varsayılan olarak satılabilir" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" -msgstr "" +msgstr "Takip Edilebilir" #: common/models.py:189 msgid "Parts are trackable by default" -msgstr "" +msgstr "Parçalar varsayılan olarak takip edilebilir" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" -msgstr "" +msgstr "Sanal" #: common/models.py:196 msgid "Parts are virtual by default" -msgstr "" +msgstr "Parçalar varsayılan olarak sanaldır" #: common/models.py:202 msgid "Show Quantity in Forms" @@ -1669,160 +1670,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:209 +msgid "Show Price in Forms" msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 +msgid "Page Size" +msgstr "" + +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" -msgstr "" +msgstr "Stok konumu ve ögeler üzerinde sahiplik kontrolünü etkinleştirin" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "" @@ -1843,9 +1869,11 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" -msgstr "" +msgstr "Dosya Yükle" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 #: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 @@ -1877,29 +1905,29 @@ msgstr "" msgid "Image URL" msgstr "" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "" @@ -1952,11 +1980,11 @@ msgstr "" msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "" @@ -1964,7 +1992,7 @@ msgstr "" msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "" @@ -1992,12 +2020,12 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "" @@ -2008,7 +2036,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "" @@ -2020,89 +2048,114 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" -msgstr "" +msgstr "Atanan Stok" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 @@ -2122,7 +2175,7 @@ msgstr "" #: company/templates/company/company_base.html:46 order/views.py:311 msgid "Create Purchase Order" -msgstr "" +msgstr "Satın Alma Emri Oluştur" #: company/templates/company/company_base.html:51 msgid "Edit company information" @@ -2165,13 +2218,13 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" -msgstr "" +msgstr "Müşteri" #: company/templates/company/detail_manufacturer_part.html:11 #: templates/InvenTree/search.html:149 @@ -2205,17 +2258,17 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:36 #: company/templates/company/detail_supplier_part.html:35 msgid "Delete parts" -msgstr "" +msgstr "Parçaları sil" #: company/templates/company/detail_manufacturer_part.html:36 #: company/templates/company/detail_supplier_part.html:35 msgid "Delete Parts" -msgstr "" +msgstr "Parçaları Sil" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "" @@ -2237,7 +2290,7 @@ msgstr "" #: company/templates/company/detail_stock.html:10 msgid "Supplier Stock" -msgstr "" +msgstr "Tedarikçi Stoku" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 @@ -2248,26 +2301,25 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" -msgstr "" +msgstr "Tedarikçi Parçaları" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" -msgstr "" +msgstr "Yeni tedarikçi parçası oluştur" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" -msgstr "" +msgstr "Yeni Tedarikçi Parçası" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2287,7 +2339,7 @@ msgstr "" #: company/templates/company/supplier_part_orders.html:17 #: part/templates/part/orders.html:17 part/templates/part/part_base.html:58 msgid "Order part" -msgstr "" +msgstr "Parça siparişi" #: company/templates/company/manufacturer_part_base.html:41 msgid "Edit manufacturer part" @@ -2316,11 +2368,12 @@ msgstr "" #: company/templates/company/manufacturer_part_delete.html:36 #, python-format msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" -msgstr "" +msgstr "Bu üretici parçası için tanımlanmış %(count)s tedarikçi bulunmaktadır. Bunu silerseniz, aşağıdaki tedarikçi parçaları da silinecektir:" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2332,16 +2385,16 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" -msgstr "" +msgstr "Stok" #: company/templates/company/manufacturer_part_navbar.html:26 msgid "Manufacturer Part Orders" @@ -2355,16 +2408,30 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/supplier.html:22 msgid "Delete supplier parts" -msgstr "" +msgstr "Tedarikçi parçalarını sil" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" @@ -2379,16 +2446,16 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" -msgstr "" +msgstr "Stok Kalemleri" #: company/templates/company/navbar.html:47 #: company/templates/company/navbar.html:56 @@ -2396,25 +2463,25 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 #: users/models.py:45 msgid "Sales Orders" -msgstr "" +msgstr "Satış Emirleri" #: company/templates/company/navbar.html:50 #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 #: users/models.py:44 msgid "Purchase Orders" -msgstr "" +msgstr "Satın Alma Emirleri" #: company/templates/company/notes.html:11 msgid "Company Notes" @@ -2423,59 +2490,59 @@ msgstr "" #: company/templates/company/purchase_orders.html:18 #: order/templates/order/purchase_orders.html:20 msgid "Create new purchase order" -msgstr "" +msgstr "Yeni satın alma emri oluştur" #: company/templates/company/purchase_orders.html:19 #: order/templates/order/purchase_orders.html:21 msgid "New Purchase Order" -msgstr "" +msgstr "Yeni Satın Alma Emri" #: company/templates/company/sales_orders.html:19 #: order/templates/order/sales_orders.html:20 msgid "Create new sales order" -msgstr "" +msgstr "Yeni satış emri oluştur" #: company/templates/company/sales_orders.html:20 #: order/templates/order/sales_orders.html:21 msgid "New Sales Order" -msgstr "" +msgstr "Yeni Satış Emri" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" -msgstr "" +msgstr "Tedarikçi Parçası" #: company/templates/company/supplier_part_base.html:40 msgid "Edit supplier part" -msgstr "" +msgstr "Tedarikçi parçasını düzenle" #: company/templates/company/supplier_part_base.html:44 msgid "Delete supplier part" -msgstr "" +msgstr "Tedarikçi parçasını sil" #: company/templates/company/supplier_part_base.html:56 #: company/templates/company/supplier_part_detail.html:10 msgid "Supplier Part Details" -msgstr "" +msgstr "Tedarikçi Parçası Detayları" #: company/templates/company/supplier_part_delete.html:5 msgid "Are you sure you want to delete the following Supplier Parts?" -msgstr "" +msgstr "Aşağıdaki Tedarikçi Parçalarını silmek istediğinizden emin misin?" #: company/templates/company/supplier_part_navbar.html:12 #: company/templates/company/supplier_part_stock.html:10 msgid "Supplier Part Stock" -msgstr "" +msgstr "Tedarikçi Parça Stoku" #: company/templates/company/supplier_part_navbar.html:19 #: company/templates/company/supplier_part_orders.html:10 msgid "Supplier Part Orders" -msgstr "" +msgstr "Tedarikçi Parçası Emirleri" #: company/templates/company/supplier_part_navbar.html:26 msgid "Supplier Part Pricing" -msgstr "" +msgstr "Tedarikçi Parçası Fiyatlandırması" #: company/templates/company/supplier_part_navbar.html:29 msgid "Pricing" @@ -2490,8 +2557,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2510,8 +2577,8 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "" @@ -2533,22 +2600,22 @@ msgstr "" msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" -msgstr "" +msgstr "Sağlanan URL geçerli bir resim dosyası değil" #: company/views.py:243 msgid "Update Company Image" @@ -2594,57 +2661,65 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" -msgstr "" +msgstr "Şablon için geçerli bir nesne sağlanmadı" #: label/models.py:103 msgid "Label name" -msgstr "" +msgstr "Etiket adı" #: label/models.py:110 msgid "Label description" -msgstr "" +msgstr "Etiket tanımı" #: label/models.py:117 stock/forms.py:202 msgid "Label" -msgstr "" +msgstr "Etiket" #: label/models.py:118 msgid "Label template file" -msgstr "" +msgstr "Etiket şablon listesi" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "" #: label/models.py:125 msgid "Label template is enabled" -msgstr "" +msgstr "Etiket sablonu etkinleştirildi" #: label/models.py:130 msgid "Width [mm]" @@ -2652,7 +2727,7 @@ msgstr "" #: label/models.py:131 msgid "Label width, specified in mm" -msgstr "" +msgstr "Etiket genişliği mm olarak belirtilmeli" #: label/models.py:137 msgid "Height [mm]" @@ -2660,22 +2735,22 @@ msgstr "" #: label/models.py:138 msgid "Label height, specified in mm" -msgstr "" +msgstr "Etiket yüksekliği mm olarak belirtilmeli" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" -msgstr "" +msgstr "Dosya Adı Deseni" #: label/models.py:145 msgid "Pattern for generating label filenames" -msgstr "" +msgstr "Etiket dosya adları oluşturma için desen" #: label/models.py:244 label/models.py:297 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" @@ -2696,239 +2771,241 @@ msgstr "" msgid "Ship order" msgstr "" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" -msgstr "" +msgstr "Parçaları bu konuma alın" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 -msgid "Enter stock item serial numbers" -msgstr "" - #: order/forms.py:242 +msgid "Enter stock item serial numbers" +msgstr "Stok kalemi seri numaları girin" + +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" -msgstr "" +msgstr "Tahsis miktarı stok miktarını aşamaz" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" -msgstr "" +msgstr "Seri numaralı stok kalemi için miktar bir olmalı" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" -msgstr "" +msgstr "Stok tahsis miktarını girin" #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 @@ -2952,10 +3029,10 @@ msgstr "" #: order/templates/order/order_base.html:64 msgid "Export order to file" -msgstr "" +msgstr "Emiri dosya çıkar" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2977,16 +3054,16 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" -msgstr "" +msgstr "Yeni Konum" #: order/templates/order/order_base.html:181 #: order/templates/order/purchase_order_detail.html:101 #: stock/templates/stock/location.html:42 msgid "Create new stock location" -msgstr "" +msgstr "Yeni stok konumu oluştur" #: order/templates/order/order_cancel.html:8 msgid "Cancelling this order means that the order and line items will no longer be editable." @@ -3015,7 +3092,7 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 msgid "Missing selections for the following required columns" -msgstr "" +msgstr "Aşağıdaki gerekli sütunlar için eksik seçimler" #: order/templates/order/order_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." @@ -3036,7 +3113,7 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 msgid "File Fields" -msgstr "" +msgstr "Dosya Alanları" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 @@ -3066,11 +3143,11 @@ msgstr "" #: order/templates/order/order_wizard/match_parts.html:28 msgid "Select Supplier Part" -msgstr "" +msgstr "Tedarikçi Parçası Seçin" #: order/templates/order/order_wizard/po_upload.html:11 msgid "Upload File for Purchase Order" -msgstr "" +msgstr "Sipariş Emri için Dosya Yükle" #: order/templates/order/order_wizard/po_upload.html:18 #, python-format @@ -3081,28 +3158,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" -msgstr "" +msgstr "Adım 1/2 - Parça Tedarikçileri Seçin" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "" @@ -3135,15 +3216,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "" @@ -3153,8 +3239,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3162,25 +3248,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3201,11 +3293,11 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" -msgstr "" +msgstr "Parçalar" #: order/templates/order/receive_parts.html:15 msgid "Select parts to receive against this order" @@ -3216,7 +3308,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3224,11 +3316,11 @@ msgstr "" msgid "Receive" msgstr "" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "" @@ -3254,7 +3346,7 @@ msgstr "" #: part/templates/part/bom_duplicate.html:12 #: stock/templates/stock/stockitem_convert.html:13 msgid "Warning" -msgstr "" +msgstr "Uyarı" #: order/templates/order/sales_order_cancel.html:9 msgid "Cancelling this order means that the order will no longer be editable." @@ -3265,68 +3357,68 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" -msgstr "" +msgstr "İşlemler" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" -msgstr "" +msgstr "Stok tahsisini düzenle" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" -msgstr "" +msgstr "Stok tahsisini sil" #: order/templates/order/sales_order_detail.html:176 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" -msgstr "" +msgstr "Seri numaralarını tahsis et" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3340,7 +3432,7 @@ msgstr "" #: order/templates/order/sales_order_ship.html:12 msgid "Ensure that the order allocation is correct before shipping the order." -msgstr "" +msgstr "Emri göndermeden önce emir tahsisinin doğru olduğundan emin olun." #: order/templates/order/sales_order_ship.html:18 msgid "Some line items in this order have been over-allocated" @@ -3356,21 +3448,17 @@ msgstr "" #: order/templates/order/so_allocate_by_serial.html:9 msgid "Allocate stock items by serial number" -msgstr "" +msgstr "Seri numarası ile stok kalemlerini tahsis et" #: order/templates/order/so_allocation_delete.html:7 msgid "This action will unallocate the following stock from the Sales Order" -msgstr "" +msgstr "Bu işlem Sipariş Emrinden belirtilen stok kalemleri tahsis edemedi" #: order/templates/order/so_attachments.html:12 #: order/templates/order/so_navbar.html:26 msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3471,93 +3559,97 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" -msgstr "" +msgstr "Seri Numaralarını Tahsis Et" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format -msgid "{serial} is not in stock" -msgstr "" +msgid "No matching item for serial {serial}" +msgstr "{serial} seri numarası için eşleşen öge bulunamadı" -#: order/views.py:1631 +#: order/views.py:1633 +#, python-brace-format +msgid "{serial} is not in stock" +msgstr "{serial} stokta yok" + +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" -msgstr "" +msgstr "{serial} zaten bir emirde tahsis edilmiş" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" -msgstr "" +msgstr "Tahsis Miktarını Düzenle" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" -msgstr "" +msgstr "Tahsisi Sil" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" -msgstr "" +msgstr "Varsayılan Konum" #: part/bom.py:139 part/templates/part/part_base.html:124 msgid "Available Stock" @@ -3566,23 +3658,23 @@ msgstr "" #: part/bom.py:379 #, python-brace-format msgid "Unsupported file format: {f}" -msgstr "" +msgstr "Geçersiz dosya biçimi: {f}" #: part/bom.py:384 msgid "Error reading BOM file (invalid data)" -msgstr "" +msgstr "Malzeme listesi okurken hata (geçersiz data)" #: part/bom.py:386 msgid "Error reading BOM file (incorrect row size)" -msgstr "" +msgstr "Malzeme listesi okurken hata (geçersiz satır boyutu)" #: part/forms.py:89 stock/forms.py:265 msgid "File Format" -msgstr "" +msgstr "Dosya Biçimi" #: part/forms.py:89 stock/forms.py:265 msgid "Select output file format" -msgstr "" +msgstr "Çıktı dosyası biçimi seçin" #: part/forms.py:91 msgid "Cascading" @@ -3630,9 +3722,9 @@ msgstr "" #: part/forms.py:101 msgid "Include part supplier data in exported BOM" -msgstr "" +msgstr "Dışa aktarılan malzeme listesine parça tedarikçisi verilerini dahil edin" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "" @@ -3658,11 +3750,11 @@ msgstr "" #: part/forms.py:165 msgid "BOM file" -msgstr "" +msgstr "Malzeme Listesi Dosyası" #: part/forms.py:165 msgid "Select BOM file to upload" -msgstr "" +msgstr "Yüklemek için Malzeme Listesi dosyası seçin" #: part/forms.py:184 msgid "Related Part" @@ -3694,21 +3786,21 @@ msgstr "" #: part/forms.py:237 msgid "Include category parameter templates" -msgstr "" +msgstr "Kategori parametre şablonlarını dahil et" #: part/forms.py:242 msgid "Include parent categories parameter templates" -msgstr "" +msgstr "Üst kategorilerin parametre şablonlarını dahil et" #: part/forms.py:322 msgid "Add parameter template to same level categories" -msgstr "" +msgstr "Parametre şablonunu aynı seviyedeki kategorilere ekle" #: part/forms.py:326 msgid "Add parameter template to all categories" -msgstr "" +msgstr "Parametre şablonunu tüm kategorilere ekle" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "" @@ -3718,7 +3810,7 @@ msgstr "" #: part/models.py:73 msgid "Default location for parts in this category" -msgstr "" +msgstr "Bu kategori içindeki parçalar için varsayılan konum" #: part/models.py:76 msgid "Default keywords" @@ -3728,7 +3820,7 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3737,367 +3829,362 @@ msgstr "" #: part/templates/part/category.html:94 templates/InvenTree/search.html:127 #: templates/stats.html:84 users/models.py:39 msgid "Part Categories" -msgstr "" +msgstr "Parça Kategorileri" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" -msgstr "" +msgstr "Sonraki kullanılabilir seri numaraları" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" -msgstr "" +msgstr "Sonraki müsait seri numarası" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" -msgstr "" +msgstr "En son seri numarası" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" -msgstr "" +msgstr "Yinelenen DPN'ye parça ayarlarında izin verilmiyor" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" -msgstr "" +msgstr "Şablon Mu" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" -msgstr "" +msgstr "Bu parça bir şablon parçası mı?" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" -msgstr "" +msgstr "Bu parça başka bir parçanın çeşidi mi?" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" -msgstr "" +msgstr "Çeşidi" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" -msgstr "" +msgstr "DPN" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" -msgstr "" +msgstr "Parça revizyon veya versiyon numarası" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" -msgstr "" +msgstr "Revizyon" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" -msgstr "" +msgstr "Varsayılan tedarikçi parçası" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" -msgstr "" +msgstr "Bu parça diğer parçalardan yapılabilir mi?" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" -msgstr "" +msgstr "Bu parça diğer parçaların yapımında kullanılabilir mi?" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" -msgstr "" +msgstr "Bu parça dış tedarikçilerden satın alınabilir mi?" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" -msgstr "" +msgstr "Bu parça müşterilere satılabilir mi?" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" -msgstr "" +msgstr "Test şablonları sadece takip edilebilir paçalar için oluşturulabilir" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" -msgstr "" +msgstr "Gerekli" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" -msgstr "" +msgstr "Testi geçmesi için bu gerekli mi?" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" -msgstr "" +msgstr "Parametre şablon adı benzersiz olmalıdır" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" -msgstr "" +msgstr "Parametre Şablonu" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" -msgstr "" +msgstr "Bu malzeme listesi, çeşit parçalar listesini kalıtsalıdır" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" -msgstr "" +msgstr "Çeşide İzin Ver" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" -msgstr "" +msgstr "Çeşit parçaların stok kalemleri bu malzeme listesinde kullanılabilir" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4112,8 +4199,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "" @@ -4160,7 +4247,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4177,7 +4264,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4227,11 +4314,11 @@ msgstr "" #: part/templates/part/bom_upload/upload_file.html:21 msgid "The BOM file must contain the required named columns as provided in the " -msgstr "" +msgstr "Malzeme Listesi dosyası gerekli sütün adlarını sağlandığı şekilde içermelidir " #: part/templates/part/bom_upload/upload_file.html:21 msgid "BOM Upload Template" -msgstr "" +msgstr "Malzeme Listesi Şablonu Yükle" #: part/templates/part/bom_upload/upload_file.html:22 msgid "Each part must already exist in the database" @@ -4258,7 +4345,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "" @@ -4272,7 +4359,7 @@ msgstr "" #: part/templates/part/category.html:50 part/templates/part/category.html:89 msgid "Category Details" -msgstr "" +msgstr "Kategori Detayları" #: part/templates/part/category.html:55 msgid "Category Path" @@ -4287,11 +4374,11 @@ msgstr "" #: part/templates/part/category_navbar.html:18 #: part/templates/part/subcategory.html:16 msgid "Subcategories" -msgstr "" +msgstr "Alt kategoriler" #: part/templates/part/category.html:84 msgid "Parts (Including subcategories)" -msgstr "" +msgstr "Parçalar (Alt kategoriler dahil)" #: part/templates/part/category.html:113 msgid "Export Part Data" @@ -4299,11 +4386,11 @@ msgstr "" #: part/templates/part/category.html:125 msgid "Set category" -msgstr "" +msgstr "Kategori ayarla" #: part/templates/part/category.html:125 msgid "Set Category" -msgstr "" +msgstr "Kategori Ayarla" #: part/templates/part/category.html:128 msgid "Export Data" @@ -4318,9 +4405,9 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" -msgstr "" +msgstr "Yeni konum oluştur" #: part/templates/part/category.html:214 part/templates/part/category.html:244 msgid "New Category" @@ -4336,7 +4423,7 @@ msgstr "" #: part/templates/part/category.html:251 stock/views.py:1391 msgid "Create new Stock Location" -msgstr "" +msgstr "Yeni Stok konumu oluştur" #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" @@ -4345,11 +4432,11 @@ msgstr "" #: part/templates/part/category_delete.html:8 #, python-format msgid "This category contains %(count)s child categories" -msgstr "" +msgstr "Bu kategori %(count)s alt kategori içermektedir" #: part/templates/part/category_delete.html:9 msgid "If this category is deleted, these child categories will be moved to the" -msgstr "" +msgstr "Bu kategori silinirse, alt kategoriler taşınacaktır" #: part/templates/part/category_delete.html:11 msgid "category" @@ -4373,14 +4460,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" @@ -4408,17 +4489,17 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "" #: part/templates/part/detail.html:42 part/templates/part/part_base.html:188 msgid "Latest Serial Number" -msgstr "" +msgstr "Son Seri Numarası" #: part/templates/part/detail.html:47 msgid "No serial numbers recorded" -msgstr "" +msgstr "Seri numaraları kaydedildi" #: part/templates/part/detail.html:120 msgid "Stock Expiry Time" @@ -4438,11 +4519,11 @@ msgstr "" #: part/templates/part/detail.html:163 msgid "Part is a template part (variants can be made from this part)" -msgstr "" +msgstr "Bu parça bir şablon parçadır (Bu parçanın çeşitleri yapılabilir)" #: part/templates/part/detail.html:165 msgid "Part is not a template part" -msgstr "" +msgstr "Parça şablon parçası değil" #: part/templates/part/detail.html:173 msgid "Part can be assembled from other parts" @@ -4462,15 +4543,15 @@ msgstr "" #: part/templates/part/detail.html:193 msgid "Part stock is tracked by serial number" -msgstr "" +msgstr "Parça stoku seri numarası ile takip edilebilir" #: part/templates/part/detail.html:195 msgid "Part stock is not tracked by serial number" -msgstr "" +msgstr "Parça stoku seri numarası ile takip edilemez" #: part/templates/part/detail.html:203 part/templates/part/detail.html:205 msgid "Part can be purchased from external suppliers" -msgstr "" +msgstr "Bu parça harici tedarikçilerden satın alınabilir" #: part/templates/part/detail.html:213 msgid "Part can be sold to customers" @@ -4488,6 +4569,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4501,127 +4612,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" -msgstr "" +msgstr "Parça Çeşitleri" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" -msgstr "" +msgstr "Çeşitler" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" -msgstr "" +msgstr "Tahsisler" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" -msgstr "" +msgstr "Parça Test Şablonları" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4630,37 +4755,24 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" #: part/templates/part/params.html:68 msgid "New Template" -msgstr "" +msgstr "Yeni Şablon" #: part/templates/part/params.html:69 msgid "Create New Parameter Template" -msgstr "" +msgstr "Yeni Parametre Şablonu Oluştur" #: part/templates/part/part_app_base.html:12 msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4672,7 +4784,7 @@ msgstr "" #: stock/templates/stock/item_base.html:75 #: stock/templates/stock/location.html:51 msgid "Barcode actions" -msgstr "" +msgstr "Barkod işlemleri" #: part/templates/part/part_base.html:42 #: stock/templates/stock/item_base.html:77 @@ -4684,7 +4796,7 @@ msgstr "" #: stock/templates/stock/item_base.html:93 #: stock/templates/stock/location.html:54 msgid "Print Label" -msgstr "" +msgstr "Etiket Yazdır" #: part/templates/part/part_base.html:48 msgid "Show pricing information" @@ -4696,7 +4808,7 @@ msgstr "" #: part/templates/part/part_base.html:67 msgid "Part actions" -msgstr "" +msgstr "Parça işlemleri" #: part/templates/part/part_base.html:70 msgid "Duplicate part" @@ -4717,7 +4829,7 @@ msgstr "" #: part/templates/part/part_base.html:113 #, python-format msgid "This part is a variant of %(link)s" -msgstr "" +msgstr "Bu parça %(link)s parçasının bir çeşididir" #: part/templates/part/part_base.html:130 templates/js/table_filters.js:161 msgid "In Stock" @@ -4725,11 +4837,11 @@ msgstr "" #: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 msgid "Required for Build Orders" -msgstr "" +msgstr "Yapım İşi Emirleri için Gerekli" #: part/templates/part/part_base.html:150 msgid "Required for Sales Orders" -msgstr "" +msgstr "Satış Emirleri için Gerekli" #: part/templates/part/part_base.html:157 msgid "Allocated to Orders" @@ -4740,17 +4852,13 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" -msgstr "" +msgstr "Test Şablonu Ekle" #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" @@ -4779,7 +4887,7 @@ msgstr "" #: part/templates/part/partial_delete.html:44 #, python-format msgid "There are %(count)s suppliers defined for this part. If you delete this part, the following supplier parts will also be deleted:" -msgstr "" +msgstr "Bu parçası için tanımlanmış %(count)s tedarikçi bulunmaktadır. Bu parçayı silerseniz, aşağıdaki tedarikçi parçaları da silinecektir:" #: part/templates/part/partial_delete.html:55 #, python-format @@ -4804,29 +4912,29 @@ msgstr "" #: part/templates/part/set_category.html:9 msgid "Set category for the following parts" -msgstr "" +msgstr "Aşağıdaki parçalara kategori ayarla" #: part/templates/part/stock.html:10 msgid "Part Stock" -msgstr "" +msgstr "Parça Stoku" #: part/templates/part/stock.html:16 #, python-format msgid "Showing stock for all variants of %(full_name)s" -msgstr "" +msgstr "%(full_name)s için tüm çeşitlerin stokları gösteriliyor" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" -msgstr "" +msgstr "Stok Yok" #: part/templates/part/stock_count.html:9 templates/InvenTree/index.html:130 msgid "Low Stock" -msgstr "" +msgstr "Düşük Stok" #: part/templates/part/supplier.html:10 msgid "Part Suppliers" -msgstr "" +msgstr "Parça Tedarikçileri" #: part/templates/part/track.html:10 msgid "Part Tracking" @@ -4838,22 +4946,22 @@ msgstr "" #: part/templates/part/variant_part.html:9 msgid "Create new part variant" -msgstr "" +msgstr "Yeni parça çeşidi oluştur" #: part/templates/part/variant_part.html:10 #, python-format msgid "Create a new variant of template '%(full_name)s'." -msgstr "" +msgstr "%(full_name)s şablonu için yeni bir çeşit oluştur." #: part/templates/part/variants.html:19 msgid "Create new variant" -msgstr "" +msgstr "Yeni çeşit oluştur" #: part/templates/part/variants.html:20 msgid "New Variant" -msgstr "" +msgstr "Yeni Çeşit" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4887,15 +4995,15 @@ msgstr "" #: part/views.py:248 msgid "Create Test Template" -msgstr "" +msgstr "Test Şablonu Oluştur" #: part/views.py:275 msgid "Edit Test Template" -msgstr "" +msgstr "Test Şablonu Düzenle" #: part/views.py:289 msgid "Delete Test Template" -msgstr "" +msgstr "Test Şablonu Sil" #: part/views.py:296 msgid "Set Part Category" @@ -4908,7 +5016,7 @@ msgstr "" #: part/views.py:381 msgid "Create Variant" -msgstr "" +msgstr "Çeşit Oluştur" #: part/views.py:466 msgid "Copied part" @@ -4922,233 +5030,245 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" -msgstr "" +msgstr "Parça Parametre Şablonu Oluştur" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" -msgstr "" +msgstr "Parça Parametre Şablonu Düzenle" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" -msgstr "" +msgstr "Parça Parametre Şablonu Sil" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" -msgstr "" +msgstr "Kategori Parametre Şablonu Oluştur" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" -msgstr "" +msgstr "Kategori Parametre Şablonu Düzenle" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" -msgstr "" +msgstr "Kategori Parametre Şablonu Sil" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" -msgstr "" +msgstr "Şablon adı" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" -msgstr "" +msgstr "Rapor şablon dosyası" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" -msgstr "" +msgstr "Rapor şablon tanımı" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" +msgstr "Revizyon numarası raporla (otomatik artış)" + +#: report/models.py:291 +msgid "Pattern for generating report filenames" msgstr "" -#: report/models.py:275 +#: report/models.py:298 msgid "Report template is enabled" -msgstr "" +msgstr "Rapor şablonu etkin" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" -msgstr "" +msgstr "Stok kalemi sorgu filtreleri (anahter=değer [key=value] olarak virgülle ayrılmış liste)" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" #: report/templates/report/inventree_build_order_base.html:147 msgid "Required For" -msgstr "" +msgstr "İçin Gerekli Olan" #: report/templates/report/inventree_po_report.html:85 #: report/templates/report/inventree_so_report.html:85 @@ -5174,7 +5294,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5189,7 +5309,7 @@ msgstr "" #: stock/api.py:212 #, python-brace-format msgid "Updated stock for {n} items" -msgstr "" +msgstr "{n} öge için stok güncellendi" #: stock/api.py:281 #, python-brace-format @@ -5197,54 +5317,54 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" #: stock/forms.py:115 stock/forms.py:419 msgid "Expiration date for this stock item" -msgstr "" +msgstr "Bu stok kalemi için son kullanma tarihi" #: stock/forms.py:118 msgid "Enter unique serial numbers (or leave blank)" -msgstr "" +msgstr "Benzersiz seri numaraları giriniz (veya boş bırakınız)" #: stock/forms.py:169 msgid "Destination for serialized stock (by default, will remain in current location)" -msgstr "" +msgstr "Seri numaralandırılmış stok için hedef konum(varsayılan olarak, geçerli konumda kalacaktır)" #: stock/forms.py:171 msgid "Serial numbers" -msgstr "" +msgstr "Seri numaraları" #: stock/forms.py:171 msgid "Unique serial numbers (must match quantity)" -msgstr "" +msgstr "Benzersiz seri numaraları (miktar ile eşleşmeli)" #: stock/forms.py:173 stock/forms.py:349 msgid "Add transaction note (optional)" -msgstr "" +msgstr "İşlem notu ekle (isteğe bağlı)" #: stock/forms.py:203 stock/forms.py:259 msgid "Select test report template" -msgstr "" +msgstr "Test raporu şablonu seç" #: stock/forms.py:267 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" -msgstr "" +msgstr "Alt konumları dahil et" #: stock/forms.py:267 msgid "Include stock items in sub locations" -msgstr "" +msgstr "Stok kalemlerine alt konumları dahil et" #: stock/forms.py:302 msgid "Stock item to install" -msgstr "" +msgstr "Kurulacak stok kalemi" #: stock/forms.py:309 msgid "Stock quantity to assign" -msgstr "" +msgstr "Atanacak stok miktarı" #: stock/forms.py:337 msgid "Must not exceed available quantity" @@ -5252,7 +5372,7 @@ msgstr "" #: stock/forms.py:347 msgid "Destination location for uninstalled items" -msgstr "" +msgstr "Sökülen ögeler için hedef konum" #: stock/forms.py:351 msgid "Confirm uninstall" @@ -5260,31 +5380,31 @@ msgstr "" #: stock/forms.py:351 msgid "Confirm removal of installed stock items" -msgstr "" +msgstr "Kurulu stok kalemlerinin kaldırılmasını onayla" #: stock/forms.py:375 msgid "Destination stock location" -msgstr "" +msgstr "Hedef stok konumu" #: stock/forms.py:377 msgid "Add note (required)" -msgstr "" +msgstr "Not ekle (gerekli)" #: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 msgid "Confirm stock adjustment" -msgstr "" +msgstr "Stok ayarlamasını onayla" #: stock/forms.py:381 msgid "Confirm movement of stock items" -msgstr "" +msgstr "Stok kalemlerinin hareketini onaylayın" #: stock/forms.py:383 msgid "Set Default Location" -msgstr "" +msgstr "Varsayılan Konum Ayarla" #: stock/forms.py:383 msgid "Set the destination as the default location for selected parts" -msgstr "" +msgstr "Hedefi seçili parçalar için varsayılan konum olarak ayarla" #: stock/models.py:56 stock/models.py:547 msgid "Owner" @@ -5296,7 +5416,7 @@ msgstr "" #: stock/models.py:275 msgid "StockItem with this serial number already exists" -msgstr "" +msgstr "Bu seri numarasına sahip stok kalemi zaten var" #: stock/models.py:311 #, python-brace-format @@ -5305,11 +5425,11 @@ msgstr "" #: stock/models.py:321 stock/models.py:330 msgid "Quantity must be 1 for item with a serial number" -msgstr "" +msgstr "Seri numarası olan ögenin miktarı bir olmalı" #: stock/models.py:322 msgid "Serial number cannot be set if quantity greater than 1" -msgstr "" +msgstr "Miktar birden büyük ise seri numarası ayarlanamaz" #: stock/models.py:344 msgid "Item cannot belong to itself" @@ -5325,7 +5445,7 @@ msgstr "" #: stock/models.py:399 msgid "Parent Stock Item" -msgstr "" +msgstr "Üst Stok Kalemi" #: stock/models.py:408 msgid "Base part" @@ -5333,11 +5453,11 @@ msgstr "" #: stock/models.py:417 msgid "Select a matching supplier part for this stock item" -msgstr "" +msgstr "Bu stok kalemi için tedarikçi parçası seçin" #: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" -msgstr "" +msgstr "Stok Konumu" #: stock/models.py:425 msgid "Where is this stock item located?" @@ -5357,7 +5477,7 @@ msgstr "" #: stock/models.py:456 msgid "Serial number for this item" -msgstr "" +msgstr "Bu öge için seri numarası" #: stock/models.py:468 msgid "Batch code for this stock item" @@ -5423,20 +5543,20 @@ msgstr "" #: stock/models.py:1026 msgid "Serial numbers must be a list of integers" -msgstr "" +msgstr "Seri numaraları tam sayı listesi olmalı" #: stock/models.py:1029 msgid "Quantity does not match serial numbers" -msgstr "" +msgstr "Miktar seri numaları ile eşleşmiyor" #: stock/models.py:1036 #, python-brace-format msgid "Serial numbers already exist: {exists}" -msgstr "" +msgstr "Seri numaraları zaten mevcut: {exists}" #: stock/models.py:1194 msgid "StockItem cannot be moved as it is not in stock" -msgstr "" +msgstr "Stok kalemi stokta olmadığı için taşınamaz" #: stock/models.py:1668 msgid "Entry notes" @@ -5483,12 +5603,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5503,11 +5623,11 @@ msgstr "" #: stock/templates/stock/item_base.html:84 templates/stock_table.html:31 msgid "Scan to Location" -msgstr "" +msgstr "Konuma Tara" #: stock/templates/stock/item_base.html:91 msgid "Printing actions" -msgstr "" +msgstr "Yazdırma işlemleri" #: stock/templates/stock/item_base.html:95 #: stock/templates/stock/item_tests.html:27 @@ -5516,7 +5636,7 @@ msgstr "" #: stock/templates/stock/item_base.html:104 msgid "Stock adjustment actions" -msgstr "" +msgstr "Stok ayarlama işlemleri" #: stock/templates/stock/item_base.html:108 #: stock/templates/stock/location.html:65 templates/stock_table.html:57 @@ -5533,7 +5653,7 @@ msgstr "" #: stock/templates/stock/item_base.html:117 msgid "Serialize stock" -msgstr "" +msgstr "Stoku seri numarala" #: stock/templates/stock/item_base.html:121 msgid "Transfer stock" @@ -5558,11 +5678,11 @@ msgstr "" #: stock/templates/stock/item_base.html:140 #: stock/templates/stock/location.html:62 msgid "Stock actions" -msgstr "" +msgstr "Stok işlemleri" #: stock/templates/stock/item_base.html:143 msgid "Convert to variant" -msgstr "" +msgstr "Çeşide çevir" #: stock/templates/stock/item_base.html:146 msgid "Duplicate stock item" @@ -5590,7 +5710,7 @@ msgstr "" #: stock/templates/stock/item_base.html:192 msgid "This stock item has not passed all required tests" -msgstr "" +msgstr "Stok kalemi tüm gerekli testleri geçmedi" #: stock/templates/stock/item_base.html:200 #, python-format @@ -5604,7 +5724,7 @@ msgstr "" #: stock/templates/stock/item_base.html:214 msgid "This stock item is serialized - it has a unique serial number and the quantity cannot be adjusted." -msgstr "" +msgstr "Bu stok kalemi seri numaları - Benzersiz bir seri numarasına sahip ve miktarı ayarlanamaz." #: stock/templates/stock/item_base.html:218 msgid "This stock item cannot be deleted as it has child items" @@ -5618,9 +5738,9 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" -msgstr "" +msgstr "Konum ayarlanmadı" #: stock/templates/stock/item_base.html:296 msgid "Barcode Identifier" @@ -5630,25 +5750,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" -msgstr "" +msgstr "Bu stok kaleminin süresi %(item.expiry_date)s tarihinde sona erdi" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" -msgstr "" +msgstr "Bu stok kaleminin süresi %(item.expiry_date)s tarihinde sona erecek" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5671,7 +5795,7 @@ msgstr "" #: stock/templates/stock/item_install.html:7 msgid "Install another StockItem into this item." -msgstr "" +msgstr "Bu ögeye başka bir stok kalemi ekle." #: stock/templates/stock/item_install.html:10 msgid "Stock items can only be installed if they meet the following criteria" @@ -5679,11 +5803,11 @@ msgstr "" #: stock/templates/stock/item_install.html:13 msgid "The StockItem links to a Part which is in the BOM for this StockItem" -msgstr "" +msgstr "Bu stok kalemi, kendi malzeme listesinin bir parçasına bağlıdır" #: stock/templates/stock/item_install.html:14 msgid "The StockItem is currently in stock" -msgstr "" +msgstr "Bu stok kalemi şu anda stokta" #: stock/templates/stock/item_installed.html:11 #: stock/templates/stock/navbar.html:27 @@ -5692,11 +5816,11 @@ msgstr "" #: stock/templates/stock/item_serialize.html:5 msgid "Create serialized items from this stock item." -msgstr "" +msgstr "Bu stok kalemi için seri numaralandırılmış ögeler oluştur." #: stock/templates/stock/item_serialize.html:7 msgid "Select quantity to serialize, and unique serial numbers." -msgstr "" +msgstr "Seri numaralandırılacak miktarı ve benzersiz seri numaralarını seçin." #: stock/templates/stock/item_tests.html:11 #: stock/templates/stock/navbar.html:19 stock/templates/stock/navbar.html:22 @@ -5713,7 +5837,7 @@ msgstr "" #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." -msgstr "" +msgstr "Bu konumun sahipleri listesinde değilsiniz. Bu stok konumu düzenlenemez." #: stock/templates/stock/location.html:37 msgid "All stock items" @@ -5725,34 +5849,34 @@ msgstr "" #: stock/templates/stock/location.html:71 msgid "Location actions" -msgstr "" +msgstr "Konum işlemleri" #: stock/templates/stock/location.html:73 msgid "Edit location" -msgstr "" +msgstr "Konumu düzenle" #: stock/templates/stock/location.html:75 msgid "Delete location" -msgstr "" +msgstr "Konumu sil" #: stock/templates/stock/location.html:87 msgid "Location Details" -msgstr "" +msgstr "Konum Detayları" #: stock/templates/stock/location.html:92 msgid "Location Path" -msgstr "" +msgstr "Konum Yolu" #: stock/templates/stock/location.html:97 msgid "Location Description" -msgstr "" +msgstr "Konum Tanımı" #: stock/templates/stock/location.html:102 #: stock/templates/stock/location_navbar.html:11 #: stock/templates/stock/location_navbar.html:18 #: stock/templates/stock/sublocation.html:16 msgid "Sublocations" -msgstr "" +msgstr "Alt konumlar" #: stock/templates/stock/location.html:112 msgid "Stock Details" @@ -5761,11 +5885,11 @@ msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 #: templates/stats.html:97 users/models.py:41 msgid "Stock Locations" -msgstr "" +msgstr "Stok Konumları" #: stock/templates/stock/location_delete.html:7 msgid "Are you sure you want to delete this stock location?" -msgstr "" +msgstr "Bu stok konumunu silmek istediğinizden emin misiniz?" #: stock/templates/stock/navbar.html:11 msgid "Stock Item Tracking" @@ -5801,28 +5925,28 @@ msgstr "" #: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 msgid "Convert Stock Item" -msgstr "" +msgstr "Stok Kalemine Dönüştür" #: stock/templates/stock/stockitem_convert.html:8 #, python-format msgid "This stock item is current an instance of %(part)s" -msgstr "" +msgstr "Bu stok kalemi şu anda %(part)s parçasının örneğidir" #: stock/templates/stock/stockitem_convert.html:9 msgid "It can be converted to one of the part variants listed below." -msgstr "" +msgstr "Aşağıda listelenen parça çeşitlerinden birine dönüştürülebilir." #: stock/templates/stock/stockitem_convert.html:14 msgid "This action cannot be easily undone" -msgstr "" +msgstr "Bu işlem kolayca geri alınamaz" #: stock/templates/stock/sublocation.html:23 templates/stock_table.html:37 msgid "Printing Actions" -msgstr "" +msgstr "Yazdırma İşlemleri" #: stock/templates/stock/sublocation.html:27 templates/stock_table.html:41 msgid "Print labels" -msgstr "" +msgstr "Etiketleri yazdır" #: stock/templates/stock/tracking_delete.html:6 msgid "Are you sure you want to delete this stock tracking entry?" @@ -5830,16 +5954,16 @@ msgstr "" #: stock/views.py:123 msgid "Edit Stock Location" -msgstr "" +msgstr "Stok konumunu düzenle" #: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 #: stock/views.py:1830 msgid "Owner is required (ownership control is enabled)" -msgstr "" +msgstr "Sahip gerekli (sahip kontrolü etkinleştirildi)" #: stock/views.py:245 msgid "Stock Location QR code" -msgstr "" +msgstr "Stok Konumu QR Kodu" #: stock/views.py:265 msgid "Add Stock Item Attachment" @@ -5867,7 +5991,7 @@ msgstr "" #: stock/views.py:385 msgid "Specify a valid location" -msgstr "" +msgstr "Geçerli bir konum belirtiniz" #: stock/views.py:396 msgid "Stock item returned from customer" @@ -5945,7 +6069,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -5968,7 +6092,7 @@ msgstr "" #: stock/views.py:1107 msgid "No action performed" -msgstr "" +msgstr "Herhangi bir işlem gerçekleştirilmedi" #: stock/views.py:1122 #, python-brace-format @@ -6009,9 +6133,9 @@ msgstr "" #: stock/views.py:1482 msgid "Serialize Stock" -msgstr "" +msgstr "Stoku Seri Numarala" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6025,7 +6149,7 @@ msgstr "" #: stock/views.py:1899 msgid "Delete Stock Location" -msgstr "" +msgstr "Stok Konumunu Sil" #: stock/views.py:1912 msgid "Delete Stock Item" @@ -6043,14 +6167,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6119,13 +6235,13 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" -msgstr "" +msgstr "Stok konumu ayarlanmadı" #: templates/InvenTree/settings/appearance.html:10 msgid "Theme Settings" @@ -6157,25 +6273,25 @@ msgstr "" #: templates/InvenTree/settings/category.html:9 msgid "Category Settings" -msgstr "" +msgstr "Kategori Ayarları" #: templates/InvenTree/settings/category.html:25 msgid "Category Parameter Templates" -msgstr "" +msgstr "Kategori Parametre Şablonu" #: templates/InvenTree/settings/category.html:52 msgid "No category parameter templates found" -msgstr "" +msgstr "Kategori parametre şablonu bulunamadı" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" -msgstr "" +msgstr "Şablonu Düzenle" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" -msgstr "" +msgstr "Şablonu Sil" #: templates/InvenTree/settings/currencies.html:10 msgid "Currency Settings" @@ -6221,13 +6337,13 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" -msgstr "" +msgstr "Parça Parametre Şablonu" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" -msgstr "" +msgstr "Parça parametre şablonu bulunamadı" #: templates/InvenTree/settings/po.html:9 msgid "Purchase Order Settings" @@ -6341,47 +6457,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6442,7 +6562,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6472,7 +6592,7 @@ msgstr "" #: templates/js/barcode.js:418 msgid "Check Stock Items into Location" -msgstr "" +msgstr "Stok Kalemlerini bu konuma kaydet" #: templates/js/barcode.js:422 templates/js/barcode.js:547 msgid "Check In" @@ -6488,7 +6608,7 @@ msgstr "" #: templates/js/barcode.js:485 msgid "Stock Item already in this location" -msgstr "" +msgstr "Stok kalemi zaten bu konumda" #: templates/js/barcode.js:492 msgid "Added stock item" @@ -6500,13 +6620,13 @@ msgstr "" #: templates/js/barcode.js:542 msgid "Check Into Location" -msgstr "" +msgstr "Konuma Kaydet" #: templates/js/barcode.js:605 msgid "Barcode does not match a valid location" -msgstr "" +msgstr "Barkod geçerli bir konumla eşleşmiyor" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6542,7 +6662,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6562,37 +6682,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" -msgstr "" +msgstr "Gerekli Parça" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6612,27 +6740,39 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" -msgstr "" +msgstr "Şablon Parça" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" #: templates/js/filters.js:167 templates/js/filters.js:397 msgid "true" -msgstr "" +msgstr "doğru" #: templates/js/filters.js:171 templates/js/filters.js:398 msgid "false" -msgstr "" +msgstr "yanlış" #: templates/js/filters.js:193 msgid "Select filter" @@ -6656,27 +6796,27 @@ msgstr "" #: templates/js/label.js:11 msgid "Stock item(s) must be selected before printing labels" -msgstr "" +msgstr "Etiket yazdırılmadan önce stok kalemleri seçilmeli" #: templates/js/label.js:29 templates/js/label.js:79 msgid "No Labels Found" -msgstr "" +msgstr "Etiket Bulunamadı" #: templates/js/label.js:30 msgid "No labels found which match selected stock item(s)" -msgstr "" +msgstr "Seçili stok kalemleri için etiket bulunamadı" #: templates/js/label.js:61 msgid "Select Stock Locations" -msgstr "" +msgstr "Stok Konumu Seç" #: templates/js/label.js:62 msgid "Stock location(s) must be selected before printing labels" -msgstr "" +msgstr "Etiket yazdırılmadan önce stok konumları seçilmeli" #: templates/js/label.js:80 msgid "No labels found which match selected stock location(s)" -msgstr "" +msgstr "Seçili konumlarla eşleşen etiket bulunamadı" #: templates/js/label.js:154 msgid "stock items selected" @@ -6684,11 +6824,11 @@ msgstr "" #: templates/js/label.js:162 msgid "Select Label" -msgstr "" +msgstr "Etiket Seç" #: templates/js/label.js:177 msgid "Select Label Template" -msgstr "" +msgstr "Etiket Şablonu Seç" #: templates/js/modals.js:265 msgid "Waiting for server..." @@ -6710,76 +6850,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" -msgstr "" +msgstr "Bu fonksiyona erişmek için gerekli izinlere sahip değilsiniz" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6795,6 +6935,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6821,41 +6965,41 @@ msgstr "" #: templates/js/part.js:194 msgid "No variants found" -msgstr "" +msgstr "Çeşit bulunamadı" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" -msgstr "" +msgstr "Sorgu ile eşleşen test şablonu bulunamadı" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6865,11 +7009,11 @@ msgstr "" #: templates/js/report.js:55 msgid "Select Report Template" -msgstr "" +msgstr "Rapor Şablonu Seç" #: templates/js/report.js:70 msgid "Select Test Report Template" -msgstr "" +msgstr "Test Raporu Şablonu Seç" #: templates/js/report.js:99 msgid "Stock item(s) must be selected before printing reports" @@ -6883,7 +7027,7 @@ msgstr "" #: templates/js/report.js:117 msgid "No report templates found which match selected stock item(s)" -msgstr "" +msgstr "Seçili stok kalemleri için rapor şablonu bulunamadı" #: templates/js/report.js:152 msgid "Select Builds" @@ -6895,7 +7039,7 @@ msgstr "" #: templates/js/report.js:170 msgid "No report templates found which match selected build(s)" -msgstr "" +msgstr "Seçili yapım işleri için rapor şablonu bulunamadı" #: templates/js/report.js:205 msgid "Select Parts" @@ -6907,7 +7051,7 @@ msgstr "" #: templates/js/report.js:224 msgid "No report templates found which match selected part(s)" -msgstr "" +msgstr "Seçili parçalar için rapor şablonu bulunamadı" #: templates/js/report.js:259 msgid "Select Purchase Orders" @@ -6919,7 +7063,7 @@ msgstr "" #: templates/js/report.js:278 templates/js/report.js:332 msgid "No report templates found which match selected orders" -msgstr "" +msgstr "Seçili emirler için rapor şablonu bulunamadı" #: templates/js/report.js:313 msgid "Select Sales Orders" @@ -6953,155 +7097,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" -msgstr "" +msgstr "konumlar" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" -msgstr "" +msgstr "Tanımsız konum" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" -msgstr "" +msgstr "Konum artık yok" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" -msgstr "" +msgstr "Yeni Konum Oluştur" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" -msgstr "" +msgstr "Seri No" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7115,11 +7259,11 @@ msgstr "" #: templates/js/table_filters.js:55 msgid "Allow Variant Stock" -msgstr "" +msgstr "Çeşit Stokuna İzin Ver" #: templates/js/table_filters.js:76 msgid "Include locations" -msgstr "" +msgstr "Konumları dahil et" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 #: templates/js/table_filters.js:300 @@ -7128,28 +7272,28 @@ msgstr "" #: templates/js/table_filters.js:97 templates/js/table_filters.js:186 msgid "Is Serialized" -msgstr "" +msgstr "Seri Numaralı" #: templates/js/table_filters.js:100 templates/js/table_filters.js:193 msgid "Serial number GTE" -msgstr "" +msgstr "Seri numarası BvE" #: templates/js/table_filters.js:101 templates/js/table_filters.js:194 msgid "Serial number greater than or equal to" -msgstr "" +msgstr "Seri numarası büyük veya eşit" #: templates/js/table_filters.js:104 templates/js/table_filters.js:197 msgid "Serial number LTE" -msgstr "" +msgstr "Seri numarası KvE" #: templates/js/table_filters.js:105 templates/js/table_filters.js:198 msgid "Serial number less than or equal to" -msgstr "" +msgstr "Seri numarası küçük veya eşit" #: templates/js/table_filters.js:108 templates/js/table_filters.js:109 #: templates/js/table_filters.js:189 templates/js/table_filters.js:190 msgid "Serial number" -msgstr "" +msgstr "Seri numarası" #: templates/js/table_filters.js:113 templates/js/table_filters.js:207 msgid "Batch code" @@ -7177,7 +7321,7 @@ msgstr "" #: templates/js/table_filters.js:139 msgid "Include stock in sublocations" -msgstr "" +msgstr "Alt konumlardaki stoku dahil et" #: templates/js/table_filters.js:144 msgid "Show stock items which are depleted" @@ -7205,11 +7349,11 @@ msgstr "" #: templates/js/table_filters.js:171 msgid "Include Variants" -msgstr "" +msgstr "Çeşitleri Dahil Et" #: templates/js/table_filters.js:172 msgid "Include stock items for variant parts" -msgstr "" +msgstr "Çeşit parçaların stok kalemlerini dahil et" #: templates/js/table_filters.js:176 msgid "Installed" @@ -7241,11 +7385,11 @@ msgstr "" #: templates/js/table_filters.js:301 msgid "Include parts in subcategories" -msgstr "" +msgstr "Alt kategorilerdeki parçaları dahil et" #: templates/js/table_filters.js:305 msgid "Has IPN" -msgstr "" +msgstr "DPN Var" #: templates/js/table_filters.js:306 msgid "Part has internal part number" @@ -7267,56 +7411,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7482,7 +7626,7 @@ msgstr "" #: templates/stock_table.html:27 msgid "Barcode Actions" -msgstr "" +msgstr "Barkod İşlemleri" #: templates/stock_table.html:43 msgid "Print test reports" @@ -7560,35 +7704,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/zh/LC_MESSAGES/django.po b/InvenTree/locale/zh/LC_MESSAGES/django.po index 9892439445..34dbe857dc 100644 --- a/InvenTree/locale/zh/LC_MESSAGES/django.po +++ b/InvenTree/locale/zh/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: inventree\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-06-16 22:40+0000\n" -"PO-Revision-Date: 2021-06-16 22:41\n" +"POT-Creation-Date: 2021-06-24 21:38+0000\n" +"PO-Revision-Date: 2021-06-24 21:40\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -77,7 +77,7 @@ msgstr "选择分类" msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:247 order/models.py:357 +#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 #: stock/views.py:1795 msgid "Invalid quantity provided" msgstr "" @@ -122,9 +122,9 @@ msgstr "注释" msgid "File comment" msgstr "文件注释" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1999 +#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1154 +#: templates/js/stock.js:1179 msgid "User" msgstr "用户" @@ -132,34 +132,35 @@ msgstr "用户" msgid "upload date" msgstr "上传日期" -#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:102 -#: part/models.py:686 part/models.py:2140 part/templates/part/params.html:27 -#: report/models.py:179 templates/InvenTree/search.html:137 -#: templates/InvenTree/search.html:289 templates/js/part.js:118 -#: templates/js/part.js:641 templates/js/stock.js:947 +#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 +#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: part/templates/part/params.html:27 report/models.py:180 +#: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 +#: templates/js/company.js:235 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:972 msgid "Name" msgstr "名称" #: InvenTree/models.py:114 build/models.py:135 #: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:491 company/templates/company/detail.html:27 +#: company/models.py:532 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 #: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:103 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:710 part/templates/part/detail.html:54 -#: part/templates/part/set_category.html:14 report/models.py:192 -#: report/models.py:505 report/models.py:544 +#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 +#: part/models.py:695 part/templates/part/detail.html:54 +#: part/templates/part/set_category.html:14 report/models.py:193 +#: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:746 templates/js/build.js:1014 +#: templates/js/build.js:833 templates/js/build.js:1101 #: templates/js/company.js:56 templates/js/order.js:183 #: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 -#: templates/js/part.js:437 templates/js/part.js:653 templates/js/part.js:721 -#: templates/js/stock.js:552 templates/js/stock.js:959 -#: templates/js/stock.js:1004 +#: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 +#: templates/js/stock.js:557 templates/js/stock.js:984 +#: templates/js/stock.js:1029 msgid "Description" msgstr "" @@ -191,15 +192,15 @@ msgstr "" msgid "Turkish" msgstr "" -#: InvenTree/status.py:93 +#: InvenTree/status.py:94 msgid "Background worker check failed" msgstr "" -#: InvenTree/status.py:97 +#: InvenTree/status.py:98 msgid "Email backend not configured" msgstr "" -#: InvenTree/status.py:100 +#: InvenTree/status.py:101 msgid "InvenTree system health checks failed" msgstr "" @@ -372,27 +373,27 @@ msgstr "" msgid "Overage must be an integer value or a percentage" msgstr "" -#: InvenTree/views.py:605 +#: InvenTree/views.py:608 msgid "Delete Item" msgstr "" -#: InvenTree/views.py:654 +#: InvenTree/views.py:657 msgid "Check box to confirm item deletion" msgstr "" -#: InvenTree/views.py:669 templates/InvenTree/settings/user.html:18 +#: InvenTree/views.py:672 templates/InvenTree/settings/user.html:18 msgid "Edit User Information" msgstr "" -#: InvenTree/views.py:680 templates/InvenTree/settings/user.html:22 +#: InvenTree/views.py:683 templates/InvenTree/settings/user.html:22 msgid "Set Password" msgstr "" -#: InvenTree/views.py:699 +#: InvenTree/views.py:702 msgid "Password fields must match" msgstr "" -#: InvenTree/views.py:950 templates/navbar.html:95 +#: InvenTree/views.py:953 templates/navbar.html:95 msgid "System Information" msgstr "" @@ -445,11 +446,11 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144 +#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:793 templates/js/order.js:200 +#: templates/js/build.js:880 templates/js/order.js:200 #: templates/js/order.js:298 msgid "Target Date" msgstr "" @@ -462,22 +463,21 @@ msgstr "" #: build/templates/build/allocation_card.html:23 #: build/templates/build/auto_allocate.html:17 #: build/templates/build/build_base.html:133 -#: build/templates/build/detail.html:31 common/models.py:699 -#: company/forms.py:176 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:188 order/forms.py:205 order/forms.py:240 order/forms.py:262 -#: order/forms.py:279 order/models.py:616 order/models.py:817 +#: build/templates/build/detail.html:31 common/models.py:720 +#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 +#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 +#: order/forms.py:285 order/models.py:617 order/models.py:841 #: order/templates/order/order_wizard/match_parts.html:29 -#: order/templates/order/order_wizard/select_parts.html:32 +#: order/templates/order/order_wizard/select_parts.html:34 #: order/templates/order/purchase_order_detail.html:179 #: order/templates/order/sales_order_detail.html:70 #: order/templates/order/sales_order_detail.html:77 #: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:230 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/models.py:2270 -#: part/templates/part/allocation.html:19 -#: part/templates/part/allocation.html:53 -#: part/templates/part/order_prices.html:175 -#: part/templates/part/part_pricing.html:13 +#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 +#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 +#: part/templates/part/internal_prices.html:98 +#: part/templates/part/order_prices.html:202 +#: part/templates/part/part_pricing.html:16 #: part/templates/part/sale_prices.html:85 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 @@ -486,9 +486,10 @@ msgstr "" #: stock/forms.py:175 stock/forms.py:308 #: stock/templates/stock/item_base.html:255 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364 -#: templates/js/bom.js:205 templates/js/build.js:486 templates/js/build.js:1024 -#: templates/js/part.js:795 templates/js/stock.js:1139 -#: templates/js/stock.js:1358 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:571 +#: templates/js/build.js:1111 templates/js/order.js:393 +#: templates/js/part.js:796 templates/js/stock.js:1164 +#: templates/js/stock.js:1383 msgid "Quantity" msgstr "" @@ -500,7 +501,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:234 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 msgid "Serial Numbers" msgstr "" @@ -529,12 +530,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: order/forms.py:82 stock/forms.py:347 -#: stock/templates/stock/item_base.html:285 +#: stock/forms.py:347 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 -#: templates/js/barcode.js:531 templates/js/build.js:500 -#: templates/js/stock.js:639 templates/js/stock.js:1031 +#: templates/js/barcode.js:531 templates/js/build.js:218 +#: templates/js/build.js:585 templates/js/order.js:378 +#: templates/js/stock.js:643 templates/js/stock.js:1056 msgid "Location" msgstr "" @@ -543,13 +544,13 @@ msgid "Location of completed parts" msgstr "" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:468 +#: build/templates/build/detail.html:59 order/models.py:469 #: order/templates/order/receive_parts.html:24 -#: stock/templates/stock/item_base.html:403 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:780 +#: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 +#: templates/js/barcode.js:119 templates/js/build.js:867 #: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:626 templates/js/stock.js:1108 -#: templates/js/stock.js:1374 +#: templates/js/stock.js:630 templates/js/stock.js:1133 +#: templates/js/stock.js:1399 msgid "Status" msgstr "" @@ -583,16 +584,16 @@ msgstr "" #: build/models.py:66 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 -#: part/templates/part/allocation.html:23 #: report/templates/report/inventree_build_order_base.html:106 +#: templates/js/build.js:195 msgid "Build Order" msgstr "" #: build/models.py:67 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55 -#: part/templates/part/navbar.html:58 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 +#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 #: templates/InvenTree/search.html:185 #: templates/InvenTree/settings/tabs.html:34 users/models.py:43 msgid "Build Orders" @@ -602,12 +603,12 @@ msgstr "" msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:101 order/models.py:618 +#: build/models.py:128 order/models.py:102 order/models.py:619 #: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:225 part/models.py:2279 +#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:575 templates/js/build.js:1018 +#: templates/js/build.js:660 templates/js/build.js:1105 msgid "Reference" msgstr "" @@ -626,27 +627,27 @@ msgstr "" #: build/models.py:153 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:622 -#: order/models.py:660 order/models.py:693 -#: order/templates/order/order_wizard/select_parts.html:30 +#: build/templates/build/detail.html:26 company/models.py:663 +#: order/models.py:661 order/models.py:717 +#: order/templates/order/order_wizard/select_parts.html:32 #: order/templates/order/purchase_order_detail.html:132 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:213 part/models.py:321 -#: part/models.py:1967 part/models.py:1979 part/models.py:1997 -#: part/models.py:2072 part/models.py:2168 part/models.py:2254 -#: part/templates/part/part_app_base.html:8 -#: part/templates/part/part_pricing.html:9 part/templates/part/related.html:29 +#: order/templates/order/sales_order_detail.html:214 part/models.py:321 +#: part/models.py:1975 part/models.py:1987 part/models.py:2002 +#: part/models.py:2020 part/models.py:2095 part/models.py:2191 +#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 #: report/templates/report/inventree_po_report.html:90 #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:466 templates/js/build.js:751 -#: templates/js/build.js:991 templates/js/company.js:140 -#: templates/js/company.js:238 templates/js/part.js:241 -#: templates/js/part.js:404 templates/js/stock.js:521 -#: templates/js/stock.js:1346 +#: templates/js/build.js:551 templates/js/build.js:838 +#: templates/js/build.js:1078 templates/js/company.js:140 +#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/part.js:404 templates/js/stock.js:526 +#: templates/js/stock.js:1371 msgid "Part" msgstr "" @@ -710,16 +711,16 @@ msgstr "" msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:107 part/models.py:882 +#: build/models.py:220 order/models.py:108 part/models.py:867 #: part/templates/part/detail.html:126 templates/js/order.js:293 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:474 +#: build/models.py:224 order/models.py:475 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:220 templates/js/build.js:798 +#: build/models.py:228 order/models.py:221 templates/js/build.js:885 msgid "Completion Date" msgstr "" @@ -736,9 +737,9 @@ msgid "User who issued this build order" msgstr "" #: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:121 +#: build/templates/build/detail.html:105 order/models.py:122 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:886 +#: order/templates/order/sales_order_base.html:140 part/models.py:871 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" @@ -757,26 +758,26 @@ msgstr "" msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:744 stock/models.py:462 +#: build/models.py:258 part/models.py:729 stock/models.py:462 msgid "Link to external URL" msgstr "" #: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:498 +#: company/models.py:132 company/models.py:539 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:125 -#: order/models.py:620 order/templates/order/po_navbar.html:29 -#: order/templates/order/po_navbar.html:32 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/sales_order_detail.html:278 +#: company/templates/company/navbar.html:73 order/models.py:126 +#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: order/templates/order/po_navbar.html:41 +#: order/templates/order/purchase_order_detail.html:243 +#: order/templates/order/sales_order_detail.html:309 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:871 -#: part/templates/part/navbar.html:134 +#: order/templates/order/so_navbar.html:36 part/models.py:856 +#: part/templates/part/navbar.html:142 #: report/templates/report/inventree_build_order_base.html:173 #: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 #: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37 -#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:674 +#: templates/js/bom.js:356 templates/js/stock.js:141 templates/js/stock.js:699 msgid "Notes" msgstr "" @@ -809,11 +810,11 @@ msgstr "" msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:791 +#: build/models.py:1188 order/models.py:815 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:794 +#: build/models.py:1192 order/models.py:818 msgid "Allocation quantity must be greater than zero" msgstr "" @@ -827,7 +828,7 @@ msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" #: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:724 +#: templates/InvenTree/search.html:183 templates/js/build.js:811 #: templates/navbar.html:29 msgid "Build" msgstr "" @@ -836,15 +837,13 @@ msgstr "" msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 part/templates/part/allocation.html:18 -#: part/templates/part/allocation.html:24 -#: part/templates/part/allocation.html:31 -#: part/templates/part/allocation.html:49 -#: stock/templates/stock/item_base.html:8 +#: build/models.py:1333 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 -#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:841 -#: templates/js/stock.js:1090 +#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 +#: templates/js/build.js:211 templates/js/build.js:928 +#: templates/js/order.js:366 templates/js/order.js:371 +#: templates/js/stock.js:1115 msgid "Stock Item" msgstr "" @@ -880,7 +879,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:656 +#: build/templates/build/allocate.html:25 templates/js/build.js:743 msgid "Unallocate stock" msgstr "" @@ -917,15 +916,15 @@ msgstr "" #: order/templates/order/sales_order_detail.html:160 #: report/templates/report/inventree_test_report_base.html:75 #: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:484 +#: templates/js/build.js:569 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 -#: order/templates/order/po_navbar.html:26 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:125 -#: part/templates/part/navbar.html:128 stock/templates/stock/navbar.html:47 +#: order/templates/order/po_navbar.html:35 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 +#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" @@ -1037,11 +1036,10 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:691 +#: build/templates/build/detail.html:84 order/models.py:715 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 -#: part/templates/part/allocation.html:30 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 #: stock/templates/stock/item_base.html:279 templates/js/order.js:245 @@ -1185,7 +1183,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 +#: order/templates/order/purchase_order_detail.html:239 +#: order/templates/order/receive_parts.html:25 stock/forms.py:169 +#: stock/forms.py:375 msgid "Destination" msgstr "" @@ -1194,15 +1195,15 @@ msgid "Destination location not specified" msgstr "" #: build/templates/build/detail.html:70 -#: stock/templates/stock/item_base.html:303 templates/js/stock.js:634 -#: templates/js/stock.js:1381 templates/js/table_filters.js:112 +#: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 +#: templates/js/stock.js:1406 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:788 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 msgid "Created" msgstr "" @@ -1210,7 +1211,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:766 +#: build/templates/build/detail.html:132 templates/js/build.js:853 msgid "Completed" msgstr "" @@ -1248,9 +1249,9 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 -#: order/templates/order/po_navbar.html:14 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:15 -#: templates/js/stock.js:1019 +#: order/templates/order/po_navbar.html:15 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 +#: templates/js/stock.js:1044 msgid "Details" msgstr "" @@ -1285,8 +1286,8 @@ msgstr "" #: build/templates/build/notes.html:26 company/templates/company/notes.html:24 #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 -#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:482 -#: stock/templates/stock/item_base.html:492 +#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 +#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1411,8 +1412,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:585 -#: templates/js/build.js:848 templates/js/build.js:1031 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 +#: templates/js/build.js:935 templates/js/build.js:1118 msgid "Available" msgstr "" @@ -1598,8 +1599,8 @@ msgstr "" msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2170 part/templates/part/detail.html:160 -#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:25 +#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 #: templates/js/table_filters.js:315 msgid "Template" msgstr "" @@ -1608,7 +1609,7 @@ msgstr "" msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:834 part/templates/part/detail.html:170 +#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 #: templates/js/table_filters.js:128 templates/js/table_filters.js:327 msgid "Assembly" msgstr "" @@ -1617,7 +1618,7 @@ msgstr "" msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:840 part/templates/part/detail.html:180 +#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 #: templates/js/table_filters.js:331 msgid "Component" msgstr "" @@ -1626,7 +1627,7 @@ msgstr "" msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:851 part/templates/part/detail.html:200 +#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" @@ -1634,7 +1635,7 @@ msgstr "" msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:856 part/templates/part/detail.html:210 +#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 #: templates/js/table_filters.js:339 msgid "Salable" msgstr "" @@ -1643,7 +1644,7 @@ msgstr "" msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:846 part/templates/part/detail.html:190 +#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 #: templates/js/table_filters.js:33 templates/js/table_filters.js:343 msgid "Trackable" msgstr "" @@ -1652,7 +1653,7 @@ msgstr "" msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:866 part/templates/part/detail.html:150 +#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" @@ -1669,160 +1670,185 @@ msgstr "" msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:209 +msgid "Show Price in Forms" msgstr "" #: common/models.py:210 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display part price in some forms" msgstr "" #: common/models.py:216 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:217 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:223 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:224 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:230 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:231 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:237 +msgid "Page Size" +msgstr "" + +#: common/models.py:238 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:227 +#: common/models.py:248 msgid "Test Reports" msgstr "" -#: common/models.py:228 +#: common/models.py:249 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:234 +#: common/models.py:255 msgid "Stock Expiry" msgstr "" -#: common/models.py:235 +#: common/models.py:256 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:241 +#: common/models.py:262 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:242 +#: common/models.py:263 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Stock Stale Time" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:251 part/templates/part/detail.html:121 +#: common/models.py:272 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Build Expired Stock" msgstr "" -#: common/models.py:257 +#: common/models.py:278 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:264 +#: common/models.py:285 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Group by Part" msgstr "" -#: common/models.py:271 +#: common/models.py:292 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Recent Stock Count" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:290 +#: common/models.py:311 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:295 +#: common/models.py:316 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:296 +#: common/models.py:317 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:301 +#: common/models.py:322 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:302 +#: common/models.py:323 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:525 +#: common/models.py:546 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:527 +#: common/models.py:548 msgid "Settings value" msgstr "" -#: common/models.py:562 +#: common/models.py:583 msgid "Must be an integer value" msgstr "" -#: common/models.py:585 +#: common/models.py:606 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:596 +#: common/models.py:617 msgid "Value must be an integer value" msgstr "" -#: common/models.py:619 +#: common/models.py:640 msgid "Key string must be unique" msgstr "" -#: common/models.py:700 company/forms.py:177 +#: common/models.py:721 company/forms.py:192 msgid "Price break quantity" msgstr "" -#: common/models.py:708 company/templates/company/supplier_part_pricing.html:82 +#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 +#: part/templates/part/internal_prices.html:103 #: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 msgid "Price" msgstr "" -#: common/models.py:709 +#: common/models.py:730 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:798 +#: common/models.py:822 msgid "Default" msgstr "" @@ -1843,7 +1869,9 @@ msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 -#: order/views.py:582 part/templates/part/bom_upload/upload_file.html:27 +#: order/templates/order/po_navbar.html:19 +#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: part/templates/part/bom_upload/upload_file.html:27 msgid "Upload File" msgstr "" @@ -1877,29 +1905,29 @@ msgstr "" msgid "Image URL" msgstr "" -#: company/forms.py:118 templates/js/part.js:786 +#: company/forms.py:133 templates/js/part.js:787 msgid "Single Price" msgstr "" -#: company/forms.py:120 +#: company/forms.py:135 msgid "Single quantity price" msgstr "" -#: company/forms.py:128 company/models.py:321 +#: company/forms.py:143 company/models.py:321 msgid "Select manufacturer" msgstr "" -#: company/forms.py:134 company/models.py:328 +#: company/forms.py:149 company/models.py:328 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:136 company/models.py:327 +#: company/forms.py:151 company/models.py:327 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 #: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:307 +#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 msgid "MPN" msgstr "" @@ -1952,11 +1980,11 @@ msgstr "" msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:485 -#: order/models.py:105 part/models.py:743 +#: company/models.py:121 company/models.py:333 company/models.py:526 +#: order/models.py:106 part/models.py:728 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:318 -#: templates/js/part.js:497 +#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/part.js:498 msgid "Link" msgstr "" @@ -1964,7 +1992,7 @@ msgstr "" msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:753 +#: company/models.py:129 part/models.py:738 msgid "Image" msgstr "" @@ -1992,12 +2020,12 @@ msgstr "" msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:456 stock/models.py:407 +#: company/models.py:305 company/models.py:497 stock/models.py:407 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:460 order/views.py:1587 +#: company/models.py:309 company/models.py:501 order/views.py:1597 msgid "Select part" msgstr "" @@ -2008,7 +2036,7 @@ msgstr "" #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 #: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:289 +#: templates/js/company.js:390 msgid "Manufacturer" msgstr "" @@ -2020,87 +2048,112 @@ msgstr "" msgid "Manufacturer part description" msgstr "" -#: company/models.py:466 company/templates/company/detail.html:62 +#: company/models.py:390 company/models.py:520 +#: company/templates/company/manufacturer_part_base.html:6 +#: company/templates/company/manufacturer_part_base.html:19 +#: stock/templates/stock/item_base.html:362 +msgid "Manufacturer Part" +msgstr "" + +#: company/models.py:397 +msgid "Parameter name" +msgstr "" + +#: company/models.py:403 part/templates/part/params.html:28 +#: report/templates/report/inventree_test_report_base.html:90 +#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:241 templates/js/stock.js:137 +msgid "Value" +msgstr "" + +#: company/models.py:404 +msgid "Parameter value" +msgstr "" + +#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: part/templates/part/detail.html:106 part/templates/part/params.html:29 +#: templates/js/company.js:247 +msgid "Units" +msgstr "" + +#: company/models.py:411 +msgid "Parameter units" +msgstr "" + +#: company/models.py:507 company/templates/company/detail.html:62 #: company/templates/company/supplier_part_base.html:84 -#: company/templates/company/supplier_part_detail.html:25 order/models.py:192 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:193 #: order/templates/order/order_base.html:92 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:175 -#: part/bom.py:286 stock/templates/stock/item_base.html:364 -#: templates/js/company.js:48 templates/js/company.js:263 +#: part/bom.py:286 stock/templates/stock/item_base.html:369 +#: templates/js/company.js:48 templates/js/company.js:364 #: templates/js/order.js:170 msgid "Supplier" msgstr "" -#: company/models.py:467 +#: company/models.py:508 msgid "Select supplier" msgstr "" -#: company/models.py:472 company/templates/company/supplier_part_base.html:88 +#: company/models.py:513 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 #: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:473 +#: company/models.py:514 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:479 -#: company/templates/company/manufacturer_part_base.html:6 -#: company/templates/company/manufacturer_part_base.html:19 -#: stock/templates/stock/item_base.html:357 -msgid "Manufacturer Part" -msgstr "" - -#: company/models.py:480 +#: company/models.py:521 msgid "Select manufacturer part" msgstr "" -#: company/models.py:486 +#: company/models.py:527 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:492 +#: company/models.py:533 msgid "Supplier part description" msgstr "" -#: company/models.py:497 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2282 +#: company/models.py:538 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "base cost" msgstr "" -#: company/models.py:501 part/models.py:1614 +#: company/models.py:542 part/models.py:1606 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:503 company/templates/company/supplier_part_base.html:109 +#: company/models.py:544 company/templates/company/supplier_part_base.html:109 #: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:670 +#: templates/js/stock.js:695 msgid "Packaging" msgstr "" -#: company/models.py:503 +#: company/models.py:544 msgid "Part packaging" msgstr "" -#: company/models.py:505 part/models.py:1616 +#: company/models.py:546 part/models.py:1608 msgid "multiple" msgstr "" -#: company/models.py:505 +#: company/models.py:546 msgid "Order multiple" msgstr "" #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:477 +#: company/templates/company/navbar.html:65 templates/js/build.js:562 msgid "Assigned Stock" msgstr "" @@ -2165,11 +2218,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:463 +#: company/templates/company/detail.html:67 order/models.py:464 #: order/templates/order/sales_order_base.html:94 stock/models.py:449 #: stock/models.py:450 stock/templates/stock/item_base.html:262 #: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1072 +#: templates/js/stock.js:1097 msgid "Customer" msgstr "" @@ -2215,7 +2268,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:66 #: company/templates/company/detail_supplier_part.html:66 #: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1287 +#: templates/js/stock.js:1312 msgid "New Part" msgstr "" @@ -2248,13 +2301,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:11 #: company/templates/company/manufacturer_part_navbar.html:11 -#: company/templates/company/manufacturer_part_suppliers.html:10 #: templates/InvenTree/search.html:164 msgid "Supplier Parts" msgstr "" #: company/templates/company/detail_supplier_part.html:21 -#: order/templates/order/order_wizard/select_parts.html:42 +#: order/templates/order/order_wizard/select_parts.html:44 #: order/templates/order/purchase_order_detail.html:50 msgid "Create new supplier part" msgstr "" @@ -2262,12 +2314,12 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 #: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1293 +#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:47 +#: company/templates/company/manufacturer_part_suppliers.html:82 #: company/views.py:64 order/templates/order/purchase_orders.html:185 #: part/templates/part/supplier.html:50 msgid "New Supplier" @@ -2319,8 +2371,9 @@ msgid "There are %(count)s suppliers defined for this manufacturer part. If you msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 -#: company/views.py:63 part/templates/part/navbar.html:84 -#: part/templates/part/navbar.html:87 templates/InvenTree/search.html:316 +#: company/templates/company/manufacturer_part_suppliers.html:10 +#: company/views.py:63 part/templates/part/navbar.html:86 +#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 #: templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2332,13 +2385,13 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:36 stock/api.py:54 +#: part/templates/part/navbar.html:38 stock/api.py:54 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 #: templates/InvenTree/search.html:232 #: templates/InvenTree/settings/tabs.html:31 templates/js/part.js:181 -#: templates/js/part.js:305 templates/js/part.js:464 templates/js/stock.js:561 +#: templates/js/part.js:305 templates/js/part.js:465 templates/js/stock.js:566 #: templates/navbar.html:26 msgid "Stock" msgstr "" @@ -2360,11 +2413,25 @@ msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:187 +#: stock/views.py:1002 users/models.py:191 msgid "Delete" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:37 +#: part/templates/part/category_navbar.html:34 +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/navbar.html:24 +msgid "Parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:43 +#: part/templates/part/params.html:18 +#: templates/InvenTree/settings/category.html:29 +#: templates/InvenTree/settings/part.html:48 +msgid "New Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:83 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" @@ -2379,13 +2446,13 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:33 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:971 +#: templates/InvenTree/search.html:198 templates/js/stock.js:996 #: templates/stats.html:93 templates/stats.html:102 users/models.py:42 msgid "Stock Items" msgstr "" @@ -2396,7 +2463,7 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:104 part/templates/part/navbar.html:107 +#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 @@ -2408,7 +2475,7 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:90 part/templates/part/navbar.html:93 +#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 @@ -2442,7 +2509,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:7 #: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:369 templates/js/company.js:279 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 msgid "Supplier Part" msgstr "" @@ -2490,8 +2557,8 @@ msgstr "" msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:794 -#: part/templates/part/sale_prices.html:17 part/views.py:2733 +#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 +#: part/templates/part/sale_prices.html:17 part/views.py:2751 msgid "Add Price Break" msgstr "" @@ -2510,8 +2577,8 @@ msgstr "" msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:78 -#: part/templates/part/navbar.html:81 templates/InvenTree/search.html:306 +#: company/views.py:70 part/templates/part/navbar.html:80 +#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 #: templates/navbar.html:36 msgid "Manufacturers" msgstr "" @@ -2533,20 +2600,20 @@ msgstr "" msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:937 +#: company/views.py:169 part/views.py:948 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:969 +#: company/views.py:198 part/views.py:980 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:976 +#: company/views.py:205 part/views.py:987 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:985 +#: company/views.py:214 part/views.py:996 msgid "Supplied URL is not a valid image file" msgstr "" @@ -2594,27 +2661,35 @@ msgstr "" msgid "Delete Manufacturer Part" msgstr "" -#: company/views.py:528 +#: company/views.py:514 +msgid "Add Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:548 +msgid "Edit Manufacturer Part Parameter" +msgstr "" + +#: company/views.py:588 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:578 templates/js/stock.js:1294 +#: company/views.py:639 templates/js/stock.js:1319 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:722 +#: company/views.py:783 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:799 part/views.py:2737 +#: company/views.py:860 part/views.py:2755 msgid "Added new price break" msgstr "" -#: company/views.py:855 part/views.py:2781 +#: company/views.py:916 part/views.py:2799 msgid "Edit Price Break" msgstr "" -#: company/views.py:870 part/views.py:2795 +#: company/views.py:931 part/views.py:2813 msgid "Delete Price Break" msgstr "" @@ -2638,7 +2713,7 @@ msgstr "" msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:274 +#: label/models.py:124 report/models.py:297 msgid "Enabled" msgstr "" @@ -2662,7 +2737,7 @@ msgstr "" msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 +#: label/models.py:144 report/models.py:290 msgid "Filename Pattern" msgstr "" @@ -2674,8 +2749,8 @@ msgstr "" msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:294 -#: report/models.py:415 report/models.py:449 +#: label/models.py:245 label/models.py:298 report/models.py:317 +#: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" @@ -2696,237 +2771,239 @@ msgstr "" msgid "Ship order" msgstr "" -#: order/forms.py:82 +#: order/forms.py:86 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:103 +#: order/forms.py:108 msgid "Purchase Order reference" msgstr "" -#: order/forms.py:110 +#: order/forms.py:115 msgid "Target date for order delivery. Order will be overdue after this date." msgstr "" -#: order/forms.py:138 +#: order/forms.py:143 msgid "Enter sales order number" msgstr "" -#: order/forms.py:145 order/models.py:475 +#: order/forms.py:150 order/models.py:476 msgid "Target date for order completion. Order will be overdue after this date." msgstr "" -#: order/forms.py:236 +#: order/forms.py:242 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:242 +#: order/forms.py:248 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:101 +#: order/models.py:102 msgid "Order reference" msgstr "" -#: order/models.py:103 +#: order/models.py:104 msgid "Order description" msgstr "" -#: order/models.py:105 +#: order/models.py:106 msgid "Link to external page" msgstr "" -#: order/models.py:113 part/templates/part/detail.html:132 +#: order/models.py:114 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:120 +#: order/models.py:121 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:125 +#: order/models.py:126 msgid "Order notes" msgstr "" -#: order/models.py:184 order/models.py:468 +#: order/models.py:185 order/models.py:469 msgid "Purchase order status" msgstr "" -#: order/models.py:193 +#: order/models.py:194 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:196 order/templates/order/order_base.html:98 +#: order/models.py:197 order/templates/order/order_base.html:98 #: templates/js/order.js:179 msgid "Supplier Reference" msgstr "" -#: order/models.py:196 +#: order/models.py:197 msgid "Supplier order reference code" msgstr "" -#: order/models.py:203 +#: order/models.py:204 msgid "received by" msgstr "" -#: order/models.py:208 +#: order/models.py:209 msgid "Issue Date" msgstr "" -#: order/models.py:209 +#: order/models.py:210 msgid "Date order was issued" msgstr "" -#: order/models.py:214 +#: order/models.py:215 msgid "Target Delivery Date" msgstr "" -#: order/models.py:215 +#: order/models.py:216 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:221 +#: order/models.py:222 msgid "Date order was completed" msgstr "" -#: order/models.py:245 part/views.py:1675 stock/models.py:304 +#: order/models.py:246 part/views.py:1686 stock/models.py:304 #: stock/models.py:1020 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:250 +#: order/models.py:251 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:348 +#: order/models.py:349 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:352 +#: order/models.py:353 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:354 +#: order/models.py:355 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:464 +#: order/models.py:465 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer Reference " msgstr "" -#: order/models.py:470 +#: order/models.py:471 msgid "Customer order reference code" msgstr "" -#: order/models.py:478 templates/js/order.js:303 +#: order/models.py:479 templates/js/order.js:303 msgid "Shipment Date" msgstr "" -#: order/models.py:485 +#: order/models.py:486 msgid "shipped by" msgstr "" -#: order/models.py:529 +#: order/models.py:530 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:616 +#: order/models.py:617 msgid "Item quantity" msgstr "" -#: order/models.py:618 +#: order/models.py:619 msgid "Line item reference" msgstr "" -#: order/models.py:620 +#: order/models.py:621 msgid "Line item notes" msgstr "" -#: order/models.py:646 order/models.py:691 -#: part/templates/part/allocation.html:17 -#: part/templates/part/allocation.html:45 +#: order/models.py:647 order/models.py:715 templates/js/order.js:353 msgid "Order" msgstr "" -#: order/models.py:647 order/templates/order/order_base.html:9 +#: order/models.py:648 order/templates/order/order_base.html:9 #: order/templates/order/order_base.html:24 #: report/templates/report/inventree_po_report.html:77 #: stock/templates/stock/item_base.html:324 templates/js/order.js:148 -#: templates/js/stock.js:1053 +#: templates/js/stock.js:669 templates/js/stock.js:1078 msgid "Purchase Order" msgstr "" -#: order/models.py:661 +#: order/models.py:662 msgid "Supplier part" msgstr "" -#: order/models.py:664 order/templates/order/order_base.html:131 +#: order/models.py:665 order/templates/order/order_base.html:131 #: order/templates/order/purchase_order_detail.html:219 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:664 +#: order/models.py:665 msgid "Number of items received" msgstr "" -#: order/models.py:671 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:665 +#: order/models.py:672 stock/models.py:542 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 msgid "Purchase Price" msgstr "" -#: order/models.py:672 +#: order/models.py:673 msgid "Unit purchase price" msgstr "" -#: order/models.py:700 part/templates/part/navbar.html:101 -#: part/templates/part/order_prices.html:82 -#: part/templates/part/part_pricing.html:78 +#: order/models.py:681 +msgid "Where does the Purchaser want this item to be stored?" +msgstr "" + +#: order/models.py:724 part/templates/part/navbar.html:109 +#: part/templates/part/order_prices.html:107 +#: part/templates/part/part_pricing.html:97 msgid "Sale Price" msgstr "" -#: order/models.py:701 +#: order/models.py:725 msgid "Unit sale price" msgstr "" -#: order/models.py:776 order/models.py:778 +#: order/models.py:800 order/models.py:802 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:782 +#: order/models.py:806 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:784 +#: order/models.py:808 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:787 +#: order/models.py:811 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:797 +#: order/models.py:821 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:802 +#: order/models.py:826 msgid "Line" msgstr "" -#: order/models.py:813 +#: order/models.py:837 msgid "Item" msgstr "" -#: order/models.py:814 +#: order/models.py:838 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:817 +#: order/models.py:841 msgid "Enter stock allocation quantity" msgstr "" @@ -2955,7 +3032,7 @@ msgid "Export order to file" msgstr "" #: order/templates/order/order_base.html:72 -#: order/templates/order/po_navbar.html:11 +#: order/templates/order/po_navbar.html:12 msgid "Purchase Order Details" msgstr "" @@ -2977,8 +3054,8 @@ msgstr "" #: order/templates/order/order_base.html:180 #: order/templates/order/purchase_order_detail.html:100 #: part/templates/part/category.html:208 part/templates/part/category.html:250 -#: stock/templates/stock/location.html:191 templates/js/stock.js:711 -#: templates/js/stock.js:1299 +#: stock/templates/stock/location.html:191 templates/js/stock.js:736 +#: templates/js/stock.js:1324 msgid "New Location" msgstr "" @@ -3081,28 +3158,32 @@ msgstr "" msgid "Order is already processed. Files cannot be uploaded." msgstr "" -#: order/templates/order/order_wizard/select_parts.html:9 +#: order/templates/order/order_wizard/select_parts.html:11 msgid "Step 1 of 2 - Select Part Suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:14 +#: order/templates/order/order_wizard/select_parts.html:16 msgid "Select suppliers" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:18 +#: order/templates/order/order_wizard/select_parts.html:20 msgid "No purchaseable parts selected" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:31 +#: order/templates/order/order_wizard/select_parts.html:33 msgid "Select Supplier" msgstr "" #: order/templates/order/order_wizard/select_parts.html:57 +msgid "No price" +msgstr "" + +#: order/templates/order/order_wizard/select_parts.html:65 #, python-format msgid "Select a supplier for %(name)s" msgstr "" -#: order/templates/order/order_wizard/select_parts.html:69 +#: order/templates/order/order_wizard/select_parts.html:77 #: part/templates/part/set_category.html:32 msgid "Remove part" msgstr "" @@ -3135,15 +3216,20 @@ msgid "Select a purchase order for %(name)s" msgstr "" #: order/templates/order/po_attachments.html:12 -#: order/templates/order/po_navbar.html:23 +#: order/templates/order/po_navbar.html:32 msgid "Purchase Order Attachments" msgstr "" -#: order/templates/order/po_navbar.html:17 +#: order/templates/order/po_lineitem_delete.html:5 +#: order/templates/order/so_lineitem_delete.html:5 +msgid "Are you sure you wish to delete this line item?" +msgstr "" + +#: order/templates/order/po_navbar.html:26 msgid "Received Stock Items" msgstr "" -#: order/templates/order/po_navbar.html:20 +#: order/templates/order/po_navbar.html:29 #: order/templates/order/po_received_items.html:12 msgid "Received Items" msgstr "" @@ -3153,8 +3239,8 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1311 -#: order/views.py:1394 +#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 +#: order/views.py:1404 msgid "Add Line Item" msgstr "" @@ -3162,25 +3248,31 @@ msgstr "" msgid "No line items found" msgstr "" +#: order/templates/order/purchase_order_detail.html:142 +#: order/templates/order/sales_order_detail.html:223 +msgid "Total" +msgstr "" + #: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:235 +#: order/templates/order/sales_order_detail.html:246 msgid "Unit Price" msgstr "" #: order/templates/order/purchase_order_detail.html:198 +#: order/templates/order/sales_order_detail.html:253 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:251 -#: order/templates/order/sales_order_detail.html:328 +#: order/templates/order/purchase_order_detail.html:255 +#: order/templates/order/sales_order_detail.html:359 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:252 +#: order/templates/order/purchase_order_detail.html:256 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:257 +#: order/templates/order/purchase_order_detail.html:261 msgid "Receive line item" msgstr "" @@ -3201,7 +3293,7 @@ msgstr "" #: part/templates/part/category_navbar.html:29 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 -#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:665 +#: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 #: users/models.py:40 msgid "Parts" @@ -3216,7 +3308,7 @@ msgid "Order Code" msgstr "" #: order/templates/order/receive_parts.html:21 -#: part/templates/part/part_base.html:136 templates/js/part.js:480 +#: part/templates/part/part_base.html:136 templates/js/part.js:481 msgid "On Order" msgstr "" @@ -3224,11 +3316,11 @@ msgstr "" msgid "Receive" msgstr "" -#: order/templates/order/receive_parts.html:36 +#: order/templates/order/receive_parts.html:37 msgid "Error: Referenced part has been removed" msgstr "" -#: order/templates/order/receive_parts.html:57 +#: order/templates/order/receive_parts.html:61 msgid "Remove line" msgstr "" @@ -3265,17 +3357,17 @@ msgid "Sales Order Items" msgstr "" #: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:637 templates/js/build.js:1054 +#: templates/js/build.js:724 templates/js/build.js:1141 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:525 -#: templates/js/build.js:859 +#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 +#: templates/js/build.js:946 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:527 -#: templates/js/build.js:860 +#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 +#: templates/js/build.js:947 msgid "Delete stock allocation" msgstr "" @@ -3283,50 +3375,50 @@ msgstr "" msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:205 +#: order/templates/order/sales_order_detail.html:206 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:243 templates/js/build.js:589 -#: templates/js/build.js:855 +#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 +#: templates/js/build.js:942 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:245 +#: order/templates/order/sales_order_detail.html:276 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:313 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:312 +#: order/templates/order/sales_order_detail.html:343 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:315 templates/js/build.js:651 +#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:318 +#: order/templates/order/sales_order_detail.html:349 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:322 templates/js/build.js:644 -#: templates/js/build.js:1062 +#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 +#: templates/js/build.js:1149 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:325 -#: order/templates/order/sales_order_detail.html:434 +#: order/templates/order/sales_order_detail.html:356 +#: order/templates/order/sales_order_detail.html:465 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:329 +#: order/templates/order/sales_order_detail.html:360 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:440 +#: order/templates/order/sales_order_detail.html:471 msgid "Update Unit Price" msgstr "" @@ -3367,10 +3459,6 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/templates/order/so_lineitem_delete.html:5 -msgid "Are you sure you wish to delete this line item?" -msgstr "" - #: order/views.py:104 msgid "Add Purchase Order Attachment" msgstr "" @@ -3471,90 +3559,94 @@ msgstr "" msgid "No lines specified" msgstr "" -#: order/views.py:1260 +#: order/views.py:1012 +msgid "Update prices" +msgstr "" + +#: order/views.py:1270 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1320 +#: order/views.py:1330 msgid "Supplier part must be specified" msgstr "" -#: order/views.py:1326 +#: order/views.py:1336 msgid "Supplier must match for Part and Order" msgstr "" -#: order/views.py:1457 order/views.py:1475 +#: order/views.py:1467 order/views.py:1485 msgid "Edit Line Item" msgstr "" -#: order/views.py:1491 order/views.py:1503 +#: order/views.py:1501 order/views.py:1513 msgid "Delete Line Item" msgstr "" -#: order/views.py:1496 order/views.py:1508 +#: order/views.py:1506 order/views.py:1518 msgid "Deleted line item" msgstr "" -#: order/views.py:1521 +#: order/views.py:1531 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1566 +#: order/views.py:1576 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1582 +#: order/views.py:1592 msgid "Select line item" msgstr "" -#: order/views.py:1613 -#, python-brace-format -msgid "No matching item for serial {serial}" -msgstr "" - #: order/views.py:1623 #, python-brace-format +msgid "No matching item for serial {serial}" +msgstr "" + +#: order/views.py:1633 +#, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1631 +#: order/views.py:1641 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1685 +#: order/views.py:1695 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1759 +#: order/views.py:1769 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1774 +#: order/views.py:1784 msgid "Remove allocation" msgstr "" -#: order/views.py:1846 +#: order/views.py:1856 msgid "Sales order not found" msgstr "" -#: order/views.py:1852 +#: order/views.py:1862 msgid "Price not found" msgstr "" -#: order/views.py:1855 +#: order/views.py:1865 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1860 +#: order/views.py:1870 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:762 +#: part/bom.py:138 part/models.py:72 part/models.py:747 #: part/templates/part/category.html:66 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3632,7 +3724,7 @@ msgstr "" msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2168 +#: part/forms.py:122 part/models.py:2191 msgid "Parent Part" msgstr "" @@ -3708,7 +3800,7 @@ msgstr "" msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2263 +#: part/forms.py:344 part/models.py:2286 msgid "Sub part" msgstr "" @@ -3728,7 +3820,7 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2214 +#: part/models.py:82 part/models.py:2237 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" @@ -3739,365 +3831,360 @@ msgstr "" msgid "Part Categories" msgstr "" -#: part/models.py:446 part/models.py:458 +#: part/models.py:448 part/models.py:460 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:555 +#: part/models.py:557 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:559 +#: part/models.py:561 msgid "Next available serial number is" msgstr "" -#: part/models.py:564 +#: part/models.py:566 msgid "Most recent serial number is" msgstr "" -#: part/models.py:643 +#: part/models.py:645 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:654 -msgid "Part must be unique for name, IPN and revision" -msgstr "" - -#: part/models.py:685 part/templates/part/detail.html:22 +#: part/models.py:670 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:692 +#: part/models.py:677 msgid "Is Template" msgstr "" -#: part/models.py:693 +#: part/models.py:678 msgid "Is this part a template part?" msgstr "" -#: part/models.py:704 +#: part/models.py:689 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:705 part/templates/part/detail.html:60 +#: part/models.py:690 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:711 +#: part/models.py:696 msgid "Part description" msgstr "" -#: part/models.py:716 part/templates/part/category.html:73 +#: part/models.py:701 part/templates/part/category.html:73 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:717 +#: part/models.py:702 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:724 part/models.py:2213 part/templates/part/detail.html:73 -#: part/templates/part/set_category.html:15 templates/js/part.js:451 +#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:725 +#: part/models.py:710 msgid "Part category" msgstr "" -#: part/models.py:730 part/templates/part/detail.html:28 +#: part/models.py:715 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:731 +#: part/models.py:716 msgid "Internal Part Number" msgstr "" -#: part/models.py:737 +#: part/models.py:722 msgid "Part revision or version number" msgstr "" -#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198 +#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:760 +#: part/models.py:745 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:807 part/templates/part/detail.html:97 +#: part/models.py:792 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:808 +#: part/models.py:793 msgid "Default supplier part" msgstr "" -#: part/models.py:815 +#: part/models.py:800 msgid "Default Expiry" msgstr "" -#: part/models.py:816 +#: part/models.py:801 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:821 part/templates/part/detail.html:113 +#: part/models.py:806 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:822 +#: part/models.py:807 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:828 part/models.py:2142 part/templates/part/detail.html:106 -#: part/templates/part/params.html:29 -msgid "Units" -msgstr "" - -#: part/models.py:829 +#: part/models.py:814 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:835 +#: part/models.py:820 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:841 +#: part/models.py:826 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:847 +#: part/models.py:832 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:852 +#: part/models.py:837 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:857 +#: part/models.py:842 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:861 part/templates/part/detail.html:227 +#: part/models.py:846 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 #: templates/js/table_filters.js:241 templates/js/table_filters.js:310 msgid "Active" msgstr "" -#: part/models.py:862 +#: part/models.py:847 msgid "Is this part active?" msgstr "" -#: part/models.py:867 +#: part/models.py:852 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:872 +#: part/models.py:857 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "BOM checksum" msgstr "" -#: part/models.py:875 +#: part/models.py:860 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:878 +#: part/models.py:863 msgid "BOM checked by" msgstr "" -#: part/models.py:880 +#: part/models.py:865 msgid "BOM checked date" msgstr "" -#: part/models.py:884 +#: part/models.py:869 msgid "Creation User" msgstr "" -#: part/models.py:1616 +#: part/models.py:1608 msgid "Sell multiple" msgstr "" -#: part/models.py:2040 +#: part/models.py:2063 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2057 +#: part/models.py:2080 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2077 templates/js/part.js:716 templates/js/stock.js:117 +#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2078 +#: part/models.py:2101 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2083 +#: part/models.py:2106 msgid "Test Description" msgstr "" -#: part/models.py:2084 +#: part/models.py:2107 msgid "Enter description for this test" msgstr "" -#: part/models.py:2089 templates/js/part.js:725 +#: part/models.py:2112 templates/js/part.js:726 #: templates/js/table_filters.js:227 msgid "Required" msgstr "" -#: part/models.py:2090 +#: part/models.py:2113 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2095 templates/js/part.js:733 +#: part/models.py:2118 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2096 +#: part/models.py:2119 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2101 templates/js/part.js:740 +#: part/models.py:2124 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2102 +#: part/models.py:2125 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2135 +#: part/models.py:2158 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2140 +#: part/models.py:2163 msgid "Parameter Name" msgstr "" -#: part/models.py:2142 +#: part/models.py:2165 msgid "Parameter Units" msgstr "" -#: part/models.py:2170 part/models.py:2219 part/models.py:2220 +#: part/models.py:2193 part/models.py:2242 part/models.py:2243 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Data" msgstr "" -#: part/models.py:2172 +#: part/models.py:2195 msgid "Parameter Value" msgstr "" -#: part/models.py:2224 templates/InvenTree/settings/category.html:67 +#: part/models.py:2247 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2225 +#: part/models.py:2248 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2255 +#: part/models.py:2278 msgid "Select parent part" msgstr "" -#: part/models.py:2264 +#: part/models.py:2287 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2270 +#: part/models.py:2293 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2272 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 msgid "Optional" msgstr "" -#: part/models.py:2272 +#: part/models.py:2295 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2275 +#: part/models.py:2298 msgid "Overage" msgstr "" -#: part/models.py:2276 +#: part/models.py:2299 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2279 +#: part/models.py:2302 msgid "BOM item reference" msgstr "" -#: part/models.py:2282 +#: part/models.py:2305 msgid "BOM item notes" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "Checksum" msgstr "" -#: part/models.py:2284 +#: part/models.py:2307 msgid "BOM line checksum" msgstr "" -#: part/models.py:2288 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2289 +#: part/models.py:2312 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2294 templates/js/bom.js:294 +#: part/models.py:2317 templates/js/bom.js:294 msgid "Allow Variants" msgstr "" -#: part/models.py:2295 +#: part/models.py:2318 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2371 part/views.py:1681 part/views.py:1733 +#: part/models.py:2394 part/views.py:1692 part/views.py:1744 #: stock/models.py:294 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2380 part/models.py:2382 +#: part/models.py:2403 part/models.py:2405 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2385 +#: part/models.py:2408 msgid "BOM Item" msgstr "" -#: part/models.py:2502 +#: part/models.py:2527 msgid "Part 1" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Part 2" msgstr "" -#: part/models.py:2506 +#: part/models.py:2531 msgid "Select Related Part" msgstr "" -#: part/models.py:2538 +#: part/models.py:2563 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" #: part/templates/part/allocation.html:11 -msgid "Part Stock Allocations" +msgid "Build Order Allocations" +msgstr "" + +#: part/templates/part/allocation.html:24 +msgid "Sales Order Allocations" msgstr "" #: part/templates/part/attachments.html:10 @@ -4112,8 +4199,8 @@ msgstr "" msgid "Deleting this entry will remove the BOM row from the following part" msgstr "" -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:48 -#: part/templates/part/navbar.html:51 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 +#: part/templates/part/navbar.html:53 msgid "Bill of Materials" msgstr "" @@ -4160,7 +4247,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1976 +#: part/templates/part/bom.html:61 part/views.py:1987 msgid "Export Bill of Materials" msgstr "" @@ -4177,7 +4264,7 @@ msgid "All selected BOM items will be deleted" msgstr "" #: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1288 +#: templates/js/stock.js:1313 msgid "Create New Part" msgstr "" @@ -4258,7 +4345,7 @@ msgstr "" msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2379 +#: part/templates/part/category.html:29 part/views.py:2397 msgid "Create new part category" msgstr "" @@ -4318,7 +4405,7 @@ msgid "View grid display" msgstr "" #: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:712 +#: stock/templates/stock/location.html:192 templates/js/stock.js:737 msgid "Create new location" msgstr "" @@ -4373,14 +4460,8 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:22 -msgid "Parameters" -msgstr "" - #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:19 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" @@ -4408,7 +4489,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:11 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 msgid "Part Details" msgstr "" @@ -4488,6 +4569,36 @@ msgstr "" msgid "Part is not active" msgstr "" +#: part/templates/part/internal_prices.html:11 +#: part/templates/part/navbar.html:100 +msgid "Internal Price Information" +msgstr "" + +#: part/templates/part/internal_prices.html:19 part/views.py:2822 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/internal_prices.html:28 templates/403.html:5 +#: templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: part/templates/part/internal_prices.html:31 templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + +#: part/templates/part/internal_prices.html:59 +msgid "No internal price break information found" +msgstr "" + +#: part/templates/part/internal_prices.html:110 +msgid "Edit internal price break" +msgstr "" + +#: part/templates/part/internal_prices.html:111 +msgid "Delete internal price break" +msgstr "" + #: part/templates/part/manufacturer.html:11 msgid "Part Manufacturers" msgstr "" @@ -4501,127 +4612,141 @@ msgstr "" msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:26 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:29 +#: part/templates/part/navbar.html:31 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:40 +#: part/templates/part/navbar.html:42 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:43 +#: part/templates/part/navbar.html:45 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:64 part/templates/part/navbar.html:67 +#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:72 part/templates/part/order_prices.html:12 +#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 msgid "Order Price Information" msgstr "" -#: part/templates/part/navbar.html:75 +#: part/templates/part/navbar.html:77 msgid "Order Price" msgstr "" -#: part/templates/part/navbar.html:98 +#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 +#: part/templates/part/part_pricing.html:82 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/navbar.html:106 msgid "Sales Price Information" msgstr "" -#: part/templates/part/navbar.html:112 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:115 stock/templates/stock/item_base.html:409 +#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:119 part/templates/part/navbar.html:122 +#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:131 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:21 +#: part/templates/part/order_prices.html:24 +#: part/templates/part/part_base.html:282 +msgid "Calculate" +msgstr "" + +#: part/templates/part/order_prices.html:31 msgid "Pricing ranges" msgstr "" -#: part/templates/part/order_prices.html:26 -#: part/templates/part/part_pricing.html:19 +#: part/templates/part/order_prices.html:36 +#: part/templates/part/part_pricing.html:22 msgid "Supplier Pricing" msgstr "" -#: part/templates/part/order_prices.html:27 -#: part/templates/part/order_prices.html:52 -#: part/templates/part/order_prices.html:83 -#: part/templates/part/part_pricing.html:23 -#: part/templates/part/part_pricing.html:49 -#: part/templates/part/part_pricing.html:81 +#: part/templates/part/order_prices.html:37 +#: part/templates/part/order_prices.html:62 +#: part/templates/part/order_prices.html:94 +#: part/templates/part/order_prices.html:108 +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 msgid "Unit Cost" msgstr "" -#: part/templates/part/order_prices.html:34 -#: part/templates/part/order_prices.html:59 -#: part/templates/part/order_prices.html:88 -#: part/templates/part/part_pricing.html:29 -#: part/templates/part/part_pricing.html:55 -#: part/templates/part/part_pricing.html:85 +#: part/templates/part/order_prices.html:44 +#: part/templates/part/order_prices.html:69 +#: part/templates/part/order_prices.html:99 +#: part/templates/part/order_prices.html:113 +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 msgid "Total Cost" msgstr "" -#: part/templates/part/order_prices.html:42 -#: part/templates/part/part_pricing.html:37 +#: part/templates/part/order_prices.html:52 +#: part/templates/part/part_pricing.html:40 msgid "No supplier pricing available" msgstr "" -#: part/templates/part/order_prices.html:51 -#: part/templates/part/order_prices.html:103 -#: part/templates/part/part_pricing.html:45 +#: part/templates/part/order_prices.html:61 +#: part/templates/part/order_prices.html:128 +#: part/templates/part/part_pricing.html:48 msgid "BOM Pricing" msgstr "" -#: part/templates/part/order_prices.html:67 -#: part/templates/part/part_pricing.html:63 +#: part/templates/part/order_prices.html:77 +#: part/templates/part/part_pricing.html:66 msgid "Note: BOM pricing is incomplete for this part" msgstr "" -#: part/templates/part/order_prices.html:74 -#: part/templates/part/part_pricing.html:70 +#: part/templates/part/order_prices.html:84 +#: part/templates/part/part_pricing.html:73 msgid "No BOM pricing available" msgstr "" -#: part/templates/part/order_prices.html:97 -#: part/templates/part/part_pricing.html:94 +#: part/templates/part/order_prices.html:122 +#: part/templates/part/part_pricing.html:113 msgid "No pricing information is available for this part." msgstr "" -#: part/templates/part/order_prices.html:113 +#: part/templates/part/order_prices.html:138 msgid "Stock Pricing" msgstr "" -#: part/templates/part/order_prices.html:121 +#: part/templates/part/order_prices.html:146 msgid "No stock pricing history is available for this part." msgstr "" -#: part/templates/part/order_prices.html:140 +#: part/templates/part/order_prices.html:165 #, python-format msgid "Single Price - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:152 +#: part/templates/part/order_prices.html:177 #, python-format msgid "Single Price Difference - %(currency)s" msgstr "" -#: part/templates/part/order_prices.html:163 +#: part/templates/part/order_prices.html:189 #, python-format msgid "Part Single Price - %(currency)s" msgstr "" @@ -4630,19 +4755,6 @@ msgstr "" msgid "Add new parameter" msgstr "" -#: part/templates/part/params.html:18 -#: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:44 -msgid "New Parameter" -msgstr "" - -#: part/templates/part/params.html:28 -#: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/stock.js:137 -msgid "Value" -msgstr "" - #: part/templates/part/params.html:41 templates/InvenTree/settings/user.html:19 msgid "Edit" msgstr "" @@ -4660,7 +4772,7 @@ msgid "Part List" msgstr "" #: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:254 templates/js/part.js:84 templates/js/part.js:161 +#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4740,14 +4852,10 @@ msgid "Can Build" msgstr "" #: part/templates/part/part_base.html:178 templates/js/part.js:312 -#: templates/js/part.js:484 +#: templates/js/part.js:485 msgid "Building" msgstr "" -#: part/templates/part/part_base.html:265 -msgid "Calculate" -msgstr "" - #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" @@ -4816,7 +4924,7 @@ msgid "Showing stock for all variants of %(full_name)s" msgstr "" #: part/templates/part/stock_count.html:7 templates/js/bom.js:239 -#: templates/js/part.js:302 templates/js/part.js:488 +#: templates/js/part.js:302 templates/js/part.js:489 msgid "No Stock" msgstr "" @@ -4853,7 +4961,7 @@ msgstr "" msgid "New Variant" msgstr "" -#: part/templatetags/inventree_extras.py:98 +#: part/templatetags/inventree_extras.py:99 msgid "Unknown database" msgstr "" @@ -4922,227 +5030,239 @@ msgstr "" msgid "Created new part" msgstr "" -#: part/views.py:914 +#: part/views.py:925 msgid "Part QR Code" msgstr "" -#: part/views.py:1016 +#: part/views.py:1027 msgid "Upload Part Image" msgstr "" -#: part/views.py:1022 part/views.py:1057 +#: part/views.py:1033 part/views.py:1068 msgid "Updated part image" msgstr "" -#: part/views.py:1031 +#: part/views.py:1042 msgid "Select Part Image" msgstr "" -#: part/views.py:1060 +#: part/views.py:1071 msgid "Part image not found" msgstr "" -#: part/views.py:1071 +#: part/views.py:1082 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1106 +#: part/views.py:1117 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1136 +#: part/views.py:1147 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1157 +#: part/views.py:1168 msgid "Validate BOM" msgstr "" -#: part/views.py:1178 +#: part/views.py:1189 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1189 +#: part/views.py:1200 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1323 +#: part/views.py:1334 msgid "No BOM file provided" msgstr "" -#: part/views.py:1684 +#: part/views.py:1695 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1709 part/views.py:1712 +#: part/views.py:1720 part/views.py:1723 msgid "Select valid part" msgstr "" -#: part/views.py:1718 +#: part/views.py:1729 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1756 +#: part/views.py:1767 msgid "Select a part" msgstr "" -#: part/views.py:1762 +#: part/views.py:1773 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1766 +#: part/views.py:1777 msgid "Specify quantity" msgstr "" -#: part/views.py:2028 +#: part/views.py:2039 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2035 +#: part/views.py:2046 msgid "Part was deleted" msgstr "" -#: part/views.py:2044 +#: part/views.py:2055 msgid "Part Pricing" msgstr "" -#: part/views.py:2178 +#: part/views.py:2196 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2188 +#: part/views.py:2206 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2195 +#: part/views.py:2213 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2203 +#: part/views.py:2221 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2253 +#: part/views.py:2271 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2267 +#: part/views.py:2285 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2327 +#: part/views.py:2345 msgid "Edit Part Category" msgstr "" -#: part/views.py:2365 +#: part/views.py:2383 msgid "Delete Part Category" msgstr "" -#: part/views.py:2371 +#: part/views.py:2389 msgid "Part category was deleted" msgstr "" -#: part/views.py:2423 +#: part/views.py:2441 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2524 +#: part/views.py:2542 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2580 +#: part/views.py:2598 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2599 +#: part/views.py:2617 msgid "Create BOM Item" msgstr "" -#: part/views.py:2669 +#: part/views.py:2687 msgid "Edit BOM item" msgstr "" -#: part/views.py:2725 +#: part/views.py:2743 msgid "Confim BOM item deletion" msgstr "" -#: report/models.py:180 +#: part/views.py:2831 +msgid "Edit Internal Price Break" +msgstr "" + +#: part/views.py:2839 +msgid "Delete Internal Price Break" +msgstr "" + +#: report/models.py:181 msgid "Template name" msgstr "" -#: report/models.py:186 +#: report/models.py:187 msgid "Report template file" msgstr "" -#: report/models.py:193 +#: report/models.py:194 msgid "Report template description" msgstr "" -#: report/models.py:199 +#: report/models.py:200 msgid "Report revision number (auto-increments)" msgstr "" -#: report/models.py:275 +#: report/models.py:291 +msgid "Pattern for generating report filenames" +msgstr "" + +#: report/models.py:298 msgid "Report template is enabled" msgstr "" -#: report/models.py:295 +#: report/models.py:318 msgid "StockItem query filters (comma-separated list of key=value pairs)" msgstr "" -#: report/models.py:303 +#: report/models.py:326 msgid "Include Installed Tests" msgstr "" -#: report/models.py:304 +#: report/models.py:327 msgid "Include test results for stock items installed inside assembled item" msgstr "" -#: report/models.py:347 +#: report/models.py:371 msgid "Build Filters" msgstr "" -#: report/models.py:348 +#: report/models.py:372 msgid "Build query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:385 +#: report/models.py:410 msgid "Part Filters" msgstr "" -#: report/models.py:386 +#: report/models.py:411 msgid "Part query filters (comma-separated list of key=value pairs" msgstr "" -#: report/models.py:416 +#: report/models.py:441 msgid "Purchase order query filters" msgstr "" -#: report/models.py:450 +#: report/models.py:475 msgid "Sales order query filters" msgstr "" -#: report/models.py:500 +#: report/models.py:525 msgid "Snippet" msgstr "" -#: report/models.py:501 +#: report/models.py:526 msgid "Report snippet file" msgstr "" -#: report/models.py:505 +#: report/models.py:530 msgid "Snippet file description" msgstr "" -#: report/models.py:540 +#: report/models.py:565 msgid "Asset" msgstr "" -#: report/models.py:541 +#: report/models.py:566 msgid "Report asset file" msgstr "" -#: report/models.py:544 +#: report/models.py:569 msgid "Asset file description" msgstr "" @@ -5174,7 +5294,7 @@ msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:987 +#: templates/js/order.js:195 templates/js/stock.js:1012 msgid "Date" msgstr "" @@ -5197,7 +5317,7 @@ msgid "Moved {n} parts to {loc}" msgstr "" #: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 -#: stock/templates/stock/item_base.html:376 templates/js/stock.js:654 +#: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" @@ -5483,12 +5603,12 @@ msgid "Stock Item Attachments" msgstr "" #: stock/templates/stock/item_base.html:33 -#: stock/templates/stock/item_base.html:380 templates/js/table_filters.js:150 +#: stock/templates/stock/item_base.html:385 templates/js/table_filters.js:150 msgid "Expired" msgstr "" #: stock/templates/stock/item_base.html:43 -#: stock/templates/stock/item_base.html:382 templates/js/table_filters.js:155 +#: stock/templates/stock/item_base.html:387 templates/js/table_filters.js:155 msgid "Stale" msgstr "" @@ -5618,7 +5738,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:508 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 msgid "No location set" msgstr "" @@ -5630,25 +5750,29 @@ msgstr "" msgid "Parent Item" msgstr "" -#: stock/templates/stock/item_base.html:380 +#: stock/templates/stock/item_base.html:356 +msgid "No manufacturer set" +msgstr "" + +#: stock/templates/stock/item_base.html:385 #, python-format msgid "This StockItem expired on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:382 +#: stock/templates/stock/item_base.html:387 #, python-format msgid "This StockItem expires on %(item.expiry_date)s" msgstr "" -#: stock/templates/stock/item_base.html:389 templates/js/stock.js:660 +#: stock/templates/stock/item_base.html:394 templates/js/stock.js:664 msgid "Last Updated" msgstr "" -#: stock/templates/stock/item_base.html:394 +#: stock/templates/stock/item_base.html:399 msgid "Last Stocktake" msgstr "" -#: stock/templates/stock/item_base.html:398 +#: stock/templates/stock/item_base.html:403 msgid "No stocktake performed" msgstr "" @@ -5945,7 +6069,7 @@ msgstr "" msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:183 +#: stock/views.py:1001 users/models.py:187 msgid "Add" msgstr "" @@ -6011,7 +6135,7 @@ msgstr "" msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:244 +#: stock/views.py:1575 templates/js/build.js:326 msgid "Create new Stock Item" msgstr "" @@ -6043,14 +6167,6 @@ msgstr "" msgid "Add Stock Tracking Entry" msgstr "" -#: templates/403.html:5 templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6119,11 +6235,11 @@ msgstr "" msgid "Enter a search query" msgstr "" -#: templates/InvenTree/search.html:268 templates/js/stock.js:298 +#: templates/InvenTree/search.html:268 templates/js/stock.js:303 msgid "Shipped to customer" msgstr "" -#: templates/InvenTree/search.html:271 templates/js/stock.js:308 +#: templates/InvenTree/search.html:271 templates/js/stock.js:313 msgid "No stock location set" msgstr "" @@ -6168,12 +6284,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:81 +#: templates/InvenTree/settings/part.html:85 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:82 +#: templates/InvenTree/settings/part.html:86 msgid "Delete Template" msgstr "" @@ -6221,11 +6337,11 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:40 +#: templates/InvenTree/settings/part.html:44 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:61 +#: templates/InvenTree/settings/part.html:65 msgid "No part parameter templates found" msgstr "" @@ -6341,47 +6457,51 @@ msgid "API Version" msgstr "" #: templates/about.html:39 +msgid "Python Version" +msgstr "" + +#: templates/about.html:44 msgid "Django Version" msgstr "" -#: templates/about.html:46 +#: templates/about.html:51 msgid "Commit Hash" msgstr "" -#: templates/about.html:53 +#: templates/about.html:58 msgid "Commit Date" msgstr "" -#: templates/about.html:58 +#: templates/about.html:63 msgid "InvenTree Documentation" msgstr "" -#: templates/about.html:63 +#: templates/about.html:68 msgid "View Code on GitHub" msgstr "" -#: templates/about.html:68 +#: templates/about.html:73 msgid "Credits" msgstr "" -#: templates/about.html:73 +#: templates/about.html:78 msgid "Mobile App" msgstr "" -#: templates/about.html:78 +#: templates/about.html:83 msgid "Submit Bug Report" msgstr "" -#: templates/about.html:85 templates/clip.html:4 +#: templates/about.html:90 templates/clip.html:4 msgid "copy to clipboard" msgstr "" -#: templates/about.html:85 +#: templates/about.html:90 msgid "copy version information" msgstr "" -#: templates/about.html:95 templates/js/modals.js:568 -#: templates/js/modals.js:846 templates/modals.html:29 templates/modals.html:54 +#: templates/about.html:100 templates/js/modals.js:568 +#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 #: templates/modals.html:97 msgid "Close" msgstr "" @@ -6442,7 +6562,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:901 +#: templates/js/barcode.js:119 templates/js/modals.js:921 msgid "Invalid server response" msgstr "" @@ -6506,7 +6626,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1004 +#: templates/js/bom.js:175 templates/js/build.js:1091 msgid "Open subassembly" msgstr "" @@ -6542,7 +6662,7 @@ msgstr "" msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:340 templates/js/build.js:1102 +#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 msgid "No BOM items found" msgstr "" @@ -6562,37 +6682,45 @@ msgstr "" msgid "Delete build output" msgstr "" -#: templates/js/build.js:243 templates/stock_table.html:20 +#: templates/js/build.js:184 +msgid "No build order allocations found" +msgstr "" + +#: templates/js/build.js:222 templates/js/order.js:382 +msgid "Location not specified" +msgstr "" + +#: templates/js/build.js:325 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:559 +#: templates/js/build.js:644 msgid "Required Part" msgstr "" -#: templates/js/build.js:580 +#: templates/js/build.js:665 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:648 templates/js/build.js:1066 +#: templates/js/build.js:735 templates/js/build.js:1153 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:701 +#: templates/js/build.js:788 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:718 templates/js/part.js:390 templates/js/part.js:634 -#: templates/js/stock.js:509 templates/js/stock.js:941 +#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:966 msgid "Select" msgstr "" -#: templates/js/build.js:738 +#: templates/js/build.js:825 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:837 +#: templates/js/build.js:924 msgid "No parts allocated for" msgstr "" @@ -6612,17 +6740,29 @@ msgstr "" msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:246 +#: templates/js/company.js:148 templates/js/company.js:347 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:250 +#: templates/js/company.js:152 templates/js/company.js:351 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:227 +#: templates/js/company.js:226 +msgid "No parameters found" +msgstr "" + +#: templates/js/company.js:262 +msgid "Edit parameter" +msgstr "" + +#: templates/js/company.js:263 +msgid "Delete parameter" +msgstr "" + +#: templates/js/company.js:328 msgid "No supplier parts found" msgstr "" @@ -6710,76 +6850,76 @@ msgstr "" msgid "Loading Data" msgstr "" -#: templates/js/modals.js:567 templates/js/modals.js:845 +#: templates/js/modals.js:567 templates/js/modals.js:860 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:797 +#: templates/js/modals.js:811 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:810 +#: templates/js/modals.js:824 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:901 +#: templates/js/modals.js:921 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:911 +#: templates/js/modals.js:931 msgid "No Response" msgstr "" -#: templates/js/modals.js:912 +#: templates/js/modals.js:932 msgid "No response from the InvenTree server" msgstr "" -#: templates/js/modals.js:916 +#: templates/js/modals.js:936 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:917 +#: templates/js/modals.js:937 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:941 msgid "Error 401: Not Authenticated" msgstr "" -#: templates/js/modals.js:922 +#: templates/js/modals.js:942 msgid "Authentication credentials not supplied" msgstr "" -#: templates/js/modals.js:926 +#: templates/js/modals.js:946 msgid "Error 403: Permission Denied" msgstr "" -#: templates/js/modals.js:927 +#: templates/js/modals.js:947 msgid "You do not have the required permissions to access this function" msgstr "" -#: templates/js/modals.js:931 +#: templates/js/modals.js:951 msgid "Error 404: Resource Not Found" msgstr "" -#: templates/js/modals.js:932 +#: templates/js/modals.js:952 msgid "The requested resource could not be located on the server" msgstr "" -#: templates/js/modals.js:936 +#: templates/js/modals.js:956 msgid "Error 408: Timeout" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:957 msgid "Connection timeout while requesting data from server" msgstr "" -#: templates/js/modals.js:940 +#: templates/js/modals.js:960 msgid "Error requesting form data" msgstr "" @@ -6795,6 +6935,10 @@ msgstr "" msgid "No sales orders found" msgstr "" +#: templates/js/order.js:343 +msgid "No sales order allocations found" +msgstr "" + #: templates/js/part.js:10 msgid "YES" msgstr "" @@ -6823,39 +6967,39 @@ msgstr "" msgid "No variants found" msgstr "" -#: templates/js/part.js:280 templates/js/part.js:518 +#: templates/js/part.js:280 templates/js/part.js:519 msgid "No parts found" msgstr "" -#: templates/js/part.js:457 +#: templates/js/part.js:458 msgid "No category" msgstr "" -#: templates/js/part.js:475 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:323 msgid "Low stock" msgstr "" -#: templates/js/part.js:659 templates/js/stock.js:965 +#: templates/js/part.js:660 templates/js/stock.js:990 msgid "Path" msgstr "" -#: templates/js/part.js:702 +#: templates/js/part.js:703 msgid "No test templates matching query" msgstr "" -#: templates/js/part.js:753 templates/js/stock.js:75 +#: templates/js/part.js:754 templates/js/stock.js:75 msgid "Edit test result" msgstr "" -#: templates/js/part.js:754 templates/js/stock.js:76 +#: templates/js/part.js:755 templates/js/stock.js:76 msgid "Delete test result" msgstr "" -#: templates/js/part.js:760 +#: templates/js/part.js:761 msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:805 +#: templates/js/part.js:806 msgid "Single Price Difference" msgstr "" @@ -6953,155 +7097,155 @@ msgstr "" msgid "Test Date" msgstr "" -#: templates/js/stock.js:290 +#: templates/js/stock.js:295 msgid "In production" msgstr "" -#: templates/js/stock.js:294 +#: templates/js/stock.js:299 msgid "Installed in Stock Item" msgstr "" -#: templates/js/stock.js:302 +#: templates/js/stock.js:307 msgid "Assigned to Sales Order" msgstr "" -#: templates/js/stock.js:334 +#: templates/js/stock.js:339 msgid "No stock items matching query" msgstr "" -#: templates/js/stock.js:355 +#: templates/js/stock.js:360 msgid "items" msgstr "" -#: templates/js/stock.js:447 +#: templates/js/stock.js:452 msgid "batches" msgstr "" -#: templates/js/stock.js:474 +#: templates/js/stock.js:479 msgid "locations" msgstr "" -#: templates/js/stock.js:476 +#: templates/js/stock.js:481 msgid "Undefined location" msgstr "" -#: templates/js/stock.js:577 +#: templates/js/stock.js:582 msgid "Stock item is in production" msgstr "" -#: templates/js/stock.js:582 +#: templates/js/stock.js:587 msgid "Stock item assigned to sales order" msgstr "" -#: templates/js/stock.js:585 +#: templates/js/stock.js:590 msgid "Stock item assigned to customer" msgstr "" -#: templates/js/stock.js:589 +#: templates/js/stock.js:594 msgid "Stock item has expired" msgstr "" -#: templates/js/stock.js:591 +#: templates/js/stock.js:596 msgid "Stock item will expire soon" msgstr "" -#: templates/js/stock.js:595 +#: templates/js/stock.js:600 msgid "Stock item has been allocated" msgstr "" -#: templates/js/stock.js:599 +#: templates/js/stock.js:604 msgid "Stock item has been installed in another item" msgstr "" -#: templates/js/stock.js:607 +#: templates/js/stock.js:611 msgid "Stock item has been rejected" msgstr "" -#: templates/js/stock.js:611 +#: templates/js/stock.js:615 msgid "Stock item is lost" msgstr "" -#: templates/js/stock.js:614 +#: templates/js/stock.js:618 msgid "Stock item is destroyed" msgstr "" -#: templates/js/stock.js:618 templates/js/table_filters.js:143 +#: templates/js/stock.js:622 templates/js/table_filters.js:143 msgid "Depleted" msgstr "" -#: templates/js/stock.js:647 +#: templates/js/stock.js:651 msgid "Stocktake" msgstr "" -#: templates/js/stock.js:828 +#: templates/js/stock.js:853 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:843 +#: templates/js/stock.js:868 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:857 +#: templates/js/stock.js:882 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:858 +#: templates/js/stock.js:883 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:997 +#: templates/js/stock.js:1022 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1044 +#: templates/js/stock.js:1069 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1063 +#: templates/js/stock.js:1088 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1082 +#: templates/js/stock.js:1107 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1100 +#: templates/js/stock.js:1125 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1123 +#: templates/js/stock.js:1148 msgid "Added" msgstr "" -#: templates/js/stock.js:1131 +#: templates/js/stock.js:1156 msgid "Removed" msgstr "" -#: templates/js/stock.js:1163 +#: templates/js/stock.js:1188 msgid "No user information" msgstr "" -#: templates/js/stock.js:1175 +#: templates/js/stock.js:1200 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1176 +#: templates/js/stock.js:1201 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1300 +#: templates/js/stock.js:1325 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1341 +#: templates/js/stock.js:1366 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1364 +#: templates/js/stock.js:1389 msgid "Serial" msgstr "" -#: templates/js/stock.js:1392 +#: templates/js/stock.js:1417 msgid "Uninstall Stock Item" msgstr "" @@ -7267,56 +7411,56 @@ msgstr "" msgid "Purchasable" msgstr "" -#: templates/js/tables.js:321 +#: templates/js/tables.js:323 msgid "Loading data" msgstr "" -#: templates/js/tables.js:324 +#: templates/js/tables.js:326 msgid "rows per page" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "Showing" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "to" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "of" msgstr "" -#: templates/js/tables.js:327 +#: templates/js/tables.js:329 msgid "rows" msgstr "" -#: templates/js/tables.js:330 templates/search_form.html:6 +#: templates/js/tables.js:332 templates/search_form.html:6 #: templates/search_form.html:8 msgid "Search" msgstr "" -#: templates/js/tables.js:333 +#: templates/js/tables.js:335 msgid "No matching results" msgstr "" -#: templates/js/tables.js:336 +#: templates/js/tables.js:338 msgid "Hide/Show pagination" msgstr "" -#: templates/js/tables.js:339 +#: templates/js/tables.js:341 msgid "Refresh" msgstr "" -#: templates/js/tables.js:342 +#: templates/js/tables.js:344 msgid "Toggle" msgstr "" -#: templates/js/tables.js:345 +#: templates/js/tables.js:347 msgid "Columns" msgstr "" -#: templates/js/tables.js:348 +#: templates/js/tables.js:350 msgid "All" msgstr "" @@ -7560,35 +7704,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:170 +#: users/models.py:174 msgid "Permission set" msgstr "" -#: users/models.py:178 +#: users/models.py:182 msgid "Group" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "View" msgstr "" -#: users/models.py:181 +#: users/models.py:185 msgid "Permission to view items" msgstr "" -#: users/models.py:183 +#: users/models.py:187 msgid "Permission to add items" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Change" msgstr "" -#: users/models.py:185 +#: users/models.py:189 msgid "Permissions to edit items" msgstr "" -#: users/models.py:187 +#: users/models.py:191 msgid "Permission to delete items" msgstr "" From ba1c70e86b93b6695a990e9a5df2333bab3e9efc Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 26 Jun 2021 20:48:09 +1000 Subject: [PATCH 092/110] Intercept is_valid() method to set default values --- InvenTree/InvenTree/serializers.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index fa7674723c..5be6d44c0c 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -7,6 +7,7 @@ Serializers used in various InvenTree apps from __future__ import unicode_literals from rest_framework import serializers +from rest_framework.utils import model_meta import os @@ -39,6 +40,35 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): but also ensures that the underlying model class data are checked on validation. """ + def is_valid(self, raise_exception=False): + """ + Override the 'is_valid' method of the underlying ModelSerializer class. + + - This is so we can intercept the data before save() is called. + - If we are creating a *new* model, replace any "missing" fields with the default values + - Default values are those specified by the database model + """ + + # This serializer is *not* associated with a model instance + # This means that we are trying to *create* a new model + if self.instance is None: + ModelClass = self.Meta.model + + fields = model_meta.get_field_info(ModelClass) + + for field_name, field in fields.fields.items(): + + # Check if the field has a default value + if field.has_default(): + + # Value not specified? + if field_name not in self.initial_data: + + self.initial_data[field_name] = field.default + + + return super().is_valid(raise_exception=raise_exception) + def validate(self, data): """ Perform serializer validation. In addition to running validators on the serializer fields, From b2aa38fefa66922165071690058686cfef7bee93 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 26 Jun 2021 21:14:10 +1000 Subject: [PATCH 093/110] Override get_initial() rather than is_valid() --- InvenTree/InvenTree/serializers.py | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index f19ef23c00..82584bdbb0 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -45,17 +45,15 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): but also ensures that the underlying model class data are checked on validation. """ - def is_valid(self, raise_exception=False): + def get_initial(self): """ - Override the 'is_valid' method of the underlying ModelSerializer class. - - - This is so we can intercept the data before save() is called. - - If we are creating a *new* model, replace any "missing" fields with the default values - - Default values are those specified by the database model + Construct initial data for the serializer. + Use the 'default' values specified by the django model definition """ - # This serializer is *not* associated with a model instance - # This means that we are trying to *create* a new model + initials = super().get_initial() + + # Are we creating a new instance? if self.instance is None: ModelClass = self.Meta.model @@ -63,16 +61,10 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): for field_name, field in fields.fields.items(): - # Check if the field has a default value if field.has_default(): + initials[field_name] = field.default - # Value not specified? - if field_name not in self.initial_data: - - self.initial_data[field_name] = field.default - - - return super().is_valid(raise_exception=raise_exception) + return initials def run_validation(self, data=empty): """ Perform serializer validation. From a0390f08219b6690bf35eda117c69e8af557108b Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 26 Jun 2021 21:14:47 +1000 Subject: [PATCH 094/110] PEP style fixes --- InvenTree/InvenTree/serializers.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 82584bdbb0..9e8e811b90 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -2,13 +2,9 @@ Serializers used in various InvenTree apps """ - # -*- coding: utf-8 -*- from __future__ import unicode_literals -from rest_framework import serializers -from rest_framework.utils import model_meta - import os from django.conf import settings @@ -16,6 +12,7 @@ from django.contrib.auth.models import User from django.core.exceptions import ValidationError as DjangoValidationError from rest_framework import serializers +from rest_framework.utils import model_meta from rest_framework.fields import empty from rest_framework.exceptions import ValidationError From ae1a1e139fa9137f2bb5fe11d42f2c3d4f2c4365 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 27 Jun 2021 00:01:40 +1000 Subject: [PATCH 095/110] Further fixes for default API values - Account for callable defaults - Extra check in is_valid() --- InvenTree/InvenTree/api_tester.py | 7 +++++- InvenTree/InvenTree/serializers.py | 39 +++++++++++++++++++++++++++++- InvenTree/part/test_api.py | 34 +++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/InvenTree/InvenTree/api_tester.py b/InvenTree/InvenTree/api_tester.py index a803e6797f..1cbc62ec0a 100644 --- a/InvenTree/InvenTree/api_tester.py +++ b/InvenTree/InvenTree/api_tester.py @@ -18,6 +18,7 @@ class InvenTreeAPITestCase(APITestCase): email = 'test@testing.com' superuser = False + is_staff = True auto_login = True # Set list of roles automatically associated with the user @@ -40,8 +41,12 @@ class InvenTreeAPITestCase(APITestCase): if self.superuser: self.user.is_superuser = True - self.user.save() + if self.is_staff: + self.user.is_staff = True + + self.user.save() + for role in self.roles: self.assignRole(role) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 9e8e811b90..c00c9ef690 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -59,10 +59,47 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): for field_name, field in fields.fields.items(): if field.has_default(): - initials[field_name] = field.default + + value = field.default + + # Account for callable functions + if callable(value): + value = value() + + initials[field_name] = value return initials + def is_valid(self, raise_exception=False): + """ + Also override the is_valid() method, as in some cases get_initial() is not actually called. + """ + + # Calling super().is_valid creates self._validated_data + valid = super().is_valid(raise_exception) + + # Are we creating a new instance? + if self.instance is None: + ModelClass = self.Meta.model + + fields = model_meta.get_field_info(ModelClass) + + for field_name, field in fields.fields.items(): + + if field.has_default(): + if field not in self._validated_data: + + value = field.default + + # Account for callable functions + if callable(value): + value = value() + + self._validated_data[field_name] = value + + + return valid + def run_validation(self, data=empty): """ Perform serializer validation. In addition to running validators on the serializer fields, diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 787c5d3f85..29df621914 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -13,6 +13,7 @@ from InvenTree.status_codes import StockStatus from part.models import Part, PartCategory from stock.models import StockItem from company.models import Company +from common.models import InvenTreeSetting class PartAPITest(InvenTreeAPITestCase): @@ -332,7 +333,38 @@ class PartAPITest(InvenTreeAPITestCase): # Check that the un-specified fields have used correct default values self.assertTrue(data['active']) self.assertFalse(data['virtual']) - self.assertTrue(data['purchaseable']) + + # By default, parts are not purchaseable + self.assertFalse(data['purchaseable']) + + # Set the default 'purchaseable' status to True + InvenTreeSetting.set_setting( + 'PART_PURCHASEABLE', + True, + self.user + ) + + response = self.client.post(url, { + 'name': 'all defaults', + 'description': 'my test part 2', + 'category': 1, + }) + + # Part should now be purchaseable by default + self.assertTrue(response.data['purchaseable']) + + # "default" values should not be used if the value is specified + response = self.client.post(url, { + 'name': 'all defaults', + 'description': 'my test part 2', + 'category': 1, + 'active': False, + 'purchaseable': False, + }) + + self.assertFalse(response.data['active']) + self.assertFalse(response.data['purchaseable']) + class PartDetailTests(InvenTreeAPITestCase): From 8913b74f4183686e2074c16c05e15d5b5522917b Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 27 Jun 2021 00:12:10 +1000 Subject: [PATCH 096/110] Typo fixes --- InvenTree/InvenTree/serializers.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index c00c9ef690..6b5bdaef22 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -58,7 +58,7 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): for field_name, field in fields.fields.items(): - if field.has_default(): + if field.has_default() and field_name not in initials: value = field.default @@ -87,7 +87,7 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): for field_name, field in fields.fields.items(): if field.has_default(): - if field not in self._validated_data: + if field_name not in self._validated_data.keys(): value = field.default @@ -97,7 +97,6 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): self._validated_data[field_name] = value - return valid def run_validation(self, data=empty): From 232899e0c43b1448cbcc9ca7b68b464fc9c08b13 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 27 Jun 2021 00:25:23 +1000 Subject: [PATCH 097/110] Simpler implementation --- InvenTree/InvenTree/serializers.py | 65 +++++++++++++++++------------- InvenTree/part/test_api.py | 1 - 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 6b5bdaef22..9d695ab0de 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -7,6 +7,8 @@ from __future__ import unicode_literals import os +from collections import OrderedDict + from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ValidationError as DjangoValidationError @@ -42,6 +44,38 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): but also ensures that the underlying model class data are checked on validation. """ + def __init__(self, instance=None, data=empty, **kwargs): + + self.instance = instance + + # If instance is None, we are creating a new instance + if instance is None: + + if data is empty: + data = OrderedDict() + else: + # Required to side-step immutability of a QueryDict + data = data.copy() + + # Add missing fields which have default values + ModelClass = self.Meta.model + + fields = model_meta.get_field_info(ModelClass) + + for field_name, field in fields.fields.items(): + + if field.has_default() and field_name not in data: + + value = field.default + + # Account for callable functions + if callable(value): + value = value() + + data[field_name] = value + + super().__init__(instance, data, **kwargs) + def get_initial(self): """ Construct initial data for the serializer. @@ -50,6 +84,8 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): initials = super().get_initial() + print("initials:", initials) + # Are we creating a new instance? if self.instance is None: ModelClass = self.Meta.model @@ -70,35 +106,6 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): return initials - def is_valid(self, raise_exception=False): - """ - Also override the is_valid() method, as in some cases get_initial() is not actually called. - """ - - # Calling super().is_valid creates self._validated_data - valid = super().is_valid(raise_exception) - - # Are we creating a new instance? - if self.instance is None: - ModelClass = self.Meta.model - - fields = model_meta.get_field_info(ModelClass) - - for field_name, field in fields.fields.items(): - - if field.has_default(): - if field_name not in self._validated_data.keys(): - - value = field.default - - # Account for callable functions - if callable(value): - value = value() - - self._validated_data[field_name] = value - - return valid - def run_validation(self, data=empty): """ Perform serializer validation. In addition to running validators on the serializer fields, diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 29df621914..3fbf26f8bb 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -366,7 +366,6 @@ class PartAPITest(InvenTreeAPITestCase): self.assertFalse(response.data['purchaseable']) - class PartDetailTests(InvenTreeAPITestCase): """ Test that we can create / edit / delete Part objects via the API From d3e9803fd48626d30dbddbcc26d9dd0a6ce6eea7 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 27 Jun 2021 00:25:49 +1000 Subject: [PATCH 098/110] Remove debug statement --- InvenTree/InvenTree/serializers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 9d695ab0de..1f7b8c0290 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -84,8 +84,6 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): initials = super().get_initial() - print("initials:", initials) - # Are we creating a new instance? if self.instance is None: ModelClass = self.Meta.model From 7505d7b3c57bd92738be6c0f0eadb0087c48072c Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 27 Jun 2021 00:47:12 +1000 Subject: [PATCH 099/110] Unit test fixes --- InvenTree/stock/test_api.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/InvenTree/stock/test_api.py b/InvenTree/stock/test_api.py index e1fb616335..729bf25a9b 100644 --- a/InvenTree/stock/test_api.py +++ b/InvenTree/stock/test_api.py @@ -354,16 +354,18 @@ class StockItemTest(StockAPITestCase): self.assertContains(response, 'does not exist', status_code=status.HTTP_400_BAD_REQUEST) # POST without quantity - response = self.client.post( + response = self.post( self.list_url, - data={ + { 'part': 1, 'location': 1, - } + }, + expected_code=201, ) - self.assertContains(response, 'This field is required', status_code=status.HTTP_400_BAD_REQUEST) - + # Item should have been created with default quantity + self.assertEqual(response.data['quantity'], 1) + # POST with quantity and part and location response = self.client.post( self.list_url, From 0cc999410b443c1173b46bfb5282dedc79691e36 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 27 Jun 2021 01:03:54 +1000 Subject: [PATCH 100/110] More unit test fixes --- InvenTree/part/test_api.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 3fbf26f8bb..ee01df89cf 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -445,7 +445,14 @@ class PartDetailTests(InvenTreeAPITestCase): # Try to remove the part response = self.client.delete(url) - + + # As the part is 'active' we cannot delete it + self.assertEqual(response.status_code, 405) + + # So, let's make it not active + response = self.patch(url, {'active': False}, expected_code=200) + + response = self.client.delete(url) self.assertEqual(response.status_code, 204) # Part count should have reduced From 34a374ce9ac0a212ca05774ffb5f344d601cb92d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 27 Jun 2021 01:18:09 +1000 Subject: [PATCH 101/110] Add try/except around callable default --- InvenTree/InvenTree/serializers.py | 10 ++++++++-- InvenTree/part/test_api.py | 2 -- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 1f7b8c0290..50a37d8cba 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -70,7 +70,10 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): # Account for callable functions if callable(value): - value = value() + try: + value = value() + except: + continue data[field_name] = value @@ -98,7 +101,10 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): # Account for callable functions if callable(value): - value = value() + try: + value = value() + except: + continue initials[field_name] = value diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index ee01df89cf..4922ed4e04 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -603,8 +603,6 @@ class PartDetailTests(InvenTreeAPITestCase): # And now check that the image has been set p = Part.objects.get(pk=pk) - print("Image:", p.image.file) - class PartAPIAggregationTest(InvenTreeAPITestCase): """ From 67128c308bb8a5985abd233f20f94fc13e4e6401 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 27 Jun 2021 12:26:02 +0200 Subject: [PATCH 102/110] fixing typo --- InvenTree/part/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 2b97fde596..7ed4c99057 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -2503,7 +2503,7 @@ class BomItem(models.Model): # get internal price setting use_internal = common.models.InvenTreeSetting.get_setting('PART_BOM_USE_INTERNAL_PRICE', False) - prange = self.sub_part.get_price_range(self.quantity, intenal=use_internal) + prange = self.sub_part.get_price_range(self.quantity, internal=use_internal) if prange is None: return prange From 786e994e19923a742e40922939dbd6cc91a157e1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 27 Jun 2021 20:58:24 +1000 Subject: [PATCH 103/110] Update version.py 0.2.4 --- InvenTree/InvenTree/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index 08fa5e0ae4..738274b1cd 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -8,7 +8,7 @@ import re import common.models -INVENTREE_SW_VERSION = "0.2.4 pre" +INVENTREE_SW_VERSION = "0.2.4" INVENTREE_API_VERSION = 6 From 604c136b003eed3d82c488eecbeb85cbf0fe2ebf Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 27 Jun 2021 21:00:01 +1000 Subject: [PATCH 104/110] Update version.py --- InvenTree/InvenTree/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py index 738274b1cd..6afa5ebadd 100644 --- a/InvenTree/InvenTree/version.py +++ b/InvenTree/InvenTree/version.py @@ -8,7 +8,7 @@ import re import common.models -INVENTREE_SW_VERSION = "0.2.4" +INVENTREE_SW_VERSION = "0.2.5 pre" INVENTREE_API_VERSION = 6 From a3ec24fbcc4a837a1e795c96dd3510e5cc2ac3d5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 27 Jun 2021 13:48:08 +0200 Subject: [PATCH 105/110] Reenabling prices for BOM items Closes #1721 --- InvenTree/part/serializers.py | 4 ++-- InvenTree/templates/js/bom.js | 11 ++--------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 6c47f1310f..2da2d05d3b 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -377,7 +377,7 @@ class PartStarSerializer(InvenTreeModelSerializer): class BomItemSerializer(InvenTreeModelSerializer): """ Serializer for BomItem object """ - # price_range = serializers.CharField(read_only=True) + price_range = serializers.CharField(read_only=True) quantity = serializers.FloatField() @@ -492,7 +492,7 @@ class BomItemSerializer(InvenTreeModelSerializer): 'reference', 'sub_part', 'sub_part_detail', - # 'price_range', + 'price_range', 'validated', ] diff --git a/InvenTree/templates/js/bom.js b/InvenTree/templates/js/bom.js index 7328bcb331..665379d8d5 100644 --- a/InvenTree/templates/js/bom.js +++ b/InvenTree/templates/js/bom.js @@ -259,26 +259,19 @@ function loadBomTable(table, options) { sortable: true, }); - /* - - // TODO - Re-introduce the pricing column at a later stage, - // once the pricing has been "fixed" - // O.W. 2020-11-24 - cols.push( { field: 'price_range', - title: '{% trans "Price" %}', + title: '{% trans "Buy Price" %}', sortable: true, formatter: function(value, row, index, field) { if (value) { return value; } else { - return "{% trans "No pricing available" %}"; + return "{% trans 'No pricing available' %}"; } } }); - */ cols.push({ field: 'optional', From 4f726931a63a3a80b52c171483e12e6bf952f258 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 27 Jun 2021 14:18:37 +0200 Subject: [PATCH 106/110] adds in money-conversion helper --- InvenTree/InvenTree/helpers.py | 19 +++++++++++++++++++ InvenTree/part/models.py | 14 +++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py index 9d00697230..cc1e60eb8e 100644 --- a/InvenTree/InvenTree/helpers.py +++ b/InvenTree/InvenTree/helpers.py @@ -21,6 +21,9 @@ import InvenTree.version from common.models import InvenTreeSetting from .settings import MEDIA_URL, STATIC_URL +from common.settings import currency_code_default + +from djmoney.money import Money def getSetting(key, backup_value=None): @@ -247,6 +250,22 @@ def decimal2string(d): return s.rstrip("0").rstrip(".") +def decimal2money(d, currency = None): + """ + Format a Decimal number as Money + + Args: + d: A python Decimal object + currency: Currency of the input amount, defaults to default currency in settings + + Returns: + A Money object from the input(s) + """ + if not currency: + currency = currency_code_default() + return Money(d, currency) + + def WrapWithQuotes(text, quote='"'): """ Wrap the supplied text with quotes diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 7ed4c99057..f76ff4c104 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -39,7 +39,7 @@ from InvenTree import helpers from InvenTree import validators from InvenTree.models import InvenTreeTree, InvenTreeAttachment from InvenTree.fields import InvenTreeURLField -from InvenTree.helpers import decimal2string, normalize +from InvenTree.helpers import decimal2string, normalize, decimal2money from InvenTree.status_codes import BuildStatus, PurchaseOrderStatus, SalesOrderStatus @@ -2414,7 +2414,7 @@ class BomItem(models.Model): return "{n} x {child} to make {parent}".format( parent=self.part.full_name, child=self.sub_part.full_name, - n=helpers.decimal2string(self.quantity)) + n=decimal2string(self.quantity)) def available_stock(self): """ @@ -2498,12 +2498,12 @@ class BomItem(models.Model): return required @property - def price_range(self): + def price_range(self, internal = False): """ Return the price-range for this BOM item. """ # get internal price setting use_internal = common.models.InvenTreeSetting.get_setting('PART_BOM_USE_INTERNAL_PRICE', False) - prange = self.sub_part.get_price_range(self.quantity, internal=use_internal) + prange = self.sub_part.get_price_range(self.quantity, internal=use_internal and internal) if prange is None: return prange @@ -2511,11 +2511,11 @@ class BomItem(models.Model): pmin, pmax = prange if pmin == pmax: - return decimal2string(pmin) + return decimal2money(pmin) # Convert to better string representation - pmin = decimal2string(pmin) - pmax = decimal2string(pmax) + pmin = decimal2money(pmin) + pmax = decimal2money(pmax) return "{pmin} to {pmax}".format(pmin=pmin, pmax=pmax) From e4a9d56ba0d7aeebbd2f20fa52035b0c7b086ad3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 27 Jun 2021 14:26:51 +0200 Subject: [PATCH 107/110] style fixes --- InvenTree/InvenTree/helpers.py | 2 +- InvenTree/part/models.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py index cc1e60eb8e..330bd2bb68 100644 --- a/InvenTree/InvenTree/helpers.py +++ b/InvenTree/InvenTree/helpers.py @@ -250,7 +250,7 @@ def decimal2string(d): return s.rstrip("0").rstrip(".") -def decimal2money(d, currency = None): +def decimal2money(d, currency=None): """ Format a Decimal number as Money diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index f76ff4c104..9f4da436df 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -2498,7 +2498,7 @@ class BomItem(models.Model): return required @property - def price_range(self, internal = False): + def price_range(self, internal=False): """ Return the price-range for this BOM item. """ # get internal price setting From 3c1f0637dcddfa6f6b4782e64e81883f113c0f30 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 28 Jun 2021 20:42:37 +1000 Subject: [PATCH 108/110] Adds unit tests for HTML API endpoints --- InvenTree/InvenTree/test_api.py | 87 +++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/InvenTree/InvenTree/test_api.py b/InvenTree/InvenTree/test_api.py index f196006df9..bc1157cf45 100644 --- a/InvenTree/InvenTree/test_api.py +++ b/InvenTree/InvenTree/test_api.py @@ -1,7 +1,13 @@ """ Low level tests for the InvenTree API """ +from django.http import response from rest_framework import status +from django.test import TestCase + +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group + from django.urls import reverse from InvenTree.api_tester import InvenTreeAPITestCase @@ -11,6 +17,87 @@ from users.models import RuleSet from base64 import b64encode +class HTMLAPITests(TestCase): + """ + Test that we can access the REST API endpoints via the HTML interface. + + History: Discovered on 2021-06-28 a bug in InvenTreeModelSerializer, + which raised an AssertionError when using the HTML API interface, + while the regular JSON interface continued to work as expected. + """ + + def setUp(self): + super().setUp() + + # Create a user + user = get_user_model() + + self.user = user.objects.create_user( + username='username', + email='user@email.com', + password='password' + ) + + # Put the user into a group with the correct permissions + group = Group.objects.create(name='mygroup') + self.user.groups.add(group) + + # Give the group *all* the permissions! + for rule in group.rule_sets.all(): + rule.can_view = True + rule.can_change = True + rule.can_add = True + rule.can_delete = True + + rule.save() + + self.client.login(username='username', password='password') + + def test_part_api(self): + url = reverse('api-part-list') + + # Check JSON response + response = self.client.get(url, HTTP_ACCEPT='application/json') + self.assertEqual(response.status_code, 200) + + # Check HTTP response + response = self.client.get(url, HTTP_ACCEPT='text/html') + self.assertEqual(response.status_code, 200) + + def test_build_api(self): + url = reverse('api-build-list') + + # Check JSON response + response = self.client.get(url, HTTP_ACCEPT='application/json') + self.assertEqual(response.status_code, 200) + + # Check HTTP response + response = self.client.get(url, HTTP_ACCEPT='text/html') + self.assertEqual(response.status_code, 200) + + def test_stock_api(self): + url = reverse('api-stock-list') + + # Check JSON response + response = self.client.get(url, HTTP_ACCEPT='application/json') + self.assertEqual(response.status_code, 200) + + # Check HTTP response + response = self.client.get(url, HTTP_ACCEPT='text/html') + self.assertEqual(response.status_code, 200) + + def test_company_list(self): + url = reverse('api-company-list') + + # Check JSON response + response = self.client.get(url, HTTP_ACCEPT='application/json') + self.assertEqual(response.status_code, 200) + + # Check HTTP response + response = self.client.get(url, HTTP_ACCEPT='text/html') + self.assertEqual(response.status_code, 200) + + class APITests(InvenTreeAPITestCase): """ Tests for the InvenTree API """ From 4dbd770f2d4f3bf65acef7d43cd048ef2956c482 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 28 Jun 2021 21:08:50 +1000 Subject: [PATCH 109/110] Fixed (I think?) --- InvenTree/InvenTree/serializers.py | 18 +++++++----------- InvenTree/InvenTree/test_api.py | 1 - 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 50a37d8cba..16db21ca37 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -7,8 +7,6 @@ from __future__ import unicode_literals import os -from collections import OrderedDict - from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ValidationError as DjangoValidationError @@ -46,16 +44,13 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): def __init__(self, instance=None, data=empty, **kwargs): - self.instance = instance + # self.instance = instance # If instance is None, we are creating a new instance - if instance is None: + if instance is None and data is not empty: - if data is empty: - data = OrderedDict() - else: - # Required to side-step immutability of a QueryDict - data = data.copy() + # Required to side-step immutability of a QueryDict + data = data.copy() # Add missing fields which have default values ModelClass = self.Meta.model @@ -85,7 +80,7 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): Use the 'default' values specified by the django model definition """ - initials = super().get_initial() + initials = super().get_initial().copy() # Are we creating a new instance? if self.instance is None: @@ -111,7 +106,8 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): return initials def run_validation(self, data=empty): - """ Perform serializer validation. + """ + Perform serializer validation. In addition to running validators on the serializer fields, this class ensures that the underlying model is also validated. """ diff --git a/InvenTree/InvenTree/test_api.py b/InvenTree/InvenTree/test_api.py index bc1157cf45..18f9319624 100644 --- a/InvenTree/InvenTree/test_api.py +++ b/InvenTree/InvenTree/test_api.py @@ -1,6 +1,5 @@ """ Low level tests for the InvenTree API """ -from django.http import response from rest_framework import status from django.test import TestCase From f0f6c7d186f0062f4a3b3d80062dbdf00acde83c Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 28 Jun 2021 21:09:48 +1000 Subject: [PATCH 110/110] Add a comment --- InvenTree/InvenTree/serializers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 16db21ca37..772daa06ab 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -59,6 +59,11 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): for field_name, field in fields.fields.items(): + """ + Update the field IF (and ONLY IF): + - The field has a specified default value + - The field does not already have a value set + """ if field.has_default() and field_name not in data: value = field.default