From 307a097ab4685d45bbf7930a728740979b6db986 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 15 May 2021 00:56:14 +0200 Subject: [PATCH 01/63] 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 02/63] 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 03/63] 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 04/63] 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 05/63] 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 06/63] 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 07/63] 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 08/63] 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 09/63] 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 10/63] 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 11/63] 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 12/63] 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 13/63] 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 14/63] 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 15/63] 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 16/63] 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 17/63] 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 18/63] 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 19/63] 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 20/63] 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 21/63] 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 22/63] 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 23/63] 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 24/63] 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 25/63] 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 26/63] 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 27/63] 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 28/63] 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 29/63] 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 30/63] 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 31/63] 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 32/63] 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 33/63] 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 34/63] 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 35/63] 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 36/63] 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 37/63] 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 38/63] 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 39/63] 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 40/63] 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 41/63] 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 42/63] 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 43/63] 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 44/63] 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 45/63] 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 46/63] 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 47/63] 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 48/63] 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 49/63] 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 59e6cc1a103dd713e47a541bd0eef52414d26805 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 18 Jun 2021 23:10:59 +0200 Subject: [PATCH 50/63] 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 %} +