diff --git a/InvenTree/InvenTree/api_tester.py b/InvenTree/InvenTree/api_tester.py index 1cbc62ec0a..e2bdae1d8f 100644 --- a/InvenTree/InvenTree/api_tester.py +++ b/InvenTree/InvenTree/api_tester.py @@ -78,6 +78,22 @@ class InvenTreeAPITestCase(APITestCase): ruleset.save() break + def getActions(self, url): + """ + Return a dict of the 'actions' available at a given endpoint. + Makes use of the HTTP 'OPTIONS' method to request this. + """ + + response = self.client.options(url) + self.assertEqual(response.status_code, 200) + + actions = response.data.get('actions', None) + + if not actions: + actions = {} + + return actions + def get(self, url, data={}, expected_code=200): """ Issue a GET request diff --git a/InvenTree/InvenTree/fields.py b/InvenTree/InvenTree/fields.py index 8d9ab77463..462d2b0e0e 100644 --- a/InvenTree/InvenTree/fields.py +++ b/InvenTree/InvenTree/fields.py @@ -14,8 +14,10 @@ from django.core import validators from django import forms from decimal import Decimal + from djmoney.models.fields import MoneyField as ModelMoneyField from djmoney.forms.fields import MoneyField +from djmoney.models.validators import MinMoneyValidator import InvenTree.helpers import common.settings @@ -47,7 +49,10 @@ def money_kwargs(): class InvenTreeModelMoneyField(ModelMoneyField): - """ custom MoneyField for clean migrations while using dynamic currency settings """ + """ + Custom MoneyField for clean migrations while using dynamic currency settings + """ + def __init__(self, **kwargs): # detect if creating migration if 'makemigrations' in sys.argv: @@ -58,6 +63,16 @@ class InvenTreeModelMoneyField(ModelMoneyField): # set defaults kwargs.update(money_kwargs()) + # Set a minimum value validator + validators = kwargs.get('validators', []) + + if len(validators) == 0: + validators.append( + MinMoneyValidator(0), + ) + + kwargs['validators'] = validators + super().__init__(**kwargs) def formfield(self, **kwargs): diff --git a/InvenTree/InvenTree/metadata.py b/InvenTree/InvenTree/metadata.py new file mode 100644 index 0000000000..f1b1c0c040 --- /dev/null +++ b/InvenTree/InvenTree/metadata.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import logging + +from rest_framework import serializers +from rest_framework.metadata import SimpleMetadata +from rest_framework.utils import model_meta +from rest_framework.fields import empty + +import users.models + + +logger = logging.getLogger('inventree') + + +class InvenTreeMetadata(SimpleMetadata): + """ + Custom metadata class for the DRF API. + + This custom metadata class imits the available "actions", + based on the user's role permissions. + + Thus when a client send an OPTIONS request to an API endpoint, + it will only receive a list of actions which it is allowed to perform! + + Additionally, we include some extra information about database models, + so we can perform lookup for ForeignKey related fields. + + """ + + def determine_metadata(self, request, view): + + metadata = super().determine_metadata(request, view) + + user = request.user + + if user is None: + # No actions for you! + metadata['actions'] = {} + return metadata + + try: + # Extract the model name associated with the view + self.model = view.serializer_class.Meta.model + + # Construct the 'table name' from the model + app_label = self.model._meta.app_label + tbl_label = self.model._meta.model_name + + metadata['model'] = tbl_label + + table = f"{app_label}_{tbl_label}" + + actions = metadata.get('actions', None) + + if actions is not None: + + check = users.models.RuleSet.check_table_permission + + # Map the request method to a permission type + rolemap = { + 'POST': 'add', + 'PUT': 'change', + 'PATCH': 'change', + 'DELETE': 'delete', + } + + # Remove any HTTP methods that the user does not have permission for + for method, permission in rolemap.items(): + if method in actions and not check(user, table, permission): + del actions[method] + + # Add a 'DELETE' action if we are allowed to delete + if 'DELETE' in view.allowed_methods and check(user, table, 'delete'): + actions['DELETE'] = True + + # Add a 'VIEW' action if we are allowed to view + if 'GET' in view.allowed_methods and check(user, table, 'view'): + actions['GET'] = True + + except AttributeError: + # We will assume that if the serializer class does *not* have a Meta + # then we don't need a permission + pass + + return metadata + + def get_serializer_info(self, serializer): + """ + Override get_serializer_info so that we can add 'default' values + to any fields whose Meta.model specifies a default value + """ + + serializer_info = super().get_serializer_info(serializer) + + try: + ModelClass = serializer.Meta.model + + model_fields = model_meta.get_field_info(ModelClass) + + # Iterate through simple fields + for name, field in model_fields.fields.items(): + + if field.has_default() and name in serializer_info.keys(): + + default = field.default + + if callable(default): + try: + default = default() + except: + continue + + serializer_info[name]['default'] = default + + # Iterate through relations + for name, relation in model_fields.relations.items(): + + if name not in serializer_info.keys(): + # Skip relation not defined in serializer + continue + + if relation.reverse: + # Ignore reverse relations + continue + + # Extract and provide the "limit_choices_to" filters + # This is used to automatically filter AJAX requests + serializer_info[name]['filters'] = relation.model_field.get_limit_choices_to() + + if 'help_text' not in serializer_info[name] and hasattr(relation.model_field, 'help_text'): + serializer_info[name]['help_text'] = relation.model_field.help_text + + except AttributeError: + pass + + return serializer_info + + def get_field_info(self, field): + """ + Given an instance of a serializer field, return a dictionary + of metadata about it. + + We take the regular DRF metadata and add our own unique flavor + """ + + # Run super method first + field_info = super().get_field_info(field) + + # If a default value is specified for the serializer field, add it! + if 'default' not in field_info and not field.default == empty: + field_info['default'] = field.get_default() + + # Introspect writable related fields + if field_info['type'] == 'field' and not field_info['read_only']: + + # If the field is a PrimaryKeyRelatedField, we can extract the model from the queryset + if isinstance(field, serializers.PrimaryKeyRelatedField): + model = field.queryset.model + else: + logger.debug("Could not extract model for:", field_info['label'], '->', field) + model = None + + if model: + # Mark this field as "related", and point to the URL where we can get the data! + field_info['type'] = 'related field' + field_info['api_url'] = model.get_api_url() + field_info['model'] = model._meta.model_name + + return field_info diff --git a/InvenTree/InvenTree/models.py b/InvenTree/InvenTree/models.py index 5822f8a19f..2831a23151 100644 --- a/InvenTree/InvenTree/models.py +++ b/InvenTree/InvenTree/models.py @@ -10,11 +10,13 @@ from django.db import models from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ +from django.core.exceptions import ValidationError from django.db.models.signals import pre_delete from django.dispatch import receiver from mptt.models import MPTTModel, TreeForeignKey +from mptt.exceptions import InvalidMove from .validators import validate_tree_name @@ -91,6 +93,15 @@ class InvenTreeTree(MPTTModel): parent: The item immediately above this one. An item with a null parent is a top-level item """ + def save(self, *args, **kwargs): + + try: + super().save(*args, **kwargs) + except InvalidMove: + raise ValidationError({ + 'parent': _("Invalid choice"), + }) + class Meta: abstract = True diff --git a/InvenTree/InvenTree/serializers.py b/InvenTree/InvenTree/serializers.py index 772daa06ab..58d33697b7 100644 --- a/InvenTree/InvenTree/serializers.py +++ b/InvenTree/InvenTree/serializers.py @@ -5,16 +5,58 @@ Serializers used in various InvenTree apps # -*- coding: utf-8 -*- from __future__ import unicode_literals + import os +from decimal import Decimal + from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ValidationError as DjangoValidationError +from django.utils.translation import ugettext_lazy as _ + +from djmoney.contrib.django_rest_framework.fields import MoneyField +from djmoney.money import Money +from djmoney.utils import MONEY_CLASSES, get_currency_field_name from rest_framework import serializers from rest_framework.utils import model_meta from rest_framework.fields import empty from rest_framework.exceptions import ValidationError +from rest_framework.serializers import DecimalField + + +class InvenTreeMoneySerializer(MoneyField): + """ + Custom serializer for 'MoneyField', + which ensures that passed values are numerically valid + + Ref: https://github.com/django-money/django-money/blob/master/djmoney/contrib/django_rest_framework/fields.py + """ + + def get_value(self, data): + """ + Test that the returned amount is a valid Decimal + """ + + amount = super(DecimalField, self).get_value(data) + + # Convert an empty string to None + if len(str(amount).strip()) == 0: + amount = None + + try: + if amount is not None: + amount = Decimal(amount) + except: + raise ValidationError(_("Must be a valid number")) + + currency = data.get(get_currency_field_name(self.field_name), self.default_currency) + + if currency and amount is not None and not isinstance(amount, MONEY_CLASSES) and amount is not empty: + return Money(amount, currency) + + return amount class UserSerializer(serializers.ModelSerializer): @@ -110,6 +152,19 @@ class InvenTreeModelSerializer(serializers.ModelSerializer): return initials + def save(self, **kwargs): + """ + Catch any django ValidationError thrown at the moment save() is called, + and re-throw as a DRF ValidationError + """ + + try: + super().save(**kwargs) + except (ValidationError, DjangoValidationError) as exc: + raise ValidationError(detail=serializers.as_serializer_error(exc)) + + return self.instance + def run_validation(self, data=empty): """ Perform serializer validation. diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 6c1d52487d..3b7c95e245 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -342,6 +342,7 @@ REST_FRAMEWORK = { 'InvenTree.permissions.RolePermission', ), 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', + 'DEFAULT_METADATA_CLASS': 'InvenTree.metadata.InvenTreeMetadata' } WSGI_APPLICATION = 'InvenTree.wsgi.application' diff --git a/InvenTree/InvenTree/static/css/bootstrap.min.css.map b/InvenTree/InvenTree/static/css/bootstrap.min.css.map new file mode 100644 index 0000000000..6c7fa40b98 --- /dev/null +++ b/InvenTree/InvenTree/static/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":";;;;4EAQA,KACE,YAAA,WACA,yBAAA,KACA,qBAAA,KAOF,KACE,OAAA,EAaF,QAAA,MAAA,QAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,KAAA,IAAA,QAAA,QAaE,QAAA,MAQF,MAAA,OAAA,SAAA,MAIE,QAAA,aACA,eAAA,SAQF,sBACE,QAAA,KACA,OAAA,EAQF,SAAA,SAEE,QAAA,KAUF,EACE,iBAAA,YAQF,SAAA,QAEE,QAAA,EAUF,YACE,cAAA,IAAA,OAOF,EAAA,OAEE,YAAA,IAOF,IACE,WAAA,OAQF,GACE,OAAA,MAAA,EACA,UAAA,IAOF,KACE,MAAA,KACA,WAAA,KAOF,MACE,UAAA,IAOF,IAAA,IAEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IACE,IAAA,MAGF,IACE,OAAA,OAUF,IACE,OAAA,EAOF,eACE,SAAA,OAUF,OACE,OAAA,IAAA,KAOF,GACE,OAAA,EAAA,mBAAA,YAAA,gBAAA,YACA,WAAA,YAOF,IACE,SAAA,KAOF,KAAA,IAAA,IAAA,KAIE,YAAA,UAAA,UACA,UAAA,IAkBF,OAAA,MAAA,SAAA,OAAA,SAKE,OAAA,EACA,KAAA,QACA,MAAA,QAOF,OACE,SAAA,QAUF,OAAA,OAEE,eAAA,KAWF,OAAA,wBAAA,kBAAA,mBAIE,mBAAA,OACA,OAAA,QAOF,iBAAA,qBAEE,OAAA,QAOF,yBAAA,wBAEE,QAAA,EACA,OAAA,EAQF,MACE,YAAA,OAWF,qBAAA,kBAEE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,EASF,8CAAA,8CAEE,OAAA,KAQF,mBACE,mBAAA,YACA,gBAAA,YAAA,WAAA,YAAA,mBAAA,UASF,iDAAA,8CAEE,mBAAA,KAOF,SACE,QAAA,MAAA,OAAA,MACA,OAAA,EAAA,IACA,OAAA,IAAA,MAAA,OAQF,OACE,QAAA,EACA,OAAA,EAOF,SACE,SAAA,KAQF,SACE,YAAA,IAUF,MACE,eAAA,EACA,gBAAA,SAGF,GAAA,GAEE,QAAA,uFCjUF,aA7FI,EAAA,OAAA,QAGI,MAAA,eACA,YAAA,eACA,WAAA,cAAA,mBAAA,eACA,WAAA,eAGJ,EAAA,UAEI,gBAAA,UAGJ,cACI,QAAA,KAAA,WAAA,IAGJ,kBACI,QAAA,KAAA,YAAA,IAKJ,6BAAA,mBAEI,QAAA,GAGJ,WAAA,IAEI,OAAA,IAAA,MAAA,KC4KL,kBAAA,MDvKK,MC0KL,QAAA,mBDrKK,IE8KN,GDLC,kBAAA,MDrKK,ICwKL,UAAA,eCUD,GF5KM,GE2KN,EF1KM,QAAA,ECuKL,OAAA,ECSD,GF3KM,GCsKL,iBAAA,MD/JK,QCkKL,QAAA,KCSD,YFtKU,oBCiKT,iBAAA,eD7JK,OCgKL,OAAA,IAAA,MAAA,KD5JK,OC+JL,gBAAA,mBCSD,UFpKU,UC+JT,iBAAA,eDzJS,mBEkKV,mBDLC,OAAA,IAAA,MAAA,gBEjPD,WACA,YAAA,uBFsPD,IAAA,+CE7OC,IAAK,sDAAuD,4BAA6B,iDAAkD,gBAAiB,gDAAiD,eAAgB,+CAAgD,mBAAoB,2EAA4E,cAE7W,WACA,SAAA,SACA,IAAA,IACA,QAAA,aACA,YAAA,uBACA,WAAA,OACA,YAAA,IACA,YAAA,EAIkC,uBAAA,YAAW,wBAAA,UACX,2BAAW,QAAA,QAEX,uBDuPlC,QAAS,QCtPyB,sBFiPnC,uBEjP8C,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,qBAAW,QAAA,QACX,0BAAW,QAAA,QACX,qBAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,sBAAW,QAAA,QACX,yBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,+BAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,gCAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,gCAAW,QAAA,QACX,gCAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,0BAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,mCAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,sBAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QACX,4BAAW,QAAA,QACX,qCAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,mCAAW,QAAA,QACX,uCAAW,QAAA,QACX,gCAAW,QAAA,QACX,oCAAW,QAAA,QACX,qCAAW,QAAA,QACX,yCAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,iCAAW,QAAA,QACX,oCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,qBAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QASX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,+BAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,mCAAW,QAAA,QACX,4BAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,kCAAW,QAAA,QACX,mCAAW,QAAA,QACX,sCAAW,QAAA,QACX,0CAAW,QAAA,QACX,oCAAW,QAAA,QACX,wCAAW,QAAA,QACX,qCAAW,QAAA,QACX,iCAAW,QAAA,QACX,gCAAW,QAAA,QACX,kCAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QCtS/C,0BCgEE,QAAA,QHi+BF,EDNC,mBAAA,WGxhCI,gBAAiB,WFiiCZ,WAAY,WGl+BZ,OADL,QJg+BJ,mBAAA,WGthCI,gBAAiB,WACpB,WAAA,WHyhCD,KGrhCC,UAAW,KAEX,4BAAA,cAEA,KACA,YAAA,iBAAA,UAAA,MAAA,WHuhCD,UAAA,KGnhCC,YAAa,WF4hCb,MAAO,KACP,iBAAkB,KExhClB,OADA,MAEA,OHqhCD,SG/gCC,YAAa,QACb,UAAA,QACA,YAAA,QAEA,EFwhCA,MAAO,QEthCL,gBAAA,KAIF,QH8gCD,QKjkCC,MAAA,QACA,gBAAA,UF6DF,QACE,QAAA,IAAA,KAAA,yBHygCD,eAAA,KGlgCC,OHqgCD,OAAA,ECSD,IACE,eAAgB,ODDjB,4BM/kCC,0BLklCF,gBKnlCE,iBADA,eH4EA,QAAS,MACT,UAAA,KHugCD,OAAA,KGhgCC,aACA,cAAA,IAEA,eACA,QAAA,aC6FA,UAAA,KACK,OAAA,KACG,QAAA,IEvLR,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KN+lCD,cAAA,IGjgCC,mBAAoB,IAAI,IAAI,YAC5B,cAAA,IAAA,IAAA,YHmgCD,WAAA,IAAA,IAAA,YG5/BC,YACA,cAAA,IAEA,GH+/BD,WAAA,KGv/BC,cAAe,KACf,OAAA,EACA,WAAA,IAAA,MAAA,KAEA,SACA,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EHy/BD,OAAA,KGj/BC,SAAA,OF0/BA,KAAM,cEx/BJ,OAAA,EAEA,0BACA,yBACA,SAAA,OACA,MAAA,KHm/BH,OAAA,KGx+BC,OAAQ,EACR,SAAA,QH0+BD,KAAA,KCSD,cACE,OAAQ,QAQV,IACA,IMlpCE,IACA,IACA,IACA,INwoCF,GACA,GACA,GACA,GACA,GACA,GDAC,YAAA,QOlpCC,YAAa,IN2pCb,YAAa,IACb,MAAO,QAoBT,WAZA,UAaA,WAZA,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UDMC,WCLD,UACA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SMppCE,YAAa,INwqCb,YAAa,EACb,MAAO,KAGT,IMxqCE,IAJF,IN2qCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UM5qCA,WN8qCA,UACA,UANA,SM5qCI,UN8qCJ,SM3qCA,UN6qCA,SAQE,UAAW,IAGb,IMprCE,IAJF,INurCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UMvrCA,WNyrCA,UACA,UANA,SMxrCI,UN0rCJ,SMtrCA,UNwrCA,SMxrCU,UAAA,IACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KAOR,IADF,GPssCC,UAAA,KCSD,EMzsCE,OAAA,EAAA,EAAA,KAEA,MPosCD,cAAA,KO/rCC,UAAW,KAwOX,YAAa,IA1OX,YAAA,IPssCH,yBO7rCC,MNssCE,UAAW,MMjsCf,OAAA,MAEE,UAAA,IAKF,MP0rCC,KO1rCsB,QAAA,KP6rCtB,iBAAA,QO5rCsB,WP+rCtB,WAAA,KO9rCsB,YPisCtB,WAAA,MOhsCsB,aPmsCtB,WAAA,OOlsCsB,cPqsCtB,WAAA,QOlsCsB,aPqsCtB,YAAA,OOpsCsB,gBPusCtB,eAAA,UOtsCsB,gBPysCtB,eAAA,UOrsCC,iBPwsCD,eAAA,WQ3yCC,YR8yCD,MAAA,KCSD,cOpzCI,MAAA,QAHF,qBDwGF,qBP6sCC,MAAA,QCSD,cO3zCI,MAAA,QAHF,qBD2GF,qBPitCC,MAAA,QCSD,WOl0CI,MAAA,QAHF,kBD8GF,kBPqtCC,MAAA,QCSD,cOz0CI,MAAA,QAHF,qBDiHF,qBPytCC,MAAA,QCSD,aOh1CI,MAAA,QDwHF,oBAHF,oBExHE,MAAA,QACA,YR01CA,MAAO,KQx1CL,iBAAA,QAHF,mBF8HF,mBP2tCC,iBAAA,QCSD,YQ/1CI,iBAAA,QAHF,mBFiIF,mBP+tCC,iBAAA,QCSD,SQt2CI,iBAAA,QAHF,gBFoIF,gBPmuCC,iBAAA,QCSD,YQ72CI,iBAAA,QAHF,mBFuIF,mBPuuCC,iBAAA,QCSD,WQp3CI,iBAAA,QF6IF,kBADF,kBAEE,iBAAA,QPsuCD,aO7tCC,eAAgB,INsuChB,OAAQ,KAAK,EAAE,KMpuCf,cAAA,IAAA,MAAA,KAFF,GPkuCC,GCSC,WAAY,EACZ,cAAe,KM9tCf,MP0tCD,MO3tCD,MAPI,MASF,cAAA,EAIF,eALE,aAAA,EACA,WAAA,KPkuCD,aO9tCC,aAAc,EAKZ,YAAA,KACA,WAAA,KP6tCH,gBOvtCC,QAAS,aACT,cAAA,IACA,aAAA,IAEF,GNguCE,WAAY,EM9tCZ,cAAA,KAGA,GADF,GP0tCC,YAAA,WOttCC,GPytCD,YAAA,IOnnCD,GAvFM,YAAA,EAEA,yBACA,kBGtNJ,MAAA,KACA,MAAA,MACA,SAAA,OVq6CC,MAAA,KO7nCC,WAAY,MAhFV,cAAA,SPgtCH,YAAA,OOtsCD,kBNgtCE,YAAa,OM1sCjB,0BPssCC,YOrsCC,OAAA,KA9IqB,cAAA,IAAA,OAAA,KAmJvB,YACE,UAAA,IACA,eAAA,UAEA,WPssCD,QAAA,KAAA,KOjsCG,OAAA,EAAA,EAAA,KN0sCF,UAAW,OACX,YAAa,IAAI,MAAM,KMptCzB,yBP+sCC,wBO/sCD,yBNytCE,cAAe,EMnsCb,kBAFA,kBACA,iBPksCH,QAAA,MO/rCG,UAAA,INwsCF,YAAa,WACb,MAAO,KMhsCT,yBP2rCC,yBO3rCD,wBAEE,QAAA,cAEA,oBACA,sBACA,cAAA,KP6rCD,aAAA,EOvrCG,WAAA,MNgsCF,aAAc,IAAI,MAAM,KACxB,YAAa,EMhsCX,kCNksCJ,kCMnsCe,iCACX,oCNmsCJ,oCDLC,mCCUC,QAAS,GMjsCX,iCNmsCA,iCMzsCM,gCAOJ,mCNmsCF,mCDLC,kCO7rCC,QAAA,cPksCD,QWv+CC,cAAe,KVg/Cf,WAAY,OACZ,YAAa,WU7+Cb,KXy+CD,IWr+CD,IACE,KACA,YAAA,MAAA,OAAA,SAAA,cAAA,UAEA,KACA,QAAA,IAAA,IXu+CD,UAAA,IWn+CC,MAAO,QACP,iBAAA,QACA,cAAA,IAEA,IACA,QAAA,IAAA,IACA,UAAA,IV4+CA,MU5+CA,KXq+CD,iBAAA,KW3+CC,cAAe,IASb,mBAAA,MAAA,EAAA,KAAA,EAAA,gBACA,WAAA,MAAA,EAAA,KAAA,EAAA,gBAEA,QV6+CF,QU7+CE,EXq+CH,UAAA,KWh+CC,YAAa,IACb,mBAAA,KACA,WAAA,KAEA,IACA,QAAA,MACA,QAAA,MACA,OAAA,EAAA,EAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,WAAA,UXk+CD,UAAA,WW7+CC,iBAAkB,QAehB,OAAA,IAAA,MAAA,KACA,cAAA,IAEA,SACA,QAAA,EACA,UAAA,QXi+CH,MAAA,QW59CC,YAAa,SACb,iBAAA,YACA,cAAA,EC1DF,gBCHE,WAAA,MACA,WAAA,OAEA,Wb8hDD,cAAA,KYxhDC,aAAA,KAqEA,aAAc,KAvEZ,YAAA,KZ+hDH,yBY1hDC,WAkEE,MAAO,OZ69CV,yBY5hDC,WA+DE,MAAO,OZk+CV,0BYzhDC,WCvBA,MAAA,QAGA,iBbmjDD,cAAA,KYthDC,aAAc,KCvBd,aAAA,KACA,YAAA,KCAE,KACE,aAAA,MAEA,YAAA,MAGA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UdgjDL,SAAA,SchiDG,WAAA,IACE,cAAA,KdkiDL,aAAA,Kc1hDG,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud6hDH,MAAA,Kc7hDG,WdgiDH,MAAA,KchiDG,WdmiDH,MAAA,acniDG,WdsiDH,MAAA,actiDG,UdyiDH,MAAA,IcziDG,Ud4iDH,MAAA,ac5iDG,Ud+iDH,MAAA,ac/iDG,UdkjDH,MAAA,IcljDG,UdqjDH,MAAA,acrjDG,UdwjDH,MAAA,acxjDG,Ud2jDH,MAAA,Ic3jDG,Ud8jDH,MAAA,ac/iDG,UdkjDH,MAAA,YcljDG,gBdqjDH,MAAA,KcrjDG,gBdwjDH,MAAA,acxjDG,gBd2jDH,MAAA,ac3jDG,ed8jDH,MAAA,Ic9jDG,edikDH,MAAA,acjkDG,edokDH,MAAA,acpkDG,edukDH,MAAA,IcvkDG,ed0kDH,MAAA,ac1kDG,ed6kDH,MAAA,ac7kDG,edglDH,MAAA,IchlDG,edmlDH,MAAA,ac9kDG,edilDH,MAAA,YchmDG,edmmDH,MAAA,KcnmDG,gBdsmDH,KAAA,KctmDG,gBdymDH,KAAA,aczmDG,gBd4mDH,KAAA,ac5mDG,ed+mDH,KAAA,Ic/mDG,edknDH,KAAA,aclnDG,edqnDH,KAAA,acrnDG,edwnDH,KAAA,IcxnDG,ed2nDH,KAAA,ac3nDG,ed8nDH,KAAA,ac9nDG,edioDH,KAAA,IcjoDG,edooDH,KAAA,ac/nDG,edkoDH,KAAA,YcnnDG,edsnDH,KAAA,KctnDG,kBdynDH,YAAA,KcznDG,kBd4nDH,YAAA,ac5nDG,kBd+nDH,YAAA,ac/nDG,iBdkoDH,YAAA,IcloDG,iBdqoDH,YAAA,acroDG,iBdwoDH,YAAA,acxoDG,iBd2oDH,YAAA,Ic3oDG,iBd8oDH,YAAA,ac9oDG,iBdipDH,YAAA,acjpDG,iBdopDH,YAAA,IcppDG,iBdupDH,YAAA,acvpDG,iBd0pDH,YAAA,Yc5rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud0rDD,MAAA,Kc1rDC,Wd6rDD,MAAA,Kc7rDC,WdgsDD,MAAA,achsDC,WdmsDD,MAAA,acnsDC,UdssDD,MAAA,IctsDC,UdysDD,MAAA,aczsDC,Ud4sDD,MAAA,ac5sDC,Ud+sDD,MAAA,Ic/sDC,UdktDD,MAAA,acltDC,UdqtDD,MAAA,acrtDC,UdwtDD,MAAA,IcxtDC,Ud2tDD,MAAA,ac5sDC,Ud+sDD,MAAA,Yc/sDC,gBdktDD,MAAA,KcltDC,gBdqtDD,MAAA,acrtDC,gBdwtDD,MAAA,acxtDC,ed2tDD,MAAA,Ic3tDC,ed8tDD,MAAA,ac9tDC,ediuDD,MAAA,acjuDC,edouDD,MAAA,IcpuDC,eduuDD,MAAA,acvuDC,ed0uDD,MAAA,ac1uDC,ed6uDD,MAAA,Ic7uDC,edgvDD,MAAA,ac3uDC,ed8uDD,MAAA,Yc7vDC,edgwDD,MAAA,KchwDC,gBdmwDD,KAAA,KcnwDC,gBdswDD,KAAA,actwDC,gBdywDD,KAAA,aczwDC,ed4wDD,KAAA,Ic5wDC,ed+wDD,KAAA,ac/wDC,edkxDD,KAAA,aclxDC,edqxDD,KAAA,IcrxDC,edwxDD,KAAA,acxxDC,ed2xDD,KAAA,ac3xDC,ed8xDD,KAAA,Ic9xDC,ediyDD,KAAA,ac5xDC,ed+xDD,KAAA,YchxDC,edmxDD,KAAA,KcnxDC,kBdsxDD,YAAA,KctxDC,kBdyxDD,YAAA,aczxDC,kBd4xDD,YAAA,ac5xDC,iBd+xDD,YAAA,Ic/xDC,iBdkyDD,YAAA,aclyDC,iBdqyDD,YAAA,acryDC,iBdwyDD,YAAA,IcxyDC,iBd2yDD,YAAA,ac3yDC,iBd8yDD,YAAA,ac9yDC,iBdizDD,YAAA,IcjzDC,iBdozDD,YAAA,acpzDC,iBduzDD,YAAA,YY9yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udw1DD,MAAA,Kcx1DC,Wd21DD,MAAA,Kc31DC,Wd81DD,MAAA,ac91DC,Wdi2DD,MAAA,acj2DC,Udo2DD,MAAA,Icp2DC,Udu2DD,MAAA,acv2DC,Ud02DD,MAAA,ac12DC,Ud62DD,MAAA,Ic72DC,Udg3DD,MAAA,ach3DC,Udm3DD,MAAA,acn3DC,Uds3DD,MAAA,Ict3DC,Udy3DD,MAAA,ac12DC,Ud62DD,MAAA,Yc72DC,gBdg3DD,MAAA,Kch3DC,gBdm3DD,MAAA,acn3DC,gBds3DD,MAAA,act3DC,edy3DD,MAAA,Icz3DC,ed43DD,MAAA,ac53DC,ed+3DD,MAAA,ac/3DC,edk4DD,MAAA,Icl4DC,edq4DD,MAAA,acr4DC,edw4DD,MAAA,acx4DC,ed24DD,MAAA,Ic34DC,ed84DD,MAAA,acz4DC,ed44DD,MAAA,Yc35DC,ed85DD,MAAA,Kc95DC,gBdi6DD,KAAA,Kcj6DC,gBdo6DD,KAAA,acp6DC,gBdu6DD,KAAA,acv6DC,ed06DD,KAAA,Ic16DC,ed66DD,KAAA,ac76DC,edg7DD,KAAA,ach7DC,edm7DD,KAAA,Icn7DC,eds7DD,KAAA,act7DC,edy7DD,KAAA,acz7DC,ed47DD,KAAA,Ic57DC,ed+7DD,KAAA,ac17DC,ed67DD,KAAA,Yc96DC,edi7DD,KAAA,Kcj7DC,kBdo7DD,YAAA,Kcp7DC,kBdu7DD,YAAA,acv7DC,kBd07DD,YAAA,ac17DC,iBd67DD,YAAA,Ic77DC,iBdg8DD,YAAA,ach8DC,iBdm8DD,YAAA,acn8DC,iBds8DD,YAAA,Ict8DC,iBdy8DD,YAAA,acz8DC,iBd48DD,YAAA,ac58DC,iBd+8DD,YAAA,Ic/8DC,iBdk9DD,YAAA,acl9DC,iBdq9DD,YAAA,YYz8DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Uds/DD,MAAA,Kct/DC,Wdy/DD,MAAA,Kcz/DC,Wd4/DD,MAAA,ac5/DC,Wd+/DD,MAAA,ac//DC,UdkgED,MAAA,IclgEC,UdqgED,MAAA,acrgEC,UdwgED,MAAA,acxgEC,Ud2gED,MAAA,Ic3gEC,Ud8gED,MAAA,ac9gEC,UdihED,MAAA,acjhEC,UdohED,MAAA,IcphEC,UduhED,MAAA,acxgEC,Ud2gED,MAAA,Yc3gEC,gBd8gED,MAAA,Kc9gEC,gBdihED,MAAA,acjhEC,gBdohED,MAAA,acphEC,eduhED,MAAA,IcvhEC,ed0hED,MAAA,ac1hEC,ed6hED,MAAA,ac7hEC,edgiED,MAAA,IchiEC,edmiED,MAAA,acniEC,edsiED,MAAA,actiEC,edyiED,MAAA,IcziEC,ed4iED,MAAA,acviEC,ed0iED,MAAA,YczjEC,ed4jED,MAAA,Kc5jEC,gBd+jED,KAAA,Kc/jEC,gBdkkED,KAAA,aclkEC,gBdqkED,KAAA,acrkEC,edwkED,KAAA,IcxkEC,ed2kED,KAAA,ac3kEC,ed8kED,KAAA,ac9kEC,edilED,KAAA,IcjlEC,edolED,KAAA,acplEC,edulED,KAAA,acvlEC,ed0lED,KAAA,Ic1lEC,ed6lED,KAAA,acxlEC,ed2lED,KAAA,Yc5kEC,ed+kED,KAAA,Kc/kEC,kBdklED,YAAA,KcllEC,kBdqlED,YAAA,acrlEC,kBdwlED,YAAA,acxlEC,iBd2lED,YAAA,Ic3lEC,iBd8lED,YAAA,ac9lEC,iBdimED,YAAA,acjmEC,iBdomED,YAAA,IcpmEC,iBdumED,YAAA,acvmEC,iBd0mED,YAAA,ac1mEC,iBd6mED,YAAA,Ic7mEC,iBdgnED,YAAA,achnEC,iBdmnED,YAAA,YetrED,iBACA,YAAA,GAGA,MACA,iBAAA,YAEA,QfyrED,YAAA,IevrEC,eAAgB,IAChB,MAAA,KfyrED,WAAA,KelrEC,GACA,WAAA,KfsrED,OexrEC,MAAO,KdmsEP,UAAW,KACX,cAAe,KcvrET,mBd0rER,mBczrEQ,mBAHA,mBACA,mBd0rER,mBDHC,QAAA,IensEC,YAAa,WAoBX,eAAA,IACA,WAAA,IAAA,MAAA,KArBJ,mBdktEE,eAAgB,OAChB,cAAe,IAAI,MAAM,KDJ1B,uCCMD,uCcrtEA,wCdstEA,wCclrEI,2CANI,2CforEP,WAAA,EezqEG,mBf4qEH,WAAA,IAAA,MAAA,KCWD,cACE,iBAAkB,Kc/pEpB,6BdkqEA,6BcjqEE,6BAZM,6BfsqEP,6BCMD,6BDHC,QAAA,ICWD,gBACE,OAAQ,IAAI,MAAM,Kc1qEpB,4Bd6qEA,4Bc7qEA,4BAQQ,4Bf8pEP,4BCMD,4Bc7pEM,OAAA,IAAA,MAAA,KAYF,4BAFJ,4BfopEC,oBAAA,IevoEG,yCf0oEH,iBAAA,QehoEC,4BACA,iBAAA,QfooED,uBe9nEG,SAAA,OdyoEF,QAAS,acxoEL,MAAA,KAEA,sBfioEL,sBgB7wEC,SAAA,OfwxEA,QAAS,WACT,MAAO,KAST,0BerxEE,0Bf+wEF,0BAGA,0BexxEM,0BAMJ,0BfgxEF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCgBlyEC,sCAAA,oCfyyEF,sCetxEM,sCf2xEJ,iBAAkB,QASpB,2Be1yEE,2BfoyEF,2BAGA,2Be7yEM,2BAMJ,2BfqyEF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBvzEC,uCAAA,qCf8zEF,uCe3yEM,uCfgzEJ,iBAAkB,QASpB,wBe/zEE,wBfyzEF,wBAGA,wBel0EM,wBAMJ,wBf0zEF,wBAGA,wBACA,wBDNC,wBCAD,wBAGA,wBASE,iBAAkB,QDLnB,oCgB50EC,oCAAA,kCfm1EF,oCeh0EM,oCfq0EJ,iBAAkB,QASpB,2Bep1EE,2Bf80EF,2BAGA,2Bev1EM,2BAMJ,2Bf+0EF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBj2EC,uCAAA,qCfw2EF,uCer1EM,uCf01EJ,iBAAkB,QASpB,0Bez2EE,0Bfm2EF,0BAGA,0Be52EM,0BAMJ,0Bfo2EF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCehtEC,sCADF,oCdwtEA,sCe12EM,sCDoJJ,iBAAA,QA6DF,kBACE,WAAY,KA3DV,WAAA,KAEA,oCACA,kBACA,MAAA,KfotED,cAAA,Ke7pEC,WAAY,OAnDV,mBAAA,yBfmtEH,OAAA,IAAA,MAAA,KCWD,yBACE,cAAe,Ec5qEjB,qCd+qEA,qCcjtEI,qCARM,qCfktET,qCCMD,qCDHC,YAAA,OCWD,kCACE,OAAQ,EcvrEV,0Dd0rEA,0Dc1rEA,0DAzBU,0Df4sET,0DCMD,0DAME,YAAa,Ec/rEf,yDdksEA,yDclsEA,yDArBU,yDfgtET,yDCMD,yDAME,aAAc,EDLjB,yDe1sEW,yDEzNV,yDjBk6EC,yDiBj6ED,cAAA,GAMA,SjBk6ED,UAAA,EiB/5EC,QAAS,EACT,OAAA,EACA,OAAA,EAEA,OACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,KACA,UAAA,KjBi6ED,YAAA,QiB95EC,MAAO,KACP,OAAA,EACA,cAAA,IAAA,MAAA,QAEA,MjBg6ED,QAAA,aiBr5EC,UAAW,Kb4BX,cAAA,IACG,YAAA,IJ63EJ,mBiBr5EC,mBAAoB,WhBg6EjB,gBAAiB,WgB95EpB,WAAA,WjBy5ED,qBiBv5EC,kBAGA,OAAQ,IAAI,EAAE,EACd,WAAA,MjBs5ED,YAAA,OiBj5EC,iBACA,QAAA,MAIF,kBhB25EE,QAAS,MgBz5ET,MAAA,KAIF,iBAAA,ahB05EE,OAAQ,KI99ER,uBY2EF,2BjB64EC,wBiB54EC,QAAA,IAAA,KAAA,yBACA,eAAA,KAEA,OACA,QAAA,MjB+4ED,YAAA,IiBr3EC,UAAW,KACX,YAAA,WACA,MAAA,KAEA,cACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KbxDA,iBAAA,KACQ,iBAAA,KAyHR,OAAA,IAAA,MAAA,KACK,cAAA,IACG,mBAAA,MAAA,EAAA,IAAA,IAAA,iBJwzET,WAAA,MAAA,EAAA,IAAA,IAAA,iBkBh8EC,mBAAA,aAAA,YAAA,KAAA,mBAAA,YAAA,KACE,cAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KACA,WAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KdWM,oBJy7ET,aAAA,QIx5EC,QAAA,EACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBAEF,gCAA0B,MAAA,KJ25E3B,QAAA,EI15EiC,oCJ65EjC,MAAA,KiBh4EG,yCACA,MAAA,KAQF,0BhBs4EA,iBAAkB,YAClB,OAAQ,EgBn4EN,wBjB63EH,wBiB13EC,iChBq4EA,iBAAkB,KgBn4EhB,QAAA,EAIF,wBACE,iCjB03EH,OAAA,YiB72EC,sBjBg3ED,OAAA,KiB91EG,mBhB02EF,mBAAoB,KAEtB,qDgB32EM,8BjBo2EH,8BiBj2EC,wCAAA,+BhB62EA,YAAa,KgB32EX,iCjBy2EH,iCiBt2EC,2CAAA,kChB02EF,0BACA,0BACA,oCACA,2BAKE,YAAa,KgBh3EX,iCjB82EH,iCACF,2CiBp2EC,kChBu2EA,0BACA,0BACA,oCACA,2BgBz2EA,YAAA,MhBi3EF,YgBv2EE,cAAA,KAGA,UADA,OjBi2ED,SAAA,SiBr2EC,QAAS,MhBg3ET,WAAY,KgBx2EV,cAAA,KAGA,gBADA,aAEA,WAAA,KjBi2EH,aAAA,KiB91EC,cAAe,EhBy2Ef,YAAa,IACb,OAAQ,QgBp2ER,+BjBg2ED,sCiBl2EC,yBACA,gCAIA,SAAU,ShBw2EV,WAAY,MgBt2EZ,YAAA,MAIF,oBAAA,cAEE,WAAA,KAGA,iBADA,cAEA,SAAA,SACA,QAAA,aACA,aAAA,KjB61ED,cAAA,EiB31EC,YAAa,IhBs2Eb,eAAgB,OgBp2EhB,OAAA,QAUA,kCjBo1ED,4BCWC,WAAY,EACZ,YAAa,KgBv1Eb,wCAAA,qCjBm1ED,8BCOD,+BgBh2EI,2BhB+1EJ,4BAME,OAAQ,YDNT,0BiBv1EG,uBAMF,oCAAA,iChB61EA,OAAQ,YDNT,yBiBp1EK,sBAaJ,mCAFF,gCAGE,OAAA,YAGA,qBjBy0ED,WAAA,KiBv0EC,YAAA,IhBk1EA,eAAgB,IgBh1Ed,cAAA,EjB00EH,8BiB5zED,8BCnQE,cAAA,EACA,aAAA,EAEA,UACA,OAAA,KlBkkFD,QAAA,IAAA,KkBhkFC,UAAA,KACE,YAAA,IACA,cAAA,IAGF,gBjB0kFA,OAAQ,KiBxkFN,YAAA,KD2PA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBy0EH,QAAA,IAAA,KiB/0EC,UAAW,KAST,YAAA,IACA,cAAA,IAVJ,mChB81EE,OAAQ,KgBh1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBy0EH,WAAA,KiBr0EC,QAAS,IAAI,KC/Rb,UAAA,KACA,YAAA,IAEA,UACA,OAAA,KlBumFD,QAAA,KAAA,KkBrmFC,UAAA,KACE,YAAA,UACA,cAAA,IAGF,gBjB+mFA,OAAQ,KiB7mFN,YAAA,KDuRA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBk1EH,QAAA,KAAA,KiBx1EC,UAAW,KAST,YAAA,UACA,cAAA,IAVJ,mChBu2EE,OAAQ,KgBz1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBk1EH,WAAA,KiBz0EC,QAAS,KAAK,KAEd,UAAA,KjB00ED,YAAA,UiBt0EG,cjBy0EH,SAAA,SiBp0EC,4BACA,cAAA,OAEA,uBACA,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,MACA,MAAA,KjBu0ED,OAAA,KiBr0EC,YAAa,KhBg1Eb,WAAY,OACZ,eAAgB,KDLjB,oDiBv0EC,uCADA,iCAGA,MAAO,KhBg1EP,OAAQ,KACR,YAAa,KDLd,oDiBv0EC,uCADA,iCAKA,MAAO,KhB80EP,OAAQ,KACR,YAAa,KAKf,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBruFG,mCAJA,yBD0ZJ,gCbvWE,MAAA,QJ2rFD,2BkBxuFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJgsFD,iCiBz1EC,aAAc,QC5YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlByuFH,gCiB91EC,MAAO,QCtYL,iBAAA,QlBuuFH,aAAA,QCWD,oCACE,MAAO,QAKT,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBnwFG,mCAJA,yBD6ZJ,gCb1WE,MAAA,QJytFD,2BkBtwFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ8tFD,iCiBp3EC,aAAc,QC/YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBuwFH,gCiBz3EC,MAAO,QCzYL,iBAAA,QlBqwFH,aAAA,QCWD,oCACE,MAAO,QAKT,qBAEA,4BAJA,0BADA,uBAEA,kBAEA,yBDNC,0BkBjyFG,iCAJA,uBDgaJ,8Bb7WE,MAAA,QJuvFD,yBkBpyFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ4vFD,+BiB/4EC,aAAc,QClZZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBqyFH,8BiBp5EC,MAAO,QC5YL,iBAAA,QlBmyFH,aAAA,QiB/4EG,kCjBk5EH,MAAA,QiB/4EG,2CjBk5EH,IAAA,KiBv4EC,mDACA,IAAA,EAEA,YjB04ED,QAAA,MiBvzEC,WAAY,IAwEZ,cAAe,KAtIX,MAAA,QAEA,yBjBy3EH,yBiBrvEC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBw3EH,2BiB1vEC,QAAS,aAxHP,MAAA,KjBq3EH,eAAA,OiBj3EG,kCACA,QAAA,aAmHJ,0BhB4wEE,QAAS,aACT,eAAgB,OgBr3Ed,wCjB82EH,6CiBtwED,2CjBywEC,MAAA,KiB72EG,wCACA,MAAA,KAmGJ,4BhBwxEE,cAAe,EgBp3Eb,eAAA,OAGA,uBADA,oBjB82EH,QAAA,aiBpxEC,WAAY,EhB+xEZ,cAAe,EgBr3EX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB6xEC,sCiBx2EG,SAAA,SjB22EH,YAAA,EiBh2ED,kDhB42EE,IAAK,GgBl2EL,2BjB+1EH,kCiBh2EG,wBAEA,+BAXF,YAAa,IhBo3Eb,WAAY,EgBn2EV,cAAA,EJviBF,2BIshBF,wBJrhBE,WAAA,KI4jBA,6BAyBA,aAAc,MAnCV,YAAA,MAEA,yBjBw1EH,gCACF,YAAA,IiBx3EG,cAAe,EAwCf,WAAA,OAwBJ,sDAdQ,MAAA,KjB80EL,yBACF,+CiBn0EC,YAAA,KAEE,UAAW,MjBs0EZ,yBACF,+CmBp6FG,YAAa,IACf,UAAA,MAGA,KACA,QAAA,aACA,QAAA,IAAA,KAAA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,WACA,WAAA,OC0CA,YAAA,OACA,eAAA,OACA,iBAAA,aACA,aAAA,ahB+JA,OAAA,QACG,oBAAA,KACC,iBAAA,KACI,gBAAA,KJ+tFT,YAAA,KmBv6FG,iBAAA,KlBm7FF,OAAQ,IAAI,MAAM,YAClB,cAAe,IkB96Ff,kBdzBA,kBACA,WLk8FD,kBCOD,kBADA,WAME,QAAS,IAAI,KAAK,yBAClB,eAAgB,KkBh7FhB,WnBy6FD,WmB56FG,WlBw7FF,MAAO,KkBn7FL,gBAAA,Kf6BM,YADR,YJk5FD,iBAAA,KmBz6FC,QAAA,ElBq7FA,mBAAoB,MAAM,EAAE,IAAI,IAAI,iBAC5B,WAAY,MAAM,EAAE,IAAI,IAAI,iBoBh+FpC,cAGA,ejB8DA,wBACQ,OAAA,YJ05FT,OAAA,kBmBz6FG,mBAAA,KlBq7FM,WAAY,KkBn7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBi+FD,aoB99FC,MAAA,KnB0+FA,iBAAkB,KmBx+FhB,aAAA,KpBk+FH,mBoBh+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBi+FH,mBoB99FC,MAAA,KnB0+FA,iBAAkB,QAClB,aAAc,QmBt+FR,oBADJ,oBpBi+FH,mCoB99FG,MAAA,KnB0+FF,iBAAkB,QAClB,aAAc,QmBt+FN,0BnB4+FV,0BAHA,0BmB1+FM,0BnB4+FN,0BAHA,0BDFC,yCoBx+FK,yCnB4+FN,yCmBv+FE,MAAA,KnB++FA,iBAAkB,QAClB,aAAc,QmBx+FZ,oBpBg+FH,oBoBh+FG,mCnB6+FF,iBAAkB,KmBz+FV,4BnB8+FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB39FA,sCClBM,sCnB8+FN,sCmBx+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB0hGD,aoBvhGC,MAAA,KnBmiGA,iBAAkB,QmBjiGhB,aAAA,QpB2hGH,mBoBzhGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB0hGH,mBoBvhGC,MAAA,KnBmiGA,iBAAkB,QAClB,aAAc,QmB/hGR,oBADJ,oBpB0hGH,mCoBvhGG,MAAA,KnBmiGF,iBAAkB,QAClB,aAAc,QmB/hGN,0BnBqiGV,0BAHA,0BmBniGM,0BnBqiGN,0BAHA,0BDFC,yCoBjiGK,yCnBqiGN,yCmBhiGE,MAAA,KnBwiGA,iBAAkB,QAClB,aAAc,QmBjiGZ,oBpByhGH,oBoBzhGG,mCnBsiGF,iBAAkB,KmBliGV,4BnBuiGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBjhGA,sCCrBM,sCnBuiGN,sCmBjiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBmlGD,aoBhlGC,MAAA,KnB4lGA,iBAAkB,QmB1lGhB,aAAA,QpBolGH,mBoBllGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBmlGH,mBoBhlGC,MAAA,KnB4lGA,iBAAkB,QAClB,aAAc,QmBxlGR,oBADJ,oBpBmlGH,mCoBhlGG,MAAA,KnB4lGF,iBAAkB,QAClB,aAAc,QmBxlGN,0BnB8lGV,0BAHA,0BmB5lGM,0BnB8lGN,0BAHA,0BDFC,yCoB1lGK,yCnB8lGN,yCmBzlGE,MAAA,KnBimGA,iBAAkB,QAClB,aAAc,QmB1lGZ,oBpBklGH,oBoBllGG,mCnB+lGF,iBAAkB,KmB3lGV,4BnBgmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBtkGA,sCCzBM,sCnBgmGN,sCmB1lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB4oGD,UoBzoGC,MAAA,KnBqpGA,iBAAkB,QmBnpGhB,aAAA,QpB6oGH,gBoB3oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB4oGH,gBoBzoGC,MAAA,KnBqpGA,iBAAkB,QAClB,aAAc,QmBjpGR,iBADJ,iBpB4oGH,gCoBzoGG,MAAA,KnBqpGF,iBAAkB,QAClB,aAAc,QmBjpGN,uBnBupGV,uBAHA,uBmBrpGM,uBnBupGN,uBAHA,uBDFC,sCoBnpGK,sCnBupGN,sCmBlpGE,MAAA,KnB0pGA,iBAAkB,QAClB,aAAc,QmBnpGZ,iBpB2oGH,iBoB3oGG,gCnBwpGF,iBAAkB,KmBppGV,yBnBypGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB3nGA,mCC7BM,mCnBypGN,mCmBnpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBqsGD,aoBlsGC,MAAA,KnB8sGA,iBAAkB,QmB5sGhB,aAAA,QpBssGH,mBoBpsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBqsGH,mBoBlsGC,MAAA,KnB8sGA,iBAAkB,QAClB,aAAc,QmB1sGR,oBADJ,oBpBqsGH,mCoBlsGG,MAAA,KnB8sGF,iBAAkB,QAClB,aAAc,QmB1sGN,0BnBgtGV,0BAHA,0BmB9sGM,0BnBgtGN,0BAHA,0BDFC,yCoB5sGK,yCnBgtGN,yCmB3sGE,MAAA,KnBmtGA,iBAAkB,QAClB,aAAc,QmB5sGZ,oBpBosGH,oBoBpsGG,mCnBitGF,iBAAkB,KmB7sGV,4BnBktGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBhrGA,sCCjCM,sCnBktGN,sCmB5sGI,iBAAA,QACA,aAAA,QD8BJ,oBC9EE,MAAA,QACA,iBAAA,KpB8vGD,YoB3vGC,MAAA,KnBuwGA,iBAAkB,QmBrwGhB,aAAA,QpB+vGH,kBoB7vGO,kBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB8vGH,kBoB3vGC,MAAA,KnBuwGA,iBAAkB,QAClB,aAAc,QmBnwGR,mBADJ,mBpB8vGH,kCoB3vGG,MAAA,KnBuwGF,iBAAkB,QAClB,aAAc,QmBnwGN,yBnBywGV,yBAHA,yBmBvwGM,yBnBywGN,yBAHA,yBDFC,wCoBrwGK,wCnBywGN,wCmBpwGE,MAAA,KnB4wGA,iBAAkB,QAClB,aAAc,QmBrwGZ,mBpB6vGH,mBoB7vGG,kCnB0wGF,iBAAkB,KmBtwGV,2BnB2wGV,2BAHA,2BDHC,4BCOD,4BAHA,4BkBruGA,qCCrCM,qCnB2wGN,qCmBrwGI,iBAAA,QACA,aAAA,QDuCJ,mBACE,MAAA,QACA,iBAAA,KnB+tGD,UmB5tGC,YAAA,IlBwuGA,MAAO,QACP,cAAe,EAEjB,UGzwGE,iBemCE,iBflCM,oBJkwGT,6BmB7tGC,iBAAA,YlByuGA,mBAAoB,KACZ,WAAY,KkBtuGlB,UAEF,iBAAA,gBnB6tGD,gBmB3tGG,aAAA,YnBiuGH,gBmB/tGG,gBAIA,MAAA,QlBuuGF,gBAAiB,UACjB,iBAAkB,YDNnB,0BmBhuGK,0BAUN,mCATM,mClB2uGJ,MAAO,KmB1yGP,gBAAA,KAGA,mBADA,QpBmyGD,QAAA,KAAA,KmBztGC,UAAW,KlBquGX,YAAa,UmBjzGb,cAAA,IAGA,mBADA,QpB0yGD,QAAA,IAAA,KmB5tGC,UAAW,KlBwuGX,YAAa,ImBxzGb,cAAA,IAGA,mBADA,QpBizGD,QAAA,IAAA,ImB3tGC,UAAW,KACX,YAAA,IACA,cAAA,IAIF,WACE,QAAA,MnB2tGD,MAAA,KCYD,sBACE,WAAY,IqBz3GZ,6BADF,4BtBk3GC,6BI7rGC,MAAA,KAEQ,MJisGT,QAAA,EsBr3GC,mBAAA,QAAA,KAAA,OACE,cAAA,QAAA,KAAA,OtBu3GH,WAAA,QAAA,KAAA,OsBl3GC,StBq3GD,QAAA,EsBn3Ga,UtBs3Gb,QAAA,KsBr3Ga,atBw3Gb,QAAA,MsBv3Ga,etB03Gb,QAAA,UsBt3GC,kBACA,QAAA,gBlBwKA,YACQ,SAAA,SAAA,OAAA,EAOR,SAAA,OACQ,mCAAA,KAAA,8BAAA,KAGR,2BAAA,KACQ,4BAAA,KAAA,uBAAA,KJ2sGT,oBAAA,KuBr5GC,4BAA6B,OAAQ,WACrC,uBAAA,OAAA,WACA,oBAAA,OAAA,WAEA,OACA,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OvBu5GD,WAAA,IAAA,OuBn5GC,WAAY,IAAI,QtBk6GhB,aAAc,IAAI,MAAM,YsBh6GxB,YAAA,IAAA,MAAA,YAKA,UADF,QvBo5GC,SAAA,SuB94GC,uBACA,QAAA,EAEA,eACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KnBsBA,iBAAA,KACQ,wBAAA,YmBrBR,gBAAA,YtB+5GA,OsB/5GA,IAAA,MAAA,KvBk5GD,OAAA,IAAA,MAAA,gBuB74GC,cAAA,IACE,mBAAA,EAAA,IAAA,KAAA,iBACA,WAAA,EAAA,IAAA,KAAA,iBAzBJ,0BCzBE,MAAA,EACA,KAAA,KAEA,wBxBo8GD,OAAA,IuB96GC,OAAQ,IAAI,EAmCV,SAAA,OACA,iBAAA,QAEA,oBACA,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KvB84GH,YAAA,IuBx4GC,YAAA,WtBw5GA,MAAO,KsBt5GL,YAAA,OvB44GH,0BuB14GG,0BAMF,MAAA,QtBo5GA,gBAAiB,KACjB,iBAAkB,QsBj5GhB,yBAEA,+BADA,+BvBu4GH,MAAA,KuB73GC,gBAAA,KtB64GA,iBAAkB,QAClB,QAAS,EDZV,2BuB33GC,iCAAA,iCAEE,MAAA,KEzGF,iCF2GE,iCAEA,gBAAA,KvB63GH,OAAA,YuBx3GC,iBAAkB,YAGhB,iBAAA,KvBw3GH,OAAA,0DuBn3GG,qBvBs3GH,QAAA,MuB72GC,QACA,QAAA,EAQF,qBACE,MAAA,EACA,KAAA,KAIF,oBACE,MAAA,KACA,KAAA,EAEA,iBACA,QAAA,MACA,QAAA,IAAA,KvBw2GD,UAAA,KuBp2GC,YAAa,WACb,MAAA,KACA,YAAA,OAEA,mBACA,SAAA,MACA,IAAA,EvBs2GD,MAAA,EuBl2GC,OAAQ,EACR,KAAA,EACA,QAAA,IAQF,2BtB42GE,MAAO,EsBx2GL,KAAA,KAEA,eACA,sCvB41GH,QAAA,GuBn2GC,WAAY,EtBm3GZ,cAAe,IAAI,OsBx2GjB,cAAA,IAAA,QAEA,uBvB41GH,8CuBv0GC,IAAK,KAXL,OAAA,KApEA,cAAA,IvB25GC,yBuBv1GD,6BA1DA,MAAA,EACA,KAAA,KvBq5GD,kC0BpiHG,MAAO,KzBojHP,KAAM,GyBhjHR,W1BsiHD,oB0B1iHC,SAAU,SzB0jHV,QAAS,ayBpjHP,eAAA,OAGA,yB1BsiHH,gBCgBC,SAAU,SACV,MAAO,KyB7iHT,gC1BsiHC,gCCYD,+BAFA,+ByBhjHA,uBANM,uBzBujHN,sBAFA,sBAQE,QAAS,EyBljHP,qB1BuiHH,2B0BliHD,2BACE,iC1BoiHD,YAAA,KCgBD,aACE,YAAa,KDZd,kB0B1iHD,wBAAA,0BzB2jHE,MAAO,KDZR,kB0B/hHD,wBACE,0B1BiiHD,YAAA,I0B5hHC,yE1B+hHD,cAAA,E2BhlHC,4BACG,YAAA,EDsDL,mEzB6iHE,wBAAyB,E0B5lHzB,2BAAA,E3BilHD,6C0B5hHD,8CACE,uBAAA,E1B8hHD,0BAAA,E0B3hHC,sB1B8hHD,MAAA,KCgBD,8D0B/mHE,cAAA,E3BomHD,mE0B3hHD,oECjEE,wBAAA,EACG,2BAAA,EDqEL,oEzB0iHE,uBAAwB,EyBxiHxB,0BAAA,EAiBF,mCACE,iCACA,QAAA,EAEF,iCACE,cAAA,IACA,aAAA,IAKF,oCtB/CE,cAAA,KACQ,aAAA,KsBkDR,iCtBnDA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsByDV,0CACE,mBAAA,K1BugHD,WAAA,K0BngHC,YACA,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,E1BqgHD,oBAAA,ECgBD,uBACE,aAAc,EAAE,IAAI,IyB1gHlB,yBACA,+BACA,oC1B+/GH,QAAA,M0BtgHC,MAAO,KAcH,MAAA,K1B2/GL,UAAA,KCgBD,oCACE,MAAO,KyBpgHL,8BACA,oC1By/GH,oC0Bp/GC,0CACE,WAAA,K1Bs/GH,YAAA,E2B/pHC,4DACC,cAAA,EAQA,sD3B4pHF,uBAAA,I0Bt/GC,wBAAA,IC/KA,2BAAA,EACC,0BAAA,EAQA,sD3BkqHF,uBAAA,E0Bv/GC,wBAAyB,EACzB,2BAAA,I1By/GD,0BAAA,ICgBD,uE0BtrHE,cAAA,E3B2qHD,4E0Bt/GD,6EC7LE,2BAAA,EACC,0BAAA,EDoMH,6EACE,uBAAA,EACA,wBAAA,EAEA,qB1Bo/GD,QAAA,M0Bx/GC,MAAO,KzBwgHP,aAAc,MyBjgHZ,gBAAA,SAEA,0B1Bq/GH,gC0B9/GC,QAAS,WAYP,MAAA,K1Bq/GH,MAAA,G0Bj/GG,qC1Bo/GH,MAAA,KCgBD,+CACE,KAAM,KyB7+GF,gDAFA,6C1Bs+GL,2D0Br+GK,wDEzOJ,SAAU,SACV,KAAA,cACA,eAAA,K5BitHD,a4B7sHC,SAAA,SACE,QAAA,MACA,gBAAA,S5BgtHH,0B4BxtHC,MAAO,KAeL,cAAA,EACA,aAAA,EAOA,2BACA,SAAA,S5BusHH,QAAA,E4BrsHG,MAAA,KACE,MAAA,K5BusHL,cAAA,ECgBD,iCACE,QAAS,EiBnrHT,8BACA,mCACA,sCACA,OAAA,KlBwqHD,QAAA,KAAA,KkBtqHC,UAAA,KjBsrHA,YAAa,UACb,cAAe,IiBrrHb,oClB0qHH,yCkBvqHC,4CjBurHA,OAAQ,KACR,YAAa,KDTd,8C4B/sHD,mDAAA,sD3B0tHA,sCACA,2CiBzrHI,8CjB8rHF,OAAQ,KiB1sHR,8BACA,mCACA,sCACA,OAAA,KlB+rHD,QAAA,IAAA,KkB7rHC,UAAA,KjB6sHA,YAAa,IACb,cAAe,IiB5sHb,oClBisHH,yCkB9rHC,4CjB8sHA,OAAQ,KACR,YAAa,KDTd,8C4B7tHD,mDAAA,sD3BwuHA,sCACA,2CiBhtHI,8CjBqtHF,OAAQ,K2BzuHR,2B5B6tHD,mB4B7tHC,iB3B8uHA,QAAS,W2BzuHX,8D5B6tHC,sD4B7tHD,oDAEE,cAAA,EAEA,mB5B+tHD,iB4B1tHC,MAAO,GACP,YAAA,OACA,eAAA,OAEA,mBACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,K5B4tHD,WAAA,O4BztHC,iBAAA,KACE,OAAA,IAAA,MAAA,KACA,cAAA,I5B4tHH,4B4BztHC,QAAA,IAAA,KACE,UAAA,KACA,cAAA,I5B4tHH,4B4B/uHC,QAAS,KAAK,K3B+vHd,UAAW,K2BruHT,cAAA,IAKJ,wCAAA,qC3BquHE,WAAY,EAEd,uCACA,+BACA,kC0B70HE,6CACG,8CC4GL,6D5BqtHC,wE4BptHC,wBAAA,E5ButHD,2BAAA,ECgBD,+BACE,aAAc,EAEhB,sCACA,8B2BhuHA,+D5BstHC,oDCWD,iC0Bl1HE,4CACG,6CCiHH,uBAAA,E5BwtHD,0BAAA,E4BltHC,8BAGA,YAAA,E5BotHD,iB4BxtHC,SAAU,SAUR,UAAA,E5BitHH,YAAA,O4B/sHK,sB5BktHL,SAAA,SCgBD,2BACE,YAAa,K2BxtHb,6BAAA,4B5B4sHD,4B4BzsHK,QAAA,EAGJ,kCAAA,wCAGI,aAAA,K5B4sHL,iC6B12HD,uCACE,QAAA,EACA,YAAA,K7B62HD,K6B/2HC,aAAc,EAOZ,cAAA,EACA,WAAA,KARJ,QAWM,SAAA,SACA,QAAA,M7B42HL,U6B12HK,SAAA,S5B03HJ,QAAS,M4Bx3HH,QAAA,KAAA,KAMJ,gB7Bu2HH,gB6Bt2HK,gBAAA,K7By2HL,iBAAA,KCgBD,mB4Br3HQ,MAAA,KAGA,yBADA,yB7B02HP,MAAA,K6Bl2HG,gBAAA,K5Bk3HF,OAAQ,YACR,iBAAkB,Y4B/2Hd,aAzCN,mB7B64HC,mBwBh5HC,iBAAA,KACA,aAAA,QAEA,kBxBm5HD,OAAA,I6Bn5HC,OAAQ,IAAI,EA0DV,SAAA,O7B41HH,iBAAA,Q6Bl1HC,c7Bq1HD,UAAA,K6Bn1HG,UAEA,cAAA,IAAA,MAAA,KALJ,aASM,MAAA,KACA,cAAA,KAEA,e7Bo1HL,aAAA,I6Bn1HK,YAAA,WACE,OAAA,IAAA,MAAA,Y7Bq1HP,cAAA,IAAA,IAAA,EAAA,ECgBD,qBACE,aAAc,KAAK,KAAK,K4B51HlB,sBAEA,4BADA,4BAEA,MAAA,K7Bi1HP,OAAA,Q6B50HC,iBAAA,KAqDA,OAAA,IAAA,MAAA,KA8BA,oBAAA,YAnFA,wBAwDE,MAAA,K7B2xHH,cAAA,E6BzxHK,2BACA,MAAA,KA3DJ,6BAgEE,cAAA,IACA,WAAA,OAYJ,iDA0DE,IAAK,KAjED,KAAA,K7B0xHH,yB6BztHD,2BA9DM,QAAA,W7B0xHL,MAAA,G6Bn2HD,6BAuFE,cAAA,GAvFF,6B5Bw3HA,aAAc,EACd,cAAe,IDZhB,kC6BtuHD,wCA3BA,wCATM,OAAA,IAAA,MAAA,K7B+wHH,yB6B3uHD,6B5B2vHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,kC6B92HD,wC7B+2HD,wC6B72HG,oBAAA,MAIE,c7B+2HL,MAAA,K6B52HK,gB7B+2HL,cAAA,ICgBD,iBACE,YAAa,I4Bv3HP,uBAQR,6B7Bo2HC,6B6Bl2HG,MAAA,K7Bq2HH,iBAAA,Q6Bn2HK,gBACA,MAAA,KAYN,mBACE,WAAA,I7B41HD,YAAA,E6Bz1HG,e7B41HH,MAAA,K6B11HK,kBACA,MAAA,KAPN,oBAYI,cAAA,IACA,WAAA,OAYJ,wCA0DE,IAAK,KAjED,KAAA,K7B21HH,yB6B1xHD,kBA9DM,QAAA,W7B21HL,MAAA,G6Bl1HD,oBACA,cAAA,GAIE,oBACA,cAAA,EANJ,yB5B02HE,aAAc,EACd,cAAe,IDZhB,8B6B1yHD,oCA3BA,oCATM,OAAA,IAAA,MAAA,K7Bm1HH,yB6B/yHD,yB5B+zHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,8B6Bx0HD,oC7By0HD,oC6Bv0HG,oBAAA,MAGA,uB7B00HH,QAAA,K6B/zHC,qBF3OA,QAAA,M3B+iID,yB8BxiIC,WAAY,KACZ,uBAAA,EACA,wBAAA,EAEA,Q9B0iID,SAAA,S8BliIC,WAAY,KA8nBZ,cAAe,KAhoBb,OAAA,IAAA,MAAA,Y9ByiIH,yB8BzhIC,QAgnBE,cAAe,K9B86GlB,yB8BjhIC,eACA,MAAA,MAGA,iBACA,cAAA,KAAA,aAAA,KAEA,WAAA,Q9BkhID,2BAAA,M8BhhIC,WAAA,IAAA,MAAA,YACE,mBAAA,MAAA,EAAA,IAAA,EAAA,qB9BkhIH,WAAA,MAAA,EAAA,IAAA,EAAA,qB8Bz7GD,oBArlBI,WAAA,KAEA,yBAAA,iB9BkhID,MAAA,K8BhhIC,WAAA,EACE,mBAAA,KACA,WAAA,KAEA,0B9BkhIH,QAAA,gB8B/gIC,OAAA,eACE,eAAA,E9BihIH,SAAA,kBCkBD,oBACE,WAAY,QDZf,sC8B/gIK,mC9B8gIH,oC8BzgIC,cAAe,E7B4hIf,aAAc,G6Bj+GlB,sCAnjBE,mC7ByhIA,WAAY,MDdX,4D8BngID,sC9BogID,mCCkBG,WAAY,O6B3gId,kCANE,gC9BsgIH,4B8BvgIG,0BAuiBF,aAAc,M7Bm/Gd,YAAa,MAEf,yBDZC,kC8B3gIK,gC9B0gIH,4B8B3gIG,0BAcF,aAAc,EAChB,YAAA,GAMF,mBA8gBE,QAAS,KAhhBP,aAAA,EAAA,EAAA,I9BkgIH,yB8B7/HC,mB7B+gIE,cAAe,G6B1gIjB,qBADA,kB9BggID,SAAA,M8Bz/HC,MAAO,EAggBP,KAAM,E7B4gHN,QAAS,KDdR,yB8B7/HD,qB9B8/HD,kB8B7/HC,cAAA,GAGF,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,I9BigID,qB8B1/HC,OAAQ,EACR,cAAA,EACA,aAAA,IAAA,EAAA,EAEA,cACA,MAAA,K9B4/HD,OAAA,K8B1/HC,QAAA,KAAA,K7B4gIA,UAAW,K6B1gIT,YAAA,KAIA,oBAbJ,oB9BwgIC,gBAAA,K8Bv/HG,kB7B0gIF,QAAS,MDdR,yBACF,iC8Bh/HC,uCACA,YAAA,OAGA,eC9LA,SAAA,SACA,MAAA,MD+LA,QAAA,IAAA,KACA,WAAA,IACA,aAAA,KACA,cAAA,I9Bm/HD,iBAAA,Y8B/+HC,iBAAA,KACE,OAAA,IAAA,MAAA,Y9Bi/HH,cAAA,I8B5+HG,qBACA,QAAA,EAEA,yB9B++HH,QAAA,M8BrgIC,MAAO,KAyBL,OAAA,I9B++HH,cAAA,I8BpjHD,mCAvbI,WAAA,I9Bg/HH,yB8Bt+HC,eACA,QAAA,MAGE,YACA,OAAA,MAAA,M9By+HH,iB8B58HC,YAAA,KA2YA,eAAgB,KAjaZ,YAAA,KAEA,yBACA,iCACA,SAAA,OACA,MAAA,KACA,MAAA,KAAA,WAAA,E9Bs+HH,iBAAA,Y8B3kHC,OAAQ,E7B8lHR,mBAAoB,K6Bt/HhB,WAAA,KAGA,kDAqZN,sC9BklHC,QAAA,IAAA,KAAA,IAAA,KCmBD,sC6Bv/HQ,YAAA,KAmBR,4C9Bs9HD,4C8BvlHG,iBAAkB,M9B4lHnB,yB8B5lHD,YAtYI,MAAA,K9Bq+HH,OAAA,E8Bn+HK,eACA,MAAA,K9Bu+HP,iB8B39HG,YAAa,KACf,eAAA,MAGA,aACA,QAAA,KAAA,K1B9NA,WAAA,IACQ,aAAA,M2B/DR,cAAA,IACA,YAAA,M/B4vID,WAAA,IAAA,MAAA,YiBtuHC,cAAe,IAAI,MAAM,YAwEzB,mBAAoB,MAAM,EAAE,IAAI,EAAE,qBAAyB,EAAE,IAAI,EAAE,qBAtI/D,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,qBAEA,yBjBwyHH,yBiBpqHC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBuyHH,2BiBzqHC,QAAS,aAxHP,MAAA,KjBoyHH,eAAA,OiBhyHG,kCACA,QAAA,aAmHJ,0BhBmsHE,QAAS,aACT,eAAgB,OgB5yHd,wCjB6xHH,6CiBrrHD,2CjBwrHC,MAAA,KiB5xHG,wCACA,MAAA,KAmGJ,4BhB+sHE,cAAe,EgB3yHb,eAAA,OAGA,uBADA,oBjB6xHH,QAAA,aiBnsHC,WAAY,EhBstHZ,cAAe,EgB5yHX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB4sHC,sCiBvxHG,SAAA,SjB0xHH,YAAA,E8BngID,kDAmWE,IAAK,GAvWH,yBACE,yB9B8gIL,cAAA,I8B5/HD,oCAoVE,cAAe,GA1Vf,yBACA,aACA,MAAA,KACA,YAAA,E1BzPF,eAAA,EACQ,aAAA,EJmwIP,YAAA,EACF,OAAA,E8BngIG,mBAAoB,KACtB,WAAA,M9BugID,8B8BngIC,WAAY,EACZ,uBAAA,EHzUA,wBAAA,EAQA,mDACC,cAAA,E3By0IF,uBAAA,I8B//HC,wBAAyB,IChVzB,2BAAA,EACA,0BAAA,EDkVA,YCnVA,WAAA,IACA,cAAA,IDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,mBChWE,WAAA,KACA,cAAA,KDuWF,aAsSE,WAAY,KA1SV,cAAA,KAEA,yB9B+/HD,aACF,MAAA,K8Bl+HG,aAAc,KAhBhB,YAAA,MACA,yBE5WA,aF8WE,MAAA,eAFF,cAKI,MAAA,gB9Bu/HH,aAAA,M8B7+HD,4BACA,aAAA,GADF,gBAKI,iBAAA,Q9Bg/HH,aAAA,QCmBD,8B6BhgIM,MAAA,KARN,oC9B0/HC,oC8B5+HG,MAAA,Q9B++HH,iBAAA,Y8B1+HK,6B9B6+HL,MAAA,KCmBD,iC6B5/HQ,MAAA,KAKF,uC9By+HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bz/HZ,sCAIF,4C9Bu+HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bv/HZ,wCAxCR,8C9BihIC,8C8Bn+HG,MAAA,K9Bs+HH,iBAAA,YCmBD,+B6Bt/HM,aAAA,KAGA,qCApDN,qC9B2hIC,iBAAA,KCmBD,yC6Bp/HI,iBAAA,KAOE,iCAAA,6B7Bk/HJ,aAAc,Q6B9+HR,oCAiCN,0C9B+7HD,0C8B3xHC,MAAO,KA7LC,iBAAA,QACA,yB7B8+HR,sD6B5+HU,MAAA,KAKF,4D9By9HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bz+HV,2DAIF,iE9Bu9HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bv+HV,6D9B09HX,mEADE,mE8B1jIC,MAAO,KA8GP,iBAAA,aAEE,6B9Bi9HL,MAAA,K8B58HG,mC9B+8HH,MAAA,KCmBD,0B6B/9HM,MAAA,KAIA,gCAAA,gC7Bg+HJ,MAAO,K6Bt9HT,0CARQ,0CASN,mD9Bu8HD,mD8Bt8HC,MAAA,KAFF,gBAKI,iBAAA,K9B08HH,aAAA,QCmBD,8B6B19HM,MAAA,QARN,oC9Bo9HC,oC8Bt8HG,MAAA,K9By8HH,iBAAA,Y8Bp8HK,6B9Bu8HL,MAAA,QCmBD,iC6Bt9HQ,MAAA,QAKF,uC9Bm8HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bn9HZ,sCAIF,4C9Bi8HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bj9HZ,wCAxCR,8C9B2+HC,8C8B57HG,MAAA,K9B+7HH,iBAAA,YCmBD,+B6B/8HM,aAAA,KAGA,qCArDN,qC9Bq/HC,iBAAA,KCmBD,yC6B78HI,iBAAA,KAME,iCAAA,6B7B48HJ,aAAc,Q6Bx8HR,oCAuCN,0C9Bm5HD,0C8B33HC,MAAO,KAvDC,iBAAA,QAuDV,yBApDU,kE9Bs7HP,aAAA,Q8Bn7HO,0D9Bs7HP,iBAAA,QCmBD,sD6Bt8HU,MAAA,QAKF,4D9Bm7HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bn8HV,2DAIF,iE9Bi7HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bj8HV,6D9Bo7HX,mEADE,mE8B1hIC,MAAO,KA+GP,iBAAA,aAEE,6B9Bg7HL,MAAA,Q8B36HG,mC9B86HH,MAAA,KCmBD,0B6B97HM,MAAA,QAIA,gCAAA,gC7B+7HJ,MAAO,KgCvkJT,0CH0oBQ,0CGzoBN,mDjCwjJD,mDiCvjJC,MAAA,KAEA,YACA,QAAA,IAAA,KjC2jJD,cAAA,KiChkJC,WAAY,KAQV,iBAAA,QjC2jJH,cAAA,IiCxjJK,eACA,QAAA,ajC4jJL,yBiCxkJC,QAAS,EAAE,IAkBT,MAAA,KjCyjJH,QAAA,SkC5kJC,oBACA,MAAA,KAEA,YlC+kJD,QAAA,akCnlJC,aAAc,EAOZ,OAAA,KAAA,ElC+kJH,cAAA,ICmBD,eiC/lJM,QAAA,OAEA,iBACA,oBACA,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WlCglJL,MAAA,QkC9kJG,gBAAA,KjCimJF,iBAAkB,KiC9lJZ,OAAA,IAAA,MAAA,KPVH,6B3B2lJJ,gCkC7kJG,YAAA,EjCgmJF,uBAAwB,I0BvnJxB,0BAAA,I3BymJD,4BkCxkJG,+BjC2lJF,wBAAyB,IACzB,2BAA4B,IiCxlJxB,uBAFA,uBAGA,0BAFA,0BlC8kJL,QAAA,EkCtkJG,MAAA,QjCylJF,iBAAkB,KAClB,aAAc,KAEhB,sBiCvlJM,4BAFA,4BjC0lJN,yBiCvlJM,+BAFA,+BAGA,QAAA,ElC2kJL,MAAA,KkCloJC,OAAQ,QjCqpJR,iBAAkB,QAClB,aAAc,QiCnlJV,wBAEA,8BADA,8BjColJN,2BiCtlJM,iCjCulJN,iCDZC,MAAA,KkC/jJC,OAAQ,YjCklJR,iBAAkB,KkC7pJd,aAAA,KAEA,oBnC8oJL,uBmC5oJG,QAAA,KAAA,KlC+pJF,UAAW,K0B1pJX,YAAA,U3B4oJD,gCmC3oJG,mClC8pJF,uBAAwB,I0BvqJxB,0BAAA,I3BypJD,+BkC1kJD,kCjC6lJE,wBAAyB,IkC7qJrB,2BAAA,IAEA,oBnC8pJL,uBmC5pJG,QAAA,IAAA,KlC+qJF,UAAW,K0B1qJX,YAAA,I3B4pJD,gCmC3pJG,mClC8qJF,uBAAwB,I0BvrJxB,0BAAA,I3ByqJD,+BoC3qJD,kCACE,wBAAA,IACA,2BAAA,IAEA,OpC6qJD,aAAA,EoCjrJC,OAAQ,KAAK,EAOX,WAAA,OpC6qJH,WAAA,KCmBD,UmC7rJM,QAAA,OAEA,YACA,eACA,QAAA,apC8qJL,QAAA,IAAA,KoC5rJC,iBAAkB,KnC+sJlB,OAAQ,IAAI,MAAM,KmC5rJd,cAAA,KAnBN,kBpCisJC,kBCmBC,gBAAiB,KmCzrJb,iBAAA,KA3BN,eAAA,kBAkCM,MAAA,MAlCN,mBAAA,sBnC6tJE,MAAO,KmClrJH,mBAEA,yBADA,yBpCqqJL,sBqCltJC,MAAO,KACP,OAAA,YACA,iBAAA,KAEA,OACA,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KrCotJD,WAAA,OqChtJG,YAAA,OpCmuJF,eAAgB,SoCjuJZ,cAAA,MrCotJL,cqCltJK,cAKJ,MAAA,KACE,gBAAA,KrC+sJH,OAAA,QqC1sJG,aACA,QAAA,KAOJ,YCtCE,SAAA,StC+uJD,IAAA,KCmBD,eqC7vJM,iBAAA,KALJ,2BD0CF,2BrC4sJC,iBAAA,QCmBD,eqCpwJM,iBAAA,QALJ,2BD8CF,2BrC+sJC,iBAAA,QCmBD,eqC3wJM,iBAAA,QALJ,2BDkDF,2BrCktJC,iBAAA,QCmBD,YqClxJM,iBAAA,QALJ,wBDsDF,wBrCqtJC,iBAAA,QCmBD,eqCzxJM,iBAAA,QALJ,2BD0DF,2BrCwtJC,iBAAA,QCmBD,cqChyJM,iBAAA,QCDJ,0BADF,0BAEE,iBAAA,QAEA,OACA,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OvCqxJD,YAAA,OuClxJC,eAAA,OACE,iBAAA,KvCoxJH,cAAA,KuC/wJG,aACA,QAAA,KAGF,YtCkyJA,SAAU,SsChyJR,IAAA,KAMA,0BvC4wJH,eCmBC,IAAK,EsC7xJD,QAAA,IAAA,IvCgxJL,cuC9wJK,cAKJ,MAAA,KtC4xJA,gBAAiB,KsC1xJf,OAAA,QvC4wJH,+BuCxwJC,4BACE,MAAA,QvC0wJH,iBAAA,KuCtwJG,wBvCywJH,MAAA,MuCrwJG,+BvCwwJH,aAAA,IwCj0JC,uBACA,YAAA,IAEA,WACA,YAAA,KxCo0JD,eAAA,KwCz0JC,cAAe,KvC41Jf,MAAO,QuCn1JL,iBAAA,KAIA,eAbJ,cAcI,MAAA,QxCo0JH,awCl1JC,cAAe,KAmBb,UAAA,KxCk0JH,YAAA,ICmBD,cuCh1JI,iBAAA,QAEA,sBxCi0JH,4BwC31JC,cAAe,KA8Bb,aAAA,KxCg0JH,cAAA,IwC7yJD,sBAfI,UAAA,KxCi0JD,oCwC9zJC,WvCi1JA,YAAa,KuC/0JX,eAAA,KxCi0JH,sBwCvzJD,4BvC00JE,cAAe,KuC90Jb,aAAA,KC5CJ,ezC42JD,cyC32JC,UAAA,MAGA,WACA,QAAA,MACA,QAAA,IACA,cAAA,KrCiLA,YAAA,WACK,iBAAA,KACG,OAAA,IAAA,MAAA,KJ8rJT,cAAA,IyCx3JC,mBAAoB,OAAO,IAAI,YxC24J1B,cAAe,OAAO,IAAI,YwC93J7B,WAAA,OAAA,IAAA,YAKF,iBzC22JD,eCmBC,aAAc,KACd,YAAa,KwCv3JX,mBA1BJ,kBzCk4JC,kByCv2JG,aAAA,QCzBJ,oBACE,QAAA,IACA,MAAA,KAEA,O1Cs4JD,QAAA,K0C14JC,cAAe,KAQb,OAAA,IAAA,MAAA,YAEA,cAAA,IAVJ,UAeI,WAAA,E1Ck4JH,MAAA,QCmBD,mByC/4JI,YAAA,IArBJ,SAyBI,U1C+3JH,cAAA,ECmBD,WyCx4JE,WAAA,IAFF,mBAAA,mBAMI,cAAA,KAEA,0BACA,0B1Cy3JH,SAAA,S0Cj3JC,IAAK,KCvDL,MAAA,MACA,MAAA,Q3C46JD,e0Ct3JC,MAAO,QClDL,iBAAA,Q3C26JH,aAAA,Q2Cx6JG,kB3C26JH,iBAAA,Q2Cn7JC,2BACA,MAAA,Q3Cu7JD,Y0C73JC,MAAO,QCtDL,iBAAA,Q3Cs7JH,aAAA,Q2Cn7JG,e3Cs7JH,iBAAA,Q2C97JC,wBACA,MAAA,Q3Ck8JD,e0Cp4JC,MAAO,QC1DL,iBAAA,Q3Ci8JH,aAAA,Q2C97JG,kB3Ci8JH,iBAAA,Q2Cz8JC,2BACA,MAAA,Q3C68JD,c0C34JC,MAAO,QC9DL,iBAAA,Q3C48JH,aAAA,Q2Cz8JG,iB3C48JH,iBAAA,Q4C78JC,0BAAQ,MAAA,QACR,wCAAQ,K5Cm9JP,oBAAA,KAAA,E4C/8JD,GACA,oBAAA,EAAA,GACA,mCAAQ,K5Cq9JP,oBAAA,KAAA,E4Cv9JD,GACA,oBAAA,EAAA,GACA,gCAAQ,K5Cq9JP,oBAAA,KAAA,E4C78JD,GACA,oBAAA,EAAA,GAGA,UACA,OAAA,KxCsCA,cAAA,KACQ,SAAA,OJ26JT,iBAAA,Q4C78JC,cAAe,IACf,mBAAA,MAAA,EAAA,IAAA,IAAA,eACA,WAAA,MAAA,EAAA,IAAA,IAAA,eAEA,cACA,MAAA,KACA,MAAA,EACA,OAAA,KACA,UAAA,KxCyBA,YAAA,KACQ,MAAA,KAyHR,WAAA,OACK,iBAAA,QACG,mBAAA,MAAA,EAAA,KAAA,EAAA,gBJ+zJT,WAAA,MAAA,EAAA,KAAA,EAAA,gB4C18JC,mBAAoB,MAAM,IAAI,K3Cq+JzB,cAAe,MAAM,IAAI,K4Cp+J5B,WAAA,MAAA,IAAA,KDEF,sBCAE,gCDAF,iBAAA,yK5C88JD,iBAAA,oK4Cv8JC,iBAAiB,iK3Cm+JjB,wBAAyB,KAAK,KG/gK9B,gBAAA,KAAA,KJy/JD,qBIv/JS,+BwCmDR,kBAAmB,qBAAqB,GAAG,OAAO,SErElD,aAAA,qBAAA,GAAA,OAAA,S9C4gKD,UAAA,qBAAA,GAAA,OAAA,S6Cz9JG,sBACA,iBAAA,Q7C69JH,wC4Cx8JC,iBAAkB,yKEzElB,iBAAA,oK9CohKD,iBAAA,iK6Cj+JG,mBACA,iBAAA,Q7Cq+JH,qC4C58JC,iBAAkB,yKE7ElB,iBAAA,oK9C4hKD,iBAAA,iK6Cz+JG,sBACA,iBAAA,Q7C6+JH,wC4Ch9JC,iBAAkB,yKEjFlB,iBAAA,oK9CoiKD,iBAAA,iK6Cj/JG,qBACA,iBAAA,Q7Cq/JH,uC+C5iKC,iBAAkB,yKAElB,iBAAA,oK/C6iKD,iBAAA,iK+C1iKG,O/C6iKH,WAAA,KC4BD,mB8CnkKE,WAAA,E/C4iKD,O+CxiKD,YACE,SAAA,O/C0iKD,KAAA,E+CtiKC,Y/CyiKD,MAAA,Q+CriKG,c/CwiKH,QAAA,MC4BD,4B8C9jKE,UAAA,KAGF,aAAA,mBAEE,aAAA,KAGF,YAAA,kB9C+jKE,cAAe,K8CxjKjB,YAHE,Y/CoiKD,a+ChiKC,QAAA,W/CmiKD,eAAA,I+C/hKC,c/CkiKD,eAAA,O+C7hKC,cACA,eAAA,OAMF,eACE,WAAA,EACA,cAAA,ICvDF,YAEE,aAAA,EACA,WAAA,KAQF,YACE,aAAA,EACA,cAAA,KAGA,iBACA,SAAA,SACA,QAAA,MhD6kKD,QAAA,KAAA,KgD1kKC,cAAA,KrB3BA,iBAAA,KACC,OAAA,IAAA,MAAA,KqB6BD,6BACE,uBAAA,IrBvBF,wBAAA,I3BsmKD,4BgDpkKC,cAAe,E/CgmKf,2BAA4B,I+C9lK5B,0BAAA,IAFF,kBAAA,uBAKI,MAAA,KAIF,2CAAA,gD/CgmKA,MAAO,K+C5lKL,wBAFA,wBhDykKH,6BgDxkKG,6BAKF,MAAO,KACP,gBAAA,KACA,iBAAA,QAKA,uB/C4lKA,MAAO,KACP,WAAY,K+CzlKV,0BhDmkKH,gCgDlkKG,gCALF,MAAA,K/CmmKA,OAAQ,YACR,iBAAkB,KDxBnB,mDgD5kKC,yDAAA,yD/CymKA,MAAO,QDxBR,gDgDhkKC,sDAAA,sD/C6lKA,MAAO,K+CzlKL,wBAEA,8BADA,8BhDmkKH,QAAA,EgDxkKC,MAAA,K/ComKA,iBAAkB,QAClB,aAAc,QAEhB,iDDpBC,wDCuBD,uDADA,uD+CzmKE,8DAYI,6D/C4lKN,uD+CxmKE,8D/C2mKF,6DAKE,MAAO,QDxBR,8CiD1qKG,oDADF,oDAEE,MAAA,QAEA,yBhDusKF,MAAO,QgDrsKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDwsKJ,MAAO,QDtBR,gCiDhrKO,gCAGF,qCAFE,qChD2sKN,MAAO,QACP,iBAAkB,QAEpB,iCgDvsKQ,uCAFA,uChD0sKR,sCDtBC,4CiDnrKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,sBhDouKF,MAAO,QgDluKH,iBAAA,QAFF,uBAAA,4BAKI,MAAA,QAGF,gDAAA,qDhDquKJ,MAAO,QDtBR,6BiD7sKO,6BAGF,kCAFE,kChDwuKN,MAAO,QACP,iBAAkB,QAEpB,8BgDpuKQ,oCAFA,oChDuuKR,mCDtBC,yCiDhtKO,yCArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,yBhDiwKF,MAAO,QgD/vKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDkwKJ,MAAO,QDtBR,gCiD1uKO,gCAGF,qCAFE,qChDqwKN,MAAO,QACP,iBAAkB,QAEpB,iCgDjwKQ,uCAFA,uChDowKR,sCDtBC,4CiD7uKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,wBhD8xKF,MAAO,QgD5xKH,iBAAA,QAFF,yBAAA,8BAKI,MAAA,QAGF,kDAAA,uDhD+xKJ,MAAO,QDtBR,+BiDvwKO,+BAGF,oCAFE,oChDkyKN,MAAO,QACP,iBAAkB,QAEpB,gCgD9xKQ,sCAFA,sChDiyKR,qCDtBC,2CiD1wKO,2CDkGN,MAAO,KACP,iBAAA,QACA,aAAA,QAEF,yBACE,WAAA,EACA,cAAA,IE1HF,sBACE,cAAA,EACA,YAAA,IAEA,O9C0DA,cAAA,KACQ,iBAAA,KJ6uKT,OAAA,IAAA,MAAA,YkDnyKC,cAAe,IACf,mBAAA,EAAA,IAAA,IAAA,gBlDqyKD,WAAA,EAAA,IAAA,IAAA,gBkD/xKC,YACA,QAAA,KvBnBC,e3BuzKF,QAAA,KAAA,KkDtyKC,cAAe,IAAI,MAAM,YAMvB,uBAAA,IlDmyKH,wBAAA,IkD7xKC,0CACA,MAAA,QAEA,alDgyKD,WAAA,EkDpyKC,cAAe,EjDg0Kf,UAAW,KACX,MAAO,QDtBR,oBkD1xKC,sBjDkzKF,eiDxzKI,mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3Bs0KF,iBAAA,QkDrxKC,WAAY,IAAI,MAAM,KjDizKtB,2BAA4B,IiD9yK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElDwxKL,oCkDnxKG,oDjD+yKF,aAAc,IAAI,EiD7yKZ,cAAA,EvBtEL,4D3B61KF,4EkDjxKG,WAAA,EjD6yKF,uBAAwB,IiD3yKlB,wBAAA,IvBtEL,0D3B21KF,0EkD1yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElD8wKH,wBAAA,EkD1wKC,wDlD6wKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDlyKpB,8BlD0wKC,ckD1wKD,gCjDuyKE,cAAe,EiDvyKjB,sCAQM,sBlDwwKL,wCC4BC,cAAe,K0Br5Kf,aAAA,KuByGF,wDlDqxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDlzK3B,yFAoBQ,yFlDwwKP,2DkDzwKO,2DjDqyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiD9zKA,wGjD4zKA,wGDtBC,wGCuBD,0EiD7zKA,0EjD2zKA,0EiDnyKU,0EjD2yKR,uBAAwB,IAK1B,uGiDx0KA,uGjDs0KA,uGDtBC,uGCuBD,yEiDv0KA,yEjDq0KA,yEiDzyKU,yEvB7HR,wBAAA,IuBiGF,sDlDqzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiDxyKrB,qFA1CR,qFAyCQ,wDlDmxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiD91KA,oGjD21KA,uEiD7yKU,uEjD+yKV,uEiD71KA,uEjDm2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiDx2KA,mGjDq2KA,sEiDnzKU,sEjDqzKV,sEiDv2KA,sEjD62KE,2BAA4B,IiDlzK1B,0BlD2xKH,qCkDt1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD23KE,OAAQ,EiDjzKA,+CjDqzKV,+CiD/3KA,+CjDi4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDh4KA,iEjDk4KA,iEAEA,iEANA,iEAWE,YAAa,EiD3zKL,8CjD+zKV,8CiD74KA,8CjD+4KA,8CAEA,8CANA,8CDjBC,gECoBD,gEiD94KA,gEjDg5KA,gEAEA,gEANA,gEAWE,aAAc,EAIhB,+CiD35KA,+CjDy5KA,+CiDl0KU,+CjDq0KV,iEiD55KA,iEjD05KA,iEDtBC,iEC6BC,cAAe,EAEjB,8CiDn0KU,8CjDq0KV,8CiDr6KA,8CjDo6KA,gEDtBC,gECwBD,gEiDh0KI,gEACA,cAAA,EAUJ,yBACE,cAAA,ElDmyKD,OAAA,EkD/xKG,aACA,cAAA,KANJ,oBASM,cAAA,ElDkyKL,cAAA,IkD7xKG,2BlDgyKH,WAAA,IC4BD,4BiDxzKM,cAAA,EAKF,wDAvBJ,wDlDqzKC,WAAA,IAAA,MAAA,KkD5xKK,2BlD+xKL,WAAA,EmDlhLC,uDnDqhLD,cAAA,IAAA,MAAA,KmDlhLG,eACA,aAAA,KnDshLH,8BmDxhLC,MAAA,KAMI,iBAAA,QnDqhLL,aAAA,KmDlhLK,0DACA,iBAAA,KAGJ,qCAEI,MAAA,QnDmhLL,iBAAA,KmDpiLC,yDnDuiLD,oBAAA,KmDpiLG,eACA,aAAA,QnDwiLH,8BmD1iLC,MAAA,KAMI,iBAAA,QnDuiLL,aAAA,QmDpiLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDqiLL,iBAAA,KmDtjLC,yDnDyjLD,oBAAA,QmDtjLG,eACA,aAAA,QnD0jLH,8BmD5jLC,MAAA,QAMI,iBAAA,QnDyjLL,aAAA,QmDtjLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDujLL,iBAAA,QmDxkLC,yDnD2kLD,oBAAA,QmDxkLG,YACA,aAAA,QnD4kLH,2BmD9kLC,MAAA,QAMI,iBAAA,QnD2kLL,aAAA,QmDxkLK,uDACA,iBAAA,QAGJ,kCAEI,MAAA,QnDykLL,iBAAA,QmD1lLC,sDnD6lLD,oBAAA,QmD1lLG,eACA,aAAA,QnD8lLH,8BmDhmLC,MAAA,QAMI,iBAAA,QnD6lLL,aAAA,QmD1lLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD2lLL,iBAAA,QmD5mLC,yDnD+mLD,oBAAA,QmD5mLG,cACA,aAAA,QnDgnLH,6BmDlnLC,MAAA,QAMI,iBAAA,QnD+mLL,aAAA,QmD5mLK,yDACA,iBAAA,QAGJ,oCAEI,MAAA,QnD6mLL,iBAAA,QoD5nLC,wDACA,oBAAA,QAEA,kBACA,SAAA,SpD+nLD,QAAA,MoDpoLC,OAAQ,EnDgqLR,QAAS,EACT,SAAU,OAEZ,yCmDtpLI,wBADA,yBAEA,yBACA,wBACA,SAAA,SACA,IAAA,EACA,OAAA,EpD+nLH,KAAA,EoD1nLC,MAAO,KACP,OAAA,KpD4nLD,OAAA,EoDvnLC,wBpD0nLD,eAAA,OqDppLC,uBACA,eAAA,IAEA,MACA,WAAA,KACA,QAAA,KjDwDA,cAAA,KACQ,iBAAA,QJgmLT,OAAA,IAAA,MAAA,QqD/pLC,cAAe,IASb,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACA,WAAA,MAAA,EAAA,IAAA,IAAA,gBAKJ,iBACE,aAAA,KACA,aAAA,gBAEF,SACE,QAAA,KACA,cAAA,ICtBF,SACE,QAAA,IACA,cAAA,IAEA,OACA,MAAA,MACA,UAAA,KjCRA,YAAA,IAGA,YAAA,ErBqrLD,MAAA,KsD7qLC,YAAA,EAAA,IAAA,EAAA,KrDysLA,OAAQ,kBqDvsLN,QAAA,GjCbF,aiCeE,ajCZF,MAAA,KrB6rLD,gBAAA,KsDzqLC,OAAA,QACE,OAAA,kBACA,QAAA,GAEA,aACA,mBAAA,KtD2qLH,QAAA,EuDhsLC,OAAQ,QACR,WAAA,IvDksLD,OAAA,EuD7rLC,YACA,SAAA,OAEA,OACA,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EAIA,QAAA,KvD6rLD,QAAA,KuD1rLC,SAAA,OnD+GA,2BAAA,MACI,QAAA,EAEI,0BAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,UAAA,IAAA,SJ6gLT,kBAAA,kBuDhsLC,cAAA,kBnD2GA,aAAA,kBACI,UAAA,kBAEI,wBJwlLT,kBAAA,euDpsLK,cAAe,eACnB,aAAA,eACA,UAAA,eAIF,mBACE,WAAA,OACA,WAAA,KvDqsLD,cuDhsLC,SAAU,SACV,MAAA,KACA,OAAA,KAEA,eACA,SAAA,SnDaA,iBAAA,KACQ,wBAAA,YmDZR,gBAAA,YtD4tLA,OsD5tLA,IAAA,MAAA,KAEA,OAAA,IAAA,MAAA,evDksLD,cAAA,IuD9rLC,QAAS,EACT,mBAAA,EAAA,IAAA,IAAA,eACA,WAAA,EAAA,IAAA,IAAA,eAEA,gBACA,SAAA,MACA,IAAA,EACA,MAAA,EvDgsLD,OAAA,EuD9rLC,KAAA,ElCrEA,QAAA,KAGA,iBAAA,KkCmEA,qBlCtEA,OAAA,iBAGA,QAAA,EkCwEF,mBACE,OAAA,kBACA,QAAA,GAIF,cACE,QAAA,KvDgsLD,cAAA,IAAA,MAAA,QuD3rLC,qBACA,WAAA,KAKF,aACE,OAAA,EACA,YAAA,WAIF,YACE,SAAA,SACA,QAAA,KvD0rLD,cuD5rLC,QAAS,KAQP,WAAA,MACA,WAAA,IAAA,MAAA,QATJ,wBAaI,cAAA,EvDsrLH,YAAA,IuDlrLG,mCvDqrLH,YAAA,KuD/qLC,oCACA,YAAA,EAEA,yBACA,SAAA,SvDkrLD,IAAA,QuDhqLC,MAAO,KAZP,OAAA,KACE,SAAA,OvDgrLD,yBuD7qLD,cnDvEA,MAAA,MACQ,OAAA,KAAA,KmD2ER,eAAY,mBAAA,EAAA,IAAA,KAAA,evD+qLX,WAAA,EAAA,IAAA,KAAA,euDzqLD,UAFA,MAAA,OvDirLD,yBwD/zLC,UACA,MAAA,OCNA,SAEA,SAAA,SACA,QAAA,KACA,QAAA,MACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,ODHA,WAAA,OnCVA,aAAA,OAGA,UAAA,OrBs1LD,YAAA,OwD30LC,OAAA,iBnCdA,QAAA,ErB61LD,WAAA,KwD90LY,YAAmB,OAAA,kBxDk1L/B,QAAA,GwDj1LY,aAAmB,QAAA,IAAA,ExDq1L/B,WAAA,KwDp1LY,eAAmB,QAAA,EAAA,IxDw1L/B,YAAA,IwDv1LY,gBAAmB,QAAA,IAAA,ExD21L/B,WAAA,IwDt1LC,cACA,QAAA,EAAA,IACA,YAAA,KAEA,eACA,UAAA,MxDy1LD,QAAA,IAAA,IwDr1LC,MAAO,KACP,WAAA,OACA,iBAAA,KACA,cAAA,IAEA,exDu1LD,SAAA,SwDn1LC,MAAA,EACE,OAAA,EACA,aAAA,YACA,aAAA,MAEA,4BxDq1LH,OAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,iCxDq1LH,MAAA,IwDn1LC,OAAA,EACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,kCxDq1LH,OAAA,EwDn1LC,KAAA,IACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,8BxDq1LH,IAAA,IwDn1LC,KAAA,EACE,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEA,6BxDq1LH,IAAA,IwDn1LC,MAAA,EACE,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEA,+BxDq1LH,IAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,oCxDq1LH,IAAA,EwDn1LC,MAAA,IACE,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,qCxDq1LH,IAAA,E0Dl7LC,KAAM,IACN,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,SACA,SAAA,SACA,IAAA,EDXA,KAAA,EAEA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KCAA,eAAA,OAEA,WAAA,OACA,aAAA,OAAA,UAAA,OACA,YAAA,OACA,iBAAA,KACA,wBAAA,YtD8CA,gBAAA,YACQ,OAAA,IAAA,MAAA,KJk5LT,OAAA,IAAA,MAAA,e0D77LC,cAAA,IAAY,mBAAA,EAAA,IAAA,KAAA,e1Dg8Lb,WAAA,EAAA,IAAA,KAAA,e0D/7La,WAAA,KACZ,aAAY,WAAA,MACZ,eAAY,YAAA,KAGd,gBACE,WAAA,KAEA,cACA,YAAA,MAEA,e1Dq8LD,QAAA,IAAA,K0Dl8LC,OAAQ,EACR,UAAA,K1Do8LD,iBAAA,Q0D57LC,cAAA,IAAA,MAAA,QzDy9LA,cAAe,IAAI,IAAI,EAAE,EyDt9LvB,iBACA,QAAA,IAAA,KAEA,gBACA,sB1D87LH,SAAA,S0D37LC,QAAS,MACT,MAAA,E1D67LD,OAAA,E0D37LC,aAAc,YACd,aAAA,M1D87LD,gB0Dz7LC,aAAA,KAEE,sBACA,QAAA,GACA,aAAA,KAEA,oB1D27LH,OAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,E1D67LL,0B0Dz7LC,OAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAEA,sB1D27LH,IAAA,I0D17LG,KAAA,MACE,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,E1D67LL,4B0Dz7LC,OAAA,MACE,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAEA,uB1D27LH,IAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gB1D67LL,6B0Dx7LC,IAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAEA,qB1D07LH,IAAA,I0Dz7LG,MAAA,MACE,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gB1D47LL,2B2DpjMC,MAAO,IACP,OAAA,M3DsjMD,QAAA,I2DnjMC,mBAAoB,EACpB,kBAAA,KAEA,U3DqjMD,SAAA,S2DljMG,gBACA,SAAA,SvD6KF,MAAA,KACK,SAAA,OJ04LN,sB2D/jMC,SAAU,S1D4lMV,QAAS,K0D9kML,mBAAA,IAAA,YAAA,K3DqjML,cAAA,IAAA,YAAA,K2D3hMC,WAAA,IAAA,YAAA,KvDmKK,4BAFL,0BAGQ,YAAA,EA3JA,qDA+GR,sBAEQ,mBAAA,kBAAA,IAAA,YJ86LP,cAAA,aAAA,IAAA,Y2DzjMG,WAAA,UAAA,IAAA,YvDmHJ,4BAAA,OACQ,oBAAA,OuDjHF,oBAAA,O3D4jML,YAAA,OI58LD,mCHs+LA,2BGr+LQ,KAAA,EuD5GF,kBAAA,sB3D6jML,UAAA,sBC2BD,kCADA,2BG5+LA,KAAA,EACQ,kBAAA,uBuDtGF,UAAA,uBArCN,6B3DomMD,gC2DpmMC,iC1D+nME,KAAM,E0DllMN,kBAAA,mB3D4jMH,UAAA,oBAGA,wB2D5mMD,sBAAA,sBAsDI,QAAA,MAEA,wB3D0jMH,KAAA,E2DtjMG,sB3DyjMH,sB2DrnMC,SAAU,SA+DR,IAAA,E3DyjMH,MAAA,KC0BD,sB0D/kMI,KAAA,KAnEJ,sBAuEI,KAAA,MAvEJ,2BA0EI,4B3DwjMH,KAAA,E2D/iMC,6BACA,KAAA,MAEA,8BACA,KAAA,KtC3FA,kBsC6FA,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,I3DmjMD,UAAA,K2D9iMC,MAAA,KdnGE,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,cAAA,OAAA,kBACA,QAAA,G7CqpMH,uB2DljMC,iBAAA,sEACE,iBAAA,iEACA,iBAAA,uFdxGA,iBAAA,kEACA,OAAA,+GACA,kBAAA,SACA,wBACA,MAAA,E7C6pMH,KAAA,K2DpjMC,iBAAA,sE1DglMA,iBAAiB,iE0D9kMf,iBAAA,uFACA,iBAAA,kEACA,OAAA,+GtCvHF,kBAAA,SsCyFF,wB3DslMC,wBC4BC,MAAO,KACP,gBAAiB,KACjB,OAAQ,kB0D7kMN,QAAA,EACA,QAAA,G3DwjMH,0C2DhmMD,2CA2CI,6BADA,6B1DklMF,SAAU,S0D7kMR,IAAA,IACA,QAAA,E3DqjMH,QAAA,a2DrmMC,WAAY,MAqDV,0CADA,6B3DsjMH,KAAA,I2D1mMC,YAAa,MA0DX,2CADA,6BAEA,MAAA,IACA,aAAA,MAME,6BADF,6B3DmjMH,MAAA,K2D9iMG,OAAA,KACE,YAAA,M3DgjML,YAAA,E2DriMC,oCACA,QAAA,QAEA,oCACA,QAAA,QAEA,qBACA,SAAA,SACA,OAAA,K3DwiMD,KAAA,I2DjjMC,QAAS,GAYP,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KAEA,wBACA,QAAA,aAWA,MAAA,KACA,OAAA,K3D8hMH,OAAA,I2D7jMC,YAAa,OAkCX,OAAA,QACA,iBAAA,OACA,iBAAA,cACA,OAAA,IAAA,MAAA,K3D8hMH,cAAA,K2DthMC,6BACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAEA,kBACA,SAAA,SACA,MAAA,IACA,OAAA,K3DyhMD,KAAA,I2DxhMC,QAAA,GACE,YAAA,K3D0hMH,eAAA,K2Dj/LC,MAAO,KAhCP,WAAA,O1D8iMA,YAAa,EAAE,IAAI,IAAI,eAEzB,uB0D3iMM,YAAA,KAEA,oCACA,0C3DmhMH,2C2D3hMD,6BAAA,6BAYI,MAAA,K3DmhMH,OAAA,K2D/hMD,WAAA,M1D2jME,UAAW,KDxBZ,0C2D9gMD,6BACE,YAAA,MAEA,2C3DghMD,6B2D5gMD,aAAA,M3D+gMC,kBACF,MAAA,I4D7wMC,KAAA,I3DyyME,eAAgB,KAElB,qBACE,OAAQ,MAkBZ,qCADA,sCADA,mBADA,oBAXA,gBADA,iBAOA,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oC2DpzME,oBAAA,qBAAA,oBAAA,qB3D2zMF,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,e2D/zMI,a3Dq0MJ,cDvBC,kB4D7yMG,mB3DqzMJ,WADA,YAwBE,QAAS,MACT,QAAS,IASX,qCADA,mBANA,gBAGA,uBADA,iBADA,wBAIA,mCDhBC,oB6D/0MC,oB5Dk2MF,W+B51MA,uBhCo0MC,qB4D5zMG,cChBF,aACA,kB5D+1MF,W+Br1ME,MAAO,KhCy0MR,cgCt0MC,QAAS,MACT,aAAA,KhCw0MD,YAAA,KgC/zMC,YhCk0MD,MAAA,gBgC/zMC,WhCk0MD,MAAA,egC/zMC,MhCk0MD,QAAA,e8Dz1MC,MACA,QAAA,gBAEA,WACA,WAAA,O9B8BF,WACE,KAAA,EAAA,EAAA,EhCg0MD,MAAA,YgCzzMC,YAAa,KACb,iBAAA,YhC2zMD,OAAA,E+D31MC,Q/D81MD,QAAA,eC4BD,OACE,SAAU,M+Dn4MV,chE42MD,MAAA,aC+BD,YADA,YADA,YADA,YAIE,QAAS,e+Dp5MT,kBhEs4MC,mBgEr4MD,yBhEi4MD,kB+Dl1MD,mBA6IA,yB9D4tMA,kBACA,mB8Dj3ME,yB9D62MF,kBACA,mBACA,yB+Dv5MY,QAAA,eACV,yBAAU,YhE04MT,QAAA,gBC4BD,iB+Dp6MU,QAAA,gBhE64MX,c+D51MG,QAAS,oB/Dg2MV,c+Dl2MC,c/Dm2MH,QAAA,sB+D91MG,yB/Dk2MD,kBACF,QAAA,iB+D91MG,yB/Dk2MD,mBACF,QAAA,kBgEh6MC,yBhEo6MC,yBgEn6MD,QAAA,wBACA,+CAAU,YhEw6MT,QAAA,gBC4BD,iB+Dl8MU,QAAA,gBhE26MX,c+Dr2MG,QAAS,oB/Dy2MV,c+D32MC,c/D42MH,QAAA,sB+Dv2MG,+C/D22MD,kBACF,QAAA,iB+Dv2MG,+C/D22MD,mBACF,QAAA,kBgE97MC,+ChEk8MC,yBgEj8MD,QAAA,wBACA,gDAAU,YhEs8MT,QAAA,gBC4BD,iB+Dh+MU,QAAA,gBhEy8MX,c+D92MG,QAAS,oB/Dk3MV,c+Dp3MC,c/Dq3MH,QAAA,sB+Dh3MG,gD/Do3MD,kBACF,QAAA,iB+Dh3MG,gD/Do3MD,mBACF,QAAA,kBgE59MC,gDhEg+MC,yBgE/9MD,QAAA,wBACA,0BAAU,YhEo+MT,QAAA,gBC4BD,iB+D9/MU,QAAA,gBhEu+MX,c+Dv3MG,QAAS,oB/D23MV,c+D73MC,c/D83MH,QAAA,sB+Dz3MG,0B/D63MD,kBACF,QAAA,iB+Dz3MG,0B/D63MD,mBACF,QAAA,kBgEl/MC,0BhEs/MC,yBACF,QAAA,wBgEv/MC,yBhE2/MC,WACF,QAAA,gBgE5/MC,+ChEggNC,WACF,QAAA,gBgEjgNC,gDhEqgNC,WACF,QAAA,gBAGA,0B+Dh3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehEyhNT,QAAA,gBC4BD,oB+DnjNU,QAAA,gBhE4hNX,iB+D93MG,QAAS,oBAMX,iB/D23MD,iB+Dt2MG,QAAS,sB/D22MZ,qB+D/3MC,QAAS,e/Dk4MV,a+D53MC,qBAcE,QAAS,iB/Dm3MZ,sB+Dh4MC,QAAS,e/Dm4MV,a+D73MC,sBAOE,QAAS,kB/D23MZ,4B+D53MC,QAAS,eCpLT,ahEojNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS","sourcesContent":["/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n margin: .67em 0;\n font-size: 2em;\n}\nmark {\n color: #000;\n background: #ff0;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsup {\n top: -.5em;\n}\nsub {\n bottom: -.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n height: 0;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0;\n font: inherit;\n color: inherit;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n padding: .35em .625em .75em;\n margin: 0 2px;\n border: 1px solid #c0c0c0;\n}\nlegend {\n padding: 0;\n border: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n display: inline-block;\n max-width: 100%;\n height: auto;\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all .2s ease-in-out;\n -o-transition: all .2s ease-in-out;\n transition: all .2s ease-in-out;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: .2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n margin-left: -5px;\n list-style: none;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n overflow: hidden;\n clear: left;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: .01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n padding: 6px 12px;\n margin-bottom: 0;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: normal;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity .15s linear;\n -o-transition: opacity .15s linear;\n transition: opacity .15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n -webkit-transition-duration: .35s;\n -o-transition-duration: .35s;\n transition-duration: .35s;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555;\n text-align: center;\n background-color: #eee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.nav > li.disabled > a {\n color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n -webkit-overflow-scrolling: touch;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-top: 8px;\n margin-right: 15px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-top: 8px;\n margin-right: -15px;\n margin-bottom: 8px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border .2s ease-in-out;\n -o-transition: border .2s ease-in-out;\n transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n float: left;\n width: 0;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n -webkit-transition: width .6s ease;\n -o-transition: width .6s ease;\n transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: .2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: .5;\n}\nbutton.close {\n -webkit-appearance: none;\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transition: -webkit-transform .3s ease-out;\n -o-transition: -o-transform .3s ease-out;\n transition: transform .3s ease-out;\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n outline: 0;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n filter: alpha(opacity=0);\n opacity: 0;\n\n line-break: auto;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: .9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n line-break: auto;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999;\n border-top-color: rgba(0, 0, 0, .25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999;\n border-right-color: rgba(0, 0, 0, .25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999;\n border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999;\n border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: .6s ease-in-out left;\n -o-transition: .6s ease-in-out left;\n transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform .6s ease-in-out;\n -o-transition: -o-transform .6s ease-in-out;\n transition: transform .6s ease-in-out;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n left: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n left: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n left: 0;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n filter: alpha(opacity=90);\n outline: 0;\n opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on ",{class:"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):h-g<0&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");if("true"===c.attr("aria-selected"))return void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{}));d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2");a(".select2.select2-container--open").each(function(){var b=a(this);this!=d[0]&&b.data("element").select2("close")})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html(''),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('
  • ×
  • ')},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e0||0===c.length)){var d=a('×');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===e.$search.val()){var b=e.$searchContainer.prev(".select2-selection__choice");if(b.length>0){var d=b.data("data");e.searchRemoveChoice(d),a.preventDefault()}}});var f=document.documentMode,g=f&&f<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(g)return void e.$selection.off("input.search input.searchcheck");e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()||e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
  • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(f=d(this))&&g.push(f)})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;if(this._isInitialized)return void b.call(this,c);this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===e.$search.val()){var b=e.$searchContainer.prev(".select2-selection__choice");if(b.length>0){var d=b.data("data");e.searchRemoveChoice(d),a.preventDefault()}}});var f=document.documentMode,g=f&&f<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(g)return void e.$selection.off("input.search input.searchcheck");e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()||e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
  • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if("object"==typeof(b=b||{}))return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c}); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/css/select2-bootstrap.css b/InvenTree/InvenTree/static/select2/css/select2-bootstrap.css similarity index 100% rename from InvenTree/InvenTree/static/css/select2-bootstrap.css rename to InvenTree/InvenTree/static/select2/css/select2-bootstrap.css diff --git a/InvenTree/InvenTree/static/css/select2.css b/InvenTree/InvenTree/static/select2/css/select2.css similarity index 97% rename from InvenTree/InvenTree/static/css/select2.css rename to InvenTree/InvenTree/static/select2/css/select2.css index 447b2b86cc..750b3207ae 100644 --- a/InvenTree/InvenTree/static/css/select2.css +++ b/InvenTree/InvenTree/static/select2/css/select2.css @@ -118,12 +118,14 @@ .select2-hidden-accessible { border: 0 !important; clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; height: 1px !important; - margin: -1px !important; overflow: hidden !important; padding: 0 !important; position: absolute !important; - width: 1px !important; } + width: 1px !important; + white-space: nowrap !important; } .select2-container--default .select2-selection--single { background-color: #fff; @@ -186,16 +188,13 @@ width: 100%; } .select2-container--default .select2-selection--multiple .select2-selection__rendered li { list-style: none; } - .select2-container--default .select2-selection--multiple .select2-selection__placeholder { - color: #999; - margin-top: 5px; - float: left; } .select2-container--default .select2-selection--multiple .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-top: 5px; - margin-right: 10px; } + margin-right: 10px; + padding: 1px; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; @@ -214,7 +213,7 @@ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #333; } -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { float: right; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { @@ -420,9 +419,7 @@ color: #555; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - float: right; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; margin-left: 5px; margin-right: auto; } diff --git a/InvenTree/InvenTree/static/select2/css/select2.min.css b/InvenTree/InvenTree/static/select2/css/select2.min.css new file mode 100644 index 0000000000..7c18ad59df --- /dev/null +++ b/InvenTree/InvenTree/static/select2/css/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/InvenTree/InvenTree/static/select2/js/i18n/af.js b/InvenTree/InvenTree/static/select2/js/i18n/af.js new file mode 100644 index 0000000000..32e5ac7de8 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/af.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ar.js b/InvenTree/InvenTree/static/select2/js/i18n/ar.js new file mode 100644 index 0000000000..64e1caad34 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ar.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/az.js b/InvenTree/InvenTree/static/select2/js/i18n/az.js new file mode 100644 index 0000000000..1d52c260f2 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/az.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/bg.js b/InvenTree/InvenTree/static/select2/js/i18n/bg.js new file mode 100644 index 0000000000..73b730a705 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/bg.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/bn.js b/InvenTree/InvenTree/static/select2/js/i18n/bn.js new file mode 100644 index 0000000000..2d17b9d8e0 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/bn.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/bs.js b/InvenTree/InvenTree/static/select2/js/i18n/bs.js new file mode 100644 index 0000000000..46b084d758 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/bs.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ca.js b/InvenTree/InvenTree/static/select2/js/i18n/ca.js new file mode 100644 index 0000000000..82dbbb7a21 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ca.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/cs.js b/InvenTree/InvenTree/static/select2/js/i18n/cs.js new file mode 100644 index 0000000000..7116d6c1df --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/cs.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/da.js b/InvenTree/InvenTree/static/select2/js/i18n/da.js new file mode 100644 index 0000000000..cda32c34aa --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/da.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/de.js b/InvenTree/InvenTree/static/select2/js/i18n/de.js new file mode 100644 index 0000000000..c2e61e5800 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/de.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/dsb.js b/InvenTree/InvenTree/static/select2/js/i18n/dsb.js new file mode 100644 index 0000000000..02f283abad --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/dsb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/el.js b/InvenTree/InvenTree/static/select2/js/i18n/el.js new file mode 100644 index 0000000000..d4922a1df5 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/el.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/en.js b/InvenTree/InvenTree/static/select2/js/i18n/en.js new file mode 100644 index 0000000000..3b19285734 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/en.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/es.js b/InvenTree/InvenTree/static/select2/js/i18n/es.js new file mode 100644 index 0000000000..68afd6d259 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/es.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/et.js b/InvenTree/InvenTree/static/select2/js/i18n/et.js new file mode 100644 index 0000000000..070b61a26d --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/et.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/eu.js b/InvenTree/InvenTree/static/select2/js/i18n/eu.js new file mode 100644 index 0000000000..90d5e73f8a --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/eu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/fa.js b/InvenTree/InvenTree/static/select2/js/i18n/fa.js new file mode 100644 index 0000000000..e1ffdbed0d --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/fa.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/fi.js b/InvenTree/InvenTree/static/select2/js/i18n/fi.js new file mode 100644 index 0000000000..ffed1247dd --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/fi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/fr.js b/InvenTree/InvenTree/static/select2/js/i18n/fr.js new file mode 100644 index 0000000000..dd02f973ff --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/fr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/gl.js b/InvenTree/InvenTree/static/select2/js/i18n/gl.js new file mode 100644 index 0000000000..208a005705 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/gl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/he.js b/InvenTree/InvenTree/static/select2/js/i18n/he.js new file mode 100644 index 0000000000..25a8805aa0 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/he.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/hi.js b/InvenTree/InvenTree/static/select2/js/i18n/hi.js new file mode 100644 index 0000000000..f3ed798434 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/hi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/hr.js b/InvenTree/InvenTree/static/select2/js/i18n/hr.js new file mode 100644 index 0000000000..cb3268db16 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/hr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/hsb.js b/InvenTree/InvenTree/static/select2/js/i18n/hsb.js new file mode 100644 index 0000000000..3d5bf09dbd --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/hsb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/hu.js b/InvenTree/InvenTree/static/select2/js/i18n/hu.js new file mode 100644 index 0000000000..4893aa2f70 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/hu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/hy.js b/InvenTree/InvenTree/static/select2/js/i18n/hy.js new file mode 100644 index 0000000000..8230007141 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/hy.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/id.js b/InvenTree/InvenTree/static/select2/js/i18n/id.js new file mode 100644 index 0000000000..4a0b3bf009 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/id.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/is.js b/InvenTree/InvenTree/static/select2/js/i18n/is.js new file mode 100644 index 0000000000..cca5bbecf0 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/is.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/it.js b/InvenTree/InvenTree/static/select2/js/i18n/it.js new file mode 100644 index 0000000000..507c7d9f29 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/it.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ja.js b/InvenTree/InvenTree/static/select2/js/i18n/ja.js new file mode 100644 index 0000000000..451025e2c7 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ja.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ka.js b/InvenTree/InvenTree/static/select2/js/i18n/ka.js new file mode 100644 index 0000000000..60c593b705 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ka.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/km.js b/InvenTree/InvenTree/static/select2/js/i18n/km.js new file mode 100644 index 0000000000..4dca94f414 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/km.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ko.js b/InvenTree/InvenTree/static/select2/js/i18n/ko.js new file mode 100644 index 0000000000..f2880fb004 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ko.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/lt.js b/InvenTree/InvenTree/static/select2/js/i18n/lt.js new file mode 100644 index 0000000000..f6a42155ad --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/lt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/lv.js b/InvenTree/InvenTree/static/select2/js/i18n/lv.js new file mode 100644 index 0000000000..806dc5c433 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/lv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/mk.js b/InvenTree/InvenTree/static/select2/js/i18n/mk.js new file mode 100644 index 0000000000..cb7b84a263 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/mk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ms.js b/InvenTree/InvenTree/static/select2/js/i18n/ms.js new file mode 100644 index 0000000000..6bd7eaa3e0 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ms.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/nb.js b/InvenTree/InvenTree/static/select2/js/i18n/nb.js new file mode 100644 index 0000000000..25d89c6870 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/nb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ne.js b/InvenTree/InvenTree/static/select2/js/i18n/ne.js new file mode 100644 index 0000000000..1c39f67210 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ne.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/nl.js b/InvenTree/InvenTree/static/select2/js/i18n/nl.js new file mode 100644 index 0000000000..2b74058d23 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/nl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/pl.js b/InvenTree/InvenTree/static/select2/js/i18n/pl.js new file mode 100644 index 0000000000..4ca5748c38 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/pl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ps.js b/InvenTree/InvenTree/static/select2/js/i18n/ps.js new file mode 100644 index 0000000000..9b008e4c14 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ps.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/pt-BR.js b/InvenTree/InvenTree/static/select2/js/i18n/pt-BR.js new file mode 100644 index 0000000000..c991e2550a --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/pt-BR.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/pt.js b/InvenTree/InvenTree/static/select2/js/i18n/pt.js new file mode 100644 index 0000000000..b5da1a6b49 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/pt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ro.js b/InvenTree/InvenTree/static/select2/js/i18n/ro.js new file mode 100644 index 0000000000..1ba7b40bef --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ro.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/ru.js b/InvenTree/InvenTree/static/select2/js/i18n/ru.js new file mode 100644 index 0000000000..63a7d66c3b --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/ru.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/sk.js b/InvenTree/InvenTree/static/select2/js/i18n/sk.js new file mode 100644 index 0000000000..5049528ad0 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/sk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/sl.js b/InvenTree/InvenTree/static/select2/js/i18n/sl.js new file mode 100644 index 0000000000..4d0b7d3e34 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/sl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/sq.js b/InvenTree/InvenTree/static/select2/js/i18n/sq.js new file mode 100644 index 0000000000..59162024ed --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/sq.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/sr-Cyrl.js b/InvenTree/InvenTree/static/select2/js/i18n/sr-Cyrl.js new file mode 100644 index 0000000000..ce13ce8f9a --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/sr-Cyrl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/sr.js b/InvenTree/InvenTree/static/select2/js/i18n/sr.js new file mode 100644 index 0000000000..dd407a06dc --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/sr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/sv.js b/InvenTree/InvenTree/static/select2/js/i18n/sv.js new file mode 100644 index 0000000000..1bc8724a79 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/sv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/th.js b/InvenTree/InvenTree/static/select2/js/i18n/th.js new file mode 100644 index 0000000000..63eab7114b --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/th.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/tk.js b/InvenTree/InvenTree/static/select2/js/i18n/tk.js new file mode 100644 index 0000000000..30255ff377 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/tk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/tr.js b/InvenTree/InvenTree/static/select2/js/i18n/tr.js new file mode 100644 index 0000000000..fc4c0bf051 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/tr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/uk.js b/InvenTree/InvenTree/static/select2/js/i18n/uk.js new file mode 100644 index 0000000000..63697e3884 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/uk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/vi.js b/InvenTree/InvenTree/static/select2/js/i18n/vi.js new file mode 100644 index 0000000000..24f3bc2d61 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/vi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/zh-CN.js b/InvenTree/InvenTree/static/select2/js/i18n/zh-CN.js new file mode 100644 index 0000000000..2c5649d310 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/zh-CN.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/select2/js/i18n/zh-TW.js b/InvenTree/InvenTree/static/select2/js/i18n/zh-TW.js new file mode 100644 index 0000000000..570a566937 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/i18n/zh-TW.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/InvenTree/InvenTree/static/script/select2/select2.full.js b/InvenTree/InvenTree/static/select2/js/select2.full.js similarity index 89% rename from InvenTree/InvenTree/static/script/select2/select2.full.js rename to InvenTree/InvenTree/static/select2/js/select2.full.js index 608642bf64..358572a657 100644 --- a/InvenTree/InvenTree/static/script/select2/select2.full.js +++ b/InvenTree/InvenTree/static/select2/js/select2.full.js @@ -1,11 +1,11 @@ /*! - * Select2 4.0.5 + * Select2 4.0.13 * https://select2.github.io * * Released under the MIT license * https://github.com/select2/select2/blob/master/LICENSE.md */ -(function (factory) { +;(function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); @@ -574,10 +574,10 @@ S2.define('select2/utils',[ DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { - var superMethod = superMethods[m]; + var superMethod = superMethods[m]; - DecoratedClass.prototype[superMethod] = - SuperClass.prototype[superMethod]; + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { @@ -772,6 +772,70 @@ S2.define('select2/utils',[ $element.append($nodes); }; + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id. + // If an id already exists, it simply returns it. + + var select2Id = element.getAttribute('data-select2-id'); + if (select2Id == null) { + // If element has id, use it. + if (element.id) { + select2Id = element.id; + element.setAttribute('data-select2-id', select2Id); + } else { + element.setAttribute('data-select2-id', ++id); + select2Id = id.toString(); + } + } + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + if (Utils.__cache[id][name] != null) { + return Utils.__cache[id][name]; + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + + element.removeAttribute('data-select2-id'); + }; + return Utils; }); @@ -791,7 +855,7 @@ S2.define('select2/results',[ Results.prototype.render = function () { var $results = $( - '
      ' + '
        ' ); if (this.options.get('multiple')) { @@ -814,7 +878,7 @@ S2.define('select2/results',[ this.hideLoading(); var $message = $( - '
      • ' ); @@ -907,7 +971,7 @@ S2.define('select2/results',[ $options.each(function () { var $option = $(this); - var item = $.data(this, 'data'); + var item = Utils.GetData(this, 'data'); // id needs to be converted to a string when comparing var id = '' + item.id; @@ -948,11 +1012,16 @@ S2.define('select2/results',[ option.className = 'select2-results__option'; var attrs = { - 'role': 'treeitem', + 'role': 'option', 'aria-selected': 'false' }; - if (data.disabled) { + var matches = window.Element.prototype.matches || + window.Element.prototype.msMatchesSelector || + window.Element.prototype.webkitMatchesSelector; + + if ((data.element != null && matches.call(data.element, ':disabled')) || + (data.element == null && data.disabled)) { delete attrs['aria-selected']; attrs['aria-disabled'] = 'true'; } @@ -1012,7 +1081,7 @@ S2.define('select2/results',[ this.template(data, option); } - $.data(option, 'data', data); + Utils.StoreData(option, 'data', data); return option; }; @@ -1053,7 +1122,10 @@ S2.define('select2/results',[ } self.setClasses(); - self.highlightFirstItem(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } }); container.on('unselect', function () { @@ -1062,7 +1134,10 @@ S2.define('select2/results',[ } self.setClasses(); - self.highlightFirstItem(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } }); container.on('open', function () { @@ -1098,7 +1173,7 @@ S2.define('select2/results',[ return; } - var data = $highlighted.data('data'); + var data = Utils.GetData($highlighted[0], 'data'); if ($highlighted.attr('aria-selected') == 'true') { self.trigger('close', {}); @@ -1116,8 +1191,9 @@ S2.define('select2/results',[ var currentIndex = $options.index($highlighted); - // If we are already at te top, don't move further - if (currentIndex === 0) { + // If we are already at the top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { return; } @@ -1210,7 +1286,7 @@ S2.define('select2/results',[ function (evt) { var $this = $(this); - var data = $this.data('data'); + var data = Utils.GetData(this, 'data'); if ($this.attr('aria-selected') === 'true') { if (self.options.get('multiple')) { @@ -1233,7 +1309,7 @@ S2.define('select2/results',[ this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) { - var data = $(this).data('data'); + var data = Utils.GetData(this, 'data'); self.getHighlightedResults() .removeClass('select2-results__option--highlighted'); @@ -1348,14 +1424,15 @@ S2.define('select2/selection/base',[ this._tabindex = 0; - if (this.$element.data('old-tabindex') != null) { - this._tabindex = this.$element.data('old-tabindex'); + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); } else if (this.$element.attr('tabindex') != null) { this._tabindex = this.$element.attr('tabindex'); } $selection.attr('title', this.$element.attr('title')); $selection.attr('tabindex', this._tabindex); + $selection.attr('aria-disabled', 'false'); this.$selection = $selection; @@ -1365,7 +1442,6 @@ S2.define('select2/selection/base',[ BaseSelection.prototype.bind = function (container, $container) { var self = this; - var id = container.id + '-container'; var resultsId = container.id + '-results'; this.container = container; @@ -1408,17 +1484,19 @@ S2.define('select2/selection/base',[ self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-owns'); - self.$selection.focus(); + self.$selection.trigger('focus'); self._detachCloseHandler(container); }); container.on('enable', function () { self.$selection.attr('tabindex', self._tabindex); + self.$selection.attr('aria-disabled', 'false'); }); container.on('disable', function () { self.$selection.attr('tabindex', '-1'); + self.$selection.attr('aria-disabled', 'true'); }); }; @@ -1441,7 +1519,6 @@ S2.define('select2/selection/base',[ }; BaseSelection.prototype._attachCloseHandler = function (container) { - var self = this; $(document.body).on('mousedown.select2.' + container.id, function (e) { var $target = $(e.target); @@ -1451,13 +1528,11 @@ S2.define('select2/selection/base',[ var $all = $('.select2.select2-container--open'); $all.each(function () { - var $this = $(this); - if (this == $select[0]) { return; } - var $element = $this.data('element'); + var $element = Utils.GetData(this, 'element'); $element.select2('close'); }); @@ -1481,6 +1556,27 @@ S2.define('select2/selection/base',[ throw new Error('The `update` method must be defined in child classes.'); }; + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + BaseSelection.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + BaseSelection.prototype.isDisabled = function () { + return this.options.get('disabled'); + }; + return BaseSelection; }); @@ -1518,7 +1614,10 @@ S2.define('select2/selection/single',[ var id = container.id + '-container'; - this.$selection.find('.select2-selection__rendered').attr('id', id); + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); this.$selection.attr('aria-labelledby', id); this.$selection.on('mousedown', function (evt) { @@ -1542,17 +1641,15 @@ S2.define('select2/selection/single',[ container.on('focus', function (evt) { if (!container.isOpen()) { - self.$selection.focus(); + self.$selection.trigger('focus'); } }); - - container.on('selection:update', function (params) { - self.update(params.data); - }); }; SingleSelection.prototype.clear = function () { - this.$selection.find('.select2-selection__rendered').empty(); + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty }; SingleSelection.prototype.display = function (data, container) { @@ -1578,7 +1675,14 @@ S2.define('select2/selection/single',[ var formatted = this.display(selection, $rendered); $rendered.empty().append(formatted); - $rendered.prop('title', selection.title || selection.text); + + var title = selection.title || selection.text; + + if (title) { + $rendered.attr('title', title); + } else { + $rendered.removeAttr('title'); + } }; return SingleSelection; @@ -1623,14 +1727,14 @@ S2.define('select2/selection/multiple',[ '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled - if (self.options.get('disabled')) { + if (self.isDisabled()) { return; } var $remove = $(this); var $selection = $remove.parent(); - var data = $selection.data('data'); + var data = Utils.GetData($selection[0], 'data'); self.trigger('unselect', { originalEvent: evt, @@ -1641,7 +1745,9 @@ S2.define('select2/selection/multiple',[ }; MultipleSelection.prototype.clear = function () { - this.$selection.find('.select2-selection__rendered').empty(); + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); }; MultipleSelection.prototype.display = function (data, container) { @@ -1679,9 +1785,14 @@ S2.define('select2/selection/multiple',[ var formatted = this.display(selection, $selection); $selection.append(formatted); - $selection.prop('title', selection.title || selection.text); - $selection.data('data', selection); + var title = selection.title || selection.text; + + if (title) { + $selection.attr('title', title); + } + + Utils.StoreData($selection[0], 'data', selection); $selections.push($selection); } @@ -1746,8 +1857,9 @@ S2.define('select2/selection/placeholder',[ S2.define('select2/selection/allowClear',[ 'jquery', - '../keys' -], function ($, KEYS) { + '../keys', + '../utils' +], function ($, KEYS, Utils) { function AllowClear () { } AllowClear.prototype.bind = function (decorated, container, $container) { @@ -1776,7 +1888,7 @@ S2.define('select2/selection/allowClear',[ AllowClear.prototype._handleClear = function (_, evt) { // Ignore the event if it is disabled - if (this.options.get('disabled')) { + if (this.isDisabled()) { return; } @@ -1789,10 +1901,22 @@ S2.define('select2/selection/allowClear',[ evt.stopPropagation(); - var data = $clear.data('data'); + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } for (var d = 0; d < data.length; d++) { - var unselectData = { + unselectData = { data: data[d] }; @@ -1802,11 +1926,12 @@ S2.define('select2/selection/allowClear',[ // If the event was prevented, don't clear it out. if (unselectData.prevented) { + this.$element.val(previousVal); return; } } - this.$element.val(this.placeholder.id).trigger('change'); + this.$element.trigger('input').trigger('change'); this.trigger('toggle', {}); }; @@ -1829,12 +1954,14 @@ S2.define('select2/selection/allowClear',[ return; } + var removeAll = this.options.get('translations').get('removeAllItems'); + var $remove = $( - '' + + '' + '×' + '' ); - $remove.data('data', data); + Utils.StoreData($remove[0], 'data', data); this.$selection.find('.select2-selection__rendered').prepend($remove); }; @@ -1856,7 +1983,7 @@ S2.define('select2/selection/search',[ '' ); @@ -1873,14 +2000,18 @@ S2.define('select2/selection/search',[ Search.prototype.bind = function (decorated, container, $container) { var self = this; + var resultsId = container.id + '-results'; + decorated.call(this, container, $container); container.on('open', function () { + self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); + self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); @@ -1900,7 +2031,11 @@ S2.define('select2/selection/search',[ }); container.on('results:focus', function (params) { - self.$search.attr('aria-activedescendant', params.id); + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { @@ -1925,7 +2060,7 @@ S2.define('select2/selection/search',[ .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { - var item = $previousChoice.data('data'); + var item = Utils.GetData($previousChoice[0], 'data'); self.searchRemoveChoice(item); @@ -1934,6 +2069,12 @@ S2.define('select2/selection/search',[ } }); + this.$selection.on('click', '.select2-search--inline', function (evt) { + if (self.$search.val()) { + evt.stopPropagation(); + } + }); + // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. @@ -2019,7 +2160,7 @@ S2.define('select2/selection/search',[ this.resizeSearch(); if (searchHadFocus) { - this.$search.focus(); + this.$search.trigger('focus'); } }; @@ -2052,7 +2193,7 @@ S2.define('select2/selection/search',[ var width = ''; if (this.$search.attr('placeholder') !== '') { - width = this.$selection.find('.select2-selection__rendered').innerWidth(); + width = this.$selection.find('.select2-selection__rendered').width(); } else { var minimumWidth = this.$search.val().length + 1; @@ -2076,10 +2217,13 @@ S2.define('select2/selection/eventRelay',[ 'open', 'opening', 'close', 'closing', 'select', 'selecting', - 'unselect', 'unselecting' + 'unselect', 'unselecting', + 'clear', 'clearing' ]; - var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; decorated.call(this, container, $container); @@ -2412,6 +2556,7 @@ S2.define('select2/diacritics',[ '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', + '\u0152': 'OE', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', @@ -2821,6 +2966,7 @@ S2.define('select2/diacritics',[ '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', + '\u0153': 'oe', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', @@ -2989,8 +3135,9 @@ S2.define('select2/diacritics',[ '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', - '\u03C9': '\u03C9', - '\u03C2': '\u03C3' + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' }; return diacritics; @@ -3075,7 +3222,7 @@ S2.define('select2/data/select',[ if ($(data.element).is('option')) { data.element.selected = true; - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); return; } @@ -3096,13 +3243,13 @@ S2.define('select2/data/select',[ } self.$element.val(val); - self.$element.trigger('change'); + self.$element.trigger('input').trigger('change'); }); } else { var val = data.id; this.$element.val(val); - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); } }; @@ -3118,7 +3265,7 @@ S2.define('select2/data/select',[ if ($(data.element).is('option')) { data.element.selected = false; - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); return; } @@ -3136,7 +3283,7 @@ S2.define('select2/data/select',[ self.$element.val(val); - self.$element.trigger('change'); + self.$element.trigger('input').trigger('change'); }); }; @@ -3158,7 +3305,7 @@ S2.define('select2/data/select',[ // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 - $.removeData(this, 'data'); + Utils.RemoveData(this); }); }; @@ -3231,7 +3378,7 @@ S2.define('select2/data/select',[ normalizedData.element = option; // Override the option's data with the combined data - $.data(option, 'data', normalizedData); + Utils.StoreData(option, 'data', normalizedData); return $option; }; @@ -3239,7 +3386,7 @@ S2.define('select2/data/select',[ SelectAdapter.prototype.item = function ($option) { var data = {}; - data = $.data($option[0], 'data'); + data = Utils.GetData($option[0], 'data'); if (data != null) { return data; @@ -3277,13 +3424,13 @@ S2.define('select2/data/select',[ data = this._normalizeItem(data); data.element = $option[0]; - $.data($option[0], 'data', data); + Utils.StoreData($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { - if (!$.isPlainObject(item)) { + if (item !== Object(item)) { item = { id: item, text: item @@ -3329,15 +3476,19 @@ S2.define('select2/data/array',[ 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { - var data = options.get('data') || []; + this._dataToConvert = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); - - this.addOptions(this.convertToOptions(data)); } Utils.Extend(ArrayAdapter, SelectAdapter); + ArrayAdapter.prototype.bind = function (container, $container) { + ArrayAdapter.__super__.bind.call(this, container, $container); + + this.addOptions(this.convertToOptions(this._dataToConvert)); + }; + ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); @@ -3487,7 +3638,8 @@ S2.define('select2/data/ajax',[ }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property - if ($request.status && $request.status === '0') { + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { return; } @@ -3626,8 +3778,6 @@ S2.define('select2/data/tags',[ }; Tags.prototype._removeOldTags = function (_) { - var tag = this._lastTag; - var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { @@ -3702,7 +3852,7 @@ S2.define('select2/data/tokenizer',[ // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); - this.$search.focus(); + this.$search.trigger('focus'); } params.term = tokenData.term; @@ -3831,10 +3981,30 @@ S2.define('select2/data/maximumSelectionLength',[ decorated.call(this, $e, options); } + MaximumSelectionLength.prototype.bind = + function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function () { + self._checkIfMaximumSelected(); + }); + }; + MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; + this._checkIfMaximumSelected(function () { + decorated.call(self, params, callback); + }); + }; + + MaximumSelectionLength.prototype._checkIfMaximumSelected = + function (_, successCallback) { + var self = this; + this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && @@ -3847,7 +4017,10 @@ S2.define('select2/data/maximumSelectionLength',[ }); return; } - decorated.call(self, params, callback); + + if (successCallback) { + successCallback(); + } }); }; @@ -3886,7 +4059,7 @@ S2.define('select2/dropdown',[ }; Dropdown.prototype.position = function ($dropdown, $container) { - // Should be implmented in subclasses + // Should be implemented in subclasses }; Dropdown.prototype.destroy = function () { @@ -3910,7 +4083,7 @@ S2.define('select2/dropdown/search',[ '' + '' + + ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' + '' ); @@ -3925,6 +4098,8 @@ S2.define('select2/dropdown/search',[ Search.prototype.bind = function (decorated, container, $container) { var self = this; + var resultsId = container.id + '-results'; + decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { @@ -3947,23 +4122,27 @@ S2.define('select2/dropdown/search',[ container.on('open', function () { self.$search.attr('tabindex', 0); + self.$search.attr('aria-controls', resultsId); - self.$search.focus(); + self.$search.trigger('focus'); window.setTimeout(function () { - self.$search.focus(); + self.$search.trigger('focus'); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); self.$search.val(''); + self.$search.trigger('blur'); }); container.on('focus', function () { if (!container.isOpen()) { - self.$search.focus(); + self.$search.trigger('focus'); } }); @@ -3978,6 +4157,14 @@ S2.define('select2/dropdown/search',[ } } }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); }; Search.prototype.handleSearch = function (evt) { @@ -4062,6 +4249,7 @@ S2.define('select2/dropdown/infiniteScroll',[ if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); + this.loadMoreIfNeeded(); } }; @@ -4080,25 +4268,27 @@ S2.define('select2/dropdown/infiniteScroll',[ self.loading = true; }); - this.$results.on('scroll', function () { - var isLoadMoreVisible = $.contains( - document.documentElement, - self.$loadingMore[0] - ); + this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); + }; - if (self.loading || !isLoadMoreVisible) { - return; - } + InfiniteScroll.prototype.loadMoreIfNeeded = function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + this.$loadingMore[0] + ); - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var loadingMoreOffset = self.$loadingMore.offset().top + - self.$loadingMore.outerHeight(false); + if (this.loading || !isLoadMoreVisible) { + return; + } - if (currentOffset + 50 >= loadingMoreOffset) { - self.loadMore(); - } - }); + var currentOffset = this.$results.offset().top + + this.$results.outerHeight(false); + var loadingMoreOffset = this.$loadingMore.offset().top + + this.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + this.loadMore(); + } }; InfiniteScroll.prototype.loadMore = function () { @@ -4119,7 +4309,7 @@ S2.define('select2/dropdown/infiniteScroll',[ var $option = $( '
      • ' + 'role="option" aria-disabled="true">' ); var message = this.options.get('translations').get('loadingMore'); @@ -4137,7 +4327,7 @@ S2.define('select2/dropdown/attachBody',[ '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { - this.$dropdownParent = options.get('dropdownParent') || $(document.body); + this.$dropdownParent = $(options.get('dropdownParent') || document.body); decorated.call(this, $element, options); } @@ -4145,27 +4335,14 @@ S2.define('select2/dropdown/attachBody',[ AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; - var setupResultsEvents = false; - decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); - if (!setupResultsEvents) { - setupResultsEvents = true; - - container.on('results:all', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:append', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - } + // Must bind after the results handlers to ensure correct sizing + self._bindContainerResultHandlers(container); }); container.on('close', function () { @@ -4214,6 +4391,44 @@ S2.define('select2/dropdown/attachBody',[ this.$dropdownContainer.detach(); }; + AttachBody.prototype._bindContainerResultHandlers = + function (decorated, container) { + + // These should only be bound once + if (this._containerResultsHandlersBound) { + return; + } + + var self = this; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:message', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('select', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('unselect', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + this._containerResultsHandlersBound = true; + }; + AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; @@ -4224,14 +4439,14 @@ S2.define('select2/dropdown/attachBody',[ var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { - $(this).data('select2-scroll-position', { + Utils.StoreData(this, 'select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { - var position = $(this).data('select2-scroll-position'); + var position = Utils.GetData(this, 'select2-scroll-position'); $(this).scrollTop(position.y); }); @@ -4290,16 +4505,26 @@ S2.define('select2/dropdown/attachBody',[ top: container.bottom }; - // Determine what the parent element is to use for calciulating the offset + // Determine what the parent element is to use for calculating the offset var $offsetParent = this.$dropdownParent; - // For statically positoned elements, we need to get the element + // For statically positioned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } - var parentOffset = $offsetParent.offset(); + var parentOffset = { + top: 0, + left: 0 + }; + + if ( + $.contains(document.body, $offsetParent[0]) || + $offsetParent[0].isConnected + ) { + parentOffset = $offsetParent.offset(); + } css.top -= parentOffset.top; css.left -= parentOffset.left; @@ -4396,8 +4621,8 @@ S2.define('select2/dropdown/minimumResultsForSearch',[ }); S2.define('select2/dropdown/selectOnClose',[ - -], function () { + '../utils' +], function (Utils) { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { @@ -4428,7 +4653,7 @@ S2.define('select2/dropdown/selectOnClose',[ return; } - var data = $highlightedResults.data('data'); + var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte if ( @@ -4469,7 +4694,7 @@ S2.define('select2/dropdown/closeOnSelect',[ var originalEvent = evt.originalEvent; // Don't close if the control key is being held - if (originalEvent && originalEvent.ctrlKey) { + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { return; } @@ -4523,6 +4748,9 @@ S2.define('select2/i18n/en',[],function () { }, searching: function () { return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; } }; }); @@ -4761,66 +4989,29 @@ S2.define('select2/defaults',[ ); } - if (typeof options.language === 'string') { - // Check if the language is specified with a region - if (options.language.indexOf('-') > 0) { - // Extract the region information if it is included - var languageParts = options.language.split('-'); - var baseLanguage = languageParts[0]; + // If the defaults were not previously applied from an element, it is + // possible for the language option to have not been resolved + options.language = this._resolveLanguage(options.language); - options.language = [options.language, baseLanguage]; - } else { - options.language = [options.language]; + // Always fall back to English since it will always be complete + options.language.push('en'); + + var uniqueLanguages = []; + + for (var l = 0; l < options.language.length; l++) { + var language = options.language[l]; + + if (uniqueLanguages.indexOf(language) === -1) { + uniqueLanguages.push(language); } } - if ($.isArray(options.language)) { - var languages = new Translation(); - options.language.push('en'); + options.language = uniqueLanguages; - var languageNames = options.language; - - for (var l = 0; l < languageNames.length; l++) { - var name = languageNames[l]; - var language = {}; - - try { - // Try to load it with the original name - language = Translation.loadPath(name); - } catch (e) { - try { - // If we couldn't load it, check if it wasn't the full path - name = this.defaults.amdLanguageBase + name; - language = Translation.loadPath(name); - } catch (ex) { - // The translation could not be loaded at all. Sometimes this is - // because of a configuration problem, other times this can be - // because of how Select2 helps load all possible translation files. - if (options.debug && window.console && console.warn) { - console.warn( - 'Select2: The language file for "' + name + '" could not be ' + - 'automatically loaded. A fallback will be used instead.' - ); - } - - continue; - } - } - - languages.extend(language); - } - - options.translations = languages; - } else { - var baseTranslation = Translation.loadPath( - this.defaults.amdLanguageBase + 'en' - ); - var customTranslation = new Translation(options.language); - - customTranslation.extend(baseTranslation); - - options.translations = customTranslation; - } + options.translations = this._processTranslations( + options.language, + options.debug + ); return options; }; @@ -4887,13 +5078,14 @@ S2.define('select2/defaults',[ debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, - language: EnglishTranslation, + language: {}, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, + scrollAfterSelect: false, sorter: function (data) { return data; }, @@ -4908,6 +5100,103 @@ S2.define('select2/defaults',[ }; }; + Defaults.prototype.applyFromElement = function (options, $element) { + var optionLanguage = options.language; + var defaultLanguage = this.defaults.language; + var elementLanguage = $element.prop('lang'); + var parentLanguage = $element.closest('[lang]').prop('lang'); + + var languages = Array.prototype.concat.call( + this._resolveLanguage(elementLanguage), + this._resolveLanguage(optionLanguage), + this._resolveLanguage(defaultLanguage), + this._resolveLanguage(parentLanguage) + ); + + options.language = languages; + + return options; + }; + + Defaults.prototype._resolveLanguage = function (language) { + if (!language) { + return []; + } + + if ($.isEmptyObject(language)) { + return []; + } + + if ($.isPlainObject(language)) { + return [language]; + } + + var languages; + + if (!$.isArray(language)) { + languages = [language]; + } else { + languages = language; + } + + var resolvedLanguages = []; + + for (var l = 0; l < languages.length; l++) { + resolvedLanguages.push(languages[l]); + + if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = languages[l].split('-'); + var baseLanguage = languageParts[0]; + + resolvedLanguages.push(baseLanguage); + } + } + + return resolvedLanguages; + }; + + Defaults.prototype._processTranslations = function (languages, debug) { + var translations = new Translation(); + + for (var l = 0; l < languages.length; l++) { + var languageData = new Translation(); + + var language = languages[l]; + + if (typeof language === 'string') { + try { + // Try to load it with the original name + languageData = Translation.loadPath(language); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + language = this.defaults.amdLanguageBase + language; + languageData = Translation.loadPath(language); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files + if (debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + language + '" could ' + + 'not be automatically loaded. A fallback will be used instead.' + ); + } + } + } + } else if ($.isPlainObject(language)) { + languageData = new Translation(language); + } else { + languageData = language; + } + + translations.extend(languageData); + } + + return translations; + }; + Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); @@ -4916,7 +5205,7 @@ S2.define('select2/defaults',[ var convertedData = Utils._convertData(data); - $.extend(this.defaults, convertedData); + $.extend(true, this.defaults, convertedData); }; var defaults = new Defaults(); @@ -4937,6 +5226,10 @@ S2.define('select2/options',[ this.fromElement($element); } + if ($element != null) { + this.options = Defaults.applyFromElement(this.options, $element); + } + this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { @@ -4960,14 +5253,6 @@ S2.define('select2/options',[ this.options.disabled = $e.prop('disabled'); } - if (this.options.language == null) { - if ($e.prop('lang')) { - this.options.language = $e.prop('lang').toLowerCase(); - } else if ($e.closest('[lang]').prop('lang')) { - this.options.language = $e.closest('[lang]').prop('lang'); - } - } - if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); @@ -4981,7 +5266,7 @@ S2.define('select2/options',[ $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); - if ($e.data('select2Tags')) { + if (Utils.GetData($e[0], 'select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + @@ -4990,11 +5275,11 @@ S2.define('select2/options',[ ); } - $e.data('data', $e.data('select2Tags')); - $e.data('tags', true); + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); } - if ($e.data('ajaxUrl')) { + if (Utils.GetData($e[0], 'ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + @@ -5003,21 +5288,45 @@ S2.define('select2/options',[ ); } - $e.attr('ajax--url', $e.data('ajaxUrl')); - $e.data('ajax--url', $e.data('ajaxUrl')); + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); } var dataset = {}; + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { - dataset = $.extend(true, {}, $e[0].dataset, $e.data()); - } else { - dataset = $e.data(); + dataset = $.extend(true, {}, $e[0].dataset, dataset); } - var data = $.extend(true, {}, dataset); + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); data = Utils._convertData(data); @@ -5054,8 +5363,8 @@ S2.define('select2/core',[ './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { - if ($element.data('select2') != null) { - $element.data('select2').destroy(); + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); } this.$element = $element; @@ -5071,7 +5380,7 @@ S2.define('select2/core',[ // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; - $element.data('old-tabindex', tabindex); + Utils.StoreData($element[0], 'old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters @@ -5132,6 +5441,9 @@ S2.define('select2/core',[ // Synchronize any monitored attributes this._syncAttributes(); + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). $element.data('select2', this); }; @@ -5208,6 +5520,12 @@ S2.define('select2/core',[ return null; } + if (method == 'computedstyle') { + var computedStyle = window.getComputedStyle($element[0]); + + return computedStyle.width; + } + return method; }; @@ -5248,8 +5566,8 @@ S2.define('select2/core',[ if (observer != null) { this._observer = new observer(function (mutations) { - $.each(mutations, self._syncA); - $.each(mutations, self._syncS); + self._syncA(); + self._syncS(null, mutations); }); this._observer.observe(this.$element[0], { attributes: true, @@ -5371,7 +5689,7 @@ S2.define('select2/core',[ if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { - self.close(); + self.close(evt); evt.preventDefault(); } else if (key === KEYS.ENTER) { @@ -5405,7 +5723,7 @@ S2.define('select2/core',[ Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); - if (this.options.get('disabled')) { + if (this.isDisabled()) { if (this.isOpen()) { this.close(); } @@ -5416,7 +5734,7 @@ S2.define('select2/core',[ } }; - Select2.prototype._syncSubtree = function (evt, mutations) { + Select2.prototype._isChangeMutation = function (evt, mutations) { var changed = false; var self = this; @@ -5444,7 +5762,22 @@ S2.define('select2/core',[ } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { changed = true; + } else if ($.isArray(mutations)) { + $.each(mutations, function(evt, mutation) { + if (self._isChangeMutation(evt, mutation)) { + // We've found a change mutation. + // Let's escape from the loop and continue + changed = true; + return false; + } + }); } + return changed; + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = this._isChangeMutation(evt, mutations); + var self = this; // Only re-pull the data if we think there is a change if (changed) { @@ -5466,7 +5799,8 @@ S2.define('select2/core',[ 'open': 'opening', 'close': 'closing', 'select': 'selecting', - 'unselect': 'unselecting' + 'unselect': 'unselecting', + 'clear': 'clearing' }; if (args === undefined) { @@ -5494,7 +5828,7 @@ S2.define('select2/core',[ }; Select2.prototype.toggleDropdown = function () { - if (this.options.get('disabled')) { + if (this.isDisabled()) { return; } @@ -5510,15 +5844,40 @@ S2.define('select2/core',[ return; } + if (this.isDisabled()) { + return; + } + this.trigger('query', {}); }; - Select2.prototype.close = function () { + Select2.prototype.close = function (evt) { if (!this.isOpen()) { return; } - this.trigger('close', {}); + this.trigger('close', { originalEvent : evt }); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + Select2.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + Select2.prototype.isDisabled = function () { + return this.options.get('disabled'); }; Select2.prototype.isOpen = function () { @@ -5595,7 +5954,7 @@ S2.define('select2/core',[ }); } - this.$element.val(newVal).trigger('change'); + this.$element.val(newVal).trigger('input').trigger('change'); }; Select2.prototype.destroy = function () { @@ -5621,10 +5980,12 @@ S2.define('select2/core',[ this._syncS = null; this.$element.off('.select2'); - this.$element.attr('tabindex', this.$element.data('old-tabindex')); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); this.$element.removeData('select2'); this.dataAdapter.destroy(); @@ -5652,7 +6013,7 @@ S2.define('select2/core',[ this.$container.addClass('select2-container--' + this.options.get('theme')); - $container.data('element', this.$element); + Utils.StoreData($container[0], 'element', this.$element); return $container; }; @@ -5862,8 +6223,9 @@ S2.define('select2/compat/initSelection',[ }); S2.define('select2/compat/inputData',[ - 'jquery' -], function ($) { + 'jquery', + '../utils' +], function ($, Utils) { function InputData (decorated, $element, options) { this._currentData = []; this._valueSeparator = options.get('valueSeparator') || ','; @@ -5927,13 +6289,13 @@ S2.define('select2/compat/inputData',[ }); this.$element.val(data.id); - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); } else { var value = this.$element.val(); value += this._valueSeparator + data.id; this.$element.val(value); - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); } }; @@ -5956,7 +6318,7 @@ S2.define('select2/compat/inputData',[ } self.$element.val(values.join(self._valueSeparator)); - self.$element.trigger('change'); + self.$element.trigger('input').trigger('change'); }); }; @@ -5980,7 +6342,7 @@ S2.define('select2/compat/inputData',[ InputData.prototype.addOptions = function (_, $options) { var options = $.map($options, function ($option) { - return $.data($option[0], 'data'); + return Utils.GetData($option[0], 'data'); }); this._currentData.push.apply(this._currentData, options); @@ -6383,8 +6745,9 @@ S2.define('jquery.select2',[ 'jquery-mousewheel', './select2/core', - './select2/defaults' -], function ($, _, Select2, Defaults) { + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; @@ -6405,7 +6768,7 @@ S2.define('jquery.select2',[ var args = Array.prototype.slice.call(arguments, 1); this.each(function () { - var instance = $(this).data('select2'); + var instance = Utils.GetData(this, 'select2'); if (instance == null && window.console && console.error) { console.error( diff --git a/InvenTree/InvenTree/static/select2/js/select2.full.min.js b/InvenTree/InvenTree/static/select2/js/select2.full.min.js new file mode 100644 index 0000000000..fa781916e8 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/select2.full.min.js @@ -0,0 +1,2 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(d){var e=function(){if(d&&d.fn&&d.fn.select2&&d.fn.select2.amd)var e=d.fn.select2.amd;var t,n,i,h,o,s,f,g,m,v,y,_,r,a,w,l;function b(e,t){return r.call(e,t)}function c(e,t){var n,i,r,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&w.test(e[s])&&(e[s]=e[s].replace(w,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},r.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},r.__cache={};var n=0;return r.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},r.StoreData=function(e,t,n){var i=r.GetUniqueElementId(e);r.__cache[i]||(r.__cache[i]={}),r.__cache[i][t]=n},r.GetData=function(e,t){var n=r.GetUniqueElementId(e);return t?r.__cache[n]&&null!=r.__cache[n][t]?r.__cache[n][t]:o(e).data(t):r.__cache[n]},r.RemoveData=function(e){var t=r.GetUniqueElementId(e);null!=r.__cache[t]&&delete r.__cache[t],e.removeAttribute("data-select2-id")},r}),e.define("select2/results",["jquery","./utils"],function(h,f){function i(e,t,n){this.$element=e,this.data=n,this.options=t,i.__super__.constructor.call(this)}return f.Extend(i,f.Observable),i.prototype.render=function(){var e=h('
          ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),i=this.options.get("translations").get(e.message);n.append(t(i(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},i.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},i.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var i=n-1;0===e.length&&(i=0);var r=t.eq(i);r.trigger("mouseenter");var o=l.$results.offset().top,s=r.offset().top,a=l.$results.scrollTop()+(s-o);0===i?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var i=t.eq(n);i.trigger("mouseenter");var r=l.$results.offset().top+l.$results.outerHeight(!1),o=i.offset().top+i.outerHeight(!1),s=l.$results.scrollTop()+o-r;0===n?l.$results.scrollTop(0):rthis.$results.outerHeight()||o<0)&&this.$results.scrollTop(r)}},i.prototype.template=function(e,t){var n=this.options.get("templateResult"),i=this.options.get("escapeMarkup"),r=n(e,t);null==r?t.style.display="none":"string"==typeof r?t.innerHTML=i(r):h(t).append(r)},i}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,i,r){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return i.Extend(o,i.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=i.GetData(this.$element[0],"old-tabindex")?this._tabindex=i.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,i=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===r.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",i),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&i.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,i){function r(){r.__super__.constructor.apply(this,arguments)}return n.Extend(r,t),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},r.prototype.bind=function(t,e){var n=this;r.__super__.bind.apply(this,arguments);var i=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",i).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",i),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return e("")},r.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),i=this.display(t,n);n.empty().append(i);var r=t.title||t.text;r?n.attr("title",r):n.removeAttr("title")}else this.clear()},r}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(r,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
            '),e},n.prototype.bind=function(e,t){var i=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){i.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!i.isDisabled()){var t=r(this).parent(),n=l.GetData(t[0],"data");i.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return r('
          • ×
          • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×
            ');a.StoreData(i[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(i)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(i,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=i('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),t.on("open",function(){i.$search.attr("aria-controls",r),i.$search.trigger("focus")}),t.on("close",function(){i.$search.val(""),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.trigger("focus")}),t.on("enable",function(){i.$search.prop("disabled",!1),i._transferTabIndex()}),t.on("disable",function(){i.$search.prop("disabled",!0)}),t.on("focus",function(e){i.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){i.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){i._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===i.$search.val()){var t=i.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(){i._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var i=this;this._checkIfMaximumSelected(function(){e.call(i,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var i=this;this.current(function(e){var t=null!=e?e.length:0;0=i.maximumSelectionLength?i.trigger("results:message",{message:"maximumSelected",args:{maximum:i.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){i.handleSearch(e)}),t.on("open",function(){i.$search.attr("tabindex",0),i.$search.attr("aria-controls",r),i.$search.trigger("focus"),window.setTimeout(function(){i.$search.trigger("focus")},0)}),t.on("close",function(){i.$search.attr("tabindex",-1),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.val(""),i.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||i.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;0<=i;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("query",function(e){i.lastParams=e,i.loading=!0}),t.on("query:append",function(e){i.lastParams=e,i.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
          • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),i._bindContainerResultHandlers(t)}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,i="scroll.select2."+t.id,r="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(i,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(i+" "+r+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+i+" "+r)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),i=null,r=this.$container.offset();r.bottom=r.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=r.top,o.bottom=r.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ar.bottom+s,d={left:r.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(i="below"),u||!c||t?!c&&u&&t&&(i="below"):i="above",("above"==i||t&&"below"!==i)&&(d.top=o.top-h.top-s),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("select2/compat/utils",["jquery"],function(s){return{syncCssClasses:function(e,t,n){var i,r,o=[];(i=s.trim(e.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)}),(i=s.trim(t.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(r=n(this))&&o.push(r)}),e.attr("class",o.join(" "))}}}),e.define("select2/compat/containerCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("containerCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptContainerCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("containerCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/dropdownCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("dropdownCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptDropdownCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("dropdownCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/initSelection",["jquery"],function(i){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=n.get("initSelection"),this._isInitialized=!1,e.call(this,t,n)}return e.prototype.current=function(e,t){var n=this;this._isInitialized?e.call(this,t):this.initSelection.call(null,this.$element,function(e){n._isInitialized=!0,i.isArray(e)||(e=[e]),t(e)})},e}),e.define("select2/compat/inputData",["jquery","../utils"],function(s,i){function e(e,t,n){this._currentData=[],this._valueSeparator=n.get("valueSeparator")||",","hidden"===t.prop("type")&&n.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `' + + ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' + '' ); @@ -1873,14 +2000,18 @@ S2.define('select2/selection/search',[ Search.prototype.bind = function (decorated, container, $container) { var self = this; + var resultsId = container.id + '-results'; + decorated.call(this, container, $container); container.on('open', function () { + self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); + self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); @@ -1900,7 +2031,11 @@ S2.define('select2/selection/search',[ }); container.on('results:focus', function (params) { - self.$search.attr('aria-activedescendant', params.id); + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { @@ -1925,7 +2060,7 @@ S2.define('select2/selection/search',[ .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { - var item = $previousChoice.data('data'); + var item = Utils.GetData($previousChoice[0], 'data'); self.searchRemoveChoice(item); @@ -1934,6 +2069,12 @@ S2.define('select2/selection/search',[ } }); + this.$selection.on('click', '.select2-search--inline', function (evt) { + if (self.$search.val()) { + evt.stopPropagation(); + } + }); + // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. @@ -2019,7 +2160,7 @@ S2.define('select2/selection/search',[ this.resizeSearch(); if (searchHadFocus) { - this.$search.focus(); + this.$search.trigger('focus'); } }; @@ -2052,7 +2193,7 @@ S2.define('select2/selection/search',[ var width = ''; if (this.$search.attr('placeholder') !== '') { - width = this.$selection.find('.select2-selection__rendered').innerWidth(); + width = this.$selection.find('.select2-selection__rendered').width(); } else { var minimumWidth = this.$search.val().length + 1; @@ -2076,10 +2217,13 @@ S2.define('select2/selection/eventRelay',[ 'open', 'opening', 'close', 'closing', 'select', 'selecting', - 'unselect', 'unselecting' + 'unselect', 'unselecting', + 'clear', 'clearing' ]; - var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; decorated.call(this, container, $container); @@ -2412,6 +2556,7 @@ S2.define('select2/diacritics',[ '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', + '\u0152': 'OE', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', @@ -2821,6 +2966,7 @@ S2.define('select2/diacritics',[ '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', + '\u0153': 'oe', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', @@ -2989,8 +3135,9 @@ S2.define('select2/diacritics',[ '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', - '\u03C9': '\u03C9', - '\u03C2': '\u03C3' + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' }; return diacritics; @@ -3075,7 +3222,7 @@ S2.define('select2/data/select',[ if ($(data.element).is('option')) { data.element.selected = true; - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); return; } @@ -3096,13 +3243,13 @@ S2.define('select2/data/select',[ } self.$element.val(val); - self.$element.trigger('change'); + self.$element.trigger('input').trigger('change'); }); } else { var val = data.id; this.$element.val(val); - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); } }; @@ -3118,7 +3265,7 @@ S2.define('select2/data/select',[ if ($(data.element).is('option')) { data.element.selected = false; - this.$element.trigger('change'); + this.$element.trigger('input').trigger('change'); return; } @@ -3136,7 +3283,7 @@ S2.define('select2/data/select',[ self.$element.val(val); - self.$element.trigger('change'); + self.$element.trigger('input').trigger('change'); }); }; @@ -3158,7 +3305,7 @@ S2.define('select2/data/select',[ // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 - $.removeData(this, 'data'); + Utils.RemoveData(this); }); }; @@ -3231,7 +3378,7 @@ S2.define('select2/data/select',[ normalizedData.element = option; // Override the option's data with the combined data - $.data(option, 'data', normalizedData); + Utils.StoreData(option, 'data', normalizedData); return $option; }; @@ -3239,7 +3386,7 @@ S2.define('select2/data/select',[ SelectAdapter.prototype.item = function ($option) { var data = {}; - data = $.data($option[0], 'data'); + data = Utils.GetData($option[0], 'data'); if (data != null) { return data; @@ -3277,13 +3424,13 @@ S2.define('select2/data/select',[ data = this._normalizeItem(data); data.element = $option[0]; - $.data($option[0], 'data', data); + Utils.StoreData($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { - if (!$.isPlainObject(item)) { + if (item !== Object(item)) { item = { id: item, text: item @@ -3329,15 +3476,19 @@ S2.define('select2/data/array',[ 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { - var data = options.get('data') || []; + this._dataToConvert = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); - - this.addOptions(this.convertToOptions(data)); } Utils.Extend(ArrayAdapter, SelectAdapter); + ArrayAdapter.prototype.bind = function (container, $container) { + ArrayAdapter.__super__.bind.call(this, container, $container); + + this.addOptions(this.convertToOptions(this._dataToConvert)); + }; + ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); @@ -3487,7 +3638,8 @@ S2.define('select2/data/ajax',[ }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property - if ($request.status && $request.status === '0') { + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { return; } @@ -3626,8 +3778,6 @@ S2.define('select2/data/tags',[ }; Tags.prototype._removeOldTags = function (_) { - var tag = this._lastTag; - var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { @@ -3702,7 +3852,7 @@ S2.define('select2/data/tokenizer',[ // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); - this.$search.focus(); + this.$search.trigger('focus'); } params.term = tokenData.term; @@ -3831,10 +3981,30 @@ S2.define('select2/data/maximumSelectionLength',[ decorated.call(this, $e, options); } + MaximumSelectionLength.prototype.bind = + function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function () { + self._checkIfMaximumSelected(); + }); + }; + MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; + this._checkIfMaximumSelected(function () { + decorated.call(self, params, callback); + }); + }; + + MaximumSelectionLength.prototype._checkIfMaximumSelected = + function (_, successCallback) { + var self = this; + this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && @@ -3847,7 +4017,10 @@ S2.define('select2/data/maximumSelectionLength',[ }); return; } - decorated.call(self, params, callback); + + if (successCallback) { + successCallback(); + } }); }; @@ -3886,7 +4059,7 @@ S2.define('select2/dropdown',[ }; Dropdown.prototype.position = function ($dropdown, $container) { - // Should be implmented in subclasses + // Should be implemented in subclasses }; Dropdown.prototype.destroy = function () { @@ -3910,7 +4083,7 @@ S2.define('select2/dropdown/search',[ '' + '' + + ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' + '' ); @@ -3925,6 +4098,8 @@ S2.define('select2/dropdown/search',[ Search.prototype.bind = function (decorated, container, $container) { var self = this; + var resultsId = container.id + '-results'; + decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { @@ -3947,23 +4122,27 @@ S2.define('select2/dropdown/search',[ container.on('open', function () { self.$search.attr('tabindex', 0); + self.$search.attr('aria-controls', resultsId); - self.$search.focus(); + self.$search.trigger('focus'); window.setTimeout(function () { - self.$search.focus(); + self.$search.trigger('focus'); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); self.$search.val(''); + self.$search.trigger('blur'); }); container.on('focus', function () { if (!container.isOpen()) { - self.$search.focus(); + self.$search.trigger('focus'); } }); @@ -3978,6 +4157,14 @@ S2.define('select2/dropdown/search',[ } } }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); }; Search.prototype.handleSearch = function (evt) { @@ -4062,6 +4249,7 @@ S2.define('select2/dropdown/infiniteScroll',[ if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); + this.loadMoreIfNeeded(); } }; @@ -4080,25 +4268,27 @@ S2.define('select2/dropdown/infiniteScroll',[ self.loading = true; }); - this.$results.on('scroll', function () { - var isLoadMoreVisible = $.contains( - document.documentElement, - self.$loadingMore[0] - ); + this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); + }; - if (self.loading || !isLoadMoreVisible) { - return; - } + InfiniteScroll.prototype.loadMoreIfNeeded = function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + this.$loadingMore[0] + ); - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var loadingMoreOffset = self.$loadingMore.offset().top + - self.$loadingMore.outerHeight(false); + if (this.loading || !isLoadMoreVisible) { + return; + } - if (currentOffset + 50 >= loadingMoreOffset) { - self.loadMore(); - } - }); + var currentOffset = this.$results.offset().top + + this.$results.outerHeight(false); + var loadingMoreOffset = this.$loadingMore.offset().top + + this.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + this.loadMore(); + } }; InfiniteScroll.prototype.loadMore = function () { @@ -4119,7 +4309,7 @@ S2.define('select2/dropdown/infiniteScroll',[ var $option = $( '
          • ' + 'role="option" aria-disabled="true">' ); var message = this.options.get('translations').get('loadingMore'); @@ -4137,7 +4327,7 @@ S2.define('select2/dropdown/attachBody',[ '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { - this.$dropdownParent = options.get('dropdownParent') || $(document.body); + this.$dropdownParent = $(options.get('dropdownParent') || document.body); decorated.call(this, $element, options); } @@ -4145,27 +4335,14 @@ S2.define('select2/dropdown/attachBody',[ AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; - var setupResultsEvents = false; - decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); - if (!setupResultsEvents) { - setupResultsEvents = true; - - container.on('results:all', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:append', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - } + // Must bind after the results handlers to ensure correct sizing + self._bindContainerResultHandlers(container); }); container.on('close', function () { @@ -4214,6 +4391,44 @@ S2.define('select2/dropdown/attachBody',[ this.$dropdownContainer.detach(); }; + AttachBody.prototype._bindContainerResultHandlers = + function (decorated, container) { + + // These should only be bound once + if (this._containerResultsHandlersBound) { + return; + } + + var self = this; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:message', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('select', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('unselect', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + this._containerResultsHandlersBound = true; + }; + AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; @@ -4224,14 +4439,14 @@ S2.define('select2/dropdown/attachBody',[ var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { - $(this).data('select2-scroll-position', { + Utils.StoreData(this, 'select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { - var position = $(this).data('select2-scroll-position'); + var position = Utils.GetData(this, 'select2-scroll-position'); $(this).scrollTop(position.y); }); @@ -4290,16 +4505,26 @@ S2.define('select2/dropdown/attachBody',[ top: container.bottom }; - // Determine what the parent element is to use for calciulating the offset + // Determine what the parent element is to use for calculating the offset var $offsetParent = this.$dropdownParent; - // For statically positoned elements, we need to get the element + // For statically positioned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } - var parentOffset = $offsetParent.offset(); + var parentOffset = { + top: 0, + left: 0 + }; + + if ( + $.contains(document.body, $offsetParent[0]) || + $offsetParent[0].isConnected + ) { + parentOffset = $offsetParent.offset(); + } css.top -= parentOffset.top; css.left -= parentOffset.left; @@ -4396,8 +4621,8 @@ S2.define('select2/dropdown/minimumResultsForSearch',[ }); S2.define('select2/dropdown/selectOnClose',[ - -], function () { + '../utils' +], function (Utils) { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { @@ -4428,7 +4653,7 @@ S2.define('select2/dropdown/selectOnClose',[ return; } - var data = $highlightedResults.data('data'); + var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte if ( @@ -4469,7 +4694,7 @@ S2.define('select2/dropdown/closeOnSelect',[ var originalEvent = evt.originalEvent; // Don't close if the control key is being held - if (originalEvent && originalEvent.ctrlKey) { + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { return; } @@ -4523,6 +4748,9 @@ S2.define('select2/i18n/en',[],function () { }, searching: function () { return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; } }; }); @@ -4761,66 +4989,29 @@ S2.define('select2/defaults',[ ); } - if (typeof options.language === 'string') { - // Check if the language is specified with a region - if (options.language.indexOf('-') > 0) { - // Extract the region information if it is included - var languageParts = options.language.split('-'); - var baseLanguage = languageParts[0]; + // If the defaults were not previously applied from an element, it is + // possible for the language option to have not been resolved + options.language = this._resolveLanguage(options.language); - options.language = [options.language, baseLanguage]; - } else { - options.language = [options.language]; + // Always fall back to English since it will always be complete + options.language.push('en'); + + var uniqueLanguages = []; + + for (var l = 0; l < options.language.length; l++) { + var language = options.language[l]; + + if (uniqueLanguages.indexOf(language) === -1) { + uniqueLanguages.push(language); } } - if ($.isArray(options.language)) { - var languages = new Translation(); - options.language.push('en'); + options.language = uniqueLanguages; - var languageNames = options.language; - - for (var l = 0; l < languageNames.length; l++) { - var name = languageNames[l]; - var language = {}; - - try { - // Try to load it with the original name - language = Translation.loadPath(name); - } catch (e) { - try { - // If we couldn't load it, check if it wasn't the full path - name = this.defaults.amdLanguageBase + name; - language = Translation.loadPath(name); - } catch (ex) { - // The translation could not be loaded at all. Sometimes this is - // because of a configuration problem, other times this can be - // because of how Select2 helps load all possible translation files. - if (options.debug && window.console && console.warn) { - console.warn( - 'Select2: The language file for "' + name + '" could not be ' + - 'automatically loaded. A fallback will be used instead.' - ); - } - - continue; - } - } - - languages.extend(language); - } - - options.translations = languages; - } else { - var baseTranslation = Translation.loadPath( - this.defaults.amdLanguageBase + 'en' - ); - var customTranslation = new Translation(options.language); - - customTranslation.extend(baseTranslation); - - options.translations = customTranslation; - } + options.translations = this._processTranslations( + options.language, + options.debug + ); return options; }; @@ -4887,13 +5078,14 @@ S2.define('select2/defaults',[ debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, - language: EnglishTranslation, + language: {}, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, + scrollAfterSelect: false, sorter: function (data) { return data; }, @@ -4908,6 +5100,103 @@ S2.define('select2/defaults',[ }; }; + Defaults.prototype.applyFromElement = function (options, $element) { + var optionLanguage = options.language; + var defaultLanguage = this.defaults.language; + var elementLanguage = $element.prop('lang'); + var parentLanguage = $element.closest('[lang]').prop('lang'); + + var languages = Array.prototype.concat.call( + this._resolveLanguage(elementLanguage), + this._resolveLanguage(optionLanguage), + this._resolveLanguage(defaultLanguage), + this._resolveLanguage(parentLanguage) + ); + + options.language = languages; + + return options; + }; + + Defaults.prototype._resolveLanguage = function (language) { + if (!language) { + return []; + } + + if ($.isEmptyObject(language)) { + return []; + } + + if ($.isPlainObject(language)) { + return [language]; + } + + var languages; + + if (!$.isArray(language)) { + languages = [language]; + } else { + languages = language; + } + + var resolvedLanguages = []; + + for (var l = 0; l < languages.length; l++) { + resolvedLanguages.push(languages[l]); + + if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = languages[l].split('-'); + var baseLanguage = languageParts[0]; + + resolvedLanguages.push(baseLanguage); + } + } + + return resolvedLanguages; + }; + + Defaults.prototype._processTranslations = function (languages, debug) { + var translations = new Translation(); + + for (var l = 0; l < languages.length; l++) { + var languageData = new Translation(); + + var language = languages[l]; + + if (typeof language === 'string') { + try { + // Try to load it with the original name + languageData = Translation.loadPath(language); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + language = this.defaults.amdLanguageBase + language; + languageData = Translation.loadPath(language); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files + if (debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + language + '" could ' + + 'not be automatically loaded. A fallback will be used instead.' + ); + } + } + } + } else if ($.isPlainObject(language)) { + languageData = new Translation(language); + } else { + languageData = language; + } + + translations.extend(languageData); + } + + return translations; + }; + Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); @@ -4916,7 +5205,7 @@ S2.define('select2/defaults',[ var convertedData = Utils._convertData(data); - $.extend(this.defaults, convertedData); + $.extend(true, this.defaults, convertedData); }; var defaults = new Defaults(); @@ -4937,6 +5226,10 @@ S2.define('select2/options',[ this.fromElement($element); } + if ($element != null) { + this.options = Defaults.applyFromElement(this.options, $element); + } + this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { @@ -4960,14 +5253,6 @@ S2.define('select2/options',[ this.options.disabled = $e.prop('disabled'); } - if (this.options.language == null) { - if ($e.prop('lang')) { - this.options.language = $e.prop('lang').toLowerCase(); - } else if ($e.closest('[lang]').prop('lang')) { - this.options.language = $e.closest('[lang]').prop('lang'); - } - } - if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); @@ -4981,7 +5266,7 @@ S2.define('select2/options',[ $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); - if ($e.data('select2Tags')) { + if (Utils.GetData($e[0], 'select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + @@ -4990,11 +5275,11 @@ S2.define('select2/options',[ ); } - $e.data('data', $e.data('select2Tags')); - $e.data('tags', true); + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); } - if ($e.data('ajaxUrl')) { + if (Utils.GetData($e[0], 'ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + @@ -5003,21 +5288,45 @@ S2.define('select2/options',[ ); } - $e.attr('ajax--url', $e.data('ajaxUrl')); - $e.data('ajax--url', $e.data('ajaxUrl')); + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); } var dataset = {}; + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { - dataset = $.extend(true, {}, $e[0].dataset, $e.data()); - } else { - dataset = $e.data(); + dataset = $.extend(true, {}, $e[0].dataset, dataset); } - var data = $.extend(true, {}, dataset); + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); data = Utils._convertData(data); @@ -5054,8 +5363,8 @@ S2.define('select2/core',[ './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { - if ($element.data('select2') != null) { - $element.data('select2').destroy(); + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); } this.$element = $element; @@ -5071,7 +5380,7 @@ S2.define('select2/core',[ // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; - $element.data('old-tabindex', tabindex); + Utils.StoreData($element[0], 'old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters @@ -5132,6 +5441,9 @@ S2.define('select2/core',[ // Synchronize any monitored attributes this._syncAttributes(); + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). $element.data('select2', this); }; @@ -5208,6 +5520,12 @@ S2.define('select2/core',[ return null; } + if (method == 'computedstyle') { + var computedStyle = window.getComputedStyle($element[0]); + + return computedStyle.width; + } + return method; }; @@ -5248,8 +5566,8 @@ S2.define('select2/core',[ if (observer != null) { this._observer = new observer(function (mutations) { - $.each(mutations, self._syncA); - $.each(mutations, self._syncS); + self._syncA(); + self._syncS(null, mutations); }); this._observer.observe(this.$element[0], { attributes: true, @@ -5371,7 +5689,7 @@ S2.define('select2/core',[ if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { - self.close(); + self.close(evt); evt.preventDefault(); } else if (key === KEYS.ENTER) { @@ -5405,7 +5723,7 @@ S2.define('select2/core',[ Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); - if (this.options.get('disabled')) { + if (this.isDisabled()) { if (this.isOpen()) { this.close(); } @@ -5416,7 +5734,7 @@ S2.define('select2/core',[ } }; - Select2.prototype._syncSubtree = function (evt, mutations) { + Select2.prototype._isChangeMutation = function (evt, mutations) { var changed = false; var self = this; @@ -5444,7 +5762,22 @@ S2.define('select2/core',[ } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { changed = true; + } else if ($.isArray(mutations)) { + $.each(mutations, function(evt, mutation) { + if (self._isChangeMutation(evt, mutation)) { + // We've found a change mutation. + // Let's escape from the loop and continue + changed = true; + return false; + } + }); } + return changed; + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = this._isChangeMutation(evt, mutations); + var self = this; // Only re-pull the data if we think there is a change if (changed) { @@ -5466,7 +5799,8 @@ S2.define('select2/core',[ 'open': 'opening', 'close': 'closing', 'select': 'selecting', - 'unselect': 'unselecting' + 'unselect': 'unselecting', + 'clear': 'clearing' }; if (args === undefined) { @@ -5494,7 +5828,7 @@ S2.define('select2/core',[ }; Select2.prototype.toggleDropdown = function () { - if (this.options.get('disabled')) { + if (this.isDisabled()) { return; } @@ -5510,15 +5844,40 @@ S2.define('select2/core',[ return; } + if (this.isDisabled()) { + return; + } + this.trigger('query', {}); }; - Select2.prototype.close = function () { + Select2.prototype.close = function (evt) { if (!this.isOpen()) { return; } - this.trigger('close', {}); + this.trigger('close', { originalEvent : evt }); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + Select2.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + Select2.prototype.isDisabled = function () { + return this.options.get('disabled'); }; Select2.prototype.isOpen = function () { @@ -5595,7 +5954,7 @@ S2.define('select2/core',[ }); } - this.$element.val(newVal).trigger('change'); + this.$element.val(newVal).trigger('input').trigger('change'); }; Select2.prototype.destroy = function () { @@ -5621,10 +5980,12 @@ S2.define('select2/core',[ this._syncS = null; this.$element.off('.select2'); - this.$element.attr('tabindex', this.$element.data('old-tabindex')); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); this.$element.removeData('select2'); this.dataAdapter.destroy(); @@ -5652,7 +6013,7 @@ S2.define('select2/core',[ this.$container.addClass('select2-container--' + this.options.get('theme')); - $container.data('element', this.$element); + Utils.StoreData($container[0], 'element', this.$element); return $container; }; @@ -5672,8 +6033,9 @@ S2.define('jquery.select2',[ 'jquery-mousewheel', './select2/core', - './select2/defaults' -], function ($, _, Select2, Defaults) { + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; @@ -5694,7 +6056,7 @@ S2.define('jquery.select2',[ var args = Array.prototype.slice.call(arguments, 1); this.each(function () { - var instance = $(this).data('select2'); + var instance = Utils.GetData(this, 'select2'); if (instance == null && window.console && console.error) { console.error( diff --git a/InvenTree/InvenTree/static/select2/js/select2.min.js b/InvenTree/InvenTree/static/select2/js/select2.min.js new file mode 100644 index 0000000000..e421426434 --- /dev/null +++ b/InvenTree/InvenTree/static/select2/js/select2.min.js @@ -0,0 +1,2 @@ +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,b;function w(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&b.test(e[s])&&(e[s]=e[s].replace(b,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t],e.removeAttribute("data-select2-id")},i}),e.define("select2/results",["jquery","./utils"],function(h,f){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return f.Extend(r,f.Observable),r.prototype.render=function(){var e=h('
              ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):ithis.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):h(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r);var i=t.title||t.text;i?n.attr("title",i):n.removeAttr("title")}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
                '),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.isDisabled()){var t=i(this).parent(),n=l.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('
              • ×
              • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),t.on("open",function(){r.$search.attr("aria-controls",i),r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(){r._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var r=this;this._checkIfMaximumSelected(function(){e.call(r,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var r=this;this.current(function(e){var t=null!=e?e.length:0;0=r.maximumSelectionLength?r.trigger("results:message",{message:"maximumSelected",args:{maximum:r.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.attr("aria-controls",i),r.$search.trigger("focus"),window.setTimeout(function(){r.$search.trigger("focus")},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.val(""),r.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||r.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
              • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),r._bindContainerResultHandlers(t)}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1 2021-07-03 + - Introduced the concept of "API forms" in https://github.com/inventree/InvenTree/pull/1716 + - API OPTIONS endpoints provide comprehensive field metedata + - Multiple new API endpoints added for database models + v6 -> 2021-06-23 - Part and Company images can now be directly uploaded via the REST API diff --git a/InvenTree/build/api.py b/InvenTree/build/api.py index 1cb973fe05..904a523a09 100644 --- a/InvenTree/build/api.py +++ b/InvenTree/build/api.py @@ -11,11 +11,12 @@ from rest_framework import generics from django.conf.urls import url, include +from InvenTree.api import AttachmentMixin from InvenTree.helpers import str2bool, isNull from InvenTree.status_codes import BuildStatus -from .models import Build, BuildItem -from .serializers import BuildSerializer, BuildItemSerializer +from .models import Build, BuildItem, BuildOrderAttachment +from .serializers import BuildAttachmentSerializer, BuildSerializer, BuildItemSerializer class BuildList(generics.ListCreateAPIView): @@ -46,6 +47,8 @@ class BuildList(generics.ListCreateAPIView): 'target_date', 'completion_date', 'quantity', + 'issued_by', + 'responsible', ] search_fields = [ @@ -226,14 +229,48 @@ class BuildItemList(generics.ListCreateAPIView): ] -build_item_api_urls = [ - url('^.*$', BuildItemList.as_view(), name='api-build-item-list'), -] +class BuildAttachmentList(generics.ListCreateAPIView, AttachmentMixin): + """ + API endpoint for listing (and creating) BuildOrderAttachment objects + """ + + queryset = BuildOrderAttachment.objects.all() + serializer_class = BuildAttachmentSerializer + + filter_backends = [ + DjangoFilterBackend, + ] + + filter_fields = [ + 'build', + ] + + +class BuildAttachmentDetail(generics.RetrieveUpdateDestroyAPIView, AttachmentMixin): + """ + Detail endpoint for a BuildOrderAttachment object + """ + + queryset = BuildOrderAttachment.objects.all() + serializer_class = BuildAttachmentSerializer + build_api_urls = [ - url(r'^item/', include(build_item_api_urls)), + # Attachments + url(r'^attachment/', include([ + url(r'^(?P\d+)/', BuildAttachmentDetail.as_view(), name='api-build-attachment-detail'), + url('^.*$', BuildAttachmentList.as_view(), name='api-build-attachment-list'), + ])), + + # Build Items + url(r'^item/', include([ + url('^.*$', BuildItemList.as_view(), name='api-build-item-list') + ])), + + # Build Detail url(r'^(?P\d+)/', BuildDetail.as_view(), name='api-build-detail'), + # Build List url(r'^.*$', BuildList.as_view(), name='api-build-list'), ] diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py index e60df22c21..e2ca7c3f75 100644 --- a/InvenTree/build/forms.py +++ b/InvenTree/build/forms.py @@ -15,7 +15,7 @@ from InvenTree.fields import DatePickerFormField from InvenTree.status_codes import StockStatus -from .models import Build, BuildItem, BuildOrderAttachment +from .models import Build, BuildItem from stock.models import StockLocation, StockItem @@ -275,17 +275,3 @@ class EditBuildItemForm(HelperForm): 'quantity', 'install_into', ] - - -class EditBuildAttachmentForm(HelperForm): - """ - Form for creating / editing a BuildAttachment object - """ - - class Meta: - model = BuildOrderAttachment - fields = [ - 'build', - 'attachment', - 'comment' - ] diff --git a/InvenTree/build/migrations/0029_auto_20210601_1525.py b/InvenTree/build/migrations/0029_auto_20210601_1525.py index e8b2d58947..fa6bab6b26 100644 --- a/InvenTree/build/migrations/0029_auto_20210601_1525.py +++ b/InvenTree/build/migrations/0029_auto_20210601_1525.py @@ -1,8 +1,13 @@ # Generated by Django 3.2 on 2021-06-01 05:25 +import logging + from django.db import migrations +logger = logging.getLogger('inventree') + + def assign_bom_items(apps, schema_editor): """ Run through existing BuildItem objects, @@ -13,7 +18,7 @@ def assign_bom_items(apps, schema_editor): BomItem = apps.get_model('part', 'bomitem') Part = apps.get_model('part', 'part') - print("Assigning BomItems to existing BuildItem objects") + logger.info("Assigning BomItems to existing BuildItem objects") count_valid = 0 count_total = 0 @@ -41,7 +46,7 @@ def assign_bom_items(apps, schema_editor): pass if count_total > 0: - print(f"Assigned BomItem for {count_valid}/{count_total} entries") + logger.info(f"Assigned BomItem for {count_valid}/{count_total} entries") def unassign_bom_items(apps, schema_editor): diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index fad5a2934d..848d774d1c 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -60,6 +60,10 @@ class Build(MPTTModel): responsible: User (or group) responsible for completing the build """ + @staticmethod + def get_api_url(): + return reverse('api-build-list') + OVERDUE_FILTER = Q(status__in=BuildStatus.ACTIVE_CODES) & ~Q(target_date=None) & Q(target_date__lte=datetime.now().date()) class Meta: @@ -1117,6 +1121,10 @@ class BuildItem(models.Model): quantity: Number of units allocated """ + @staticmethod + def get_api_url(): + return reverse('api-build-item-list') + def get_absolute_url(self): # TODO - Fix! return '/build/item/{pk}/'.format(pk=self.id) diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py index d8573cfa70..363614035a 100644 --- a/InvenTree/build/serializers.py +++ b/InvenTree/build/serializers.py @@ -10,13 +10,14 @@ from django.db.models import BooleanField from rest_framework import serializers -from InvenTree.serializers import InvenTreeModelSerializer +from InvenTree.serializers import InvenTreeModelSerializer, InvenTreeAttachmentSerializerField, UserSerializerBrief from stock.serializers import StockItemSerializerBrief from stock.serializers import LocationSerializer from part.serializers import PartSerializer, PartBriefSerializer +from users.serializers import OwnerSerializer -from .models import Build, BuildItem +from .models import Build, BuildItem, BuildOrderAttachment class BuildSerializer(InvenTreeModelSerializer): @@ -31,6 +32,10 @@ class BuildSerializer(InvenTreeModelSerializer): overdue = serializers.BooleanField(required=False, read_only=True) + issued_by_detail = UserSerializerBrief(source='issued_by', read_only=True) + + responsible_detail = OwnerSerializer(source='responsible', read_only=True) + @staticmethod def annotate_queryset(queryset): """ @@ -84,6 +89,10 @@ class BuildSerializer(InvenTreeModelSerializer): 'target_date', 'notes', 'link', + 'issued_by', + 'issued_by_detail', + 'responsible', + 'responsible_detail', ] read_only_fields = [ @@ -143,3 +152,26 @@ class BuildItemSerializer(InvenTreeModelSerializer): 'stock_item_detail', 'quantity' ] + + +class BuildAttachmentSerializer(InvenTreeModelSerializer): + """ + Serializer for a BuildAttachment + """ + + attachment = InvenTreeAttachmentSerializerField(required=True) + + class Meta: + model = BuildOrderAttachment + + fields = [ + 'pk', + 'build', + 'attachment', + 'comment', + 'upload_date', + ] + + read_only_fields = [ + 'upload_date', + ] diff --git a/InvenTree/build/templates/build/attachments.html b/InvenTree/build/templates/build/attachments.html index 8546ab42f5..e969756b81 100644 --- a/InvenTree/build/templates/build/attachments.html +++ b/InvenTree/build/templates/build/attachments.html @@ -22,7 +22,7 @@ enableDragAndDrop( '#attachment-dropzone', - '{% url "build-attachment-create" %}', + '{% url "api-build-attachment-list" %}', { data: { build: {{ build.id }}, @@ -36,45 +36,49 @@ enableDragAndDrop( // Callback for creating a new attachment $('#new-attachment').click(function() { - launchModalForm( - '{% url "build-attachment-create" %}', - { - reload: true, - data: { - build: {{ build.pk }}, + + constructForm('{% url "api-build-attachment-list" %}', { + fields: { + attachment: {}, + comment: {}, + build: { + value: {{ build.pk }}, + hidden: true, } - } - ); + }, + method: 'POST', + onSuccess: reloadAttachmentTable, + title: '{% trans "Add Attachment" %}', + }); }); -// Callback for editing an attachment -$("#attachment-table").on('click', '.attachment-edit-button', function() { - var pk = $(this).attr('pk'); +loadAttachmentTable( + '{% url "api-build-attachment-list" %}', + { + filters: { + build: {{ build.pk }}, + }, + onEdit: function(pk) { + var url = `/api/build/attachment/${pk}/`; - var url = `/build/attachment/${pk}/edit/`; + constructForm(url, { + fields: { + comment: {}, + }, + onSuccess: reloadAttachmentTable, + title: '{% trans "Edit Attachment" %}', + }); + }, + onDelete: function(pk) { - launchModalForm( - url, - { - reload: true, + constructForm(`/api/build/attachment/${pk}/`, { + method: 'DELETE', + confirmMessage: '{% trans "Confirm Delete Operation" %}', + title: '{% trans "Delete Attachment" %}', + onSuccess: reloadAttachmentTable, + }); } - ); -}); - -// Callback for deleting an attachment -$("#attachment-table").on('click', '.attachment-delete-button', function() { - var pk = $(this).attr('pk'); - - var url = `/build/attachment/${pk}/delete/`; - - launchModalForm( - url, - { - reload: true, - } - ); -}); - -$("#attachment-table").inventreeTable({}); + } +); {% endblock %} diff --git a/InvenTree/build/urls.py b/InvenTree/build/urls.py index 99b6b72818..549a20ee7e 100644 --- a/InvenTree/build/urls.py +++ b/InvenTree/build/urls.py @@ -36,12 +36,6 @@ build_urls = [ url('^new/', views.BuildItemCreate.as_view(), name='build-item-create'), ])), - url('^attachment/', include([ - url('^new/', views.BuildAttachmentCreate.as_view(), name='build-attachment-create'), - url(r'^(?P\d+)/edit/', views.BuildAttachmentEdit.as_view(), name='build-attachment-edit'), - url(r'^(?P\d+)/delete/', views.BuildAttachmentDelete.as_view(), name='build-attachment-delete'), - ])), - url(r'new/', views.BuildCreate.as_view(), name='build-create'), url(r'^(?P\d+)/', include(build_detail_urls)), diff --git a/InvenTree/build/views.py b/InvenTree/build/views.py index 6e72f7f3e6..16004dacc1 100644 --- a/InvenTree/build/views.py +++ b/InvenTree/build/views.py @@ -12,7 +12,7 @@ from django.forms import HiddenInput from django.urls import reverse from part.models import Part -from .models import Build, BuildItem, BuildOrderAttachment +from .models import Build, BuildItem from . import forms from stock.models import StockLocation, StockItem @@ -1058,88 +1058,3 @@ class BuildItemEdit(AjaxUpdateView): form.fields['install_into'].widget = HiddenInput() return form - - -class BuildAttachmentCreate(AjaxCreateView): - """ - View for creating a BuildAttachment - """ - - model = BuildOrderAttachment - form_class = forms.EditBuildAttachmentForm - ajax_form_title = _('Add Build Order Attachment') - - def save(self, form, **kwargs): - """ - Add information on the user that uploaded the attachment - """ - - attachment = form.save(commit=False) - attachment.user = self.request.user - attachment.save() - - def get_data(self): - return { - 'success': _('Added attachment') - } - - def get_initial(self): - """ - Get initial data for creating an attachment - """ - - initials = super().get_initial() - - try: - initials['build'] = Build.objects.get(pk=self.request.GET.get('build', -1)) - except (ValueError, Build.DoesNotExist): - pass - - return initials - - def get_form(self): - """ - Hide the 'build' field if specified - """ - - form = super().get_form() - - form.fields['build'].widget = HiddenInput() - - return form - - -class BuildAttachmentEdit(AjaxUpdateView): - """ - View for editing a BuildAttachment object - """ - - model = BuildOrderAttachment - form_class = forms.EditBuildAttachmentForm - ajax_form_title = _('Edit Attachment') - - def get_form(self): - form = super().get_form() - form.fields['build'].widget = HiddenInput() - - return form - - def get_data(self): - return { - 'success': _('Attachment updated') - } - - -class BuildAttachmentDelete(AjaxDeleteView): - """ - View for deleting a BuildAttachment - """ - - model = BuildOrderAttachment - ajax_form_title = _('Delete Attachment') - context_object_name = 'attachment' - - def get_data(self): - return { - 'danger': _('Deleted attachment') - } diff --git a/InvenTree/common/settings.py b/InvenTree/common/settings.py index e255ed0904..b34cf0b785 100644 --- a/InvenTree/common/settings.py +++ b/InvenTree/common/settings.py @@ -28,7 +28,7 @@ def currency_code_mappings(): """ Returns the current currency choices """ - return [(a, a) for a in settings.CURRENCIES] + return [(a, CURRENCIES[a].name) for a in settings.CURRENCIES] def currency_codes(): diff --git a/InvenTree/company/api.py b/InvenTree/company/api.py index 6cd1e83dfa..2c05c98d91 100644 --- a/InvenTree/company/api.py +++ b/InvenTree/company/api.py @@ -158,6 +158,7 @@ class ManufacturerPartList(generics.ListCreateAPIView): 'manufacturer__name', 'description', 'MPN', + 'part__IPN', 'part__name', 'part__description', ] @@ -355,6 +356,7 @@ class SupplierPartList(generics.ListCreateAPIView): 'manufacturer_part__manufacturer__name', 'description', 'manufacturer_part__MPN', + 'part__IPN', 'part__name', 'part__description', ] @@ -394,6 +396,15 @@ class SupplierPriceBreakList(generics.ListCreateAPIView): ] +class SupplierPriceBreakDetail(generics.RetrieveUpdateDestroyAPIView): + """ + Detail endpoint for SupplierPriceBreak object + """ + + queryset = SupplierPriceBreak.objects.all() + serializer_class = SupplierPriceBreakSerializer + + manufacturer_part_api_urls = [ url(r'^parameter/', include([ @@ -424,7 +435,12 @@ company_api_urls = [ url(r'^part/', include(supplier_part_api_urls)), - url(r'^price-break/', SupplierPriceBreakList.as_view(), name='api-part-supplier-price'), + # Supplier price breaks + url(r'^price-break/', include([ + + url(r'^(?P\d+)/?', SupplierPriceBreakDetail.as_view(), name='api-part-supplier-price-detail'), + url(r'^.*$', SupplierPriceBreakList.as_view(), name='api-part-supplier-price-list'), + ])), url(r'^(?P\d+)/?', CompanyDetail.as_view(), name='api-company-detail'), diff --git a/InvenTree/company/forms.py b/InvenTree/company/forms.py index 564b5fab53..15f380ae44 100644 --- a/InvenTree/company/forms.py +++ b/InvenTree/company/forms.py @@ -11,62 +11,12 @@ from InvenTree.fields import InvenTreeMoneyField, RoundingDecimalFormField from django.utils.translation import ugettext_lazy as _ import django.forms -import djmoney.settings - -from common.settings import currency_code_default - -from .models import Company, ManufacturerPartParameter +from .models import Company from .models import ManufacturerPart from .models import SupplierPart from .models import SupplierPriceBreak -class EditCompanyForm(HelperForm): - """ Form for editing a Company object """ - - field_prefix = { - 'website': 'fa-globe-asia', - 'email': 'fa-at', - 'address': 'fa-envelope', - 'contact': 'fa-user-tie', - 'phone': 'fa-phone', - } - - currency = django.forms.ChoiceField( - required=False, - label=_('Currency'), - help_text=_('Default currency used for this company'), - choices=[('', '----------')] + djmoney.settings.CURRENCY_CHOICES, - initial=currency_code_default, - ) - - class Meta: - model = Company - fields = [ - 'name', - 'description', - 'website', - 'address', - 'currency', - 'phone', - 'email', - 'contact', - 'is_supplier', - 'is_manufacturer', - 'is_customer', - ] - - -class CompanyImageForm(HelperForm): - """ Form for uploading a Company image """ - - class Meta: - model = Company - fields = [ - 'image' - ] - - class CompanyImageDownloadForm(HelperForm): """ Form for downloading an image from a URL @@ -104,21 +54,6 @@ class EditManufacturerPartForm(HelperForm): ] -class EditManufacturerPartParameterForm(HelperForm): - """ - Form for creating / editing a ManufacturerPartParameter object - """ - - class Meta: - model = ManufacturerPartParameter - fields = [ - 'manufacturer_part', - 'name', - 'value', - 'units', - ] - - class EditSupplierPartForm(HelperForm): """ Form for editing a SupplierPart object """ diff --git a/InvenTree/company/migrations/0026_auto_20201110_1011.py b/InvenTree/company/migrations/0026_auto_20201110_1011.py index 20ec7d2f6f..29a5099c3a 100644 --- a/InvenTree/company/migrations/0026_auto_20201110_1011.py +++ b/InvenTree/company/migrations/0026_auto_20201110_1011.py @@ -1,5 +1,6 @@ # Generated by Django 3.0.7 on 2020-11-10 10:11 +import logging import sys from moneyed import CURRENCIES @@ -7,6 +8,9 @@ from django.db import migrations, connection from company.models import SupplierPriceBreak +logger = logging.getLogger('inventree') + + def migrate_currencies(apps, schema_editor): """ Migrate from the 'old' method of handling currencies, @@ -19,7 +23,7 @@ def migrate_currencies(apps, schema_editor): for the SupplierPriceBreak model, to a new django-money compatible currency. """ - print("Updating currency references for SupplierPriceBreak model...") + logger.info("Updating currency references for SupplierPriceBreak model...") # A list of available currency codes currency_codes = CURRENCIES.keys() @@ -39,7 +43,7 @@ def migrate_currencies(apps, schema_editor): suffix = suffix.strip().upper() if suffix not in currency_codes: - print("Missing suffix:", suffix) + logger.warning(f"Missing suffix: '{suffix}'") while suffix not in currency_codes: # Ask the user to input a valid currency @@ -72,7 +76,7 @@ def migrate_currencies(apps, schema_editor): count += 1 if count > 0: - print(f"Updated {count} SupplierPriceBreak rows") + logger.info(f"Updated {count} SupplierPriceBreak rows") def reverse_currencies(apps, schema_editor): """ diff --git a/InvenTree/company/migrations/0040_alter_company_currency.py b/InvenTree/company/migrations/0040_alter_company_currency.py new file mode 100644 index 0000000000..f26f470191 --- /dev/null +++ b/InvenTree/company/migrations/0040_alter_company_currency.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.4 on 2021-07-02 13:21 + +import InvenTree.validators +import common.settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('company', '0039_auto_20210701_0509'), + ] + + operations = [ + migrations.AlterField( + model_name='company', + name='currency', + field=models.CharField(blank=True, default=common.settings.currency_code_default, help_text='Default currency used for this company', max_length=3, validators=[InvenTree.validators.validate_currency_code], verbose_name='Currency'), + ), + ] diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 093d545f78..3786531311 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -31,6 +31,7 @@ import InvenTree.validators import common.models import common.settings +from common.settings import currency_code_default def rename_company_image(instance, filename): @@ -84,6 +85,10 @@ class Company(models.Model): currency_code: Specifies the default currency for the company """ + @staticmethod + def get_api_url(): + return reverse('api-company-list') + class Meta: ordering = ['name', ] constraints = [ @@ -101,7 +106,11 @@ class Company(models.Model): blank=True, ) - website = models.URLField(blank=True, verbose_name=_('Website'), help_text=_('Company website URL')) + website = models.URLField( + blank=True, + verbose_name=_('Website'), + help_text=_('Company website URL') + ) address = models.CharField(max_length=200, verbose_name=_('Address'), @@ -141,6 +150,7 @@ class Company(models.Model): max_length=3, verbose_name=_('Currency'), blank=True, + default=currency_code_default, help_text=_('Default currency used for this company'), validators=[InvenTree.validators.validate_currency_code], ) @@ -297,6 +307,10 @@ class ManufacturerPart(models.Model): description: Descriptive notes field """ + @staticmethod + def get_api_url(): + return reverse('api-manufacturer-part-list') + class Meta: unique_together = ('part', 'manufacturer', 'MPN') @@ -380,6 +394,10 @@ class ManufacturerPartParameter(models.Model): Each parameter is a simple string (text) value. """ + @staticmethod + def get_api_url(): + return reverse('api-manufacturer-part-parameter-list') + class Meta: unique_together = ('manufacturer_part', 'name') @@ -432,6 +450,10 @@ class SupplierPart(models.Model): packaging: packaging that the part is supplied in, e.g. "Reel" """ + @staticmethod + def get_api_url(): + return reverse('api-supplier-part-list') + def get_absolute_url(self): return reverse('supplier-part-detail', kwargs={'pk': self.id}) @@ -660,6 +682,10 @@ class SupplierPriceBreak(common.models.PriceBreak): currency: Reference to the currency of this pricebreak (leave empty for base currency) """ + @staticmethod + def get_api_url(): + return reverse('api-part-supplier-price-list') + part = models.ForeignKey(SupplierPart, on_delete=models.CASCADE, related_name='pricebreaks', verbose_name=_('Part'),) class Meta: diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 1e97756987..276225624f 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -2,6 +2,8 @@ JSON serializers for Company app """ +from django.utils.translation import ugettext_lazy as _ + from rest_framework import serializers from sql_util.utils import SubqueryCount @@ -15,6 +17,8 @@ from .models import Company from .models import ManufacturerPart, ManufacturerPartParameter from .models import SupplierPart, SupplierPriceBreak +from common.settings import currency_code_default, currency_code_mappings + class CompanyBriefSerializer(InvenTreeModelSerializer): """ Serializer for Company object (limited detail) """ @@ -58,6 +62,14 @@ class CompanySerializer(InvenTreeModelSerializer): parts_supplied = serializers.IntegerField(read_only=True) parts_manufactured = serializers.IntegerField(read_only=True) + currency = serializers.ChoiceField( + choices=currency_code_mappings(), + initial=currency_code_default, + help_text=_('Default currency used for this supplier'), + label=_('Currency Code'), + required=True, + ) + class Meta: model = Company fields = [ @@ -70,6 +82,7 @@ class CompanySerializer(InvenTreeModelSerializer): 'phone', 'address', 'email', + 'currency', 'contact', 'link', 'image', @@ -167,9 +180,10 @@ class SupplierPartSerializer(InvenTreeModelSerializer): def __init__(self, *args, **kwargs): - part_detail = kwargs.pop('part_detail', False) - supplier_detail = kwargs.pop('supplier_detail', False) - manufacturer_detail = kwargs.pop('manufacturer_detail', False) + part_detail = kwargs.pop('part_detail', True) + supplier_detail = kwargs.pop('supplier_detail', True) + manufacturer_detail = kwargs.pop('manufacturer_detail', True) + prettify = kwargs.pop('pretty', False) super(SupplierPartSerializer, self).__init__(*args, **kwargs) @@ -239,6 +253,12 @@ class SupplierPriceBreakSerializer(InvenTreeModelSerializer): price = serializers.CharField() + price_currency = serializers.ChoiceField( + choices=currency_code_mappings(), + default=currency_code_default, + label=_('Currency'), + ) + class Meta: model = SupplierPriceBreak fields = [ @@ -246,4 +266,5 @@ class SupplierPriceBreakSerializer(InvenTreeModelSerializer): 'part', 'quantity', 'price', + 'price_currency', ] diff --git a/InvenTree/company/templates/company/company_base.html b/InvenTree/company/templates/company/company_base.html index a276f5df4f..8c6b077137 100644 --- a/InvenTree/company/templates/company/company_base.html +++ b/InvenTree/company/templates/company/company_base.html @@ -111,32 +111,31 @@ }); $('#company-edit').click(function() { - launchModalForm( - "{% url 'company-edit' company.id %}", - { - reload: true - }); + editCompany({{ company.id }}); }); $("#company-order-2").click(function() { - launchModalForm("{% url 'po-create' %}", - { - data: { - supplier: {{ company.id }}, - }, - follow: true, + createPurchaseOrder({ + supplier: {{ company.pk }}, }); }); - $('#company-delete').click(function() { - launchModalForm( - "{% url 'company-delete' company.id %}", - { - redirect: "{% url 'company-index' %}" - }); + constructForm('{% url "api-company-detail" company.pk %}', { + method: 'DELETE', + title: '{% trans "Delete Company" %}', + redirect: '{% url "company-index" %}', + }); }); + function reloadImage(data) { + if (data.image) { + $('#company-image').attr('src', data.image); + } else { + location.reload(); + } + } + enableDragAndDrop( "#company-thumb", "{% url 'api-company-detail' company.id %}", @@ -144,12 +143,7 @@ label: 'image', method: 'PATCH', success: function(data, status, xhr) { - - if (data.image) { - $('#company-image').attr('src', data.image); - } else { - location.reload(); - } + reloadImage(data); } } ); @@ -161,10 +155,18 @@ {% endif %} $("#company-image-upload").click(function() { - launchModalForm( - "{% url 'company-image' company.id %}", + + constructForm( + '{% url "api-company-detail" company.pk %}', { - reload: true + method: 'PATCH', + fields: { + image: {}, + }, + title: '{% trans "Upload Image" %}', + onSuccess: function(data) { + reloadImage(data); + } } ); }); diff --git a/InvenTree/company/templates/company/delete.html b/InvenTree/company/templates/company/delete.html deleted file mode 100644 index 3236a7a58d..0000000000 --- a/InvenTree/company/templates/company/delete.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "modal_delete_form.html" %} - -{% load i18n %} - -{% block pre_form_content %} - -{% blocktrans with company.name as name %}Are you sure you want to delete company '{{ name }}'?{% endblocktrans %} - -
                - -{% if company.supplied_part_count > 0 %} -

                {% blocktrans with company.supplied_part_count as count %}There are {{ count }} parts sourced from this company.
                -If this supplier is deleted, these supplier part entries will also be deleted.{% endblocktrans %}

                -
                  -{% for part in company.parts.all %} -
                • {{ part.SKU }} - {{ part.part.full_name }}
                • -{% endfor %} -
                -{% endif %} - -{% endblock %} \ No newline at end of file diff --git a/InvenTree/company/templates/company/detail_manufacturer_part.html b/InvenTree/company/templates/company/detail_manufacturer_part.html index 902d456eaf..41eb005b2f 100644 --- a/InvenTree/company/templates/company/detail_manufacturer_part.html +++ b/InvenTree/company/templates/company/detail_manufacturer_part.html @@ -25,7 +25,7 @@ {% endif %}
                @@ -57,15 +60,26 @@ {% block js_ready %} {{ block.super }} +function reloadParameters() { + $("#parameter-table").bootstrapTable("refresh"); +} + $('#parameter-create').click(function() { - launchModalForm( - "{% url 'manufacturer-part-parameter-create' %}", - { - data: { - manufacturer_part: {{ part.id }}, + + constructForm('{% url "api-manufacturer-part-parameter-list" %}', { + method: 'POST', + fields: { + name: {}, + value: {}, + units: {}, + manufacturer_part: { + value: {{ part.pk }}, + hidden: true, } - } - ); + }, + title: '{% trans "Add Parameter" %}', + onSuccess: reloadParameters + }); }); $('#supplier-create').click(function () { @@ -81,7 +95,6 @@ $('#supplier-create').click(function () { field: 'supplier', label: '{% trans "New Supplier" %}', title: '{% trans "Create new supplier" %}', - url: "{% url 'supplier-create' %}" }, ] }); @@ -105,6 +118,46 @@ $("#supplier-part-delete").click(function() { }); }); +$("#multi-parameter-delete").click(function() { + + var selections = $("#parameter-table").bootstrapTable("getSelections"); + + var text = ` +
                +

                {% trans "Selected parameters will be deleted" %}:

                + +
                `; + + showQuestionDialog( + '{% trans "Delete Parameters" %}', + text, + { + accept_text: '{% trans "Delete" %}', + accept: function() { + // Delete each parameter via the API + var requests = []; + + selections.forEach(function(item) { + var url = `/api/company/part/manufacturer/parameter/${item.pk}/`; + + requests.push(inventreeDelete(url)); + }); + + $.when.apply($, requests).then(function() { + $('#parameter-table').bootstrapTable('refresh'); + }); + } + } + ); +}); + loadSupplierPartTable( "#supplier-table", "{% url 'api-supplier-part-list' %}", @@ -130,5 +183,5 @@ loadManufacturerPartParameterTable( ); linkButtonsToSelection($("#supplier-table"), ['#supplier-part-options']) - +linkButtonsToSelection($("#parameter-table"), ['#parameter-options']) {% endblock %} \ No newline at end of file diff --git a/InvenTree/company/templates/company/purchase_orders.html b/InvenTree/company/templates/company/purchase_orders.html index 0403c8cc59..f23d360a8f 100644 --- a/InvenTree/company/templates/company/purchase_orders.html +++ b/InvenTree/company/templates/company/purchase_orders.html @@ -39,14 +39,9 @@ } }); - function newOrder() { - launchModalForm("{% url 'po-create' %}", - { - data: { - supplier: {{ company.id }}, - }, - follow: true, + createPurchaseOrder({ + supplier: {{ company.pk }}, }); } diff --git a/InvenTree/company/templates/company/sales_orders.html b/InvenTree/company/templates/company/sales_orders.html index e8585e2caa..c21a9afc21 100644 --- a/InvenTree/company/templates/company/sales_orders.html +++ b/InvenTree/company/templates/company/sales_orders.html @@ -42,15 +42,10 @@ }); $("#new-sales-order").click(function() { - launchModalForm( - "{% url 'so-create' %}", - { - data: { - customer: {{ company.id }}, - }, - follow: true, - }, - ); + + createSalesOrder({ + customer: {{ company.pk }}, + }); }); {% endblock %} \ No newline at end of file diff --git a/InvenTree/company/templates/company/supplier_part_pricing.html b/InvenTree/company/templates/company/supplier_part_pricing.html index 9da3f3df7e..a476b53a13 100644 --- a/InvenTree/company/templates/company/supplier_part_pricing.html +++ b/InvenTree/company/templates/company/supplier_part_pricing.html @@ -39,30 +39,32 @@ $('#price-break-table').inventreeTable({ queryParams: { part: {{ part.id }}, }, - url: "{% url 'api-part-supplier-price' %}", + url: "{% url 'api-part-supplier-price-list' %}", onPostBody: function() { var table = $('#price-break-table'); table.find('.button-price-break-delete').click(function() { var pk = $(this).attr('pk'); - launchModalForm( - `/price-break/${pk}/delete/`, - { - success: reloadPriceBreaks - } - ); + constructForm(`/api/company/price-break/${pk}/`, { + method: 'DELETE', + onSuccess: reloadPriceBreaks, + title: '{% trans "Delete Price Break" %}', + }); }); table.find('.button-price-break-edit').click(function() { var pk = $(this).attr('pk'); - launchModalForm( - `/price-break/${pk}/edit/`, - { - success: reloadPriceBreaks - } - ); + constructForm(`/api/company/price-break/${pk}/`, { + fields: { + quantity: {}, + price: {}, + price_currency: {}, + }, + onSuccess: reloadPriceBreaks, + title: '{% trans "Edit Price Break" %}', + }); }); }, columns: [ @@ -98,12 +100,23 @@ $('#price-break-table').inventreeTable({ }); $('#new-price-break').click(function() { - launchModalForm("{% url 'price-break-create' %}", + + constructForm( + '{% url "api-part-supplier-price-list" %}', { - reload: true, - data: { - part: {{ part.id }}, - } + method: 'POST', + fields: { + quantity: {}, + part: { + value: {{ part.pk }}, + hidden: true, + }, + price: {}, + price_currency: { + }, + }, + title: '{% trans "Add Price Break" %}', + onSuccess: reloadPriceBreaks, } ); }); diff --git a/InvenTree/company/test_api.py b/InvenTree/company/test_api.py index dd42b97801..40176c7634 100644 --- a/InvenTree/company/test_api.py +++ b/InvenTree/company/test_api.py @@ -20,7 +20,7 @@ class CompanyTest(InvenTreeAPITestCase): super().setUp() - Company.objects.create(name='ACME', description='Supplier', is_customer=False, is_supplier=True) + self.acme = Company.objects.create(name='ACME', description='Supplier', is_customer=False, is_supplier=True) Company.objects.create(name='Drippy Cup Co.', description='Customer', is_customer=True, is_supplier=False) Company.objects.create(name='Sippy Cup Emporium', description='Another supplier') @@ -44,7 +44,11 @@ class CompanyTest(InvenTreeAPITestCase): self.assertEqual(len(response.data), 2) def test_company_detail(self): - url = reverse('api-company-detail', kwargs={'pk': 1}) + """ + Tests for the Company detail endpoint + """ + + url = reverse('api-company-detail', kwargs={'pk': self.acme.pk}) response = self.get(url) self.assertEqual(response.data['name'], 'ACME') @@ -52,22 +56,93 @@ class CompanyTest(InvenTreeAPITestCase): # Change the name of the company # Note we should not have the correct permissions (yet) data = response.data - data['name'] = 'ACMOO' response = self.client.patch(url, data, format='json', expected_code=400) self.assignRole('company.change') + # Update the name and set the currency to a valid value + data['name'] = 'ACMOO' + data['currency'] = 'NZD' + response = self.client.patch(url, data, format='json', expected_code=200) self.assertEqual(response.data['name'], 'ACMOO') + self.assertEqual(response.data['currency'], 'NZD') def test_company_search(self): - # Test search functionality in company list + """ + Test search functionality in company list + """ + url = reverse('api-company-list') data = {'search': 'cup'} response = self.get(url, data) self.assertEqual(len(response.data), 2) + def test_company_create(self): + """ + Test that we can create a company via the API! + """ + + url = reverse('api-company-list') + + # Name is required + response = self.post( + url, + { + 'description': 'A description!', + }, + expected_code=400 + ) + + # Minimal example, checking default values + response = self.post( + url, + { + 'name': 'My API Company', + 'description': 'A company created via the API', + }, + expected_code=201 + ) + + self.assertTrue(response.data['is_supplier']) + self.assertFalse(response.data['is_customer']) + self.assertFalse(response.data['is_manufacturer']) + + self.assertEqual(response.data['currency'], 'USD') + + # Maximal example, specify values + response = self.post( + url, + { + 'name': "Another Company", + 'description': "Also created via the API!", + 'currency': 'AUD', + 'is_supplier': False, + 'is_manufacturer': True, + 'is_customer': True, + }, + expected_code=201 + ) + + self.assertEqual(response.data['currency'], 'AUD') + self.assertFalse(response.data['is_supplier']) + self.assertTrue(response.data['is_customer']) + self.assertTrue(response.data['is_manufacturer']) + + # Attempt to create with invalid currency + response = self.post( + url, + { + 'name': "A name", + 'description': 'A description', + 'currency': 'POQD', + }, + expected_code=400 + ) + + self.assertTrue('currency' in response.data) + class ManufacturerTest(InvenTreeAPITestCase): """ @@ -115,6 +190,9 @@ class ManufacturerTest(InvenTreeAPITestCase): self.assertEqual(len(response.data), 2) def test_manufacturer_part_detail(self): + """ + Tests for the ManufacturerPart detail endpoint + """ url = reverse('api-manufacturer-part-detail', kwargs={'pk': 1}) response = self.get(url) diff --git a/InvenTree/company/test_views.py b/InvenTree/company/test_views.py index cdb2d32af9..4c53bbb8c4 100644 --- a/InvenTree/company/test_views.py +++ b/InvenTree/company/test_views.py @@ -188,21 +188,6 @@ class CompanyViewTest(CompanyViewTestBase): response = self.client.get(reverse('company-index')) self.assertEqual(response.status_code, 200) - def test_company_create(self): - """ - Test the view for creating a company - """ - - # Check that different company types return different form titles - response = self.client.get(reverse('supplier-create'), HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertContains(response, 'Create new Supplier') - - response = self.client.get(reverse('manufacturer-create'), HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertContains(response, 'Create new Manufacturer') - - response = self.client.get(reverse('customer-create'), HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertContains(response, 'Create new Customer') - class ManufacturerPartViewTests(CompanyViewTestBase): """ @@ -274,33 +259,3 @@ class ManufacturerPartViewTests(CompanyViewTestBase): # Check that the ManufacturerPart was created! self.assertEqual(n + 1, ManufacturerPart.objects.all().count()) - - def test_manufacturer_part_delete(self): - """ - Test the ManufacturerPartDelete view - """ - - url = reverse('manufacturer-part-delete') - - # Get form using 'part' argument - response = self.client.get(url, {'part': '2'}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - - # POST to delete manufacturer part - n = ManufacturerPart.objects.count() - m = SupplierPart.objects.count() - - response = self.client.post( - url, - { - 'manufacturer-part-2': 'manufacturer-part-2', - 'confirm_delete': True - }, - HTTP_X_REQUESTED_WITH='XMLHttpRequest') - - self.assertEqual(response.status_code, 200) - - # Check that the ManufacturerPart was deleted - self.assertEqual(n - 1, ManufacturerPart.objects.count()) - # Check that the SupplierParts were deleted - self.assertEqual(m - 2, SupplierPart.objects.count()) diff --git a/InvenTree/company/urls.py b/InvenTree/company/urls.py index 51aa81f1c7..4fe0519ea9 100644 --- a/InvenTree/company/urls.py +++ b/InvenTree/company/urls.py @@ -8,9 +8,6 @@ from . import views company_detail_urls = [ - url(r'edit/?', views.CompanyEdit.as_view(), name='company-edit'), - url(r'delete/?', views.CompanyDelete.as_view(), name='company-delete'), - # url(r'orders/?', views.CompanyDetail.as_view(template_name='company/orders.html'), name='company-detail-orders'), url(r'^supplier-parts/', views.CompanyDetail.as_view(template_name='company/detail_supplier_part.html'), name='company-detail-supplier-parts'), @@ -21,7 +18,6 @@ company_detail_urls = [ url(r'^sales-orders/', views.CompanyDetail.as_view(template_name='company/sales_orders.html'), name='company-detail-sales-orders'), url(r'^notes/', views.CompanyNotes.as_view(), name='company-notes'), - url(r'^thumbnail/', views.CompanyImage.as_view(), name='company-image'), url(r'^thumb-download/', views.CompanyImageDownloadFromURL.as_view(), name='company-image-download'), # Any other URL @@ -31,11 +27,6 @@ company_detail_urls = [ company_urls = [ - url(r'new/supplier/', views.CompanyCreate.as_view(), name='supplier-create'), - url(r'new/manufacturer/', views.CompanyCreate.as_view(), name='manufacturer-create'), - url(r'new/customer/', views.CompanyCreate.as_view(), name='customer-create'), - url(r'new/?', views.CompanyCreate.as_view(), name='company-create'), - url(r'^(?P\d+)/', include(company_detail_urls)), url(r'suppliers/', views.CompanyIndex.as_view(), name='supplier-index'), @@ -46,29 +37,10 @@ company_urls = [ url(r'^.*$', views.CompanyIndex.as_view(), name='company-index'), ] -price_break_urls = [ - url('^new/', views.PriceBreakCreate.as_view(), name='price-break-create'), - - url(r'^(?P\d+)/edit/', views.PriceBreakEdit.as_view(), name='price-break-edit'), - url(r'^(?P\d+)/delete/', views.PriceBreakDelete.as_view(), name='price-break-delete'), -] - manufacturer_part_urls = [ url(r'^new/?', views.ManufacturerPartCreate.as_view(), name='manufacturer-part-create'), - url(r'^delete/', views.ManufacturerPartDelete.as_view(), name='manufacturer-part-delete'), - - # URLs for ManufacturerPartParameter views (create / edit / delete) - url(r'^parameter/', include([ - url(r'^new/', views.ManufacturerPartParameterCreate.as_view(), name='manufacturer-part-parameter-create'), - url(r'^(?P\d)/', include([ - url(r'^edit/', views.ManufacturerPartParameterEdit.as_view(), name='manufacturer-part-parameter-edit'), - url(r'^delete/', views.ManufacturerPartParameterDelete.as_view(), name='manufacturer-part-parameter-delete'), - ])), - ])), - url(r'^(?P\d+)/', include([ - url(r'^edit/?', views.ManufacturerPartEdit.as_view(), name='manufacturer-part-edit'), url(r'^suppliers/', views.ManufacturerPartDetail.as_view(template_name='company/manufacturer_part_suppliers.html'), name='manufacturer-part-suppliers'), url('^.*$', views.ManufacturerPartDetail.as_view(template_name='company/manufacturer_part_suppliers.html'), name='manufacturer-part-detail'), ])), diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py index 74a583710a..60c37a392a 100644 --- a/InvenTree/company/views.py +++ b/InvenTree/company/views.py @@ -23,18 +23,14 @@ from InvenTree.views import AjaxCreateView, AjaxUpdateView, AjaxDeleteView from InvenTree.helpers import str2bool from InvenTree.views import InvenTreeRoleMixin -from .models import Company, ManufacturerPartParameter +from .models import Company from .models import ManufacturerPart from .models import SupplierPart -from .models import SupplierPriceBreak from part.models import Part -from .forms import EditCompanyForm, EditManufacturerPartParameterForm -from .forms import CompanyImageForm from .forms import EditManufacturerPartForm from .forms import EditSupplierPartForm -from .forms import EditPriceBreakForm from .forms import CompanyImageDownloadForm import common.models @@ -63,21 +59,18 @@ class CompanyIndex(InvenTreeRoleMixin, ListView): 'title': _('Suppliers'), 'button_text': _('New Supplier'), 'filters': {'is_supplier': 'true'}, - 'create_url': reverse('supplier-create'), 'pagetype': 'suppliers', }, reverse('manufacturer-index'): { 'title': _('Manufacturers'), 'button_text': _('New Manufacturer'), 'filters': {'is_manufacturer': 'true'}, - 'create_url': reverse('manufacturer-create'), 'pagetype': 'manufacturers', }, reverse('customer-index'): { 'title': _('Customers'), 'button_text': _('New Customer'), 'filters': {'is_customer': 'true'}, - 'create_url': reverse('customer-create'), 'pagetype': 'customers', } } @@ -86,7 +79,6 @@ class CompanyIndex(InvenTreeRoleMixin, ListView): 'title': _('Companies'), 'button_text': _('New Company'), 'filters': {}, - 'create_url': reverse('company-create'), 'pagetype': 'companies' } @@ -236,103 +228,6 @@ class CompanyImageDownloadFromURL(AjaxUpdateView): ) -class CompanyImage(AjaxUpdateView): - """ View for uploading an image for the Company """ - model = Company - ajax_template_name = 'modal_form.html' - ajax_form_title = _('Update Company Image') - form_class = CompanyImageForm - permission_required = 'company.change_company' - - def get_data(self): - return { - 'success': _('Updated company image'), - } - - -class CompanyEdit(AjaxUpdateView): - """ View for editing a Company object """ - model = Company - form_class = EditCompanyForm - context_object_name = 'company' - ajax_template_name = 'modal_form.html' - ajax_form_title = _('Edit Company') - permission_required = 'company.change_company' - - def get_data(self): - return { - 'info': _('Edited company information'), - } - - -class CompanyCreate(AjaxCreateView): - """ View for creating a new Company object """ - model = Company - context_object_name = 'company' - form_class = EditCompanyForm - ajax_template_name = 'modal_form.html' - permission_required = 'company.add_company' - - def get_form_title(self): - - url = self.request.path - - if url == reverse('supplier-create'): - return _("Create new Supplier") - - if url == reverse('manufacturer-create'): - return _('Create new Manufacturer') - - if url == reverse('customer-create'): - return _('Create new Customer') - - return _('Create new Company') - - def get_initial(self): - """ Initial values for the form data """ - initials = super().get_initial().copy() - - url = self.request.path - - if url == reverse('supplier-create'): - initials['is_supplier'] = True - initials['is_customer'] = False - initials['is_manufacturer'] = False - - elif url == reverse('manufacturer-create'): - initials['is_manufacturer'] = True - initials['is_supplier'] = True - initials['is_customer'] = False - - elif url == reverse('customer-create'): - initials['is_customer'] = True - initials['is_manufacturer'] = False - initials['is_supplier'] = False - - return initials - - def get_data(self): - return { - 'success': _("Created new company"), - } - - -class CompanyDelete(AjaxDeleteView): - """ View for deleting a Company object """ - - model = Company - success_url = '/company/' - ajax_template_name = 'company/delete.html' - ajax_form_title = _('Delete Company') - context_object_name = 'company' - permission_required = 'company.delete_company' - - def get_data(self): - return { - 'danger': _('Company was deleted'), - } - - class ManufacturerPartDetail(DetailView): """ Detail view for ManufacturerPart """ model = ManufacturerPart @@ -347,16 +242,6 @@ class ManufacturerPartDetail(DetailView): return ctx -class ManufacturerPartEdit(AjaxUpdateView): - """ Update view for editing ManufacturerPart """ - - model = ManufacturerPart - context_object_name = 'part' - form_class = EditManufacturerPartForm - ajax_template_name = 'modal_form.html' - ajax_form_title = _('Edit Manufacturer Part') - - class ManufacturerPartCreate(AjaxCreateView): """ Create view for making new ManufacturerPart """ @@ -425,145 +310,6 @@ class ManufacturerPartCreate(AjaxCreateView): return initials -class ManufacturerPartDelete(AjaxDeleteView): - """ Delete view for removing a ManufacturerPart. - - ManufacturerParts can be deleted using a variety of 'selectors'. - - - ?part= -> Delete a single ManufacturerPart object - - ?parts=[] -> Delete a list of ManufacturerPart objects - - """ - - success_url = '/manufacturer/' - ajax_template_name = 'company/manufacturer_part_delete.html' - ajax_form_title = _('Delete Manufacturer Part') - - role_required = 'purchase_order.delete' - - parts = [] - - def get_context_data(self): - ctx = {} - - ctx['parts'] = self.parts - - return ctx - - def get_parts(self): - """ Determine which ManufacturerPart object(s) the user wishes to delete. - """ - - self.parts = [] - - # User passes a single ManufacturerPart ID - if 'part' in self.request.GET: - try: - self.parts.append(ManufacturerPart.objects.get(pk=self.request.GET.get('part'))) - except (ValueError, ManufacturerPart.DoesNotExist): - pass - - elif 'parts[]' in self.request.GET: - - part_id_list = self.request.GET.getlist('parts[]') - - self.parts = ManufacturerPart.objects.filter(id__in=part_id_list) - - def get(self, request, *args, **kwargs): - self.request = request - self.get_parts() - - return self.renderJsonResponse(request, form=self.get_form()) - - def post(self, request, *args, **kwargs): - """ Handle the POST action for deleting ManufacturerPart object. - """ - - self.request = request - self.parts = [] - - for item in self.request.POST: - if item.startswith('manufacturer-part-'): - pk = item.replace('manufacturer-part-', '') - - try: - self.parts.append(ManufacturerPart.objects.get(pk=pk)) - except (ValueError, ManufacturerPart.DoesNotExist): - pass - - confirm = str2bool(self.request.POST.get('confirm_delete', False)) - - data = { - 'form_valid': confirm, - } - - if confirm: - for part in self.parts: - part.delete() - - return self.renderJsonResponse(self.request, data=data, form=self.get_form()) - - -class ManufacturerPartParameterCreate(AjaxCreateView): - """ - View for creating a new ManufacturerPartParameter object - """ - - model = ManufacturerPartParameter - form_class = EditManufacturerPartParameterForm - ajax_form_title = _('Add Manufacturer Part Parameter') - - def get_form(self): - - form = super().get_form() - - # Hide the manufacturer_part field if specified - if form.initial.get('manufacturer_part', None): - form.fields['manufacturer_part'].widget = HiddenInput() - - return form - - def get_initial(self): - - initials = super().get_initial().copy() - - manufacturer_part = self.get_param('manufacturer_part') - - if manufacturer_part: - try: - initials['manufacturer_part'] = ManufacturerPartParameter.objects.get(pk=manufacturer_part) - except (ValueError, ManufacturerPartParameter.DoesNotExist): - pass - - return initials - - -class ManufacturerPartParameterEdit(AjaxUpdateView): - """ - View for editing a ManufacturerPartParameter object - """ - - model = ManufacturerPartParameter - form_class = EditManufacturerPartParameterForm - ajax_form_title = _('Edit Manufacturer Part Parameter') - - def get_form(self): - - form = super().get_form() - - form.fields['manufacturer_part'].widget = HiddenInput() - - return form - - -class ManufacturerPartParameterDelete(AjaxDeleteView): - """ - View for deleting a ManufacturerPartParameter object - """ - - model = ManufacturerPartParameter - - class SupplierPartDetail(DetailView): """ Detail view for SupplierPart """ model = SupplierPart @@ -845,88 +591,3 @@ class SupplierPartDelete(AjaxDeleteView): part.delete() return self.renderJsonResponse(self.request, data=data, form=self.get_form()) - - -class PriceBreakCreate(AjaxCreateView): - """ View for creating a supplier price break """ - - model = SupplierPriceBreak - form_class = EditPriceBreakForm - ajax_form_title = _('Add Price Break') - ajax_template_name = 'modal_form.html' - - def get_data(self): - return { - 'success': _('Added new price break') - } - - def get_part(self): - """ - Attempt to extract SupplierPart object from the supplied data. - """ - - try: - supplier_part = SupplierPart.objects.get(pk=self.request.GET.get('part')) - return supplier_part - except (ValueError, SupplierPart.DoesNotExist): - pass - - try: - supplier_part = SupplierPart.objects.get(pk=self.request.POST.get('part')) - return supplier_part - except (ValueError, SupplierPart.DoesNotExist): - pass - - return None - - def get_form(self): - - form = super(AjaxCreateView, self).get_form() - form.fields['part'].widget = HiddenInput() - - return form - - def get_initial(self): - - initials = super(AjaxCreateView, self).get_initial() - - supplier_part = self.get_part() - - initials['part'] = self.get_part() - - if supplier_part is not None: - currency_code = supplier_part.supplier.currency_code - else: - currency_code = common.settings.currency_code_default() - - # Extract the currency object associated with the code - currency = CURRENCIES.get(currency_code, None) - - if currency: - initials['price'] = [1.0, currency] - - return initials - - -class PriceBreakEdit(AjaxUpdateView): - """ View for editing a supplier price break """ - - model = SupplierPriceBreak - form_class = EditPriceBreakForm - ajax_form_title = _('Edit Price Break') - ajax_template_name = 'modal_form.html' - - def get_form(self): - - form = super(AjaxUpdateView, self).get_form() - form.fields['part'].widget = HiddenInput() - - return form - - -class PriceBreakDelete(AjaxDeleteView): - """ View for deleting a supplier price break """ - - model = SupplierPriceBreak - ajax_form_title = _("Delete Price Break") - ajax_template_name = 'modal_delete_form.html' diff --git a/InvenTree/label/models.py b/InvenTree/label/models.py index a5d8314193..8a6684d7e3 100644 --- a/InvenTree/label/models.py +++ b/InvenTree/label/models.py @@ -12,6 +12,7 @@ import datetime from django.conf import settings from django.db import models +from django.urls import reverse from django.core.validators import FileExtensionValidator, MinValueValidator from django.core.exceptions import ValidationError, FieldError @@ -237,6 +238,10 @@ class StockItemLabel(LabelTemplate): Template for printing StockItem labels """ + @staticmethod + def get_api_url(): + return reverse('api-stockitem-label-list') + SUBDIR = "stockitem" filters = models.CharField( @@ -290,6 +295,10 @@ class StockLocationLabel(LabelTemplate): Template for printing StockLocation labels """ + @staticmethod + def get_api_url(): + return reverse('api-stocklocation-label-list') + SUBDIR = "stocklocation" filters = models.CharField( diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po index 3ce90dc928..6d43eccbe6 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-24 21:40\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: German\n" "Language: de_DE\n" @@ -29,14 +29,14 @@ msgstr "Keine Aktion angegeben" msgid "No matching action found" msgstr "Keine passende Aktion gefunden" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "Datum eingeben" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "Bestätigen" @@ -72,123 +72,131 @@ msgstr "Thema anwenden" msgid "Select Category" msgstr "Kategorie auswählen" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "Doppelte Seriennummer: {n}" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "Keine gültige Menge" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "Keine Seriennummer angegeben" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "Ungültige Gruppe: {g}" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "Doppelte Seriennummer: {g}" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "Keine Seriennummern gefunden" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format 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:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "Anhang" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "Datei zum Anhängen auswählen" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "Kommentar" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "Datei-Kommentar" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "Benutzer" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "Hochladedatum" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "Name" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "Beschreibung" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "Beschreibung (optional)" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "Eltern" -#: InvenTree/settings.py:503 +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" +msgstr "" + +#: InvenTree/settings.py:505 msgid "English" msgstr "Englisch" -#: InvenTree/settings.py:504 +#: InvenTree/settings.py:506 msgid "French" msgstr "Französisch" -#: InvenTree/settings.py:505 +#: InvenTree/settings.py:507 msgid "German" msgstr "Deutsch" -#: InvenTree/settings.py:506 +#: InvenTree/settings.py:508 msgid "Polish" msgstr "Polnisch" -#: InvenTree/settings.py:507 +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "Türkisch" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "geplantes Bestelldatum" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "Zieldatum" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "Anzahl" @@ -501,7 +507,7 @@ msgstr "Anzahl der zu bauenden Teile" msgid "Enter quantity for build output" msgstr "Menge der Endprodukte angeben" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "Seriennummer" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "Bauauftrag als vollständig markieren" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "Lagerort" @@ -544,13 +550,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "Status" @@ -582,60 +588,60 @@ msgstr "Bauabbruch bestätigen" msgid "Select quantity of stock to allocate" msgstr "Menge der BestandsObjekte für Zuordnung auswählen" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "Bauauftrag" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "Bauaufträge" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "Bauauftragsreferenz" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "Referenz" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "Kurze Beschreibung des Baus" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "Eltern-Bauauftrag" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "Teil" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "Teil für den Bauauftrag wählen" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "Auftrag Referenz" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "Bestellung, die diesem Bauauftrag zugewiesen ist" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "Quell-Lagerort" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "Entnahme-Lagerort für diesen Bauauftrag wählen (oder leer lassen für einen beliebigen Lagerort)" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "Ziel-Lagerort" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "Lagerort an dem fertige Objekte gelagert werden auswählen" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "Bau-Anzahl" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "Anzahl der zu bauenden BestandsObjekt" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "Fertiggestellte Teile" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "Anzahl der fertigen BestandsObjekte" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "Bauauftrags-Status" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "Bau-Statuscode" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "Losnummer" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "Losnummer für dieses Endprodukt" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "Erstelldatum" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "geplantes Fertigstellungsdatum" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "Fertigstellungsdatum" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "Fertiggestellt von" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "Aufgegeben von" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "Verantwortlicher Benutzer" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "Nutzer der für diesen Bauauftrag zuständig ist" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "Externer Link" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 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:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "Notizen" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "Extranotizen für den Bauauftrag" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "kein Endprodukt angegeben" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "Endprodukt bereits hergstellt" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "Endprodukt stimmt nicht mit dem Bauauftrag überein" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "Bauauftrags-Objekt muss für Bauauftrag, Lager-Objekt und installiert_in eindeutig sein" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "Bauauftragsposition muss ein Endprodukt festlegen, da der übergeordnete Teil verfolgbar ist" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format 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:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "Zu viele BestandsObjekt zugewiesen" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "Reserviermenge muss größer null sein" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "Ausgewähltes BestandsObjekt nicht Stückliste für Teil '{p}' gefunden" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "Bauauftrag" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "Bauauftrag starten um Teile zuzuweisen" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "BestandsObjekt" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "Quell-BestandsObjekt" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "BestandsObjekt-Anzahl dem Bauauftrag zuweisen" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "Installiere in" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "Ziel-BestandsObjekt" @@ -879,7 +885,7 @@ msgstr "Lagerbestand Bauauftrag zuweisen" msgid "Auto Allocate" msgstr "Automatisch zuweisen" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "Bestandszuordnung aufheben" @@ -893,8 +899,8 @@ msgstr "Benötigte Teile bestellen" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "Teile bestellen" @@ -912,23 +918,52 @@ msgstr "Dieser Bauauftrag hat keine zugeordneten Stücklisten-Einträge" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "Seriennummer" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "Anhänge" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "Anhang hinzufügen" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "Anhang bearbeiten" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "Anhang löschen" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "Lagerbestand automatisch zuweisen" @@ -977,7 +1012,7 @@ msgstr "Lagerbestand wurde Bauauftrag noch nicht vollständig zugewiesen" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "Admin" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "Überfällig" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "Fortschritt" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "Auftrag" @@ -1183,10 +1218,10 @@ msgstr "Ausgangs-Lager" msgid "Stock can be taken from any available location." msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden." -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "Ziel-Lager" @@ -1196,14 +1231,14 @@ msgstr "Ziel-Lagerort nicht angegeben" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Losnummer" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "Erstellt" @@ -1211,7 +1246,7 @@ msgstr "Erstellt" msgid "No target date set" msgstr "Kein Ziel-Datum gesetzt" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "Fertig" @@ -1250,8 +1285,8 @@ msgstr "Bauauftrag-details" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "Details" @@ -1287,7 +1322,6 @@ msgstr "Bermerkungen bearbeiten" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Speichern" @@ -1316,7 +1350,7 @@ msgstr "Endprodukt anlegen" msgid "Maximum output quantity is " msgstr "Maximale Endproduktmenge ist " -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "Seriennummern existieren bereits" @@ -1332,7 +1366,7 @@ msgstr "Endprodukt entfernen" msgid "Confirm unallocation of build stock" msgstr "Entfernung von Bestands-Zuordnung bestätigen" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "Bestätigungsbox bestätigen" @@ -1412,8 +1446,8 @@ msgstr "Teil muss aktuell im Bestand sein" msgid "Stock item is over-allocated" msgstr "BestandObjekt ist zu oft zugewiesen" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "Verfügbar" @@ -1429,60 +1463,35 @@ msgstr "Bestandszuordnung bearbeiten" msgid "Updated Build Item" msgstr "Bauobjekt aktualisiert" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "Bauauftrags-Anhang hinzufügen" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "Anhang hinzugefügt" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "Anhang bearbeiten" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "Anhang aktualisiert" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "Anhang löschen" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "Anhang gelöscht" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "Dateiformat nicht unterstützt: {ext.upper()}" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "Fehler beim Lesen der Datei (ungültiges Format)" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "Fehler beim Lesen der Datei (falsche Größe)" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "Fehler beim Lesen der Datei (Daten könnten beschädigt sein)" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "Datei" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "Datei zum Hochladen auswählen" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "{name.title()} Datei" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "{name} Datei zum Hochladen auswählen" @@ -1503,7 +1512,7 @@ msgstr "Name der Instanz verwenden" msgid "Use the instance name in the title-bar" msgstr "Den Namen der Instanz in der Titelleiste verwenden" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "Firmenname" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "Basis-URL für dieses Instanz" #: common/models.py:85 +msgid "Default Currency" +msgstr "" + +#: common/models.py:86 +msgid "Default currency" +msgstr "" + +#: common/models.py:92 msgid "Download from URL" msgstr "Von URL herunterladen" -#: common/models.py:86 +#: common/models.py:93 msgid "Allow download of remote images and files from external URL" msgstr "Herunterladen von externen Bildern und Dateien von URLs erlaubt" -#: common/models.py:92 +#: common/models.py:99 msgid "Barcode Support" msgstr "Bacode-Feature verwenden" -#: common/models.py:93 +#: common/models.py:100 msgid "Enable barcode scanner support" msgstr "Barcode-Scanner Unterstützung" -#: common/models.py:99 +#: common/models.py:106 msgid "IPN Regex" msgstr "IPN Regex" -#: common/models.py:100 +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "RegEx Muster für die Zuordnung von Teil-IPN" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "Mehrere Artikel mit gleicher IPN erlaubt" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "Mehrere Artikel mit gleicher IPN erlaubt" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "Ändern von IPN erlaubt" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "Ändern der IPN während des Bearbeiten eines Teils erlaubt" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "Teil-Stückliste kopieren" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "Stückliste von Teil kopieren wenn das Teil dupliziert wird " -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "Teil-Parameter kopieren" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "Parameter-Daten für dieses Teil kopieren wenn das Teil dupliziert wird" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "Teil-Testdaten kopieren" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "Test-Daten für dieses Teil kopieren wenn das Teil dupliziert wird" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "Kategorie-Parametervorlage kopieren" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "Kategorie-Parameter Vorlagen kopieren wenn ein Teil angelegt wird" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "Aktuelle Teile-Stände" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "Anzahl der neusten Teile auf der Startseite" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "Vorlage" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "Teile sind standardmäßig Vorlagen" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "Baugruppe" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "Teile können standardmäßig aus anderen Teilen angefertigt werden" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "Komponente" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "Teile können standardmäßig in Baugruppen benutzt werden" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "Kaufbar" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "Artikel sind grundsätzlich kaufbar" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "Verkäuflich" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "Artikel sind grundsätzlich verkaufbar" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "Nachverfolgbar" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "Artikel sind grundsätzlich verfolgbar" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "Virtuell" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "Teile sind grundsätzlich virtuell" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "zeige Bestand in Eingabemasken" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "Zeige den verfügbaren Bestand in einigen Eingabemasken" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 +msgid "Display part price in some forms" +msgstr "" + +#: common/models.py:230 +msgid "Show related parts" +msgstr "" + +#: common/models.py:231 +msgid "Display related parts for a part" +msgstr "" + +#: common/models.py:237 +msgid "Internal Prices" +msgstr "" + +#: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 msgid "Use the internal price (if set) in BOM-price calculations" msgstr "" -#: common/models.py:230 templates/stats.html:25 +#: common/models.py:251 templates/stats.html:25 msgid "Debug Mode" msgstr "Entwickler-Modus" -#: common/models.py:231 +#: common/models.py:252 msgid "Generate reports in debug mode (HTML output)" msgstr "Berichte im Entwickler-Modus generieren (als HTML)" -#: common/models.py:237 +#: common/models.py:258 msgid "Page Size" msgstr "Seitengröße" -#: common/models.py:238 +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "Standardseitenformat für PDF-Bericht" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "Test-Berichte" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "Erstellung von Test-Berichten aktivieren" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "Bestands-Ablauf" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "Ablaufen von Bestand ermöglichen" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "Abgelaufenen Bestand verkaufen" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "Verkauf von abgelaufenem Bestand erlaubt" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "Bestands-Stehzeit" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "Anzahl an Tagen, an denen Bestand als abgestanden markiert wird, bevor sie ablaufen" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "Tage" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "Abgelaufenen Bestand verbauen" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "Verbauen von abgelaufenen Bestand erlaubt" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "Bestands-Eigentümerkontrolle" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "Eigentümerkontrolle für Lagerorte und Teile aktivieren" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "Gruppieren nach Teil" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "Bestand in Tabellen anhand von Teil-Referenz gruppieren" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "aktueller Bestand" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "Anzahl des geänderten Bestands auf der Startseite" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "Bauauftrag-Referenz Präfix" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "Präfix für Bauauftrag-Referenz" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "Bauauftrag-Referenz RegEx" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "RegEx Muster für die Zuordnung von Bauauftrag-Referenzen" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "Auftrags-Referenz Präfix" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "Präfix für Auftrags-Referenz" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "Bestellungs-Referenz Präfix" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "Präfix für Bestellungs-Referenz" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "Einstellungs-Schlüssel (muss einzigartig sein, Groß-/ Kleinschreibung wird nicht beachtet)" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "Einstellungs-Wert" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "Nur Ganzzahl eingeben" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "Wahrheitswert erforderlich" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "Nur Ganzzahl eingeben" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "Schlüsseltext muss eindeutig sein" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "Preisstaffelungs Anzahl" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "Preis" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "Stückpreis für die angegebene Anzahl" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "Standard" @@ -1856,27 +1888,30 @@ msgstr "Standard" msgid "Current value" msgstr "Aktueller Wert" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "Einstellungen ändern" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "Angegebener Wert nicht erlaubt" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "Angegebener Wert muss ein Wahrheitswert sein" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "Datei hochgeladen" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "Übereinstimmende Felder" @@ -1884,282 +1919,303 @@ msgstr "Übereinstimmende Felder" msgid "Match Items" msgstr "Positionen zuordnen" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "Felder zuteilen fehlgeschlagen" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" -msgstr "Währung" +#: common/views.py:586 +msgid "Parts imported" +msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" -msgstr "Standard-Währung für diese Firma" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" +msgstr "Vorheriger Schritt" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "URL" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "Bild-URL" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "Einzelpreis" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "Preis für eine Einheit" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "Hersteller auswählen" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "Hersteller-Teilenummer" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "MPN" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "Firmenbeschreibung" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "Firmenbeschreibung" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "Website" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "Firmenwebsite Adresse/URL" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "Adresse" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "Firmenadresse" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "Kontakt-Tel." -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "Kontakt-Telefon" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "Email" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "Kontakt-Email" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "Kontakt" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "Anlaufstelle" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "Link" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "Link auf externe Firmeninformation" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "Bild" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "ist Kunde" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "Verkaufen Sie Teile an diese Firma?" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "ist Zulieferer" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "Kaufen Sie Teile von dieser Firma?" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "ist Hersteller" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "Produziert diese Firma Teile?" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "Währung" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "Standard-Währung für diese Firma" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "Basisteil" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "Teil auswählen" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "Hersteller" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "Externe URL für das Herstellerteil" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "Teilbeschreibung des Herstellers" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "Herstellerteil" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "Wert" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "Einheiten" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "Zulieferer" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "Zulieferer auswählen" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "SKU (Lagerbestandseinheit)" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "Lagerbestandseinheit (SKU) des Zulieferers" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "Herstellerteil auswählen" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "Teil-URL des Zulieferers" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "Zuliefererbeschreibung des Teils" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "Notiz" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "Basiskosten" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "Mindestpreis" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "Verpackungen" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "Teile-Verpackungen" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "Vielfache" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "Mehrere bestellen" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "Zugeordneter Bestand" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "Firma" @@ -2173,7 +2229,7 @@ msgstr "Neues Bild hochladen" msgid "Download image from URL" msgstr "Bild von URL herunterladen" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "Bestellung anlegen" @@ -2181,7 +2237,8 @@ msgstr "Bestellung anlegen" msgid "Edit company information" msgstr "Firmeninformation bearbeiten" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "Firma löschen" @@ -2195,17 +2252,10 @@ msgstr "Firmendetails" msgid "Phone" msgstr "Telefon" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "Sind Sie sicher, dass Sie die Firma '%(name)s' löschen wollen?" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." -msgstr "Es gibt %(count)s Teile, die von diesem Unternehmen bezogen werden.
                \n" -"Wenn dieser Lieferant gelöscht wird, werden auch diese Zulieferer-Teile gelöscht." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" +msgstr "" #: company/templates/company/detail.html:21 msgid "Company Name" @@ -2219,11 +2269,11 @@ msgstr "Keine Website angegeben" msgid "Uses default currency" msgstr "verwendet Standard-Währung" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "Kunde" @@ -2244,7 +2294,8 @@ msgstr "Neues Herstellerteil" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2252,7 +2303,7 @@ msgstr "Optionen" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "Teile bestellen" @@ -2266,26 +2317,25 @@ msgstr "Teile löschen" msgid "Delete Parts" msgstr "Teile löschen" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "Neues Teil" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "Neues Teil hinzufügen" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "Neuer Hersteller" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "Neuen Hersteller anlegen" @@ -2295,8 +2345,8 @@ msgstr "Zulieferer-Bestand" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "Exportieren" @@ -2308,26 +2358,24 @@ msgstr "Zuliefererteile" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "Neues Zuliefererteil" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "Neuer Zulieferer" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "Neuen Zulieferer anlegen" @@ -2362,20 +2410,19 @@ msgstr "Herstellerteil-Details" msgid "Internal Part" msgstr "Internes Teil" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" -msgstr "Sind Sie sicher, dass sie die folgenden Herstellerteile löschen möchten?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" +msgstr "Herstellerteil ändern" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" -msgstr "Für dieses Herstellerteil sind %(count)s Lieferanten definiert. Wenn Sie es löschen, werden die folgenden Lieferantenteile ebenfalls gelöscht:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" +msgstr "Herstellerteil löschen" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "Zulieferer" @@ -2386,7 +2433,7 @@ msgstr "Herstellerteil-Bestand" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2412,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "Zuliefererteil entfernen" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "Löschen" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "Parameter" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "Neuer Parameter" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "Neuen Zulieferer anlegen" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2447,14 +2512,14 @@ msgstr "Hergestellte Teile" msgid "Supplied Parts" msgstr "Zuliefererteile" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "Teilbestand" @@ -2464,11 +2529,11 @@ msgstr "Teilbestand" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "Aufträge" @@ -2476,11 +2541,11 @@ msgstr "Aufträge" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "Bestellungen" @@ -2509,8 +2574,9 @@ 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:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "Zuliefererteil" @@ -2555,459 +2621,401 @@ msgid "Order Part" msgstr "Teil bestellen" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "Preisinformationen ansehen" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "Preisstaffel hinzufügen" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "Keine Informationen zur Preisstaffel gefunden" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "Preisstaffel löschen" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "Preisstaffel bearbeiten" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "Preisstaffel bearbeiten" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "Preisstaffel löschen" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "Hersteller" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "Kunden" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "Neuer Kunde" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "Firmen" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "Neue Firma" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "Bild herunterladen" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "Bildgröße überschreitet maximal-erlaubte Größe für Downloads" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "Ungültige Antwort {code}" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "Angegebene URL ist kein gültiges Bild" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "Firmenbild aktualisieren" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "Aktualisiertes Firmenbild" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "Firma bearbeiten" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "Firmeninformation bearbeitet" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "Neuen Kunden anlegen" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "Neue Firma anlegen" - -#: company/views.py:316 -msgid "Created new company" -msgstr "Neue Firma angelegt" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "Firma gelöscht" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "Herstellerteil ändern" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "Neues Herstellerteil anlegen" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "Herstellerteil löschen" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "Zuliefererteil bearbeiten" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "Neues Zuliefererteil anlegen" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "Zuliefererteil entfernen" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "neue Preisstaffel hinzufügt" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "Preisstaffel bearbeiten" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "Preisstaffel löschen" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "Keine korrekten Objekte für Vorlage gegeben" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "Label Name" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "Label Beschreibung" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "Label" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "Label-Vorlage-Datei" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "Aktiviert" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "Label-Vorlage ist aktiviert" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "Breite [mm]" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "Label-Breite in mm" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "Höhe [mm]" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "Label-Höhe in mm" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "Dateinamen-Muster" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "Muster für die Erstellung von Label-Dateinamen" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "Filter" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "Bestellung aufgeben" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "Bestellung als vollständig markieren" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "Bestellung stornieren" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "Bestellung versenden" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "Teile in diesen Lagerort empfangen" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "Bestellungs-Referenz" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "Zieldatum für Auftrags-Lieferung." - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "Auftrag-Nummer eingeben" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "Zieldatum für Auftrags-Fertigstellung." - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "Seriennummern für BestandsObjekt eingeben" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "Menge der BestandsObjekt eingeben" -#: order/models.py:102 -msgid "Order reference" -msgstr "Bestell-Referenz" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "Bestellungs-Beschreibung" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "Link auf externe Seite" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "Erstellt von" -#: order/models.py:121 +#: order/models.py:171 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:126 +#: order/models.py:176 msgid "Order notes" msgstr "Bestell-Notizen" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "Bestell-Referenz" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "Bestellungs-Status" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "Firma bei der die Teile bestellt werden" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "Zulieferer-Referenz" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "Zulieferer Bestellreferenz" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "Empfangen von" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "Aufgabedatum" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "Datum an dem die Bestellung aufgegeben wurde" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "Ziel-Versanddatum" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "Geplantes Lieferdatum für Auftrag." -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "Datum an dem der Auftrag fertigstellt wurde" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "Anzahl muss größer Null sein" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "Teile-Zulieferer muss dem Zulieferer der Bestellung entsprechen" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "Nur Teile aufgegebener Bestllungen können empfangen werden" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "Anzahl muss eine Ganzzahl sein" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "Anzahl muss eine positive Zahl sein" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "Firma an die die Teile verkauft werden" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "Kundenreferenz" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "Bestellreferenz" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "Zieldatum für Auftrags-Fertigstellung." + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "Versanddatum" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "Versand von" -#: order/models.py:530 +#: order/models.py:606 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:617 +#: order/models.py:703 msgid "Item quantity" msgstr "Anzahl" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "Position - Referenz" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "Position - Notizen" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "Bestellung" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "Bestellung" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "Zuliefererteil" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "Empfangen" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "Empfangene Objekt-Anzahl" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "Preis" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "Preis pro Einheit" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "Wo möchte der Käufer diesen Artikel gelagert haben?" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "Verkaufspreis" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "Stückverkaufspreis" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "BestandsObjekt wurde nicht zugewiesen" -#: order/models.py:806 +#: order/models.py:906 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:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "Kann BestandsObjekt keiner Zeile ohne Teil hinzufügen" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "Die zugeordnete Anzahl darf nicht die verfügbare Anzahl überschreiten" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "Anzahl für BestandsObjekt mit Seriennummer muss 1 sein" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "Position" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "Position" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "BestandsObjekt für Zuordnung auswählen" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "Anzahl für Bestandszuordnung eingeben" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3052,16 +3060,22 @@ msgstr "Bestellstatus" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "Bestellung bearbeiten" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "Neuer Lagerort" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "Neuen Lagerort anlegen" @@ -3092,57 +3106,71 @@ msgstr "Notizen zur Bestellung" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "Es fehlt eine Auswahl für die folgende benötigte Spalte" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "Doppelte Auswahlen gefunden, siehe unten. Reparieren und erneut versuchen." -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "Vorheriger Schritt" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "Auswahl übertragen" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "Datei-Felder" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "Spalte entfernen" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "Auswahl duplizieren" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "Zeile entfernen" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "Fehler in den übermittelten Daten" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "Zeile" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "Zulieferer-Teil auswählen" @@ -3151,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "Datei zur Bestellung hochladen" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "Schritt %(step)s von %(count)s" @@ -3198,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "Bestellungen auswählen oder anlegen." #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "Positionen" @@ -3222,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "Bestellungs-Anhänge" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "Sind Sie sicher, dass Sie diese Position löschen möchten?" @@ -3240,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "Bestellungs-Positionen" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "Position hinzufügen" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "Position bearbeiten" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "Position löschen" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "Keine Positionen gefunden" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "Summe" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "Stück-Preis" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "Gesamtpreis" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "Position bearbeiten" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "Position löschen" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "Position empfangen" @@ -3288,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "Ausstehende Teile für %(order)s - %(desc)s empfangen" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "Teile" @@ -3338,10 +3379,14 @@ msgstr "Packliste" msgid "Sales Order Details" msgstr "Auftragsdetails" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "Kundenreferenz" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "Auftrag bearbeiten" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3357,69 +3402,69 @@ msgstr "Abbruch dieser Bestellung bedeutet, dass sie nicht länger bearbeitbar i msgid "Sales Order Items" msgstr "Auftrags-Positionen" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "Aktionen" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "Bestands-Zuordnung bearbeiten" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "Bestands-Zuordnung löschen" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "Keine passenden Positionen gefunden" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "ID" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "Zugeordnet" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "Erledigt" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "PO" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "Seriennummern zuweisen" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "Lagerbestand zuweisen" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "Lagerbestand kaufen" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "Lagerbestand bauen" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "Preis berechnen" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "Position löschen " -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "Stückpreis aktualisieren" @@ -3460,195 +3505,155 @@ msgstr "Diese Aktion wird die folgenden BestandsObjekt vom Auftrag entfernen" msgid "Sales Order Attachments" msgstr "Auftrags-Anhänge" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "Bestellungs-Anhang hinzufügen" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "Auftrags-Anhang hinzufügen" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "Auftrag anlegen" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "Bestellung bearbeiten" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "Auftrag bearbeiten" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "Bestellung stornieren" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "Bestellstornierung bestätigen" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "Bestellung kann nicht verworfen werden" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "Auftrag stornieren" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "Bestellung aufgeben" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "Bestellungstätigung bestätigen" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "Bestellung plaziert" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "Auftrag fertigstellen" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "Fertigstellung bestätigen" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "Bestellung als vollständig markieren" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "Versenden" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "Versand bestätigen" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "Versand fehlgeschlagen" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "Zuliefererteile zuordnen" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "Teile empfangen" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "Anzahl empfangener Positionen" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "Kein Ziel gesetzt" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "Fehler beim Konvertieren zu Zahl" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "Anzahl kleiner null empfangen" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "Keine Zeilen angegeben" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "{n} Teile bestellt" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "Zuliefererteil muss ausgewählt werden" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "Zulieferer muss zu Teil und Bestellung passen" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "Position bearbeiten" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "Position löschen" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "Position gelöscht" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "Seriennummern zuweisen" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "{n} Positionen zugeordnet" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "Position auswählen" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "Kein passends Teil für Seriennummer {serial} gefunden" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "{serial} ist nicht auf Lager" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "{serial} bereits einem Auftrag zugeordnet" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "Lagerbestand dem Auftrag zuweisen" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "Zuordnung bearbeiten" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "Zuordnung entfernen" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "Auftrag nicht gefunden" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "Preis nicht gefunden" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "Stückpreis für {part} auf {price} aktualisiert" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "{part} Stückpreis auf {price} und Menge auf {qty} aktualisiert" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "Standard-Lagerort" @@ -3669,143 +3674,143 @@ msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)" msgid "Error reading BOM file (incorrect row size)" msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "Dateiformat" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "Ausgabe-Dateiformat auswählen" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "Kaskadierend" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "Kaskadierende Stückliste herunterladen" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "Ebenen" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "Maximale Anzahl an Ebenen für Stückliste-Export auswählen (0 = alle Ebenen)" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "Parameter-Daten einschließen" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "Teil-Parameter in Stückliste-Export einschließen" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "Bestand einschließen" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "Teil-Bestand in Stückliste-Export einschließen" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "Herstellerdaten einschließen" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "Teil-Herstellerdaten in Stückliste-Export einschließen" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "Zulieferer einschließen" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "Zulieferer-Daten in Stückliste-Export einschließen" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "Ausgangsteil" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "Teil für Stücklisten-Kopie auswählen" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "Stücklisten-Position(en) löschen" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "Kopie von Stückliste bestätigen" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "kontrollieren" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "Bestätigen, dass die Stückliste korrekt ist" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "Stücklisten-Datei" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "Stücklisten-Datei zum Upload auswählen" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "verknüpftes Teil" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "Teil-Kategorie wählen" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "Stückliste für dieses Teil kopieren" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "Stückliste kopieren" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "Alle Parameter-Daten für dieses Teil kopieren" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "Parameter kopieren" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "Erstellen des Teils bestätigen" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "Kategorie Parameter-Vorlage einschließen" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "Über-Kategorie Parameter-Vorlage einschließen" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "Parameter-Vorlage zu Kategorien dieser Ebene hinzufügen" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "Parameter-Vorlage zu allen Kategorien hinzufügen" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "Untergeordnetes Teil" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "Menge für die Preisberechnung" @@ -3821,362 +3826,362 @@ msgstr "Standard Stichwörter" msgid "Default keywords for parts in this category" msgstr "Standard-Stichworte für Teile dieser Kategorie" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "Teil-Kategorie" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "Teil-Kategorien" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "Teil '{p1}' wird in Stückliste für Teil '{p2}' benutzt (rekursiv)" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "Nächste verfügbare Seriennummern wären" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "Nächste verfügbare Seriennummer ist" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "Die neuste Seriennummer ist" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "Doppelte IPN in den Teil-Einstellungen nicht erlaubt" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "Name des Teils" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "Ist eine Vorlage" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "Ist dieses Teil eine Vorlage?" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "Ist dieses Teil eine Variante eines anderen Teils?" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "Variante von" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "Beschreibung des Teils" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "Schlüsselwörter" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "Schlüsselworte um die Sichtbarkeit in Suchergebnissen zu verbessern" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "Kategorie" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "Teile-Kategorie" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "IPN (Interne Produktnummer)" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "Interne Teilenummer" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "Revisions- oder Versionsnummer" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "Revision" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "Standard Zulieferer" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "Standard Zuliefererteil" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "Standard Ablaufzeit" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "Ablauf-Zeit (in Tagen) für Lagerbestand dieses Teils" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "Minimaler Lagerbestand" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "Minimal zulässiger Lagerbestand" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "Stock Keeping Units (SKU) für dieses Teil" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "Kann dieses Teil aus anderen Teilen angefertigt werden?" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "Kann dieses Teil zum Bauauftrag von anderen genutzt werden?" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "Hat dieses Teil Tracking für einzelne Objekte?" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "Kann dieses Teil von externen Zulieferern gekauft werden?" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "Kann dieses Teil an Kunden verkauft werden?" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "Aktiv" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "Ist dieses Teil aktiv?" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "Ist dieses Teil virtuell, wie zum Beispiel eine Software oder Lizenz?" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "Bemerkungen - unterstüzt Markdown-Formatierung" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "Prüfsumme der Stückliste" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "Prüfsumme der Stückliste gespeichert" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "Stückliste kontrolliert von" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "BOM Kontrolldatum" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "Erstellungs-Nutzer" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "Mehrere verkaufen" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "Test-Vorlagen können nur für verfolgbare Teile angelegt werden" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "Ein Test mit diesem Namen besteht bereits für dieses Teil" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "Test-Name" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "Namen für diesen Test eingeben" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "Test-Beschreibung" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "Beschreibung für diesen Test eingeben" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "Benötigt" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "Muss dieser Test erfolgreich sein?" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "Erfordert Wert" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "Muss für diesen Test ein Wert für das Test-Ergebnis eingetragen werden?" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "Anhang muss eingegeben werden" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "Muss für diesen Test ein Anhang für das Test-Ergebnis hinzugefügt werden?" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "Vorlagen-Name des Parameters muss eindeutig sein" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "Name des Parameters" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "Einheit des Parameters" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "Parameter Vorlage" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "Wert" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "Parameter Wert" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "Standard-Wert" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "Standard Parameter Wert" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "Ausgangsteil auswählen" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "Teil für die Nutzung in der Stückliste auswählen" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "Optional" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "Diese Stücklisten-Position ist optional" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "Überschuss" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "Geschätzter Ausschuss (absolut oder prozentual)" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "Referenz der Postion auf der Stückliste" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "Notizen zur Stücklisten-Position" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "Prüfsumme" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "Prüfsumme der Stückliste" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "Geerbt" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "Diese Stücklisten-Position wird in die Stücklisten von Teil-Varianten vererbt" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "Varianten zulassen" -#: part/models.py:2318 +#: part/models.py:2355 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:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "Menge muss eine Ganzzahl sein" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "Zuliefererteil muss festgelegt sein" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "Stücklisten-Position" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "Teil 1" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "Teil 2" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "verknüpftes Teil auswählen" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "Fehler bei Verwandschaft: Ist das Teil mit sich selbst verwandt oder ist das die Verwandtschaft nicht eindeutig?" @@ -4192,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "Anhänge" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "Sind Sie sicher, dass Sie diese Stücklisten-Position löschen wollen?" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "Die Löschung dieses Eintrags wird das Stücklisten-Position vom folgenden Teil entfernen" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "Stückliste" @@ -4248,7 +4245,7 @@ msgstr "Stückliste bearbeiten" msgid "Validate Bill of Materials" msgstr "Stückliste kontrollieren" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "Stückliste exportieren" @@ -4264,8 +4261,8 @@ msgstr "Ausgewählte Stücklistenpositionen löschen?" 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:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "Neues Teil anlegen" @@ -4301,7 +4298,7 @@ msgid "Select Part" msgstr "Teil auswählen" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "Neues Teil anlegen" @@ -4342,90 +4339,99 @@ msgstr "Gefertigte Teile" msgid "Start New Build" msgstr "Neuen Bauauftrag beginnen" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "Alle Teile" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "Teil-Kategorie anlegen" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "Teil-Kategorie bearbeiten" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "Teil-Kategorie löschen" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "Kategorie-Details" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "Pfad zur Kategorie" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "Kategorie-Beschreibung" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "Unter-Kategorien" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "Teile (inklusive Unter-Kategorien)" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "Teile-Daten exportieren" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "Teil-Kategorie auswählen" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "Teil-Kategorie auswählen" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "Exportieren" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "Listenansicht anzeigen" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "Rasteransicht anzeigen" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "Neuen Lagerort anlegen" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "Neue Kategorie" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "Teil-Kategorie anlegen" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "Neue Teil-Kategorie anlegen" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "Neuen Lagerort erstellen" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "Teil-Kategorie bearbeiten" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "Sind Sie sicher, dass Sie diese Kategorie löschen wollen" @@ -4461,12 +4467,17 @@ msgstr "Wenn diese Kat. gelöscht wird, werden diese Teile in die übergeordnete msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "Wenn diese Kat. gelöscht wird, werden diese Teile in die oberste Kat. verschoben" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "Teilparameter" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "Teil duplizieren" @@ -4490,7 +4501,7 @@ msgstr "Teil evtl. Duplikat dieser Teile" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "%(full_name)s - %(desc)s (%(match_per)s%% übereinstimmend)" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "Teil Details" @@ -4570,34 +4581,13 @@ msgstr "Teil ist aktiv" msgid "Part is not active" msgstr "Teil ist nicht aktiv" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "Zugriff verweigert" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "Keine Berechtigung zum Anzeigen dieser Seite." - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4609,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "Herstellerteile löschen" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "Neuen Hersteller anlegen" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "Teil Varianten" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "Varianten" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "Lagerbestand zuweisen" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "Zuweisungen" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "Benutzt in" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "Bestellpreisinformationen" - #: part/templates/part/navbar.html:77 -msgid "Order Price" -msgstr "Bestellpreis" +msgid "Prices" +msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "Interner Preis" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "Preisinformationen ansehen" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "Teil Test-Vorlagen" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "Tests" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "Verknüpfte Teile" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "Teil-Bemerkungen" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "Berechnen" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "Preisspannen" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "Zulieferer-Preise" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "Stückpreis" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "Gesamtkosten" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "Keine Zulieferer-Preise verfügbar" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "Stücklistenpreise" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "Anmerkung: Stücklistenbepreisung für dieses Teil ist unvollständig" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "Keine Stücklisten-Preise verfügbar" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "Keine Preise für dieses Teil verfügbar" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "Bestandspreise" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "Für dieses Teil sind keine Bestandspreise verfügbar." - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "Einzelpreis - %(currency)s" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "Einzelpreisdifferenz - %(currency)s" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "Einzelpreis für Zuliefererteil- %(currency)s" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "Parameter hinzufügen" @@ -4772,8 +4664,8 @@ msgstr "Neue Teilparametervorlage anlegen" msgid "Part List" msgstr "Teileliste" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "Inaktiv" @@ -4836,7 +4728,7 @@ msgstr "Dieses Teil ist eine Variante von %(link)s" msgid "In Stock" msgstr "Auf Lager" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "Für Bauaufträge benötigt" @@ -4848,7 +4740,7 @@ msgstr "Benötigt für Aufträge" msgid "Allocated to Orders" msgstr "Zu Bauaufträgen zugeordnet" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "Herstellbar" @@ -4857,10 +4749,86 @@ msgstr "Herstellbar" msgid "Building" msgstr "Im Bau" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "Berechnen" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "Zulieferer-Preise" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "Stückpreis" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "Gesamtkosten" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "Keine Zulieferer-Preise verfügbar" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "Stücklistenpreise" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "Anmerkung: Stücklistenbepreisung für dieses Teil ist unvollständig" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "Keine Stücklisten-Preise verfügbar" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "Interner Preis" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "Keine Preise für dieses Teil verfügbar" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "Test Vorlage hinzufügen" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "Aus vorhandenen Bildern auswählen" @@ -4895,14 +4863,100 @@ msgstr "Es sind %(count)s Zulieferer für diesen Teil definiert. Wenn Sie diesen msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "Es gibt %(count)s einzigartige Teile, die für '%(full_name)s' verfolgt werden. Das Löschen dieses Teils wird diese Tracking-Informationen dauerhaft entfernen." +#: part/templates/part/prices.html:12 +msgid "General Price Information" +msgstr "" + +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "Preisspannen" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "Bestandspreise" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "Für dieses Teil sind keine Bestandspreise verfügbar." + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "Einzelpreis - %(currency)s" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "Einzelpreisdifferenz - %(currency)s" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "Einzelpreis für Zuliefererteil- %(currency)s" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + #: part/templates/part/related.html:18 msgid "Add Related" msgstr "Verknüpftes Teil hinzufügen" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" -msgstr "Verkaufspreis Informationen" - #: part/templates/part/sales_orders.html:18 msgid "New sales order" msgstr "Neuer Auftrag" @@ -4966,220 +5020,188 @@ msgstr "neue Variante anlegen" msgid "Unknown database" msgstr "Unbekannte Datenbank" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "verknüpftes Teil hinzufügen" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "verknüpftes Teil entfernen" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "Teilanhang hinzufügen" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "Anhang bearbeiten" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "Teilanhang aktualisiert" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "Teilanhang löschen" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "Teilanhang gelöscht" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "Testvorlage anlegen" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "Testvorlage bearbeiten" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "Testvorlage löschen" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "Teil-Kategorie auswählen" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "Kategorie für {n} Teile setzen" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "Variante anlegen" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "Teil kopiert" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "Übereinstimmung gefunden - Teil trotzdem anlegen" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "Neues Teil angelegt" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "Teil-QR-Code" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "Teilbild hochladen" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "Teilbild aktualisiert" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "Teilbild auswählen" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "Teilbild aktualisiert" + +#: part/views.py:1115 msgid "Part image not found" msgstr "Teilbild nicht gefunden" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "Teileigenschaften bearbeiten" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "Stückliste duplizieren" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "bestätige Duplizierung Stückliste von übergeordneter Stückliste" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "Stückliste überprüfen" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "Bestätigen, dass Stückliste korrekt ist" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "überprüfte Stückliste" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "Keine Stückliste angegeben" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "Bitte eine gültige Anzahl eingeben" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "Bitte ein gültiges Teil auswählen" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "Teil doppelt ausgewählt" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "Teil auswählen" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "gewähltes Teil erzeugt rekursive Stückliste" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "Anzahl angeben" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "Löschen des Teils bestätigen" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "Teil wurde gelöscht" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "Teilbepreisung" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "Teilparametervorlage anlegen" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "Teilparametervorlage bearbeiten" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "Teilparametervorlage löschen" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "Teilparameter anlegen" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "Teilparameter bearbeiten" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "Teilparameter löschen" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "Teil-Kategorie bearbeiten" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "Teil-Kategorie löschen" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "Teil-Kategorie wurde gelöscht" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "Kategorieparametervorlage anlegen" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "Kategorieparametervorlage bearbeiten" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "Kategorieparametervorlage löschen" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "Stücklisten-Position anlegen" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "Stücklisten-Position bearbeiten" -#: part/views.py:2743 -msgid "Confim BOM item deletion" -msgstr "löschen von Stücklisten-Position bestätigen" +#: part/views.py:2792 +msgid "Added new price break" +msgstr "neue Preisstaffel hinzufügt" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5285,17 +5307,17 @@ msgid "Test Results" msgstr "Testergebnisse" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "Test" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "Ergebnis" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "Datum" @@ -5307,287 +5329,287 @@ msgstr "bestanden" msgid "Fail" msgstr "fehlgeschlagen" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "Bestand für {n} Objekte geändert" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "{n} Teile nach {loc} bewegt" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "Ablaufdatum" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "Ablaufdatum für dieses BestandsObjekt" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "Eindeutige Seriennummern eingeben (oder leer lassen)" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "Lagerort für serial" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "Seriennummern" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "Anzahl der eindeutigen Seriennummern (muss mit der Anzahl übereinstimmen)" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr " Transaktionsnotizen hinzufügen (optional)" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "Test Bericht Vorlage auswählen" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "Unter-Lagerorte einschließen" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "BestandsObjekt in untergeordneten Lagerorten einschließen" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "BestandsObjekt zum verbauen" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "Bestandmenge zum Zuweisen" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "Anzahl darf die verfügbare Anzahl nicht überschreiten" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "Ziel Lagerort für unverbaute Objekte" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "nicht mehr verbauen bestätigen" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "Entfernen der verbauten BestandsObjekt bestätigen" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "Ziel-Lagerbestand" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "Notiz hinzufügen (erforderlich)" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "Bestands-Anpassung bestätigen" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "Verschieben der BestandsObjekt bestätigen" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "Standard-Lagerort ändern" -#: stock/forms.py:383 +#: stock/forms.py:350 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:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "Besitzer" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "Besitzer auswählen" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "Ein BestandsObjekt mit dieser Seriennummer existiert bereits" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "Teile-Typ ('{pf}') muss {pe} sein" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "Anzahl muss für Objekte mit Seriennummer 1 sein" -#: stock/models.py:322 +#: stock/models.py:326 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:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "Teil kann nicht zu sich selbst gehören" -#: stock/models.py:350 +#: stock/models.py:354 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:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "Referenz verweist nicht auf das gleiche Teil" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "Eltern-BestandsObjekt" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "Basis-Teil" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "Passendes Zuliefererteil für dieses BestandsObjekt auswählen" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "Bestand-Lagerort" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "Wo wird dieses Teil normalerweise gelagert?" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "Die Verpackung dieses BestandsObjekt ist gelagert in" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "verbaut in" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "Ist dieses Teil in einem anderen verbaut?" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "Seriennummer für dieses Teil" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "Losnummer für dieses BestandsObjekt" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "Bestand" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "Quellbau" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "Bauauftrag für dieses BestandsObjekt" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "Quelle Bestellung" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "Bestellung für dieses BestandsObjekt" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "Ziel-Auftrag" -#: stock/models.py:510 +#: stock/models.py:514 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:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "Löschen wenn leer" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "Dieses BestandsObjekt löschen wenn Bestand aufgebraucht" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "BestandsObjekt-Notizen" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "Preis für eine Einheit bei Einkauf" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "Teil ist nicht verfolgbar" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "Anzahl muss eine Ganzzahl sein" -#: stock/models.py:1023 +#: stock/models.py:1026 #, 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:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "Seriennummern muss eine Liste von Ganzzahlen sein" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "Anzahl stimmt nicht mit den Seriennummern überein" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "Seriennummern {exists} existieren bereits" -#: stock/models.py:1194 +#: stock/models.py:1197 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:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "Eintrags-Notizen" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "Wert muss für diesen Test angegeben werden" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "Anhang muss für diesen Test hochgeladen werden" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "Name des Tests" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "Testergebnis" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "Test Ausgabe Wert" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "Test Ergebnis Anhang" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "Test Notizen" @@ -5739,7 +5761,7 @@ msgstr "Dieses BestandsObjekt wird automatisch gelöscht wenn der Lagerbestand a msgid "Stock Item Details" msgstr "BestandsObjekt-Details" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "Kein Lagerort gesetzt" @@ -5777,6 +5799,10 @@ msgstr "Letzte Inventur" msgid "No stocktake performed" msgstr "Keine Inventur ausgeführt" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "Kind-BestandsObjekt" @@ -5836,6 +5862,19 @@ msgstr "Testdaten löschen" msgid "Add Test Data" msgstr "Testdaten hinzufügen" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "Testergebnis hinzufügen" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "Testergebnis bearbeiten" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "Testergebnis löschen" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "Sie sind nicht auf der Liste der Besitzer dieses Lagerorts. Der Bestands-Lagerort kann nicht verändert werden." @@ -5884,7 +5923,7 @@ msgid "Stock Details" msgstr "Objekt-Details" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "Bestand-Lagerorte" @@ -5924,7 +5963,7 @@ msgstr "Lade..." msgid "The following stock items will be uninstalled" msgstr "Die folgenden BestandsObjekte werden nicht mehr verbaut" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "BestandsObjekt umwandeln" @@ -5957,8 +5996,8 @@ msgstr "Sind Sie sicher, dass Sie diesen BestandsObjekt-Verfolgungs-Eintrag lös msgid "Edit Stock Location" msgstr "BestandsObjekt-Lagerort bearbeiten" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "Eigentümer notwendig (Eigentümerkontrolle aktiv)" @@ -5966,208 +6005,188 @@ msgstr "Eigentümer notwendig (Eigentümerkontrolle aktiv)" msgid "Stock Location QR code" msgstr "QR-Code für diesen Lagerort" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "BestandsObjekt-Anhang hinzufügen" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "BestandsObjekt-Anhang bearbeiten" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "BestandsObjekt-Anhang löschen" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "Kunden zuweisen" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "Kunde muss angegeben werden" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "zurück ins Lager" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "gültigen Lagerort angeben" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "BestandsObjekt retoure vom Kunden" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "alle Testdaten löschen" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "Löschen Testdaten bestätigen" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "Testergebnis hinzufügen" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "Testergebnis bearbeiten" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "Testergebnis löschen" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "Lagerbestand Exportoptionen" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "BestandsObjekt-QR-Code" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "BestandsObjekt installiert" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "BestandsObjekte deinstallieren" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "BestandsObjekte deinstalliert" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "Lagerbestand anpassen" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "BestandsObjekte bewegen" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "Verschieben" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "BestandsObjekte zählen" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "Anzahl" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "Aus Lagerbestand entfernen" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "Entfernen" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "BestandsObjekte hinzufügen" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "Hinzufügen" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "BestandsObjekte löschen" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "Nur Ganzzahl eingeben" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "Anzahl muss positiv sein" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "Anzahl darf {x} nicht überschreiten" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "Keine Aktion durchgeführt" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "Vorrat zu {n} BestandsObjekten hinzugefügt" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "Vorrat von {n} BestandsObjekten entfernt" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "Bestand für {n} Objekte erfasst" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "Keine BestandsObjekt wurden bewegt" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "{n} Teile nach {dest} bewegt" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "{n} BestandsObjekte gelöscht" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "Status bearbeiten" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "BestandsObjekt bearbeiten" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "Lagerbestand erfassen" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "Neues BestandsObjekt hinzufügen" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "Bestand duplizieren" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "Anzahl kann nicht negativ sein" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "Bestand-Lagerort löschen" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "BestandsObjekt löschen" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag löschen" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag bearbeiten" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "Lagerbestands-Tracking-Eintrag hinzufügen" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "Zugriff verweigert" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "Keine Berechtigung zum Anzeigen dieser Seite." + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "Seite nicht gefunden" @@ -6196,35 +6215,39 @@ msgstr "Stücklisten erwarten Kontrolle" msgid "Recently Updated" msgstr "kürzlich aktualisiert" -#: templates/InvenTree/index.html:145 +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" +msgstr "" + +#: templates/InvenTree/index.html:146 msgid "Expired Stock" msgstr "abgelaufener Bestand" -#: templates/InvenTree/index.html:146 +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "Lagerbestand überfällig" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "laufende Bauaufträge" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "überfällige Bauaufträge" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "ausstehende Bestellungen" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "überfällige Bestellungen" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "ausstehende Aufträge" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "überfällige Aufträge" @@ -6288,12 +6311,12 @@ msgid "No category parameter templates found" msgstr "Keine Kategorie-Parametervorlagen gefunden" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "Vorlage bearbeiten" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "Vorlage löschen" @@ -6301,23 +6324,23 @@ msgstr "Vorlage löschen" msgid "Currency Settings" msgstr "Währungseinstellungen" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "Basiswährung" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "Wechselkurse" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "Letzte Aktualisierung" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "Nie" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "Jetzt aktualisieren" @@ -6341,11 +6364,19 @@ msgstr "Teil-Einstellungen" msgid "Part Options" msgstr "Teil-Optionen" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "Teil-Parametervorlage" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "Keine Teilparametervorlagen gefunden" @@ -6504,24 +6535,12 @@ msgstr "In die Zwischenablage kopieren" msgid "copy version information" msgstr "Versionsinformationen kopieren" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "Schliessen" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "Anhang hinzufügen" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "Hochgeladen" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "Anhang löschen" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "URL für Bild-Donwload angeben" @@ -6538,6 +6557,22 @@ msgstr "Der angegebene Server muss erreichbar sein" msgid "Remote image must not exceed maximum allowable file size" msgstr "Das Bild darf nicht größer als die maximal-erlaubte Größe sein" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "Anhang bearbeiten" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "Anhang löschen" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "Hier den Barcode scannen" @@ -6566,7 +6601,7 @@ msgstr "Server-Fehler" msgid "Unknown response from server" msgstr "Unbekannte Antwort von Server erhalten" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "Ungültige Antwort von Server" @@ -6630,7 +6665,7 @@ msgstr "In Lagerorten buchen" msgid "Barcode does not match a valid location" msgstr "Barcode entspricht keinem Lagerort" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "Unterbaugruppe öffnen" @@ -6642,31 +6677,35 @@ msgstr "Kaufpreisspanne" msgid "Purchase Price Average" msgstr "Durchschnittlicher Kaufpreis" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "Keine Preisinformation verfügbar" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "Stückliste anzeigen" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "Stücklisten-Position kontrollieren" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "Diese Position wurde kontrolliert" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "Stücklisten-Position bearbeiten" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "Stücklisten-Position löschen" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "Keine Stücklisten-Position(en) gefunden" @@ -6690,83 +6729,107 @@ msgstr "Endprodukt entfernen" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "Standort nicht angegeben" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "Neues BestandsObjekt" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "benötigtes Teil" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "Anzahl pro" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "Bestand bestellen" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "Keine Bauaufträge passen zur Anfrage" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "Auswählen" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "Bauauftrag ist überfällig" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "Keine Teile zugeordnet zu" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "Firma bearbeiten" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "Teile geliefert" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "Hersteller-Teile" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "Keine Firmeninformation gefunden" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "Keine Herstellerteile gefunden" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "Vorlagenteil" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "Baugruppe" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "Keine Zuliefererteile gefunden" @@ -6794,6 +6857,83 @@ msgstr "Filter entfernen" msgid "Create filter" msgstr "Filter anlegen" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "Keine Antwort" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "keine Antwort vom InvenTree Server" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "Fehler 401: Nicht Angemeldet" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "Authentication Kredentials nicht angegeben" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "Fehler 403: keine Berechtigung" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "Fehlende Berechtigung für diese Aktion" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "Fehler 404: Ressource nicht gefunden" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "Die angefragte Ressource kann auf diesem Server nicht gefunden werden" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "Fehler 408: Zeitüberschreitung" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "Verbindungszeitüberschreitung bei der Datenanforderung" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "Fehler bei Formulardaten-Anfrage" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "Fehler in Formular" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "BestandsObjekte auswählen" @@ -6834,112 +6974,102 @@ msgstr "Label auswählen" msgid "Select Label Template" msgstr "Label-Vorlage auswählen" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "Warte auf Server..." - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "Fehler-Informationen anzeigen" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "Akzeptieren" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "abbrechen" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "Lade Daten" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "Abschicken" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "Warte auf Server..." + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "Fehler-Informationen anzeigen" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "Akzeptieren" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "Lade Daten" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "ungültige Antwort vom Server" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "Formulardaten fehlen bei Serverantwort" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "Formulardaten fehlerhaft" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "JSON Antwort enthält keine Formulardaten" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "Keine Antwort" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "keine Antwort vom InvenTree Server" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "Fehler 400: Ungültige Anfrage" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "Fehler 400 von Server erhalten" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" -msgstr "Fehler 401: Nicht Angemeldet" +#: templates/js/model_renderers.js:21 +msgid "Company ID" +msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" -msgstr "Authentication Kredentials nicht angegeben" +#: templates/js/model_renderers.js:63 +msgid "Location ID" +msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" -msgstr "Fehler 403: keine Berechtigung" +#: templates/js/model_renderers.js:90 +msgid "Part ID" +msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" -msgstr "Fehlende Berechtigung für diese Aktion" +#: templates/js/model_renderers.js:126 +msgid "Category ID" +msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" -msgstr "Fehler 404: Ressource nicht gefunden" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" +msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" -msgstr "Die angefragte Ressource kann auf diesem Server nicht gefunden werden" +#: templates/js/order.js:31 +msgid "Create Sales Order" +msgstr "Auftrag anlegen" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "Fehler 408: Zeitüberschreitung" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "Verbindungszeitüberschreitung bei der Datenanforderung" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "Fehler bei Formulardaten-Anfrage" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "Keine Bestellungen gefunden" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "Bestellung überfällig" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "Keine Aufträge gefunden" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6979,11 +7109,11 @@ msgstr "Keine Teile gefunden" msgid "No category" msgstr "Keine Kategorie" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "Bestand niedrig" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "Pfad" @@ -7003,7 +7133,22 @@ msgstr "Testergebnis löschen" msgid "This test is defined for a parent part" msgstr "Dieses Testergebnis ist für ein Hauptteil" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "Einzelpreisdifferenz" @@ -7181,75 +7326,75 @@ msgstr "gelöscht" msgid "Stocktake" msgstr "Inventur" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "Status" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "Status setzen" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "Status Code setzen" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "Status Code muss ausgewählt werden" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "Ungültiges Datum" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "Standort nicht mehr vorhanden" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "Bestellung existiert nicht mehr" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "Kunde existiert nicht mehr" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "Lagerbestand existiert nicht mehr" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "Hinzugefügt" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "Entfernt" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "Keine Benutzerinformation" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "Tracking-Eintrag bearbeiten" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "Tracking-Eintrag löschen" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "Neuen Lagerort anlegen" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "Keine installierten Elemente" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "Seriennummer" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "Lagerbestand entfernen" @@ -7270,7 +7415,7 @@ msgid "Include locations" msgstr "Lagerorte einschließen" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "Unterkategorien einschließen" @@ -7303,7 +7448,7 @@ msgstr "Seriennummer" msgid "Batch code" msgstr "Losnummer" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "Aktive Teile" @@ -7375,43 +7520,51 @@ msgstr "zeige zu Kunden zugeordnete Einträge" msgid "Stock status" msgstr "Status" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "Bauauftrags-Status" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "Bestellstatus" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "ausstehend" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "Teile in Unterkategorien einschließen" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "Hat IPN" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "Teil hat Interne Teilenummer" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "Aktive Teile anzeigen" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "verfügbarer Lagerbestand" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "Favorit" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "Käuflich" @@ -7468,10 +7621,6 @@ msgstr "Spalten" msgid "All" msgstr "Alle" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "Fehler in Formular" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "Navigation ein-/ausklappen" @@ -7488,7 +7637,7 @@ msgstr "Verkaufen" msgid "Scan Barcode" msgstr "Barcode scannen" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "Admin" @@ -7708,35 +7857,35 @@ msgstr "Berechtigungen" msgid "Important dates" msgstr "wichtige Daten" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "Berechtigung geändert" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "Gruppe" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "Ansicht" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "Berechtigung Einträge anzuzeigen" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "Berechtigung Einträge zu erstellen" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "Ändern" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "Berechtigungen Einträge zu ändern" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "Berechtigung Einträge zu löschen" diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po index 792cf22fc2..ba01b18cb4 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-24 21:38+0000\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -30,14 +30,14 @@ msgstr "" msgid "No matching action found" msgstr "" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "" @@ -73,123 +73,131 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "" -#: InvenTree/settings.py:503 -msgid "English" -msgstr "" - -#: InvenTree/settings.py:504 -msgid "French" +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" msgstr "" #: InvenTree/settings.py:505 -msgid "German" +msgid "English" msgstr "" #: InvenTree/settings.py:506 -msgid "Polish" +msgid "French" msgstr "" #: InvenTree/settings.py:507 +msgid "German" +msgstr "" + +#: InvenTree/settings.py:508 +msgid "Polish" +msgstr "" + +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "" @@ -447,50 +455,48 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "" @@ -502,7 +508,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "" @@ -531,12 +537,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "" @@ -545,13 +551,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "" @@ -583,60 +589,60 @@ msgstr "" msgid "Select quantity of stock to allocate" msgstr "" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -644,223 +650,223 @@ msgstr "" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 msgid "Link to external URL" msgstr "" -#: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "" @@ -880,7 +886,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "" @@ -894,8 +900,8 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "" @@ -913,23 +919,52 @@ msgstr "" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" @@ -978,7 +1013,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -990,8 +1025,8 @@ msgstr "" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "" @@ -1037,13 +1072,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "" @@ -1184,10 +1219,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "" @@ -1197,14 +1232,14 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "" @@ -1212,7 +1247,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "" @@ -1251,8 +1286,8 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "" @@ -1288,7 +1323,6 @@ msgstr "" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1317,7 +1351,7 @@ msgstr "" msgid "Maximum output quantity is " msgstr "" -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "" @@ -1333,7 +1367,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "" @@ -1413,8 +1447,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "" @@ -1430,60 +1464,35 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "" @@ -1504,7 +1513,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "" @@ -1521,335 +1530,358 @@ msgid "Base URL for server instance" msgstr "" #: common/models.py:85 -msgid "Download from URL" +msgid "Default Currency" msgstr "" #: common/models.py:86 -msgid "Allow download of remote images and files from external URL" +msgid "Default currency" msgstr "" #: common/models.py:92 -msgid "Barcode Support" +msgid "Download from URL" msgstr "" #: common/models.py:93 -msgid "Enable barcode scanner support" +msgid "Allow download of remote images and files from external URL" msgstr "" #: common/models.py:99 -msgid "IPN Regex" +msgid "Barcode Support" msgstr "" #: common/models.py:100 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:106 +msgid "IPN Regex" +msgstr "" + +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:230 +msgid "Show related parts" msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 +msgid "Page Size" +msgstr "" + +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "" @@ -1857,27 +1889,30 @@ msgstr "" msgid "Current value" msgstr "" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1885,282 +1920,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "" @@ -2174,7 +2230,7 @@ msgstr "" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "" @@ -2182,7 +2238,8 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2196,16 +2253,9 @@ msgstr "" msgid "Phone" msgstr "" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "" -"There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2220,11 +2270,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "" @@ -2245,7 +2295,8 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2253,7 +2304,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "" @@ -2267,26 +2318,25 @@ msgstr "" msgid "Delete Parts" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "" @@ -2296,8 +2346,8 @@ msgstr "" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "" @@ -2309,26 +2359,24 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "" @@ -2363,20 +2411,19 @@ msgstr "" msgid "Internal Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2387,7 +2434,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2413,31 +2460,49 @@ msgid "Delete supplier parts" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2448,14 +2513,14 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "" @@ -2465,11 +2530,11 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "" @@ -2477,11 +2542,11 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "" @@ -2510,8 +2575,9 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "" @@ -2556,459 +2622,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "" - -#: company/views.py:316 -msgid "Created new company" -msgstr "" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:102 -msgid "Order reference" -msgstr "" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3053,16 +3061,22 @@ msgstr "" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "" @@ -3093,57 +3107,71 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "" @@ -3152,6 +3180,8 @@ msgid "Upload File for Purchase Order" msgstr "" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3199,7 +3229,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "" @@ -3223,7 +3253,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3241,40 +3270,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3289,15 +3330,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "" @@ -3339,10 +3380,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3358,69 +3403,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3461,195 +3506,155 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3670,143 +3675,143 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3822,362 +3827,362 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4193,16 +4198,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "" @@ -4249,7 +4246,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4265,8 +4262,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4302,7 +4299,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4343,90 +4340,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4462,12 +4468,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "" @@ -4491,7 +4502,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "" @@ -4571,34 +4582,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4610,149 +4600,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4773,8 +4665,8 @@ msgstr "" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4837,7 +4729,7 @@ msgstr "" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "" @@ -4849,7 +4741,7 @@ msgstr "" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4858,10 +4750,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4896,12 +4864,98 @@ msgstr "" msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4967,220 +5021,188 @@ msgstr "" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5286,17 +5308,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5308,287 +5330,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5740,7 +5762,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "" @@ -5778,6 +5800,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5837,6 +5863,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" @@ -5885,7 +5924,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "" @@ -5925,7 +5964,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "" @@ -5958,8 +5997,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "" @@ -5967,208 +6006,188 @@ msgstr "" msgid "Stock Location QR code" msgstr "" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6197,35 +6216,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6287,12 +6310,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "" @@ -6300,23 +6323,23 @@ msgstr "" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6340,11 +6363,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "" @@ -6503,24 +6534,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6537,6 +6556,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6565,7 +6600,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6629,7 +6664,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6641,31 +6676,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6689,83 +6728,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6793,6 +6856,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6833,112 +6973,102 @@ msgstr "" msgid "Select Label Template" msgstr "" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6978,11 +7108,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -7002,7 +7132,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7180,75 +7325,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7269,7 +7414,7 @@ msgid "Include locations" msgstr "" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7302,7 +7447,7 @@ msgstr "" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7374,43 +7519,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7467,10 +7620,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7487,7 +7636,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7707,34 +7856,34 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po index 1bbb282835..9968d727ff 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-25 14:06\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -29,14 +29,14 @@ msgstr "No se especificó ninguna acción" msgid "No matching action found" msgstr "No se encontró ninguna acción coincidente" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "Ingrese la fecha" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "Confirmar" @@ -72,123 +72,131 @@ msgstr "Aplicar tema" msgid "Select Category" msgstr "Seleccionar Categoría" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "Cantidad proporcionada no válida" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "Grupo no válido: un {g}" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "Numeros de serie no encontrados" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "Comentario" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "Usuario" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "Nombre" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "Descripción" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "" -#: InvenTree/settings.py:503 +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" +msgstr "" + +#: InvenTree/settings.py:505 msgid "English" msgstr "Inglés" -#: InvenTree/settings.py:504 +#: InvenTree/settings.py:506 msgid "French" msgstr "Francés" -#: InvenTree/settings.py:505 +#: InvenTree/settings.py:507 msgid "German" msgstr "Alemán" -#: InvenTree/settings.py:506 +#: InvenTree/settings.py:508 msgid "Polish" msgstr "Polaco" -#: InvenTree/settings.py:507 +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "Turco" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "Cantidad" @@ -501,7 +507,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "Números de serie" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "Unicación" @@ -544,13 +550,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "Estado" @@ -582,60 +588,60 @@ msgstr "" msgid "Select quantity of stock to allocate" msgstr "" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "Referencia" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "Parte" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "Elementos completados" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "Responsable" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 msgid "Link to external URL" msgstr "" -#: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "Notas" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "" @@ -879,7 +885,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "" @@ -893,8 +899,8 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "" @@ -912,23 +918,52 @@ msgstr "" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "Número de serie" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" @@ -977,7 +1012,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "Progreso" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "" @@ -1183,10 +1218,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "Destinación" @@ -1196,14 +1231,14 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Lote" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "" @@ -1211,7 +1246,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "Completados" @@ -1250,8 +1285,8 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "Detalles" @@ -1287,7 +1322,6 @@ msgstr "" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Guardar" @@ -1316,7 +1350,7 @@ msgstr "" msgid "Maximum output quantity is " msgstr "" -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "" @@ -1332,7 +1366,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "" @@ -1412,8 +1446,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "" @@ -1429,60 +1463,35 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "" @@ -1503,7 +1512,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "" #: common/models.py:85 -msgid "Download from URL" +msgid "Default Currency" msgstr "" #: common/models.py:86 -msgid "Allow download of remote images and files from external URL" +msgid "Default currency" msgstr "" #: common/models.py:92 -msgid "Barcode Support" +msgid "Download from URL" msgstr "" #: common/models.py:93 -msgid "Enable barcode scanner support" +msgid "Allow download of remote images and files from external URL" msgstr "" #: common/models.py:99 -msgid "IPN Regex" +msgid "Barcode Support" msgstr "" #: common/models.py:100 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:106 +msgid "IPN Regex" +msgstr "" + +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:230 +msgid "Show related parts" msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 +msgid "Page Size" +msgstr "" + +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "días" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "" @@ -1856,27 +1888,30 @@ msgstr "" msgid "Current value" msgstr "" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1884,282 +1919,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "Página web" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "Teléfono" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "Teléfono de contacto" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "Email" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "Contacto" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "Fabricante" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "Proveedor" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "Nota" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "" @@ -2173,7 +2229,7 @@ msgstr "" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "" @@ -2181,7 +2237,8 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2195,15 +2252,9 @@ msgstr "" msgid "Phone" msgstr "Teléfono" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2218,11 +2269,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "Cliente" @@ -2243,7 +2294,8 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2251,7 +2303,7 @@ msgstr "Opciones" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "" @@ -2265,26 +2317,25 @@ msgstr "" msgid "Delete Parts" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "" @@ -2294,8 +2345,8 @@ msgstr "" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "Exportar" @@ -2307,26 +2358,24 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "" @@ -2361,20 +2410,19 @@ msgstr "" msgid "Internal Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2385,7 +2433,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2411,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "Eliminar" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2446,14 +2512,14 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "" @@ -2463,11 +2529,11 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "" @@ -2475,11 +2541,11 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "" @@ -2508,8 +2574,9 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "" @@ -2554,459 +2621,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "Fabricantes" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "" - -#: company/views.py:316 -msgid "Created new company" -msgstr "" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:102 -msgid "Order reference" -msgstr "" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3051,16 +3060,22 @@ msgstr "" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "" @@ -3091,57 +3106,71 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "" @@ -3150,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3197,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "" @@ -3221,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3239,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3287,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "" @@ -3337,10 +3379,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3356,69 +3402,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3459,195 +3505,155 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3668,143 +3674,143 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3820,362 +3826,362 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4191,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "" @@ -4247,7 +4245,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4263,8 +4261,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4300,7 +4298,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4341,90 +4339,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4460,12 +4467,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "" @@ -4489,7 +4501,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "" @@ -4569,34 +4581,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4608,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4771,8 +4664,8 @@ msgstr "" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4835,7 +4728,7 @@ msgstr "" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "" @@ -4847,7 +4740,7 @@ msgstr "" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4856,10 +4749,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4894,12 +4863,98 @@ msgstr "" msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4965,220 +5020,188 @@ msgstr "" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5284,17 +5307,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5306,287 +5329,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5738,7 +5761,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "" @@ -5776,6 +5799,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5835,6 +5862,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" @@ -5883,7 +5923,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "" @@ -5923,7 +5963,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "" @@ -5956,8 +5996,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "" @@ -5965,208 +6005,188 @@ msgstr "" msgid "Stock Location QR code" msgstr "" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6195,35 +6215,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6284,12 +6308,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "" @@ -6297,23 +6321,23 @@ msgstr "" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6337,11 +6361,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "" @@ -6500,24 +6532,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6534,6 +6554,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6562,7 +6598,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6626,7 +6662,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6638,31 +6674,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6686,83 +6726,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6790,6 +6854,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6830,112 +6971,102 @@ msgstr "" msgid "Select Label Template" msgstr "" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6975,11 +7106,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -6999,7 +7130,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7177,75 +7323,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7266,7 +7412,7 @@ msgid "Include locations" msgstr "" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7299,7 +7445,7 @@ msgstr "" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7371,43 +7517,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7464,10 +7618,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7484,7 +7634,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7704,35 +7854,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/fr/LC_MESSAGES/django.po b/InvenTree/locale/fr/LC_MESSAGES/django.po index 61f43d466b..3b11868014 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-24 21:40\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -29,14 +29,14 @@ msgstr "Aucune action spécifiée" msgid "No matching action found" msgstr "Aucune action correspondante trouvée" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "Entrer la date" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "Confirmer" @@ -72,123 +72,131 @@ msgstr "Appliquer le thème" msgid "Select Category" msgstr "Sélectionnez une catégorie" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "Dupliquer le numéro de série: {n}" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "Quantité fournie invalide" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "Chaîne de numéro de série vide" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "Groupe invalide : {g}" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "Numéro de série dupliqué: {g}" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "Aucun numéro de série trouvé" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format 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:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "Pièce jointe" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "Sélectionnez un fichier à joindre" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "Commentaire" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "Commentaire du fichier" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "Utilisateur" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "date de chargement" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "Nom" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "Description" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "Description (facultative)" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "parent" -#: InvenTree/settings.py:503 +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" +msgstr "" + +#: InvenTree/settings.py:505 msgid "English" msgstr "Anglais" -#: InvenTree/settings.py:504 +#: InvenTree/settings.py:506 msgid "French" msgstr "Français" -#: InvenTree/settings.py:505 +#: InvenTree/settings.py:507 msgid "German" msgstr "Allemand" -#: InvenTree/settings.py:506 +#: InvenTree/settings.py:508 msgid "Polish" msgstr "Polonais" -#: InvenTree/settings.py:507 +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "Turc" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "Quantité" @@ -501,7 +507,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "Numéros de série" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "" @@ -544,13 +550,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "" @@ -582,60 +588,60 @@ msgstr "" msgid "Select quantity of stock to allocate" msgstr "" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "Référence" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "Pièce" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "Sélectionnez la pièce à construire" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "Date de création" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "Lien Externe" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 msgid "Link to external URL" msgstr "" -#: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "Notes" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "L'élément de construction doit spécifier une sortie de construction, la pièce maîtresse étant marquée comme objet traçable" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "L'article en stock sélectionné n'a pas été trouvé dans la BOM pour la pièce '{p}'" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "" @@ -879,7 +885,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "" @@ -893,8 +899,8 @@ msgstr "Commander les pièces requises" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "Commander des pièces" @@ -912,23 +918,52 @@ msgstr "" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "Pieces jointes" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" @@ -977,7 +1012,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "" @@ -1183,10 +1218,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "" @@ -1196,14 +1231,14 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "" @@ -1211,7 +1246,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "" @@ -1250,8 +1285,8 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "Détails" @@ -1287,7 +1322,6 @@ msgstr "" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Enregistrer" @@ -1316,7 +1350,7 @@ msgstr "" msgid "Maximum output quantity is " msgstr "" -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "" @@ -1332,7 +1366,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "" @@ -1412,8 +1446,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "Disponible" @@ -1429,60 +1463,35 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "Pièce jointe ajoutée" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "Sélectionner un fichier à téléverser" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "{name.title()} Fichier" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "" @@ -1503,7 +1512,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "" #: common/models.py:85 -msgid "Download from URL" -msgstr "Télécharger depuis l'URL" +msgid "Default Currency" +msgstr "" #: common/models.py:86 -msgid "Allow download of remote images and files from external URL" +msgid "Default currency" msgstr "" #: common/models.py:92 -msgid "Barcode Support" -msgstr "" +msgid "Download from URL" +msgstr "Télécharger depuis l'URL" #: common/models.py:93 -msgid "Enable barcode scanner support" +msgid "Allow download of remote images and files from external URL" msgstr "" #: common/models.py:99 +msgid "Barcode Support" +msgstr "" + +#: common/models.py:100 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:106 msgid "IPN Regex" msgstr "Regex IPN" -#: common/models.py:100 +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "Expression régulière pour la correspondance avec l'IPN de la Pièce" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "Autoriser les IPN dupliqués" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "Permettre à plusieurs pièces de partager le même IPN" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "Autoriser l'édition de l'IPN" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "Permettre de modifier la valeur de l'IPN lors de l'édition d'une pièce" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:230 +msgid "Show related parts" msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 +msgid "Page Size" +msgstr "" + +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "jours" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "" @@ -1856,27 +1888,30 @@ msgstr "" msgid "Current value" msgstr "" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1884,282 +1919,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "" @@ -2173,7 +2229,7 @@ msgstr "" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "" @@ -2181,7 +2237,8 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2195,15 +2252,9 @@ msgstr "" msgid "Phone" msgstr "" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2218,11 +2269,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "" @@ -2243,7 +2294,8 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2251,7 +2303,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "" @@ -2265,26 +2317,25 @@ msgstr "" msgid "Delete Parts" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "" @@ -2294,8 +2345,8 @@ msgstr "" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "" @@ -2307,26 +2358,24 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "" @@ -2361,20 +2410,19 @@ msgstr "" msgid "Internal Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2385,7 +2433,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2411,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2446,14 +2512,14 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "" @@ -2463,11 +2529,11 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "" @@ -2475,11 +2541,11 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "" @@ -2508,8 +2574,9 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "" @@ -2554,459 +2621,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "" - -#: company/views.py:316 -msgid "Created new company" -msgstr "" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:102 -msgid "Order reference" -msgstr "" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3051,16 +3060,22 @@ msgstr "" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "" @@ -3091,57 +3106,71 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "" @@ -3150,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3197,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "" @@ -3221,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3239,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3287,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "" @@ -3337,10 +3379,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3356,69 +3402,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3459,195 +3505,155 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3668,143 +3674,143 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3820,362 +3826,362 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "IPN dupliqué non autorisé dans les paramètres de la pièce" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "IPN" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4191,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "" @@ -4247,7 +4245,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4263,8 +4261,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4300,7 +4298,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4341,90 +4339,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4460,12 +4467,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "" @@ -4489,7 +4501,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "" @@ -4569,34 +4581,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4608,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4771,8 +4664,8 @@ msgstr "" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4835,7 +4728,7 @@ msgstr "" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "" @@ -4847,7 +4740,7 @@ msgstr "" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4856,10 +4749,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4894,12 +4863,98 @@ msgstr "" msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4965,220 +5020,188 @@ msgstr "" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5284,17 +5307,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5306,287 +5329,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5738,7 +5761,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "" @@ -5776,6 +5799,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5835,6 +5862,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" @@ -5883,7 +5923,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "" @@ -5923,7 +5963,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "" @@ -5956,8 +5996,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "" @@ -5965,208 +6005,188 @@ msgstr "" msgid "Stock Location QR code" msgstr "" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6195,35 +6215,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6284,12 +6308,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "" @@ -6297,23 +6321,23 @@ msgstr "" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6337,11 +6361,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "" @@ -6500,24 +6532,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6534,6 +6554,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6562,7 +6598,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6626,7 +6662,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6638,31 +6674,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6686,83 +6726,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6790,6 +6854,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6830,112 +6971,102 @@ msgstr "" msgid "Select Label Template" msgstr "" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6975,11 +7106,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -6999,7 +7130,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7177,75 +7323,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7266,7 +7412,7 @@ msgid "Include locations" msgstr "" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7299,7 +7445,7 @@ msgstr "" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7371,43 +7517,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "A un IPN" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7464,10 +7618,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7484,7 +7634,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7704,35 +7854,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/it/LC_MESSAGES/django.po b/InvenTree/locale/it/LC_MESSAGES/django.po index 87d69fb09a..ae1f42af1e 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-24 21:40\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -29,14 +29,14 @@ msgstr "" msgid "No matching action found" msgstr "" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "" @@ -72,123 +72,131 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "" -#: InvenTree/settings.py:503 -msgid "English" -msgstr "" - -#: InvenTree/settings.py:504 -msgid "French" +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" msgstr "" #: InvenTree/settings.py:505 -msgid "German" +msgid "English" msgstr "" #: InvenTree/settings.py:506 -msgid "Polish" +msgid "French" msgstr "" #: InvenTree/settings.py:507 +msgid "German" +msgstr "" + +#: InvenTree/settings.py:508 +msgid "Polish" +msgstr "" + +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "" @@ -501,7 +507,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "" @@ -544,13 +550,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "" @@ -582,60 +588,60 @@ msgstr "" msgid "Select quantity of stock to allocate" msgstr "" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 msgid "Link to external URL" msgstr "" -#: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "" @@ -879,7 +885,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "" @@ -893,8 +899,8 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "" @@ -912,23 +918,52 @@ msgstr "" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" @@ -977,7 +1012,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "" @@ -1183,10 +1218,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "" @@ -1196,14 +1231,14 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "" @@ -1211,7 +1246,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "" @@ -1250,8 +1285,8 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "" @@ -1287,7 +1322,6 @@ msgstr "" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1316,7 +1350,7 @@ msgstr "" msgid "Maximum output quantity is " msgstr "" -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "" @@ -1332,7 +1366,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "" @@ -1412,8 +1446,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "" @@ -1429,60 +1463,35 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "" @@ -1503,7 +1512,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "" #: common/models.py:85 -msgid "Download from URL" +msgid "Default Currency" msgstr "" #: common/models.py:86 -msgid "Allow download of remote images and files from external URL" +msgid "Default currency" msgstr "" #: common/models.py:92 -msgid "Barcode Support" +msgid "Download from URL" msgstr "" #: common/models.py:93 -msgid "Enable barcode scanner support" +msgid "Allow download of remote images and files from external URL" msgstr "" #: common/models.py:99 -msgid "IPN Regex" +msgid "Barcode Support" msgstr "" #: common/models.py:100 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:106 +msgid "IPN Regex" +msgstr "" + +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:230 +msgid "Show related parts" msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 +msgid "Page Size" +msgstr "" + +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "" @@ -1856,27 +1888,30 @@ msgstr "" msgid "Current value" msgstr "" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1884,282 +1919,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "" @@ -2173,7 +2229,7 @@ msgstr "" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "" @@ -2181,7 +2237,8 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2195,15 +2252,9 @@ msgstr "" msgid "Phone" msgstr "" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2218,11 +2269,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "" @@ -2243,7 +2294,8 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2251,7 +2303,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "" @@ -2265,26 +2317,25 @@ msgstr "" msgid "Delete Parts" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "" @@ -2294,8 +2345,8 @@ msgstr "" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "" @@ -2307,26 +2358,24 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "" @@ -2361,20 +2410,19 @@ msgstr "" msgid "Internal Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2385,7 +2433,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2411,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2446,14 +2512,14 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "" @@ -2463,11 +2529,11 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "" @@ -2475,11 +2541,11 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "" @@ -2508,8 +2574,9 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "" @@ -2554,459 +2621,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "" - -#: company/views.py:316 -msgid "Created new company" -msgstr "" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:102 -msgid "Order reference" -msgstr "" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3051,16 +3060,22 @@ msgstr "" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "" @@ -3091,57 +3106,71 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "" @@ -3150,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3197,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "" @@ -3221,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3239,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3287,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "" @@ -3337,10 +3379,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3356,69 +3402,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3459,195 +3505,155 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3668,143 +3674,143 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3820,362 +3826,362 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4191,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "" @@ -4247,7 +4245,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4263,8 +4261,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4300,7 +4298,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4341,90 +4339,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4460,12 +4467,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "" @@ -4489,7 +4501,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "" @@ -4569,34 +4581,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4608,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4771,8 +4664,8 @@ msgstr "" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4835,7 +4728,7 @@ msgstr "" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "" @@ -4847,7 +4740,7 @@ msgstr "" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4856,10 +4749,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4894,12 +4863,98 @@ msgstr "" msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4965,220 +5020,188 @@ msgstr "" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5284,17 +5307,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5306,287 +5329,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5738,7 +5761,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "" @@ -5776,6 +5799,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5835,6 +5862,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" @@ -5883,7 +5923,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "" @@ -5923,7 +5963,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "" @@ -5956,8 +5996,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "" @@ -5965,208 +6005,188 @@ msgstr "" msgid "Stock Location QR code" msgstr "" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6195,35 +6215,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6284,12 +6308,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "" @@ -6297,23 +6321,23 @@ msgstr "" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6337,11 +6361,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "" @@ -6500,24 +6532,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6534,6 +6554,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6562,7 +6598,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6626,7 +6662,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6638,31 +6674,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6686,83 +6726,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6790,6 +6854,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6830,112 +6971,102 @@ msgstr "" msgid "Select Label Template" msgstr "" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6975,11 +7106,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -6999,7 +7130,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7177,75 +7323,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7266,7 +7412,7 @@ msgid "Include locations" msgstr "" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7299,7 +7445,7 @@ msgstr "" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7371,43 +7517,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7464,10 +7618,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7484,7 +7634,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7704,35 +7854,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/ja/LC_MESSAGES/django.po b/InvenTree/locale/ja/LC_MESSAGES/django.po index fa6df1a934..8ffaee4eda 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-24 21:40\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -29,14 +29,14 @@ msgstr "" msgid "No matching action found" msgstr "" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "" @@ -72,123 +72,131 @@ msgstr "" msgid "Select Category" msgstr "" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "" -#: InvenTree/settings.py:503 -msgid "English" -msgstr "" - -#: InvenTree/settings.py:504 -msgid "French" +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" msgstr "" #: InvenTree/settings.py:505 -msgid "German" +msgid "English" msgstr "" #: InvenTree/settings.py:506 -msgid "Polish" +msgid "French" msgstr "" #: InvenTree/settings.py:507 +msgid "German" +msgstr "" + +#: InvenTree/settings.py:508 +msgid "Polish" +msgstr "" + +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "" @@ -501,7 +507,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "" @@ -544,13 +550,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "" @@ -582,60 +588,60 @@ msgstr "" msgid "Select quantity of stock to allocate" msgstr "" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 msgid "Link to external URL" msgstr "" -#: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "" @@ -879,7 +885,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "" @@ -893,8 +899,8 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "" @@ -912,23 +918,52 @@ msgstr "" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" @@ -977,7 +1012,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "" @@ -1183,10 +1218,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "" @@ -1196,14 +1231,14 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "" @@ -1211,7 +1246,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "" @@ -1250,8 +1285,8 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "" @@ -1287,7 +1322,6 @@ msgstr "" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1316,7 +1350,7 @@ msgstr "" msgid "Maximum output quantity is " msgstr "" -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "" @@ -1332,7 +1366,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "" @@ -1412,8 +1446,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "" @@ -1429,60 +1463,35 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "" @@ -1503,7 +1512,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "" #: common/models.py:85 -msgid "Download from URL" +msgid "Default Currency" msgstr "" #: common/models.py:86 -msgid "Allow download of remote images and files from external URL" +msgid "Default currency" msgstr "" #: common/models.py:92 -msgid "Barcode Support" +msgid "Download from URL" msgstr "" #: common/models.py:93 -msgid "Enable barcode scanner support" +msgid "Allow download of remote images and files from external URL" msgstr "" #: common/models.py:99 -msgid "IPN Regex" +msgid "Barcode Support" msgstr "" #: common/models.py:100 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:106 +msgid "IPN Regex" +msgstr "" + +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:230 +msgid "Show related parts" msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 +msgid "Page Size" +msgstr "" + +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "" @@ -1856,27 +1888,30 @@ msgstr "" msgid "Current value" msgstr "" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1884,282 +1919,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "" @@ -2173,7 +2229,7 @@ msgstr "" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "" @@ -2181,7 +2237,8 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2195,15 +2252,9 @@ msgstr "" msgid "Phone" msgstr "" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2218,11 +2269,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "" @@ -2243,7 +2294,8 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2251,7 +2303,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "" @@ -2265,26 +2317,25 @@ msgstr "" msgid "Delete Parts" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "" @@ -2294,8 +2345,8 @@ msgstr "" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "" @@ -2307,26 +2358,24 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "" @@ -2361,20 +2410,19 @@ msgstr "" msgid "Internal Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2385,7 +2433,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2411,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2446,14 +2512,14 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "" @@ -2463,11 +2529,11 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "" @@ -2475,11 +2541,11 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "" @@ -2508,8 +2574,9 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "" @@ -2554,459 +2621,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "" - -#: company/views.py:316 -msgid "Created new company" -msgstr "" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:102 -msgid "Order reference" -msgstr "" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3051,16 +3060,22 @@ msgstr "" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "" @@ -3091,57 +3106,71 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "" @@ -3150,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3197,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "" @@ -3221,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3239,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3287,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "" @@ -3337,10 +3379,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3356,69 +3402,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3459,195 +3505,155 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3668,143 +3674,143 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3820,362 +3826,362 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4191,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "" @@ -4247,7 +4245,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4263,8 +4261,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4300,7 +4298,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4341,90 +4339,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4460,12 +4467,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "" @@ -4489,7 +4501,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "" @@ -4569,34 +4581,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4608,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4771,8 +4664,8 @@ msgstr "" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4835,7 +4728,7 @@ msgstr "" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "" @@ -4847,7 +4740,7 @@ msgstr "" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4856,10 +4749,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4894,12 +4863,98 @@ msgstr "" msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4965,220 +5020,188 @@ msgstr "" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5284,17 +5307,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5306,287 +5329,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5738,7 +5761,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "" @@ -5776,6 +5799,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5835,6 +5862,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" @@ -5883,7 +5923,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "" @@ -5923,7 +5963,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "" @@ -5956,8 +5996,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "" @@ -5965,208 +6005,188 @@ msgstr "" msgid "Stock Location QR code" msgstr "" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6195,35 +6215,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6284,12 +6308,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "" @@ -6297,23 +6321,23 @@ msgstr "" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6337,11 +6361,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "" @@ -6500,24 +6532,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6534,6 +6554,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6562,7 +6598,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6626,7 +6662,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6638,31 +6674,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6686,83 +6726,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6790,6 +6854,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6830,112 +6971,102 @@ msgstr "" msgid "Select Label Template" msgstr "" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6975,11 +7106,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -6999,7 +7130,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7177,75 +7323,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7266,7 +7412,7 @@ msgid "Include locations" msgstr "" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7299,7 +7445,7 @@ msgstr "" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7371,43 +7517,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7464,10 +7618,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7484,7 +7634,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7704,35 +7854,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/pl/LC_MESSAGES/django.po b/InvenTree/locale/pl/LC_MESSAGES/django.po index 4bc233a127..e7b0087141 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-24 21:40\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: Polish\n" "Language: pl_PL\n" @@ -29,14 +29,14 @@ msgstr "Nie określono działania" msgid "No matching action found" msgstr "Nie znaleziono pasującej akcji" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "Wprowadź dane" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "Potwierdź" @@ -72,123 +72,131 @@ msgstr "Zastosuj motyw" msgid "Select Category" msgstr "Wybierz kategorię" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "Powtórzony numer seryjny: {n}" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "Podano nieprawidłową ilość" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "Pusty ciąg numeru seryjnego" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "Nieprawidłowa grupa: {g}" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "Powtórzony numer seryjny: {g}" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "Nie znaleziono numerów seryjnych" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format 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:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "Załącznik" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "Wybierz plik do załączenia" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "Komentarz" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "Komentarz pliku" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "Użytkownik" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "data przesłania" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "Nazwa" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "Opis" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "Opis (opcjonalny)" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "nadrzędny" -#: InvenTree/settings.py:503 +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" +msgstr "" + +#: InvenTree/settings.py:505 msgid "English" msgstr "Angielski" -#: InvenTree/settings.py:504 +#: InvenTree/settings.py:506 msgid "French" msgstr "Francuski" -#: InvenTree/settings.py:505 +#: InvenTree/settings.py:507 msgid "German" msgstr "Niemiecki" -#: InvenTree/settings.py:506 +#: InvenTree/settings.py:508 msgid "Polish" msgstr "Polski" -#: InvenTree/settings.py:507 +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "Turecki" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "Data docelowa" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "Ilość" @@ -501,7 +507,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "Numer seryjny" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "Oznacz budowę jako ukończoną" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "Lokalizacja" @@ -544,13 +550,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "Status" @@ -582,60 +588,60 @@ msgstr "" msgid "Select quantity of stock to allocate" msgstr "" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "Zlecenie Budowy" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "Zlecenia budowy" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "Odwołanie do zamówienia wykonania" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "Referencja" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "Krótki opis budowy" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "Budowa nadrzędna" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "Zamówienie budowy, do którego budowa jest przypisana" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "Zamówienie budowy, do którego budowa jest przypisana" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "Część" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "Wybierz część do budowy" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "Odwołanie do zamówienia sprzedaży" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "Zamówienie sprzedaży, do którego budowa jest przypisana" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "Lokalizacja źródła" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "Wybierz lokalizację, z której pobrać element do budowy (pozostaw puste, aby wziąć z dowolnej lokalizacji)" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "Lokalizacja docelowa" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "Wybierz lokalizację, w której będą przechowywane ukończone elementy" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "Ilość do stworzenia" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "Ilość przedmiotów do zbudowania" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "Ukończone elementy" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "Ilość produktów magazynowych które zostały ukończone" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "Status budowania" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "Kod statusu budowania" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "Kod partii" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "Kod partii dla wyjścia budowy" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "Data utworzenia" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "Docelowy termin zakończenia" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "Data zakończenia" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "zrealizowane przez" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "Wydany przez" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "Odpowiedzialny" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "Użytkownik odpowiedzialny za to zamówienie budowy" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "Link Zewnętrzny" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 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:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "Uwagi" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "Dodatkowe notatki do budowy" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "Nie określono danych wyjściowych budowy" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "Budowanie wyjścia jest już ukończone" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "Budowa" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "Element magazynowy" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "Lokalizacja magazynowania przedmiotu" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "Zainstaluj do" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "Docelowa lokalizacja magazynowa przedmiotu" @@ -879,7 +885,7 @@ msgstr "Przydziel zapasy do budowy" msgid "Auto Allocate" msgstr "Automatyczne przypisywanie" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "Cofnij przydział zapasów" @@ -893,8 +899,8 @@ msgstr "Zamów wymagane komponenty" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "Zamów części" @@ -912,23 +918,52 @@ msgstr "" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "Numer Seryjny" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "Załączniki" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "Edytuj załącznik" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "Usuń załącznik" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "Przydziel automatycznie zapasy" @@ -977,7 +1012,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "Widok administratora" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "Zaległe" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "Postęp" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "Zamówienie zakupu" @@ -1183,10 +1218,10 @@ msgstr "Źródło magazynu" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "Przeznaczenie" @@ -1196,14 +1231,14 @@ msgstr "Nie określono lokalizacji docelowej" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Partia" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "Utworzony" @@ -1211,7 +1246,7 @@ msgstr "Utworzony" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "Zakończone" @@ -1250,8 +1285,8 @@ msgstr "Szczegóły zlecenia budowy" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "Szczegóły" @@ -1287,7 +1322,6 @@ msgstr "Edytuj uwagi" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Zapisz" @@ -1316,7 +1350,7 @@ msgstr "Utwórz zlecenie budowy" msgid "Maximum output quantity is " msgstr "" -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "Numer seryjny już istnieje" @@ -1332,7 +1366,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "" @@ -1412,8 +1446,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "Dostępne" @@ -1429,60 +1463,35 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "Dodano załącznik" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "Edytuj załącznik" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "Załącznik zaktualizowany" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "Usuń załącznik" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "Załącznik usunięto" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "" @@ -1503,7 +1512,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "Nazwa firmy" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "Bazowy adres URL dla instancji serwera" #: common/models.py:85 +msgid "Default Currency" +msgstr "" + +#: common/models.py:86 +msgid "Default currency" +msgstr "" + +#: common/models.py:92 msgid "Download from URL" msgstr "Pobierz z adresu URL" -#: common/models.py:86 +#: common/models.py:93 msgid "Allow download of remote images and files from external URL" msgstr "Zezwól na pobieranie zewnętrznych obrazów i plików z zewnętrznego URL" -#: common/models.py:92 +#: common/models.py:99 msgid "Barcode Support" msgstr "Obsługa kodu kreskowego" -#: common/models.py:93 +#: common/models.py:100 msgid "Enable barcode scanner support" msgstr "Włącz obsługę skanera kodów" -#: common/models.py:99 +#: common/models.py:106 msgid "IPN Regex" msgstr "Wyrażenie regularne IPN" -#: common/models.py:100 +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "Zezwól na powtarzający się IPN" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "Zezwól na edycję IPN" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "Skopiuj BOM komponentu" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "Szablon" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "Złożenie" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "Komponent" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "Możliwość zakupu" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "Części są domyślnie z możliwością zakupu" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "Możliwość sprzedaży" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "Części są domyślnie z możliwością sprzedaży" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "Możliwość śledzenia" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "Części są domyślnie z możliwością śledzenia" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "Wirtualny" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "Części są domyślnie wirtualne" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" -msgstr "Tryb Debugowania" +#: common/models.py:230 +msgid "Show related parts" +msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 +msgid "Internal Prices" +msgstr "" + +#: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "Tryb Debugowania" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 msgid "Page Size" msgstr "Rozmiar strony" -#: common/models.py:238 +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "Raporty testów" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "Włącz generowanie raportów testów" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "dni" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "Grupuj według komponentu" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "Ustawienia wartości" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "Cena" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "Domyślny" @@ -1856,27 +1888,30 @@ msgstr "Domyślny" msgid "Current value" msgstr "Aktualna wartość" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "Zmień ustawienie" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "Wyślij plik" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1884,282 +1919,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" -msgstr "Waluta" - -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" +msgstr "" + +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "URL" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "URL zdjęcia" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "Cena jednostkowa" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "Cena jednostkowa" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "Wybierz producenta" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "Numer producenta" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "MPN" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "Opis firmy" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "Opis firmy" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "Strona WWW" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "Witryna internetowa firmy" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "Adres" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "Adres firmy" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "Numer telefonu" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "Numer telefonu kontaktowego" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "Adres E-Mail" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "Kontaktowy adres e-mail" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "Kontakt" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "Punkt kontaktowy" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "Łącze" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "Link do informacji o zewnętrznym przedsiębiorstwie" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "Obraz" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "jest klientem" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "Czy sprzedajesz produkty tej firmie?" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "jest dostawcą" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "Czy kupujesz przedmioty od tej firmy?" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "jest producentem" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "Czy to przedsiębiorstwo produkuje części?" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "Waluta" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "Część bazowa" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "Wybierz część" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "Producent" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "Część producenta" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "Jednostki" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "Dostawca" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "Wybierz dostawcę" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "SKU" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "Uwaga" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "koszt podstawowy" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "Opakowanie" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "Opakowanie części" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "wielokrotność" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "Firma" @@ -2173,7 +2229,7 @@ msgstr "Prześlij nowy obraz" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "" @@ -2181,7 +2237,8 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2195,15 +2252,9 @@ msgstr "" msgid "Phone" msgstr "Telefon" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2218,11 +2269,11 @@ msgstr "Nie określono strony internetowej" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "Klient" @@ -2243,7 +2294,8 @@ msgstr "Nowa część producenta" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2251,7 +2303,7 @@ msgstr "Opcje" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "Zamów części" @@ -2265,26 +2317,25 @@ msgstr "Usuń części" msgid "Delete Parts" msgstr "Usuń części" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "Nowy komponent" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "Utwórz nowy komponent" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "Now producent" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "Utwórz nowego producenta" @@ -2294,8 +2345,8 @@ msgstr "Zapasy dostawcy" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "Eksportuj" @@ -2307,26 +2358,24 @@ msgstr "Komponenty dostawcy" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "Now dostawca części" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "Nowy dostawca" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "Dodaj nowego dostawcę" @@ -2361,20 +2410,19 @@ msgstr "Szczegóły części producenta" msgid "Internal Part" msgstr "Część wewnętrzna" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "Dostawcy" @@ -2385,7 +2433,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2411,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "Usuń" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "Parametry" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "Utwórz nowego dostawcę" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2446,14 +2512,14 @@ msgstr "" msgid "Supplied Parts" msgstr "Dostarczone części" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "" @@ -2463,11 +2529,11 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "" @@ -2475,11 +2541,11 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "" @@ -2508,8 +2574,9 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "" @@ -2554,459 +2621,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "Informacja cenowa" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "Edytuj przedział cenowy" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "Edytuj przedział cenowy" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "Producenci" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "Klienci" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "Nowy klient" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "Firmy" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "Nowa firma" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "Pobierz obraz" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "Edytuj firmę" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "Utwórz nowego klienta" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "Utwórz nową firmę" - -#: company/views.py:316 -msgid "Created new company" -msgstr "Utwórz nową firmę" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "Usunięto firmę" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "Edytuj przedział cenowy" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "Nazwa etykiety" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "Opis etykiety" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "Etykieta" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "Aktywne" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "Szerokość [mm]" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "Wysokość [mm]" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "Filtry" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "Złóż zamówienie" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "Oznacz zamówienie jako zakończone" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "Anuluj zamówienie" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "Wyślij zamówienie" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "Wprowadź ilość produktów magazynowych" -#: order/models.py:102 -msgid "Order reference" -msgstr "Odniesienie zamówienia" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "Opis Zamówienia" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "Link do zewnętrznej witryny" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "Utworzony przez" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "Użytkownik lub grupa odpowiedzialna za to zamówienie" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "Notatki do zamówienia" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "Odniesienie zamówienia" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "odebrane przez" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "Data wydania" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "Data wysyłki" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "wysłane przez" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "Ilość elementów" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "Zamówienie" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "Odebrane" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "Cena zakupu" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "Cena zakupu jednostkowego" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "Cena sprzedaży" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "Jednostkowa cena sprzedaży" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "Linia" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "Komponent" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3051,16 +3060,22 @@ msgstr "Status zamówienia" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "Nowa lokalizacja" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "" @@ -3091,57 +3106,71 @@ msgstr "Notatki zamówień" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "Wiersz" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "" @@ -3150,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3197,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "Przedmioty" @@ -3221,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3239,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "Cena jednostkowa" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3287,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "Części" @@ -3337,10 +3379,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3356,69 +3402,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "Akcje" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "Numer ID" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "Przydzielono" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "Oblicz cenę" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3459,195 +3505,155 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "Wyślij zamówienie" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "Otrzymane przedmioty" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "Nie ustawiono miejsca docelowego" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "Błąd konwersji ilości na liczbę" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "Nie znaleziono ceny" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "Domyślna lokalizacja" @@ -3668,143 +3674,143 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "Format pliku" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "Wybierz format pliku wyjściowego" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "Kaskadowe" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "Poziomy" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "Część nadrzędna" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "potwierdź" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "Podczęść" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3820,362 +3826,362 @@ msgstr "Domyślne słowa kluczowe" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "Wariant" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "Opis części" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "Słowa kluczowe" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "Kategoria" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "IPN" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "Wersja" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "Minimalny stan magazynowy" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "Aktywny" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "Czy ta część jest aktywna?" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "Sprzedaj wiele" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "Nazwa testu" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "Wymagane" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "Dane" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "Wartość domyślna" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "Suma kontrolna" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "Część 1" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "Część 2" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "Wybierz powiązaną część" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4191,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "Zestawienie materiałowe" @@ -4247,7 +4245,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4263,8 +4261,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4300,7 +4298,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4341,90 +4339,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "Wszystkie części" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "Stwórz nową kategorię komponentów" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "Utwórz nową lokalizację magazynową" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4460,12 +4467,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "Parametry części" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "Duplikuj część" @@ -4489,7 +4501,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "Szczegóły części" @@ -4569,34 +4581,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4608,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4771,8 +4664,8 @@ msgstr "" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4835,7 +4728,7 @@ msgstr "" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "" @@ -4847,7 +4740,7 @@ msgstr "" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4856,10 +4749,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4894,12 +4863,98 @@ msgstr "" msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4965,220 +5020,188 @@ msgstr "" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5284,17 +5307,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5306,287 +5329,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5738,7 +5761,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "" @@ -5776,6 +5799,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5835,6 +5862,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" @@ -5883,7 +5923,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "" @@ -5923,7 +5963,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "" @@ -5956,8 +5996,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "" @@ -5965,208 +6005,188 @@ msgstr "" msgid "Stock Location QR code" msgstr "" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6195,35 +6215,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6284,12 +6308,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "" @@ -6297,23 +6321,23 @@ msgstr "" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6337,11 +6361,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "" @@ -6500,24 +6532,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6534,6 +6554,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6562,7 +6598,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6626,7 +6662,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6638,31 +6674,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6686,83 +6726,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "Edytuj firmę" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6790,6 +6854,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6830,112 +6971,102 @@ msgstr "" msgid "Select Label Template" msgstr "" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6975,11 +7106,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -6999,7 +7130,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7177,75 +7323,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7266,7 +7412,7 @@ msgid "Include locations" msgstr "" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7299,7 +7445,7 @@ msgstr "" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7371,43 +7517,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7464,10 +7618,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7484,7 +7634,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7704,35 +7854,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/ru/LC_MESSAGES/django.po b/InvenTree/locale/ru/LC_MESSAGES/django.po index 0b04ba9921..af63aef8e1 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-24 21:40\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -29,14 +29,14 @@ msgstr "Действие не указано" msgid "No matching action found" msgstr "Соответствующее действие не найдено" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "Введите дату" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "Подтвердить" @@ -72,123 +72,131 @@ msgstr "Применить тему" msgid "Select Category" msgstr "Выбрать категорию" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "Дублировать серийный номер: {n}" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "недопустимое количество" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "Пустая строка серийного номера" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "Некорректный идентификатор группы {g}" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "Повторяющийся серийный {g}" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "Серийных номеров не найдено" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "Число уникальных серийных номеров ({s}) должно соответствовать количеству ({q})" -#: InvenTree/models.py:59 stock/models.py:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "Вложения" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "Выберите файл для вложения" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "Комментарий" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "Комментарий к файлу" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "Пользователь" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "дата загрузки" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "Название" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "Описание" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "Описание (необязательно)" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "родитель" -#: InvenTree/settings.py:503 +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" +msgstr "" + +#: InvenTree/settings.py:505 msgid "English" msgstr "Английский" -#: InvenTree/settings.py:504 +#: InvenTree/settings.py:506 msgid "French" msgstr "Французский" -#: InvenTree/settings.py:505 +#: InvenTree/settings.py:507 msgid "German" msgstr "Немецкий" -#: InvenTree/settings.py:506 +#: InvenTree/settings.py:508 msgid "Polish" msgstr "Польский" -#: InvenTree/settings.py:507 +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "Турецкий" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "Срок выполнения заказа" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "Целевая дата" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "Количество" @@ -501,7 +507,7 @@ msgstr "Количество элементов для сборки" msgid "Enter quantity for build output" msgstr "Введите количество для вывода сборки" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "Серийные номера" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "Пометить сборку как завершенную" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "Расположение" @@ -544,13 +550,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "Статус" @@ -582,60 +588,60 @@ msgstr "Подтвердите отмену сборки" msgid "Select quantity of stock to allocate" msgstr "Выберите количество запасов для распределения" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "Порядок сборки" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "Порядок сборки" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "Ссылка на заказ" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 msgid "Link to external URL" msgstr "" -#: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "" @@ -879,7 +885,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "" @@ -893,8 +899,8 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "" @@ -912,23 +918,52 @@ msgstr "" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" @@ -977,7 +1012,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "" @@ -1183,10 +1218,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "" @@ -1196,14 +1231,14 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "" @@ -1211,7 +1246,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "" @@ -1250,8 +1285,8 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "" @@ -1287,7 +1322,6 @@ msgstr "" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1316,7 +1350,7 @@ msgstr "" msgid "Maximum output quantity is " msgstr "" -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "" @@ -1332,7 +1366,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "" @@ -1412,8 +1446,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "" @@ -1429,60 +1463,35 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "" @@ -1503,7 +1512,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "" #: common/models.py:85 -msgid "Download from URL" +msgid "Default Currency" msgstr "" #: common/models.py:86 -msgid "Allow download of remote images and files from external URL" +msgid "Default currency" msgstr "" #: common/models.py:92 -msgid "Barcode Support" +msgid "Download from URL" msgstr "" #: common/models.py:93 -msgid "Enable barcode scanner support" +msgid "Allow download of remote images and files from external URL" msgstr "" #: common/models.py:99 -msgid "IPN Regex" +msgid "Barcode Support" msgstr "" #: common/models.py:100 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:106 +msgid "IPN Regex" +msgstr "" + +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:230 +msgid "Show related parts" msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 +msgid "Page Size" +msgstr "" + +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "" @@ -1856,27 +1888,30 @@ msgstr "" msgid "Current value" msgstr "" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1884,282 +1919,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "" @@ -2173,7 +2229,7 @@ msgstr "" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "" @@ -2181,7 +2237,8 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2195,15 +2252,9 @@ msgstr "" msgid "Phone" msgstr "" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2218,11 +2269,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "" @@ -2243,7 +2294,8 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2251,7 +2303,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "" @@ -2265,26 +2317,25 @@ msgstr "" msgid "Delete Parts" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "" @@ -2294,8 +2345,8 @@ msgstr "" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "" @@ -2307,26 +2358,24 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "" @@ -2361,20 +2410,19 @@ msgstr "" msgid "Internal Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2385,7 +2433,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2411,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2446,14 +2512,14 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "" @@ -2463,11 +2529,11 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "" @@ -2475,11 +2541,11 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "" @@ -2508,8 +2574,9 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "" @@ -2554,459 +2621,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "" - -#: company/views.py:316 -msgid "Created new company" -msgstr "" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:102 -msgid "Order reference" -msgstr "" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3051,16 +3060,22 @@ msgstr "" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "" @@ -3091,57 +3106,71 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "" @@ -3150,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3197,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "" @@ -3221,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3239,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3287,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "" @@ -3337,10 +3379,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3356,69 +3402,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3459,195 +3505,155 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3668,143 +3674,143 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3820,362 +3826,362 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4191,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "" @@ -4247,7 +4245,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4263,8 +4261,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4300,7 +4298,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4341,90 +4339,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4460,12 +4467,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "" @@ -4489,7 +4501,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "" @@ -4569,34 +4581,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4608,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4771,8 +4664,8 @@ msgstr "" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4835,7 +4728,7 @@ msgstr "" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "" @@ -4847,7 +4740,7 @@ msgstr "" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4856,10 +4749,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4894,12 +4863,98 @@ msgstr "" msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4965,220 +5020,188 @@ msgstr "" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5284,17 +5307,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5306,287 +5329,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5738,7 +5761,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "" @@ -5776,6 +5799,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5835,6 +5862,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" @@ -5883,7 +5923,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "" @@ -5923,7 +5963,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "" @@ -5956,8 +5996,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "" @@ -5965,208 +6005,188 @@ msgstr "" msgid "Stock Location QR code" msgstr "" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6195,35 +6215,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6284,12 +6308,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "" @@ -6297,23 +6321,23 @@ msgstr "" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6337,11 +6361,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "" @@ -6500,24 +6532,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6534,6 +6554,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6562,7 +6598,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6626,7 +6662,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6638,31 +6674,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6686,83 +6726,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6790,6 +6854,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6830,112 +6971,102 @@ msgstr "" msgid "Select Label Template" msgstr "" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6975,11 +7106,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -6999,7 +7130,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7177,75 +7323,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7266,7 +7412,7 @@ msgid "Include locations" msgstr "" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7299,7 +7445,7 @@ msgstr "" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7371,43 +7517,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7464,10 +7618,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7484,7 +7634,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7704,35 +7854,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/tr/LC_MESSAGES/django.po b/InvenTree/locale/tr/LC_MESSAGES/django.po index 20d48e6e5b..4db90764bd 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-24 21:40\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -29,14 +29,14 @@ msgstr "İşlem belirtilmedi" msgid "No matching action found" msgstr "Eşleşen eylem bulunamadı" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "Tarih giriniz" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "Onay" @@ -72,123 +72,131 @@ msgstr "Temayı Uygula" msgid "Select Category" msgstr "Kategori Seçin" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "Tekrarlanan seri {n}" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "Geçersiz veri sağlandı" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "Boş seri numarası dizesi" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "Geçersiz grup: {g}" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "Tekrarlanan seri {g}" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "Seri numarası bulunamadı" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "Benzersiz seri numaralarının sayısı ({s}) girilen miktarla eşleşmeli ({q})" -#: InvenTree/models.py:59 stock/models.py:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "Ek" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "Eklenecek dosyayı seç" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "Yorum" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "Dosya yorumu" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "Kullanıcı" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "yükleme tarihi" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "Adı" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "Açıklama" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "Açıklama (isteğe bağlı)" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "üst" -#: InvenTree/settings.py:503 +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" +msgstr "" + +#: InvenTree/settings.py:505 msgid "English" msgstr "İngilizce" -#: InvenTree/settings.py:504 +#: InvenTree/settings.py:506 msgid "French" msgstr "Fransızca" -#: InvenTree/settings.py:505 +#: InvenTree/settings.py:507 msgid "German" msgstr "Almanca" -#: InvenTree/settings.py:506 +#: InvenTree/settings.py:508 msgid "Polish" msgstr "Polonyaca" -#: InvenTree/settings.py:507 +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "Türkçe" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "Emir hedef tarihi" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "Hedeflenen tarih" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 msgid "Target date for build completion. Build will be overdue after this date." msgstr "Yapım işinin tamamlanması için hedef tarih. Bu tarihten sonra yapım işi gecikmiş olacak." -#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "Miktar" @@ -501,7 +507,7 @@ msgstr "Yapılacak öge sayısı" msgid "Enter quantity for build output" msgstr "Yapım işi çıktısı için miktarını girin" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "Seri Numaraları" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "Yapım işini tamamlandı olarak işaretle" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "Konum" @@ -544,13 +550,13 @@ msgid "Location of completed parts" msgstr "Tamamlanmış parçaların konumu" #: build/forms.py:215 build/templates/build/build_base.html:138 -#: build/templates/build/detail.html:59 order/models.py:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "Durum" @@ -582,60 +588,60 @@ msgstr "Yapım işi iptalini onayla" msgid "Select quantity of stock to allocate" msgstr "Tahsis edilecek stok miktarını seçiniz" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "Yapım İşi Emri" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "Yapım İşi Emirleri" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "Yapım İşi Emri Referansı" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "Referans" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "Yapım işinin kısa açıklaması" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "Üst Yapım İşi" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "Bu yapım işinin tahsis edildiği yapım işi emri" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "Bu yapım işinin tahsis edildiği yapım işi emri" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "Parça" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "Yapım işi için parça seçin" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "Satış Emri Referansı" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "Bu yapım işinin tahsis edildiği satış emri" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "Kaynak Konum" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "Bu yapım işi için stok alınacak konumu seçin (her hangi bir stok konumundan alınması için boş bırakın)" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "Hedef Konum" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "Tamamlanmış ögelerin saklanacağı konumu seçiniz" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "Yapım İşi Miktarı" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "Yapım işi stok kalemlerinin sayısı" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "Tamamlanmış ögeler" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "Tamamlanan stok kalemlerinin sayısı" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "Yapım İşi Durumu" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "Yapım işi durum kodu" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "Sıra numarası" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "Yapım işi çıktısı için sıra numarası" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "Oluşturulma tarihi" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "Hedef tamamlama tarihi" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "Tamamlama tarihi" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "tamamlayan" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "Veren" -#: build/models.py:243 +#: build/models.py:247 msgid "User who issued this build order" msgstr "Bu yapım işi emrini veren kullanıcı" -#: build/models.py:251 build/templates/build/build_base.html:184 -#: build/templates/build/detail.html:105 order/models.py:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "Sorumlu" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "Bu yapım işi emrinden sorumlu kullanıcı" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "Harici Bağlantı" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 msgid "Link to external URL" msgstr "Harici URL'ye bağlantı" -#: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "Notlar" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "Yapım işi için ekstra notlar" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "Yapım işi çıktısı belirtilmedi" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "Yapım işi çıktısı zaten tamamlanmış" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "Yapım işi çıktısı, yapım işi emri ile eşleşmiyor" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "Yapım işi ögesi; yapım işi, stok kalemi ve kurulacak yer için benzersiz olmalıdır" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "Ana parça izlenebilir olarak işaretlendiğinden, yapım işi çıktısı için bir yapım işi ögesi belirtmelidir" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "Tahsis edilecek miktar ({n}) mevcut miktarı ({q}) geçmemeli" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "Stok kalemi fazladan tahsis edilmiş" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "Tahsis edilen miktar sıfırdan büyük olmalıdır" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "Seri numaralı stok için miktar bir olmalı" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "{p} parçasının malzeme listesindeki seçili stok kalemi bulunamadı" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "Yapım İşi" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "Yapım işi için tahsis edilen parçalar" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "Stok Kalemi" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "Kaynak stok kalemi" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "Yapım işi için tahsis edilen stok miktarı" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "Kurulduğu yer" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "Hedef stok kalemi" @@ -879,7 +885,7 @@ msgstr "Yapım işi için stok tahsis et" msgid "Auto Allocate" msgstr "Otomatik Tahsis Et" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "Stok tahsisini kaldır" @@ -893,8 +899,8 @@ msgstr "Gerekli parçaları sipariş edin" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "Parça Siparişi" @@ -912,23 +918,52 @@ msgstr "Bu yapım işi emri, herhangi bir takip edilmeyen malzeme listesi öğes #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "Seri Numara" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "Ekler" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "Ek Düzenle" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "Eki Sil" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "Stoku Otomatik Olarak Tahsis Et" @@ -977,7 +1012,7 @@ msgstr "Stok, yapım işi emri için tamamen tahsis edilemedi" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "Yönetici görünümü" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "Vadesi geçmiş" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "İlerleme" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "Sipariş Emri" @@ -1183,10 +1218,10 @@ msgstr "Stok Kaynağı" msgid "Stock can be taken from any available location." msgstr "Stok herhangi bir konumdan alınabilir." -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "Hedef" @@ -1196,14 +1231,14 @@ msgstr "Hedef konumu belirtilmedi" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "Toplu" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "Oluşturuldu" @@ -1211,7 +1246,7 @@ msgstr "Oluşturuldu" msgid "No target date set" msgstr "Hedef tarih ayarlanmadı" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "Tamamlandı" @@ -1250,8 +1285,8 @@ msgstr "Yapım İşi Emri Detayları" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "Detaylar" @@ -1287,7 +1322,6 @@ msgstr "Notları Düzenle" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "Kaydet" @@ -1316,7 +1350,7 @@ msgstr "Yapım İşi Çıktısı Oluştur" msgid "Maximum output quantity is " msgstr "Maksimum çıktı miktarı " -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "Seri numaraları zaten mevcut" @@ -1332,7 +1366,7 @@ msgstr "Yapım İşi Çıktısı Sil" msgid "Confirm unallocation of build stock" msgstr "Yapım işi stoku tahsisinin iptalini onayla" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "Onay kutusunu işaretleyin" @@ -1412,8 +1446,8 @@ msgstr "Öge stokta bulunmalı" msgid "Stock item is over-allocated" msgstr "Stok kalemi fazladan tahsis edilmiş" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "Mevcut" @@ -1429,60 +1463,35 @@ msgstr "Stok Tahsisini Düzenle" msgid "Updated Build Item" msgstr "Yapım İşi Ögesini Güncelle" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "Ek eklendi" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "Ek Düzenle" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "Ek güncellendi" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "Eki Sil" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "Eki sil" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "Desteklenmeyen dosya formatı: {ext.upper()}" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "Dosya okurken hata (geçersiz biçim)" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "Dosya okurken hata (hatalı ölçüler)" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "Dosya okurken hata (veri bozulmuş olabilir)" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "Dosya" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "Yüklenecek dosyayı seç" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "{name.title()} Dosya" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "{name} dosyasını yüklemek için seçin" @@ -1503,7 +1512,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "" #: common/models.py:85 -msgid "Download from URL" +msgid "Default Currency" msgstr "" #: common/models.py:86 -msgid "Allow download of remote images and files from external URL" -msgstr "Harici URL'den resim ve dosyaların indirilmesine izin ver" +msgid "Default currency" +msgstr "" #: common/models.py:92 -msgid "Barcode Support" +msgid "Download from URL" msgstr "" #: common/models.py:93 +msgid "Allow download of remote images and files from external URL" +msgstr "Harici URL'den resim ve dosyaların indirilmesine izin ver" + +#: common/models.py:99 +msgid "Barcode Support" +msgstr "" + +#: common/models.py:100 msgid "Enable barcode scanner support" msgstr "" -#: common/models.py:99 +#: common/models.py:106 msgid "IPN Regex" msgstr "DPN Regex" -#: common/models.py:100 +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "Parça DPN eşleştirmesi için Düzenli İfade Kalıbı (Regex)" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "Yinelenen DPN'ye İzin Ver" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "Birden çok parçanın aynı DPN'yi paylaşmasına izin ver" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "DPN Düzenlemeye İzin Ver" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "Parçayı düzenlerken DPN değiştirmeye izin ver" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "Kategori Paremetre Sablonu Kopyala" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "Parça oluştururken kategori parametre şablonlarını kopyala" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "Şablon" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "Parçaları varsayılan olan şablondur" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "Montaj" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "Parçalar varsayılan olarak başka bileşenlerden monte edilebilir" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "Bileşen" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "Parçalar varsayılan olarak alt bileşen olarak kullanılabilir" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "Satın Alınabilir" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "Parçalar varsayılan olarak satın alınabilir" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "Satılabilir" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "Parçalar varsayılan olarak satılabilir" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "Takip Edilebilir" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "Parçalar varsayılan olarak takip edilebilir" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "Sanal" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "Parçalar varsayılan olarak sanaldır" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:230 +msgid "Show related parts" msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 +msgid "Page Size" +msgstr "" + +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "Stok konumu ve ögeler üzerinde sahiplik kontrolünü etkinleştirin" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "" @@ -1856,27 +1888,30 @@ msgstr "" msgid "Current value" msgstr "" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "Dosya Yükle" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1884,282 +1919,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "Atanan Stok" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "" @@ -2173,7 +2229,7 @@ msgstr "" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "Satın Alma Emri Oluştur" @@ -2181,7 +2237,8 @@ msgstr "Satın Alma Emri Oluştur" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2195,15 +2252,9 @@ msgstr "" msgid "Phone" msgstr "" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2218,11 +2269,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "Müşteri" @@ -2243,7 +2294,8 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2251,7 +2303,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "" @@ -2265,26 +2317,25 @@ msgstr "Parçaları sil" msgid "Delete Parts" msgstr "Parçaları Sil" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "" @@ -2294,8 +2345,8 @@ msgstr "Tedarikçi Stoku" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "" @@ -2307,26 +2358,24 @@ msgstr "Tedarikçi Parçaları" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" msgstr "Yeni tedarikçi parçası oluştur" #: company/templates/company/detail_supplier_part.html:22 #: company/templates/company/manufacturer_part_suppliers.html:17 -#: order/templates/order/purchase_order_detail.html:49 -#: part/templates/part/supplier.html:17 templates/js/stock.js:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "Yeni Tedarikçi Parçası" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "" @@ -2361,20 +2410,19 @@ msgstr "" msgid "Internal Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" -msgstr "Bu üretici parçası için tanımlanmış %(count)s tedarikçi bulunmaktadır. Bunu silerseniz, aşağıdaki tedarikçi parçaları da silinecektir:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" +msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2385,7 +2433,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2411,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "Tedarikçi parçalarını sil" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2446,14 +2512,14 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "Stok Kalemleri" @@ -2463,11 +2529,11 @@ msgstr "Stok Kalemleri" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "Satış Emirleri" @@ -2475,11 +2541,11 @@ msgstr "Satış Emirleri" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "Satın Alma Emirleri" @@ -2508,8 +2574,9 @@ msgid "New Sales Order" msgstr "Yeni Satış Emri" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "Tedarikçi Parçası" @@ -2554,459 +2621,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "Sağlanan URL geçerli bir resim dosyası değil" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "" - -#: company/views.py:316 -msgid "Created new company" -msgstr "" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "Şablon için geçerli bir nesne sağlanmadı" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "Etiket adı" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "Etiket tanımı" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "Etiket" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "Etiket şablon listesi" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "Etiket sablonu etkinleştirildi" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "Etiket genişliği mm olarak belirtilmeli" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "Etiket yüksekliği mm olarak belirtilmeli" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "Dosya Adı Deseni" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "Etiket dosya adları oluşturma için desen" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "Parçaları bu konuma alın" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "Stok kalemi seri numaları girin" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:102 -msgid "Order reference" -msgstr "" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "Tahsis miktarı stok miktarını aşamaz" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "Seri numaralı stok kalemi için miktar bir olmalı" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "Stok tahsis miktarını girin" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3051,16 +3060,22 @@ msgstr "" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "Yeni Konum" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "Yeni stok konumu oluştur" @@ -3091,57 +3106,71 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "Aşağıdaki gerekli sütunlar için eksik seçimler" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "Dosya Alanları" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "Tedarikçi Parçası Seçin" @@ -3150,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "Sipariş Emri için Dosya Yükle" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3197,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "" @@ -3221,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3239,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3287,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "Parçalar" @@ -3337,10 +3379,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3356,69 +3402,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "İşlemler" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "Stok tahsisini düzenle" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "Stok tahsisini sil" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "Seri numaralarını tahsis et" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3459,195 +3505,155 @@ msgstr "Bu işlem Sipariş Emrinden belirtilen stok kalemleri tahsis edemedi" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "Seri Numaralarını Tahsis Et" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "{serial} seri numarası için eşleşen öge bulunamadı" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "{serial} stokta yok" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "{serial} zaten bir emirde tahsis edilmiş" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "Tahsis Miktarını Düzenle" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "Tahsisi Sil" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "Varsayılan Konum" @@ -3668,143 +3674,143 @@ msgstr "Malzeme listesi okurken hata (geçersiz data)" msgid "Error reading BOM file (incorrect row size)" msgstr "Malzeme listesi okurken hata (geçersiz satır boyutu)" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "Dosya Biçimi" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "Çıktı dosyası biçimi seçin" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "Dışa aktarılan malzeme listesine parça tedarikçisi verilerini dahil edin" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "Malzeme Listesi Dosyası" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "Yüklemek için Malzeme Listesi dosyası seçin" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "Kategori parametre şablonlarını dahil et" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "Üst kategorilerin parametre şablonlarını dahil et" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "Parametre şablonunu aynı seviyedeki kategorilere ekle" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "Parametre şablonunu tüm kategorilere ekle" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3820,362 +3826,362 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "Parça Kategorileri" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "Sonraki kullanılabilir seri numaraları" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "Sonraki müsait seri numarası" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "En son seri numarası" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "Yinelenen DPN'ye parça ayarlarında izin verilmiyor" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "Şablon Mu" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "Bu parça bir şablon parçası mı?" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "Bu parça başka bir parçanın çeşidi mi?" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "Çeşidi" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "DPN" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "Parça revizyon veya versiyon numarası" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "Revizyon" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "Varsayılan tedarikçi parçası" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "Bu parça diğer parçalardan yapılabilir mi?" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "Bu parça diğer parçaların yapımında kullanılabilir mi?" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "Bu parça dış tedarikçilerden satın alınabilir mi?" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "Bu parça müşterilere satılabilir mi?" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "Test şablonları sadece takip edilebilir paçalar için oluşturulabilir" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "Gerekli" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "Testi geçmesi için bu gerekli mi?" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "Parametre şablon adı benzersiz olmalıdır" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "Parametre Şablonu" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "Bu malzeme listesi, çeşit parçalar listesini kalıtsalıdır" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "Çeşide İzin Ver" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "Çeşit parçaların stok kalemleri bu malzeme listesinde kullanılabilir" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4191,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "" @@ -4247,7 +4245,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4263,8 +4261,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4300,7 +4298,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4341,90 +4339,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "Kategori Detayları" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "Alt kategoriler" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "Parçalar (Alt kategoriler dahil)" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "Kategori ayarla" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "Kategori Ayarla" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "Yeni konum oluştur" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "Yeni Stok konumu oluştur" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4460,12 +4467,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "" @@ -4489,7 +4501,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "" @@ -4569,34 +4581,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4608,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "Parça Çeşitleri" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "Çeşitler" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "Tahsisler" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "Parça Test Şablonları" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4771,8 +4664,8 @@ msgstr "Yeni Parametre Şablonu Oluştur" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4835,7 +4728,7 @@ msgstr "Bu parça %(link)s parçasının bir çeşididir" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "Yapım İşi Emirleri için Gerekli" @@ -4847,7 +4740,7 @@ msgstr "Satış Emirleri için Gerekli" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4856,10 +4749,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "Test Şablonu Ekle" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4894,12 +4863,98 @@ msgstr "Bu parçası için tanımlanmış %(count)s tedarikçi bulunmaktadır. B msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4965,220 +5020,188 @@ msgstr "Yeni Çeşit" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "Test Şablonu Oluştur" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "Test Şablonu Düzenle" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "Test Şablonu Sil" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "Çeşit Oluştur" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "Parça Parametre Şablonu Oluştur" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "Parça Parametre Şablonu Düzenle" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "Parça Parametre Şablonu Sil" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "Kategori Parametre Şablonu Oluştur" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "Kategori Parametre Şablonu Düzenle" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "Kategori Parametre Şablonu Sil" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5284,17 +5307,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5306,287 +5329,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "{n} öge için stok güncellendi" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "Bu stok kalemi için son kullanma tarihi" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "Benzersiz seri numaraları giriniz (veya boş bırakınız)" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "Seri numaralandırılmış stok için hedef konum(varsayılan olarak, geçerli konumda kalacaktır)" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "Seri numaraları" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "Benzersiz seri numaraları (miktar ile eşleşmeli)" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "İşlem notu ekle (isteğe bağlı)" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "Test raporu şablonu seç" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "Alt konumları dahil et" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "Stok kalemlerine alt konumları dahil et" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "Kurulacak stok kalemi" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "Atanacak stok miktarı" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "Sökülen ögeler için hedef konum" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "Kurulu stok kalemlerinin kaldırılmasını onayla" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "Hedef stok konumu" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "Not ekle (gerekli)" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "Stok ayarlamasını onayla" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "Stok kalemlerinin hareketini onaylayın" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "Varsayılan Konum Ayarla" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "Hedefi seçili parçalar için varsayılan konum olarak ayarla" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "Bu seri numarasına sahip stok kalemi zaten var" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "Seri numarası olan ögenin miktarı bir olmalı" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "Miktar birden büyük ise seri numarası ayarlanamaz" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "Üst Stok Kalemi" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "Bu stok kalemi için tedarikçi parçası seçin" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "Stok Konumu" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "Bu öge için seri numarası" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "Seri numaraları tam sayı listesi olmalı" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "Miktar seri numaları ile eşleşmiyor" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "Seri numaraları zaten mevcut: {exists}" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "Stok kalemi stokta olmadığı için taşınamaz" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5738,7 +5761,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "Konum ayarlanmadı" @@ -5776,6 +5799,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5835,6 +5862,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "Bu konumun sahipleri listesinde değilsiniz. Bu stok konumu düzenlenemez." @@ -5883,7 +5923,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "Stok Konumları" @@ -5923,7 +5963,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "Stok Kalemine Dönüştür" @@ -5956,8 +5996,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "Stok konumunu düzenle" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "Sahip gerekli (sahip kontrolü etkinleştirildi)" @@ -5965,208 +6005,188 @@ msgstr "Sahip gerekli (sahip kontrolü etkinleştirildi)" msgid "Stock Location QR code" msgstr "Stok Konumu QR Kodu" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "Geçerli bir konum belirtiniz" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "Herhangi bir işlem gerçekleştirilmedi" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "Stoku Seri Numarala" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "Stok Konumunu Sil" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6195,35 +6215,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6284,12 +6308,12 @@ msgid "No category parameter templates found" msgstr "Kategori parametre şablonu bulunamadı" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "Şablonu Düzenle" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "Şablonu Sil" @@ -6297,23 +6321,23 @@ msgstr "Şablonu Sil" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6337,11 +6361,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "Parça Parametre Şablonu" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "Parça parametre şablonu bulunamadı" @@ -6500,24 +6532,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6534,6 +6554,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6562,7 +6598,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6626,7 +6662,7 @@ msgstr "Konuma Kaydet" msgid "Barcode does not match a valid location" msgstr "Barkod geçerli bir konumla eşleşmiyor" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6638,31 +6674,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6686,83 +6726,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "Gerekli Parça" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "Şablon Parça" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6790,6 +6854,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "Bu fonksiyona erişmek için gerekli izinlere sahip değilsiniz" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6830,112 +6971,102 @@ msgstr "Etiket Seç" msgid "Select Label Template" msgstr "Etiket Şablonu Seç" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" -msgstr "Bu fonksiyona erişmek için gerekli izinlere sahip değilsiniz" - -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6975,11 +7106,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -6999,7 +7130,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7177,75 +7323,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "Konum artık yok" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "Yeni Konum Oluştur" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "Seri No" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7266,7 +7412,7 @@ msgid "Include locations" msgstr "Konumları dahil et" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7299,7 +7445,7 @@ msgstr "Seri numarası" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7371,43 +7517,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "Alt kategorilerdeki parçaları dahil et" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "DPN Var" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7464,10 +7618,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7484,7 +7634,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7704,35 +7854,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/locale/zh/LC_MESSAGES/django.po b/InvenTree/locale/zh/LC_MESSAGES/django.po index 34dbe857dc..a5b51e77ec 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-24 21:38+0000\n" -"PO-Revision-Date: 2021-06-24 21:40\n" +"POT-Creation-Date: 2021-07-03 12:15+0000\n" +"PO-Revision-Date: 2021-07-03 12:44\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -29,14 +29,14 @@ msgstr "未指定操作" msgid "No matching action found" msgstr "未找到指定操作" -#: InvenTree/fields.py:44 +#: InvenTree/fields.py:99 msgid "Enter date" msgstr "输入日期" #: InvenTree/forms.py:112 build/forms.py:102 build/forms.py:123 #: build/forms.py:145 build/forms.py:169 build/forms.py:185 build/forms.py:227 -#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60 -#: order/forms.py:71 part/forms.py:134 +#: order/forms.py:30 order/forms.py:41 order/forms.py:52 order/forms.py:63 +#: order/forms.py:74 part/forms.py:118 templates/js/forms.js:486 msgid "Confirm" msgstr "确认" @@ -72,123 +72,131 @@ msgstr "应用主题" msgid "Select Category" msgstr "选择分类" -#: InvenTree/helpers.py:377 +#: InvenTree/helpers.py:396 #, python-brace-format msgid "Duplicate serial: {n}" msgstr "" -#: InvenTree/helpers.py:384 order/models.py:248 order/models.py:358 -#: stock/views.py:1795 +#: InvenTree/helpers.py:403 order/models.py:311 order/models.py:421 +#: stock/views.py:1627 msgid "Invalid quantity provided" msgstr "" -#: InvenTree/helpers.py:387 +#: InvenTree/helpers.py:406 msgid "Empty serial number string" msgstr "" -#: InvenTree/helpers.py:409 InvenTree/helpers.py:412 InvenTree/helpers.py:415 -#: InvenTree/helpers.py:440 +#: InvenTree/helpers.py:428 InvenTree/helpers.py:431 InvenTree/helpers.py:434 +#: InvenTree/helpers.py:459 #, python-brace-format msgid "Invalid group: {g}" msgstr "" -#: InvenTree/helpers.py:445 +#: InvenTree/helpers.py:464 #, python-brace-format msgid "Duplicate serial: {g}" msgstr "" -#: InvenTree/helpers.py:453 +#: InvenTree/helpers.py:472 msgid "No serial numbers found" msgstr "未找到序列号" -#: InvenTree/helpers.py:457 +#: InvenTree/helpers.py:476 #, python-brace-format msgid "Number of unique serial number ({s}) must match quantity ({q})" msgstr "" -#: InvenTree/models.py:59 stock/models.py:1763 +#: InvenTree/models.py:61 stock/models.py:1778 msgid "Attachment" msgstr "附件" -#: InvenTree/models.py:60 +#: InvenTree/models.py:62 msgid "Select file to attach" msgstr "选择附件" -#: InvenTree/models.py:62 templates/attachment_table.html:16 +#: InvenTree/models.py:64 templates/js/attachment.js:52 msgid "Comment" msgstr "注释" -#: InvenTree/models.py:62 +#: InvenTree/models.py:64 msgid "File comment" msgstr "文件注释" -#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:2022 +#: InvenTree/models.py:70 InvenTree/models.py:71 part/models.py:2043 #: report/templates/report/inventree_test_report_base.html:91 -#: templates/js/stock.js:1179 +#: templates/js/stock.js:1193 msgid "User" msgstr "用户" -#: InvenTree/models.py:72 +#: InvenTree/models.py:74 msgid "upload date" msgstr "上传日期" -#: InvenTree/models.py:107 InvenTree/models.py:108 company/models.py:396 -#: label/models.py:102 part/models.py:671 part/models.py:2163 +#: InvenTree/models.py:102 +msgid "Invalid choice" +msgstr "" + +#: InvenTree/models.py:118 InvenTree/models.py:119 company/models.py:414 +#: label/models.py:103 part/models.py:680 part/models.py:2192 #: part/templates/part/params.html:27 report/models.py:180 #: templates/InvenTree/search.html:137 templates/InvenTree/search.html:289 -#: templates/js/company.js:235 templates/js/part.js:118 -#: templates/js/part.js:642 templates/js/stock.js:972 +#: templates/js/company.js:359 templates/js/part.js:118 +#: templates/js/part.js:642 templates/js/stock.js:986 msgid "Name" msgstr "名称" -#: InvenTree/models.py:114 build/models.py:135 -#: build/templates/build/detail.html:21 company/models.py:339 -#: company/models.py:532 company/templates/company/detail.html:27 +#: InvenTree/models.py:125 build/models.py:139 +#: build/templates/build/detail.html:21 company/models.py:353 +#: company/models.py:554 company/templates/company/detail.html:27 #: company/templates/company/manufacturer_part_base.html:72 #: company/templates/company/supplier_part_base.html:71 -#: company/templates/company/supplier_part_detail.html:31 label/models.py:109 -#: order/models.py:104 order/templates/order/purchase_order_detail.html:147 -#: part/models.py:695 part/templates/part/detail.html:54 +#: company/templates/company/supplier_part_detail.html:31 label/models.py:110 +#: order/models.py:154 order/templates/order/purchase_order_detail.html:174 +#: part/models.py:704 part/templates/part/detail.html:54 #: part/templates/part/set_category.html:14 report/models.py:193 #: report/models.py:530 report/models.py:569 #: report/templates/report/inventree_build_order_base.html:118 #: templates/InvenTree/search.html:144 templates/InvenTree/search.html:224 #: templates/InvenTree/search.html:296 #: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190 -#: templates/js/build.js:833 templates/js/build.js:1101 -#: templates/js/company.js:56 templates/js/order.js:183 -#: templates/js/order.js:280 templates/js/part.js:177 templates/js/part.js:260 +#: templates/js/build.js:834 templates/js/build.js:1102 +#: templates/js/company.js:125 templates/js/order.js:245 +#: templates/js/order.js:347 templates/js/part.js:177 templates/js/part.js:260 #: templates/js/part.js:437 templates/js/part.js:654 templates/js/part.js:722 -#: templates/js/stock.js:557 templates/js/stock.js:984 -#: templates/js/stock.js:1029 +#: templates/js/stock.js:557 templates/js/stock.js:998 +#: templates/js/stock.js:1043 msgid "Description" msgstr "" -#: InvenTree/models.py:115 +#: InvenTree/models.py:126 msgid "Description (optional)" msgstr "" -#: InvenTree/models.py:123 +#: InvenTree/models.py:134 msgid "parent" msgstr "" -#: InvenTree/settings.py:503 -msgid "English" -msgstr "" - -#: InvenTree/settings.py:504 -msgid "French" +#: InvenTree/serializers.py:52 +msgid "Must be a valid number" msgstr "" #: InvenTree/settings.py:505 -msgid "German" +msgid "English" msgstr "" #: InvenTree/settings.py:506 -msgid "Polish" +msgid "French" msgstr "" #: InvenTree/settings.py:507 +msgid "German" +msgstr "" + +#: InvenTree/settings.py:508 +msgid "Polish" +msgstr "" + +#: InvenTree/settings.py:509 msgid "Turkish" msgstr "" @@ -446,50 +454,48 @@ msgid "Order target date" msgstr "" #: build/forms.py:42 build/templates/build/build_base.html:146 -#: build/templates/build/detail.html:121 order/forms.py:114 order/forms.py:149 +#: build/templates/build/detail.html:121 #: order/templates/order/order_base.html:124 #: order/templates/order/sales_order_base.html:119 #: report/templates/report/inventree_build_order_base.html:126 -#: templates/js/build.js:880 templates/js/order.js:200 -#: templates/js/order.js:298 +#: templates/js/build.js:881 templates/js/order.js:262 +#: templates/js/order.js:365 msgid "Target Date" msgstr "" -#: build/forms.py:43 build/models.py:225 +#: build/forms.py:43 build/models.py:229 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:1346 +#: build/forms.py:48 build/forms.py:90 build/forms.py:266 build/models.py:1354 #: 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:720 -#: company/forms.py:191 company/templates/company/supplier_part_pricing.html:77 -#: order/forms.py:193 order/forms.py:211 order/forms.py:246 order/forms.py:268 -#: order/forms.py:285 order/models.py:617 order/models.py:841 -#: order/templates/order/order_wizard/match_parts.html:29 +#: build/templates/build/detail.html:31 common/models.py:741 +#: company/forms.py:124 company/templates/company/supplier_part_pricing.html:79 +#: order/forms.py:120 order/forms.py:142 order/forms.py:159 order/models.py:702 +#: order/models.py:941 order/templates/order/order_wizard/match_parts.html:30 #: order/templates/order/order_wizard/select_parts.html:34 -#: order/templates/order/purchase_order_detail.html:179 -#: order/templates/order/sales_order_detail.html:70 -#: order/templates/order/sales_order_detail.html:77 -#: order/templates/order/sales_order_detail.html:162 -#: order/templates/order/sales_order_detail.html:234 part/forms.py:342 -#: part/forms.py:372 part/forms.py:388 part/forms.py:404 part/models.py:2293 -#: part/templates/part/internal_prices.html:98 -#: part/templates/part/order_prices.html:202 -#: part/templates/part/part_pricing.html:16 -#: part/templates/part/sale_prices.html:85 +#: order/templates/order/purchase_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:80 +#: order/templates/order/sales_order_detail.html:87 +#: order/templates/order/sales_order_detail.html:172 +#: order/templates/order/sales_order_detail.html:244 part/forms.py:314 +#: part/forms.py:344 part/forms.py:360 part/forms.py:376 part/models.py:2330 +#: part/templates/part/part_pricing.html:16 part/templates/part/prices.html:377 +#: part/templates/part/prices.html:474 #: report/templates/report/inventree_build_order_base.html:114 #: report/templates/report/inventree_po_report.html:91 #: report/templates/report/inventree_so_report.html:91 #: report/templates/report/inventree_test_report_base.html:77 -#: stock/forms.py:175 stock/forms.py:308 +#: stock/forms.py:142 stock/forms.py:275 #: 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:233 templates/js/build.js:571 -#: templates/js/build.js:1111 templates/js/order.js:393 -#: templates/js/part.js:796 templates/js/stock.js:1164 -#: templates/js/stock.js:1383 +#: templates/js/bom.js:205 templates/js/build.js:233 templates/js/build.js:572 +#: templates/js/build.js:1112 templates/js/model_renderers.js:43 +#: templates/js/order.js:460 templates/js/part.js:827 templates/js/part.js:949 +#: templates/js/part.js:1005 templates/js/stock.js:1178 +#: templates/js/stock.js:1397 msgid "Quantity" msgstr "" @@ -501,7 +507,7 @@ msgstr "" msgid "Enter quantity for build output" msgstr "" -#: build/forms.py:95 order/forms.py:240 stock/forms.py:118 +#: build/forms.py:95 order/forms.py:114 stock/forms.py:85 msgid "Serial Numbers" msgstr "" @@ -530,12 +536,12 @@ msgid "Mark build as complete" msgstr "" #: build/forms.py:210 build/templates/build/auto_allocate.html:18 -#: stock/forms.py:347 stock/templates/stock/item_base.html:285 +#: stock/forms.py:314 stock/templates/stock/item_base.html:285 #: stock/templates/stock/stock_adjust.html:17 #: templates/InvenTree/search.html:260 templates/js/barcode.js:363 #: templates/js/barcode.js:531 templates/js/build.js:218 -#: templates/js/build.js:585 templates/js/order.js:378 -#: templates/js/stock.js:643 templates/js/stock.js:1056 +#: templates/js/build.js:586 templates/js/order.js:445 +#: templates/js/stock.js:643 templates/js/stock.js:1070 msgid "Location" msgstr "" @@ -544,13 +550,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:469 +#: build/templates/build/detail.html:59 order/models.py:545 #: order/templates/order/receive_parts.html:24 #: stock/templates/stock/item_base.html:408 templates/InvenTree/search.html:252 -#: templates/js/barcode.js:119 templates/js/build.js:867 -#: templates/js/order.js:187 templates/js/order.js:285 -#: templates/js/stock.js:630 templates/js/stock.js:1133 -#: templates/js/stock.js:1399 +#: templates/js/barcode.js:119 templates/js/build.js:868 +#: templates/js/order.js:249 templates/js/order.js:352 +#: templates/js/stock.js:630 templates/js/stock.js:1147 +#: templates/js/stock.js:1413 msgid "Status" msgstr "" @@ -582,60 +588,60 @@ msgstr "" msgid "Select quantity of stock to allocate" msgstr "" -#: build/models.py:66 build/templates/build/build_base.html:9 +#: build/models.py:70 build/templates/build/build_base.html:9 #: build/templates/build/build_base.html:73 #: report/templates/report/inventree_build_order_base.html:106 #: templates/js/build.js:195 msgid "Build Order" msgstr "" -#: build/models.py:67 build/templates/build/index.html:8 +#: build/models.py:71 build/templates/build/index.html:8 #: build/templates/build/index.html:15 order/templates/order/so_builds.html:12 #: order/templates/order/so_navbar.html:19 -#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:57 -#: part/templates/part/navbar.html:60 templates/InvenTree/index.html:183 +#: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:58 +#: part/templates/part/navbar.html:61 templates/InvenTree/index.html:191 #: templates/InvenTree/search.html:185 -#: templates/InvenTree/settings/tabs.html:34 users/models.py:43 +#: templates/InvenTree/settings/tabs.html:34 users/models.py:44 msgid "Build Orders" msgstr "" -#: build/models.py:127 +#: build/models.py:131 msgid "Build Order Reference" msgstr "" -#: build/models.py:128 order/models.py:102 order/models.py:619 -#: order/templates/order/purchase_order_detail.html:174 -#: order/templates/order/sales_order_detail.html:229 part/models.py:2302 +#: build/models.py:132 order/models.py:242 order/models.py:529 +#: order/models.py:709 order/templates/order/purchase_order_detail.html:201 +#: order/templates/order/sales_order_detail.html:239 part/models.py:2339 #: report/templates/report/inventree_po_report.html:92 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197 -#: templates/js/build.js:660 templates/js/build.js:1105 +#: templates/js/build.js:661 templates/js/build.js:1106 msgid "Reference" msgstr "" -#: build/models.py:138 +#: build/models.py:142 msgid "Brief description of the build" msgstr "" -#: build/models.py:147 build/templates/build/build_base.html:163 +#: build/models.py:151 build/templates/build/build_base.html:163 #: build/templates/build/detail.html:77 msgid "Parent Build" msgstr "" -#: build/models.py:148 +#: build/models.py:152 msgid "BuildOrder to which this build is allocated" msgstr "" -#: build/models.py:153 build/templates/build/auto_allocate.html:16 +#: build/models.py:157 build/templates/build/auto_allocate.html:16 #: build/templates/build/build_base.html:128 -#: build/templates/build/detail.html:26 company/models.py:663 -#: order/models.py:661 order/models.py:717 +#: build/templates/build/detail.html:26 company/models.py:689 +#: order/models.py:755 order/models.py:814 #: order/templates/order/order_wizard/select_parts.html:32 -#: order/templates/order/purchase_order_detail.html:132 +#: order/templates/order/purchase_order_detail.html:159 #: order/templates/order/receive_parts.html:19 -#: order/templates/order/sales_order_detail.html:214 part/models.py:321 -#: part/models.py:1975 part/models.py:1987 part/models.py:2002 -#: part/models.py:2020 part/models.py:2095 part/models.py:2191 -#: part/models.py:2277 part/templates/part/part_app_base.html:8 +#: order/templates/order/sales_order_detail.html:224 part/models.py:325 +#: part/models.py:1988 part/models.py:2004 part/models.py:2023 +#: part/models.py:2041 part/models.py:2120 part/models.py:2224 +#: part/models.py:2314 part/templates/part/part_app_base.html:8 #: part/templates/part/part_pricing.html:12 part/templates/part/related.html:29 #: part/templates/part/set_category.html:13 #: report/templates/report/inventree_build_order_base.html:110 @@ -643,223 +649,223 @@ msgstr "" #: report/templates/report/inventree_so_report.html:90 #: templates/InvenTree/search.html:112 templates/InvenTree/search.html:210 #: templates/js/barcode.js:362 templates/js/bom.js:163 -#: templates/js/build.js:551 templates/js/build.js:838 -#: templates/js/build.js:1078 templates/js/company.js:140 -#: templates/js/company.js:339 templates/js/part.js:241 +#: templates/js/build.js:552 templates/js/build.js:839 +#: templates/js/build.js:1079 templates/js/company.js:264 +#: templates/js/company.js:464 templates/js/part.js:241 #: templates/js/part.js:404 templates/js/stock.js:526 -#: templates/js/stock.js:1371 +#: templates/js/stock.js:1385 msgid "Part" msgstr "" -#: build/models.py:161 +#: build/models.py:165 msgid "Select part to build" msgstr "" -#: build/models.py:166 +#: build/models.py:170 msgid "Sales Order Reference" msgstr "" -#: build/models.py:170 +#: build/models.py:174 msgid "SalesOrder to which this build is allocated" msgstr "" -#: build/models.py:175 +#: build/models.py:179 msgid "Source Location" msgstr "" -#: build/models.py:179 +#: build/models.py:183 msgid "Select location to take stock from for this build (leave blank to take from any stock location)" msgstr "" -#: build/models.py:184 +#: build/models.py:188 msgid "Destination Location" msgstr "" -#: build/models.py:188 +#: build/models.py:192 msgid "Select location where the completed items will be stored" msgstr "" -#: build/models.py:192 +#: build/models.py:196 msgid "Build Quantity" msgstr "" -#: build/models.py:195 +#: build/models.py:199 msgid "Number of stock items to build" msgstr "" -#: build/models.py:199 +#: build/models.py:203 msgid "Completed items" msgstr "" -#: build/models.py:201 +#: build/models.py:205 msgid "Number of stock items which have been completed" msgstr "" -#: build/models.py:205 part/templates/part/part_base.html:167 +#: build/models.py:209 part/templates/part/part_base.html:167 msgid "Build Status" msgstr "" -#: build/models.py:209 +#: build/models.py:213 msgid "Build status code" msgstr "" -#: build/models.py:213 stock/models.py:466 +#: build/models.py:217 stock/models.py:470 msgid "Batch Code" msgstr "" -#: build/models.py:217 +#: build/models.py:221 msgid "Batch code for this build output" msgstr "" -#: build/models.py:220 order/models.py:108 part/models.py:867 -#: part/templates/part/detail.html:126 templates/js/order.js:293 +#: build/models.py:224 order/models.py:158 part/models.py:876 +#: part/templates/part/detail.html:126 templates/js/order.js:360 msgid "Creation Date" msgstr "" -#: build/models.py:224 order/models.py:475 +#: build/models.py:228 order/models.py:551 msgid "Target completion date" msgstr "" -#: build/models.py:228 order/models.py:221 templates/js/build.js:885 +#: build/models.py:232 order/models.py:284 templates/js/build.js:886 msgid "Completion Date" msgstr "" -#: build/models.py:234 +#: build/models.py:238 msgid "completed by" msgstr "" -#: build/models.py:242 +#: build/models.py:246 msgid "Issued by" msgstr "" -#: build/models.py:243 +#: build/models.py:247 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:122 +#: build/models.py:255 build/templates/build/build_base.html:184 +#: build/templates/build/detail.html:105 order/models.py:172 #: order/templates/order/order_base.html:138 -#: order/templates/order/sales_order_base.html:140 part/models.py:871 +#: order/templates/order/sales_order_base.html:140 part/models.py:880 #: report/templates/report/inventree_build_order_base.html:159 msgid "Responsible" msgstr "" -#: build/models.py:252 +#: build/models.py:256 msgid "User responsible for this build order" msgstr "" -#: build/models.py:257 build/templates/build/detail.html:91 +#: build/models.py:261 build/templates/build/detail.html:91 #: company/templates/company/manufacturer_part_base.html:79 #: company/templates/company/manufacturer_part_detail.html:28 #: 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:460 stock/templates/stock/item_base.html:345 +#: stock/models.py:464 stock/templates/stock/item_base.html:345 msgid "External Link" msgstr "" -#: build/models.py:258 part/models.py:729 stock/models.py:462 +#: build/models.py:262 part/models.py:738 stock/models.py:466 msgid "Link to external URL" msgstr "" -#: build/models.py:262 build/templates/build/navbar.html:53 -#: company/models.py:132 company/models.py:539 +#: build/models.py:266 build/templates/build/navbar.html:53 +#: company/models.py:141 company/models.py:561 #: company/templates/company/navbar.html:70 -#: company/templates/company/navbar.html:73 order/models.py:126 -#: order/models.py:621 order/templates/order/po_navbar.html:38 +#: company/templates/company/navbar.html:73 order/models.py:176 +#: order/models.py:711 order/templates/order/po_navbar.html:38 #: order/templates/order/po_navbar.html:41 -#: order/templates/order/purchase_order_detail.html:243 -#: order/templates/order/sales_order_detail.html:309 +#: order/templates/order/purchase_order_detail.html:270 +#: order/templates/order/sales_order_detail.html:319 #: order/templates/order/so_navbar.html:33 -#: order/templates/order/so_navbar.html:36 part/models.py:856 -#: part/templates/part/navbar.html:142 +#: order/templates/order/so_navbar.html:36 part/models.py:865 +#: part/templates/part/navbar.html:133 #: report/templates/report/inventree_build_order_base.html:173 -#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377 -#: stock/models.py:532 stock/models.py:1667 stock/models.py:1769 +#: stock/forms.py:140 stock/forms.py:284 stock/forms.py:316 stock/forms.py:344 +#: stock/models.py:536 stock/models.py:1678 stock/models.py:1784 #: 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:699 +#: templates/js/bom.js:349 templates/js/stock.js:141 templates/js/stock.js:713 msgid "Notes" msgstr "" -#: build/models.py:263 +#: build/models.py:267 msgid "Extra build notes" msgstr "" -#: build/models.py:740 +#: build/models.py:744 msgid "No build output specified" msgstr "" -#: build/models.py:743 +#: build/models.py:747 msgid "Build output is already completed" msgstr "" -#: build/models.py:746 +#: build/models.py:750 msgid "Build output does not match Build Order" msgstr "" -#: build/models.py:1152 +#: build/models.py:1160 msgid "BuildItem must be unique for build, stock_item and install_into" msgstr "" -#: build/models.py:1177 +#: build/models.py:1185 msgid "Build item must specify a build output, as master part is marked as trackable" msgstr "" -#: build/models.py:1181 +#: build/models.py:1189 #, python-brace-format msgid "Allocated quantity ({n}) must not exceed available quantity ({q})" msgstr "" -#: build/models.py:1188 order/models.py:815 +#: build/models.py:1196 order/models.py:915 msgid "StockItem is over-allocated" msgstr "" -#: build/models.py:1192 order/models.py:818 +#: build/models.py:1200 order/models.py:918 msgid "Allocation quantity must be greater than zero" msgstr "" -#: build/models.py:1196 +#: build/models.py:1204 msgid "Quantity must be 1 for serialized stock" msgstr "" -#: build/models.py:1256 +#: build/models.py:1264 #, python-brace-format msgid "Selected stock item not found in BOM for part '{p}'" msgstr "" -#: build/models.py:1316 stock/templates/stock/item_base.html:317 -#: templates/InvenTree/search.html:183 templates/js/build.js:811 +#: build/models.py:1324 stock/templates/stock/item_base.html:317 +#: templates/InvenTree/search.html:183 templates/js/build.js:812 #: templates/navbar.html:29 msgid "Build" msgstr "" -#: build/models.py:1317 +#: build/models.py:1325 msgid "Build to allocate parts" msgstr "" -#: build/models.py:1333 stock/templates/stock/item_base.html:8 +#: build/models.py:1341 stock/templates/stock/item_base.html:8 #: stock/templates/stock/item_base.html:31 #: stock/templates/stock/item_base.html:339 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:206 -#: templates/js/build.js:211 templates/js/build.js:928 -#: templates/js/order.js:366 templates/js/order.js:371 -#: templates/js/stock.js:1115 +#: templates/js/build.js:211 templates/js/build.js:929 +#: templates/js/order.js:433 templates/js/order.js:438 +#: templates/js/stock.js:1129 msgid "Stock Item" msgstr "" -#: build/models.py:1334 +#: build/models.py:1342 msgid "Source stock item" msgstr "" -#: build/models.py:1347 +#: build/models.py:1355 msgid "Stock quantity to allocate to build" msgstr "" -#: build/models.py:1355 +#: build/models.py:1363 msgid "Install into" msgstr "" -#: build/models.py:1356 +#: build/models.py:1364 msgid "Destination stock item" msgstr "" @@ -879,7 +885,7 @@ msgstr "" msgid "Auto Allocate" msgstr "" -#: build/templates/build/allocate.html:25 templates/js/build.js:743 +#: build/templates/build/allocate.html:25 templates/js/build.js:744 msgid "Unallocate stock" msgstr "" @@ -893,8 +899,8 @@ msgstr "" #: build/templates/build/allocate.html:30 #: company/templates/company/detail_manufacturer_part.html:33 -#: company/templates/company/detail_supplier_part.html:32 order/views.py:986 -#: part/templates/part/category.html:127 +#: company/templates/company/detail_supplier_part.html:32 order/views.py:724 +#: part/templates/part/category.html:136 msgid "Order Parts" msgstr "" @@ -912,23 +918,52 @@ msgstr "" #: build/templates/build/allocation_card.html:21 #: build/templates/build/complete_output.html:46 -#: order/templates/order/sales_order_detail.html:75 -#: order/templates/order/sales_order_detail.html:160 +#: order/templates/order/sales_order_detail.html:85 +#: order/templates/order/sales_order_detail.html:170 #: report/templates/report/inventree_test_report_base.html:75 -#: stock/models.py:454 stock/templates/stock/item_base.html:249 -#: templates/js/build.js:569 +#: stock/models.py:458 stock/templates/stock/item_base.html:249 +#: templates/js/build.js:570 templates/js/model_renderers.js:41 msgid "Serial Number" msgstr "" #: build/templates/build/attachments.html:12 #: build/templates/build/navbar.html:43 build/templates/build/navbar.html:46 #: order/templates/order/po_navbar.html:35 -#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:133 -#: part/templates/part/navbar.html:136 stock/templates/stock/navbar.html:47 +#: order/templates/order/so_navbar.html:29 part/templates/part/navbar.html:124 +#: part/templates/part/navbar.html:127 stock/templates/stock/navbar.html:47 #: stock/templates/stock/navbar.html:50 msgid "Attachments" msgstr "" +#: build/templates/build/attachments.html:51 +#: order/templates/order/so_attachments.html:79 +#: part/templates/part/attachments.html:81 +#: stock/templates/stock/item_attachments.html:81 +#: templates/attachment_table.html:6 +msgid "Add Attachment" +msgstr "" + +#: build/templates/build/attachments.html:69 +#: order/templates/order/so_attachments.html:52 +#: part/templates/part/attachments.html:35 +#: stock/templates/stock/item_attachments.html:49 +msgid "Edit Attachment" +msgstr "" + +#: build/templates/build/attachments.html:76 +#: order/templates/order/so_attachments.html:58 +#: part/templates/part/attachments.html:44 +#: stock/templates/stock/item_attachments.html:58 +msgid "Confirm Delete Operation" +msgstr "" + +#: build/templates/build/attachments.html:77 +#: order/templates/order/so_attachments.html:59 +#: part/templates/part/attachments.html:45 +#: stock/templates/stock/item_attachments.html:59 +msgid "Delete Attachment" +msgstr "" + #: build/templates/build/auto_allocate.html:9 msgid "Automatically Allocate Stock" msgstr "" @@ -977,7 +1012,7 @@ msgstr "" #: company/templates/company/supplier_part_base.html:26 #: order/templates/order/order_base.html:26 #: order/templates/order/sales_order_base.html:37 -#: part/templates/part/category.html:18 part/templates/part/part_base.html:22 +#: part/templates/part/category.html:27 part/templates/part/part_base.html:22 #: stock/templates/stock/item_base.html:62 #: stock/templates/stock/location.html:31 msgid "Admin view" @@ -989,8 +1024,8 @@ msgstr "" #: order/templates/order/order_base.html:86 #: order/templates/order/sales_order_base.html:43 #: order/templates/order/sales_order_base.html:88 -#: templates/js/table_filters.js:245 templates/js/table_filters.js:264 -#: templates/js/table_filters.js:281 +#: templates/js/table_filters.js:250 templates/js/table_filters.js:269 +#: templates/js/table_filters.js:286 msgid "Overdue" msgstr "" @@ -1036,13 +1071,13 @@ msgid "Progress" msgstr "" #: build/templates/build/build_base.html:170 -#: build/templates/build/detail.html:84 order/models.py:715 +#: build/templates/build/detail.html:84 order/models.py:812 #: order/templates/order/sales_order_base.html:9 #: order/templates/order/sales_order_base.html:35 #: order/templates/order/sales_order_ship.html:25 #: report/templates/report/inventree_build_order_base.html:136 #: report/templates/report/inventree_so_report.html:77 -#: stock/templates/stock/item_base.html:279 templates/js/order.js:245 +#: stock/templates/stock/item_base.html:279 templates/js/order.js:307 msgid "Sales Order" msgstr "" @@ -1183,10 +1218,10 @@ msgstr "" msgid "Stock can be taken from any available location." msgstr "" -#: build/templates/build/detail.html:46 order/forms.py:85 order/models.py:678 -#: order/templates/order/purchase_order_detail.html:239 -#: order/templates/order/receive_parts.html:25 stock/forms.py:169 -#: stock/forms.py:375 +#: build/templates/build/detail.html:46 order/forms.py:88 order/models.py:771 +#: order/templates/order/purchase_order_detail.html:266 +#: order/templates/order/receive_parts.html:25 stock/forms.py:136 +#: stock/forms.py:342 msgid "Destination" msgstr "" @@ -1196,14 +1231,14 @@ msgstr "" #: build/templates/build/detail.html:70 #: stock/templates/stock/item_base.html:303 templates/js/stock.js:638 -#: templates/js/stock.js:1406 templates/js/table_filters.js:112 +#: templates/js/stock.js:1420 templates/js/table_filters.js:112 #: templates/js/table_filters.js:206 msgid "Batch" msgstr "" #: build/templates/build/detail.html:116 #: order/templates/order/order_base.html:111 -#: order/templates/order/sales_order_base.html:113 templates/js/build.js:875 +#: order/templates/order/sales_order_base.html:113 templates/js/build.js:876 msgid "Created" msgstr "" @@ -1211,7 +1246,7 @@ msgstr "" msgid "No target date set" msgstr "" -#: build/templates/build/detail.html:132 templates/js/build.js:853 +#: build/templates/build/detail.html:132 templates/js/build.js:854 msgid "Completed" msgstr "" @@ -1250,8 +1285,8 @@ msgstr "" #: build/templates/build/navbar.html:15 #: company/templates/company/navbar.html:15 #: order/templates/order/po_navbar.html:15 -#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:17 -#: templates/js/stock.js:1044 +#: order/templates/order/so_navbar.html:15 part/templates/part/navbar.html:18 +#: templates/js/stock.js:1058 msgid "Details" msgstr "" @@ -1287,7 +1322,6 @@ msgstr "" #: order/templates/order/order_notes.html:27 #: order/templates/order/sales_order_notes.html:29 #: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:487 -#: stock/templates/stock/item_base.html:497 #: stock/templates/stock/item_notes.html:26 msgid "Save" msgstr "" @@ -1316,7 +1350,7 @@ msgstr "" msgid "Maximum output quantity is " msgstr "" -#: build/views.py:184 stock/views.py:1821 +#: build/views.py:184 stock/views.py:1653 msgid "Serial numbers already exist" msgstr "" @@ -1332,7 +1366,7 @@ msgstr "" msgid "Confirm unallocation of build stock" msgstr "" -#: build/views.py:281 build/views.py:371 stock/views.py:425 +#: build/views.py:281 build/views.py:371 stock/views.py:346 msgid "Check the confirmation box" msgstr "" @@ -1412,8 +1446,8 @@ msgstr "" msgid "Stock item is over-allocated" msgstr "" -#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:670 -#: templates/js/build.js:935 templates/js/build.js:1118 +#: build/views.py:872 templates/js/bom.js:230 templates/js/build.js:671 +#: templates/js/build.js:936 templates/js/build.js:1119 msgid "Available" msgstr "" @@ -1429,60 +1463,35 @@ msgstr "" msgid "Updated Build Item" msgstr "" -#: build/views.py:1070 -msgid "Add Build Order Attachment" -msgstr "" - -#: build/views.py:1083 order/views.py:115 order/views.py:167 part/views.py:173 -#: stock/views.py:277 -msgid "Added attachment" -msgstr "" - -#: build/views.py:1119 order/views.py:194 order/views.py:215 -msgid "Edit Attachment" -msgstr "" - -#: build/views.py:1129 order/views.py:198 order/views.py:219 -msgid "Attachment updated" -msgstr "" - -#: build/views.py:1139 order/views.py:234 order/views.py:248 -msgid "Delete Attachment" -msgstr "" - -#: build/views.py:1144 order/views.py:240 order/views.py:254 stock/views.py:333 -msgid "Deleted attachment" -msgstr "" - -#: common/files.py:64 +#: common/files.py:66 msgid "Unsupported file format: {ext.upper()}" msgstr "" -#: common/files.py:69 +#: common/files.py:71 msgid "Error reading file (invalid format)" msgstr "" -#: common/files.py:71 +#: common/files.py:73 msgid "Error reading file (incorrect dimension)" msgstr "" -#: common/files.py:73 +#: common/files.py:75 msgid "Error reading file (data could be corrupted)" msgstr "" -#: common/forms.py:39 templates/attachment_table.html:15 +#: common/forms.py:34 templates/js/attachment.js:42 msgid "File" msgstr "" -#: common/forms.py:40 +#: common/forms.py:35 msgid "Select file to upload" msgstr "" -#: common/forms.py:55 +#: common/forms.py:50 msgid "{name.title()} File" msgstr "" -#: common/forms.py:56 +#: common/forms.py:51 #, python-brace-format msgid "Select {name} file to upload" msgstr "" @@ -1503,7 +1512,7 @@ msgstr "" msgid "Use the instance name in the title-bar" msgstr "" -#: common/models.py:72 company/models.py:94 company/models.py:95 +#: common/models.py:72 company/models.py:99 company/models.py:100 msgid "Company name" msgstr "" @@ -1520,335 +1529,358 @@ msgid "Base URL for server instance" msgstr "" #: common/models.py:85 -msgid "Download from URL" +msgid "Default Currency" msgstr "" #: common/models.py:86 -msgid "Allow download of remote images and files from external URL" +msgid "Default currency" msgstr "" #: common/models.py:92 -msgid "Barcode Support" +msgid "Download from URL" msgstr "" #: common/models.py:93 -msgid "Enable barcode scanner support" +msgid "Allow download of remote images and files from external URL" msgstr "" #: common/models.py:99 -msgid "IPN Regex" +msgid "Barcode Support" msgstr "" #: common/models.py:100 +msgid "Enable barcode scanner support" +msgstr "" + +#: common/models.py:106 +msgid "IPN Regex" +msgstr "" + +#: common/models.py:107 msgid "Regular expression pattern for matching Part IPN" msgstr "" -#: common/models.py:104 +#: common/models.py:111 msgid "Allow Duplicate IPN" msgstr "" -#: common/models.py:105 +#: common/models.py:112 msgid "Allow multiple parts to share the same IPN" msgstr "" -#: common/models.py:111 +#: common/models.py:118 msgid "Allow Editing IPN" msgstr "" -#: common/models.py:112 +#: common/models.py:119 msgid "Allow changing the IPN value while editing a part" msgstr "" -#: common/models.py:118 +#: common/models.py:125 msgid "Copy Part BOM Data" msgstr "" -#: common/models.py:119 +#: common/models.py:126 msgid "Copy BOM data by default when duplicating a part" msgstr "" -#: common/models.py:125 +#: common/models.py:132 msgid "Copy Part Parameter Data" msgstr "" -#: common/models.py:126 +#: common/models.py:133 msgid "Copy parameter data by default when duplicating a part" msgstr "" -#: common/models.py:132 +#: common/models.py:139 msgid "Copy Part Test Data" msgstr "" -#: common/models.py:133 +#: common/models.py:140 msgid "Copy test data by default when duplicating a part" msgstr "" -#: common/models.py:139 +#: common/models.py:146 msgid "Copy Category Parameter Templates" msgstr "" -#: common/models.py:140 +#: common/models.py:147 msgid "Copy category parameter templates when creating a part" msgstr "" -#: common/models.py:146 +#: common/models.py:153 msgid "Recent Part Count" msgstr "" -#: common/models.py:147 +#: common/models.py:154 msgid "Number of recent parts to display on index page" msgstr "" -#: common/models.py:153 part/models.py:2193 part/templates/part/detail.html:160 -#: report/models.py:186 stock/forms.py:259 templates/js/table_filters.js:25 -#: templates/js/table_filters.js:315 +#: common/models.py:160 part/models.py:2226 part/templates/part/detail.html:160 +#: report/models.py:186 stock/forms.py:226 templates/js/table_filters.js:25 +#: templates/js/table_filters.js:320 msgid "Template" msgstr "" -#: common/models.py:154 +#: common/models.py:161 msgid "Parts are templates by default" msgstr "" -#: common/models.py:160 part/models.py:819 part/templates/part/detail.html:170 -#: templates/js/table_filters.js:128 templates/js/table_filters.js:327 +#: common/models.py:167 part/models.py:828 part/templates/part/detail.html:170 +#: templates/js/table_filters.js:128 templates/js/table_filters.js:332 msgid "Assembly" msgstr "" -#: common/models.py:161 +#: common/models.py:168 msgid "Parts can be assembled from other components by default" msgstr "" -#: common/models.py:167 part/models.py:825 part/templates/part/detail.html:180 -#: templates/js/table_filters.js:331 +#: common/models.py:174 part/models.py:834 part/templates/part/detail.html:180 +#: templates/js/table_filters.js:336 msgid "Component" msgstr "" -#: common/models.py:168 +#: common/models.py:175 msgid "Parts can be used as sub-components by default" msgstr "" -#: common/models.py:174 part/models.py:836 part/templates/part/detail.html:200 +#: common/models.py:181 part/models.py:845 part/templates/part/detail.html:200 msgid "Purchaseable" msgstr "" -#: common/models.py:175 +#: common/models.py:182 msgid "Parts are purchaseable by default" msgstr "" -#: common/models.py:181 part/models.py:841 part/templates/part/detail.html:210 -#: templates/js/table_filters.js:339 +#: common/models.py:188 part/models.py:850 part/templates/part/detail.html:210 +#: templates/js/table_filters.js:344 msgid "Salable" msgstr "" -#: common/models.py:182 +#: common/models.py:189 msgid "Parts are salable by default" msgstr "" -#: common/models.py:188 part/models.py:831 part/templates/part/detail.html:190 -#: templates/js/table_filters.js:33 templates/js/table_filters.js:343 +#: common/models.py:195 part/models.py:840 part/templates/part/detail.html:190 +#: templates/js/table_filters.js:33 templates/js/table_filters.js:348 msgid "Trackable" msgstr "" -#: common/models.py:189 +#: common/models.py:196 msgid "Parts are trackable by default" msgstr "" -#: common/models.py:195 part/models.py:851 part/templates/part/detail.html:150 +#: common/models.py:202 part/models.py:860 part/templates/part/detail.html:150 #: templates/js/table_filters.js:29 msgid "Virtual" msgstr "" -#: common/models.py:196 +#: common/models.py:203 msgid "Parts are virtual by default" msgstr "" -#: common/models.py:202 +#: common/models.py:209 msgid "Show Quantity in Forms" msgstr "" -#: common/models.py:203 +#: common/models.py:210 msgid "Display available part quantity in some forms" msgstr "" -#: common/models.py:209 -msgid "Show Price in Forms" -msgstr "" - -#: common/models.py:210 -msgid "Display part price in some forms" -msgstr "" - #: common/models.py:216 -msgid "Internal Prices" +msgid "Show Import in Views" msgstr "" #: common/models.py:217 -msgid "Enable internal prices for parts" +msgid "Display the import wizard in some part views" msgstr "" #: common/models.py:223 -msgid "Internal Price as BOM-Price" +msgid "Show Price in Forms" msgstr "" #: common/models.py:224 -msgid "Use the internal price (if set) in BOM-price calculations" +msgid "Display part price in some forms" msgstr "" -#: common/models.py:230 templates/stats.html:25 -msgid "Debug Mode" +#: common/models.py:230 +msgid "Show related parts" msgstr "" #: common/models.py:231 -msgid "Generate reports in debug mode (HTML output)" +msgid "Display related parts for a part" msgstr "" #: common/models.py:237 -msgid "Page Size" +msgid "Internal Prices" msgstr "" #: common/models.py:238 +msgid "Enable internal prices for parts" +msgstr "" + +#: common/models.py:244 +msgid "Internal Price as BOM-Price" +msgstr "" + +#: common/models.py:245 +msgid "Use the internal price (if set) in BOM-price calculations" +msgstr "" + +#: common/models.py:251 templates/stats.html:25 +msgid "Debug Mode" +msgstr "" + +#: common/models.py:252 +msgid "Generate reports in debug mode (HTML output)" +msgstr "" + +#: common/models.py:258 +msgid "Page Size" +msgstr "" + +#: common/models.py:259 msgid "Default page size for PDF reports" msgstr "" -#: common/models.py:248 +#: common/models.py:269 msgid "Test Reports" msgstr "" -#: common/models.py:249 +#: common/models.py:270 msgid "Enable generation of test reports" msgstr "" -#: common/models.py:255 +#: common/models.py:276 msgid "Stock Expiry" msgstr "" -#: common/models.py:256 +#: common/models.py:277 msgid "Enable stock expiry functionality" msgstr "" -#: common/models.py:262 +#: common/models.py:283 msgid "Sell Expired Stock" msgstr "" -#: common/models.py:263 +#: common/models.py:284 msgid "Allow sale of expired stock" msgstr "" -#: common/models.py:269 +#: common/models.py:290 msgid "Stock Stale Time" msgstr "" -#: common/models.py:270 +#: common/models.py:291 msgid "Number of days stock items are considered stale before expiring" msgstr "" -#: common/models.py:272 part/templates/part/detail.html:121 +#: common/models.py:293 part/templates/part/detail.html:121 msgid "days" msgstr "" -#: common/models.py:277 +#: common/models.py:298 msgid "Build Expired Stock" msgstr "" -#: common/models.py:278 +#: common/models.py:299 msgid "Allow building with expired stock" msgstr "" -#: common/models.py:284 +#: common/models.py:305 msgid "Stock Ownership Control" msgstr "" -#: common/models.py:285 +#: common/models.py:306 msgid "Enable ownership control over stock locations and items" msgstr "" -#: common/models.py:291 +#: common/models.py:312 msgid "Group by Part" msgstr "" -#: common/models.py:292 +#: common/models.py:313 msgid "Group stock items by part reference in table views" msgstr "" -#: common/models.py:298 +#: common/models.py:319 msgid "Recent Stock Count" msgstr "" -#: common/models.py:299 +#: common/models.py:320 msgid "Number of recent stock items to display on index page" msgstr "" -#: common/models.py:305 +#: common/models.py:326 msgid "Build Order Reference Prefix" msgstr "" -#: common/models.py:306 +#: common/models.py:327 msgid "Prefix value for build order reference" msgstr "" -#: common/models.py:311 +#: common/models.py:332 msgid "Build Order Reference Regex" msgstr "" -#: common/models.py:312 +#: common/models.py:333 msgid "Regular expression pattern for matching build order reference" msgstr "" -#: common/models.py:316 +#: common/models.py:337 msgid "Sales Order Reference Prefix" msgstr "" -#: common/models.py:317 +#: common/models.py:338 msgid "Prefix value for sales order reference" msgstr "" -#: common/models.py:322 +#: common/models.py:343 msgid "Purchase Order Reference Prefix" msgstr "" -#: common/models.py:323 +#: common/models.py:344 msgid "Prefix value for purchase order reference" msgstr "" -#: common/models.py:546 +#: common/models.py:567 msgid "Settings key (must be unique - case insensitive" msgstr "" -#: common/models.py:548 +#: common/models.py:569 msgid "Settings value" msgstr "" -#: common/models.py:583 +#: common/models.py:604 msgid "Must be an integer value" msgstr "" -#: common/models.py:606 +#: common/models.py:627 msgid "Value must be a boolean value" msgstr "" -#: common/models.py:617 +#: common/models.py:638 msgid "Value must be an integer value" msgstr "" -#: common/models.py:640 +#: common/models.py:661 msgid "Key string must be unique" msgstr "" -#: common/models.py:721 company/forms.py:192 +#: common/models.py:742 company/forms.py:125 msgid "Price break quantity" msgstr "" -#: common/models.py:729 company/templates/company/supplier_part_pricing.html:82 -#: part/templates/part/internal_prices.html:103 -#: part/templates/part/sale_prices.html:90 templates/js/bom.js:271 +#: common/models.py:749 company/templates/company/supplier_part_pricing.html:84 +#: templates/js/part.js:832 msgid "Price" msgstr "" -#: common/models.py:730 +#: common/models.py:750 msgid "Unit price at specified quantity" msgstr "" -#: common/models.py:822 +#: common/models.py:842 msgid "Default" msgstr "" @@ -1856,27 +1888,30 @@ msgstr "" msgid "Current value" msgstr "" -#: common/views.py:32 +#: common/views.py:33 msgid "Change Setting" msgstr "" -#: common/views.py:101 +#: common/views.py:102 msgid "Supplied value is not allowed" msgstr "" -#: common/views.py:110 +#: common/views.py:111 msgid "Supplied value must be a boolean" msgstr "" #: common/views.py:184 order/templates/order/order_wizard/po_upload.html:42 #: order/templates/order/po_navbar.html:19 -#: order/templates/order/po_navbar.html:22 order/views.py:582 +#: order/templates/order/po_navbar.html:22 order/views.py:337 #: part/templates/part/bom_upload/upload_file.html:27 +#: part/templates/part/import_wizard/part_upload.html:45 part/views.py:621 msgid "Upload File" msgstr "" #: common/views.py:185 order/templates/order/order_wizard/match_fields.html:52 -#: order/views.py:583 part/templates/part/bom_upload/select_fields.html:58 +#: order/views.py:338 part/templates/part/bom_upload/select_fields.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:45 +#: part/templates/part/import_wizard/match_fields.html:52 part/views.py:622 msgid "Match Fields" msgstr "" @@ -1884,282 +1919,303 @@ msgstr "" msgid "Match Items" msgstr "" -#: common/views.py:479 +#: common/views.py:531 msgid "Fields matching failed" msgstr "" -#: company/forms.py:38 company/models.py:142 -#: company/templates/company/detail.html:42 -msgid "Currency" +#: common/views.py:586 +msgid "Parts imported" msgstr "" -#: company/forms.py:39 company/models.py:144 -msgid "Default currency used for this company" +#: common/views.py:608 order/templates/order/order_wizard/match_fields.html:27 +#: order/templates/order/order_wizard/match_parts.html:19 +#: order/templates/order/order_wizard/po_upload.html:40 +#: part/templates/part/import_wizard/match_fields.html:27 +#: part/templates/part/import_wizard/match_references.html:19 +#: part/templates/part/import_wizard/part_upload.html:43 +msgid "Previous Step" msgstr "" -#: company/forms.py:77 part/forms.py:46 +#: company/forms.py:26 part/forms.py:46 msgid "URL" msgstr "" -#: company/forms.py:78 part/forms.py:47 +#: company/forms.py:27 part/forms.py:47 msgid "Image URL" msgstr "" -#: company/forms.py:133 templates/js/part.js:787 +#: company/forms.py:67 templates/js/part.js:940 msgid "Single Price" msgstr "" -#: company/forms.py:135 +#: company/forms.py:68 msgid "Single quantity price" msgstr "" -#: company/forms.py:143 company/models.py:321 +#: company/forms.py:76 company/models.py:335 msgid "Select manufacturer" msgstr "" -#: company/forms.py:149 company/models.py:328 +#: company/forms.py:82 company/models.py:342 msgid "Manufacturer Part Number" msgstr "" -#: company/forms.py:151 company/models.py:327 +#: company/forms.py:84 company/models.py:341 #: company/templates/company/manufacturer_part_base.html:89 #: company/templates/company/manufacturer_part_detail.html:26 #: company/templates/company/supplier_part_base.html:102 #: company/templates/company/supplier_part_detail.html:35 -#: order/templates/order/purchase_order_detail.html:162 part/bom.py:171 -#: part/bom.py:242 templates/js/company.js:181 templates/js/company.js:408 +#: order/templates/order/purchase_order_detail.html:189 part/bom.py:171 +#: part/bom.py:242 templates/js/company.js:305 templates/js/company.js:533 msgid "MPN" msgstr "" -#: company/models.py:99 +#: company/models.py:104 msgid "Company description" msgstr "" -#: company/models.py:100 +#: company/models.py:105 msgid "Description of the company" msgstr "" -#: company/models.py:104 company/templates/company/company_base.html:70 -#: company/templates/company/detail.html:33 templates/js/company.js:60 +#: company/models.py:111 company/templates/company/company_base.html:70 +#: company/templates/company/detail.html:33 templates/js/company.js:129 msgid "Website" msgstr "" -#: company/models.py:104 +#: company/models.py:112 msgid "Company website URL" msgstr "" -#: company/models.py:107 company/templates/company/company_base.html:77 +#: company/models.py:116 company/templates/company/company_base.html:77 msgid "Address" msgstr "" -#: company/models.py:108 +#: company/models.py:117 msgid "Company address" msgstr "" -#: company/models.py:111 +#: company/models.py:120 msgid "Phone number" msgstr "" -#: company/models.py:112 +#: company/models.py:121 msgid "Contact phone number" msgstr "" -#: company/models.py:115 company/templates/company/company_base.html:91 +#: company/models.py:124 company/templates/company/company_base.html:91 msgid "Email" msgstr "" -#: company/models.py:115 +#: company/models.py:124 msgid "Contact email address" msgstr "" -#: company/models.py:118 company/templates/company/company_base.html:98 +#: company/models.py:127 company/templates/company/company_base.html:98 msgid "Contact" msgstr "" -#: company/models.py:119 +#: company/models.py:128 msgid "Point of contact" msgstr "" -#: company/models.py:121 company/models.py:333 company/models.py:526 -#: order/models.py:106 part/models.py:728 +#: company/models.py:130 company/models.py:347 company/models.py:548 +#: order/models.py:156 part/models.py:737 #: report/templates/report/inventree_build_order_base.html:165 -#: templates/js/company.js:188 templates/js/company.js:419 +#: templates/js/company.js:312 templates/js/company.js:544 #: templates/js/part.js:498 msgid "Link" msgstr "" -#: company/models.py:121 +#: company/models.py:130 msgid "Link to external company information" msgstr "" -#: company/models.py:129 part/models.py:738 +#: company/models.py:138 part/models.py:747 msgid "Image" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "is customer" msgstr "" -#: company/models.py:134 +#: company/models.py:143 msgid "Do you sell items to this company?" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "is supplier" msgstr "" -#: company/models.py:136 +#: company/models.py:145 msgid "Do you purchase items from this company?" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "is manufacturer" msgstr "" -#: company/models.py:138 +#: company/models.py:147 msgid "Does this company manufacture parts?" msgstr "" -#: company/models.py:305 company/models.py:497 stock/models.py:407 +#: company/models.py:151 company/serializers.py:259 +#: company/templates/company/detail.html:42 +msgid "Currency" +msgstr "" + +#: company/models.py:154 +msgid "Default currency used for this company" +msgstr "" + +#: company/models.py:319 company/models.py:519 stock/models.py:411 #: stock/templates/stock/item_base.html:235 msgid "Base Part" msgstr "" -#: company/models.py:309 company/models.py:501 order/views.py:1597 +#: company/models.py:323 company/models.py:523 order/views.py:1127 msgid "Select part" msgstr "" -#: company/models.py:320 company/templates/company/detail.html:57 +#: company/models.py:334 company/templates/company/detail.html:57 #: company/templates/company/manufacturer_part_base.html:85 #: company/templates/company/manufacturer_part_detail.html:25 #: company/templates/company/supplier_part_base.html:94 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:170 #: part/bom.py:241 stock/templates/stock/item_base.html:352 -#: templates/js/company.js:44 templates/js/company.js:165 -#: templates/js/company.js:390 +#: templates/js/company.js:113 templates/js/company.js:289 +#: templates/js/company.js:515 msgid "Manufacturer" msgstr "" -#: company/models.py:334 +#: company/models.py:348 msgid "URL for external manufacturer part link" msgstr "" -#: company/models.py:340 +#: company/models.py:354 msgid "Manufacturer part description" msgstr "" -#: company/models.py:390 company/models.py:520 +#: company/models.py:408 company/models.py:542 #: company/templates/company/manufacturer_part_base.html:6 #: company/templates/company/manufacturer_part_base.html:19 #: stock/templates/stock/item_base.html:362 msgid "Manufacturer Part" msgstr "" -#: company/models.py:397 +#: company/models.py:415 msgid "Parameter name" msgstr "" -#: company/models.py:403 part/templates/part/params.html:28 +#: company/models.py:421 part/templates/part/params.html:28 #: report/templates/report/inventree_test_report_base.html:90 -#: stock/models.py:1756 templates/InvenTree/settings/header.html:8 -#: templates/js/company.js:241 templates/js/stock.js:137 +#: stock/models.py:1771 templates/InvenTree/settings/header.html:8 +#: templates/js/company.js:365 templates/js/stock.js:137 msgid "Value" msgstr "" -#: company/models.py:404 +#: company/models.py:422 msgid "Parameter value" msgstr "" -#: company/models.py:410 part/models.py:813 part/models.py:2165 +#: company/models.py:428 part/models.py:822 part/models.py:2194 #: part/templates/part/detail.html:106 part/templates/part/params.html:29 -#: templates/js/company.js:247 +#: templates/js/company.js:371 msgid "Units" msgstr "" -#: company/models.py:411 +#: company/models.py:429 msgid "Parameter units" msgstr "" -#: company/models.py:507 company/templates/company/detail.html:62 +#: company/models.py:529 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:193 +#: company/templates/company/supplier_part_detail.html:25 order/models.py:256 #: 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:369 -#: templates/js/company.js:48 templates/js/company.js:364 -#: templates/js/order.js:170 +#: templates/js/company.js:117 templates/js/company.js:489 +#: templates/js/order.js:232 msgid "Supplier" msgstr "" -#: company/models.py:508 +#: company/models.py:530 msgid "Select supplier" msgstr "" -#: company/models.py:513 company/templates/company/supplier_part_base.html:88 +#: company/models.py:535 company/templates/company/supplier_part_base.html:88 #: company/templates/company/supplier_part_detail.html:26 -#: order/templates/order/purchase_order_detail.html:153 part/bom.py:176 +#: order/templates/order/purchase_order_detail.html:180 part/bom.py:176 #: part/bom.py:287 msgid "SKU" msgstr "" -#: company/models.py:514 +#: company/models.py:536 msgid "Supplier stock keeping unit" msgstr "" -#: company/models.py:521 +#: company/models.py:543 msgid "Select manufacturer part" msgstr "" -#: company/models.py:527 +#: company/models.py:549 msgid "URL for external supplier part link" msgstr "" -#: company/models.py:533 +#: company/models.py:555 msgid "Supplier part description" msgstr "" -#: company/models.py:538 company/templates/company/supplier_part_base.html:116 -#: company/templates/company/supplier_part_detail.html:38 part/models.py:2305 +#: company/models.py:560 company/templates/company/supplier_part_base.html:116 +#: company/templates/company/supplier_part_detail.html:38 part/models.py:2342 #: report/templates/report/inventree_po_report.html:93 #: report/templates/report/inventree_so_report.html:93 msgid "Note" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "base cost" msgstr "" -#: company/models.py:542 part/models.py:1606 +#: company/models.py:564 part/models.py:1615 msgid "Minimum charge (e.g. stocking fee)" msgstr "" -#: company/models.py:544 company/templates/company/supplier_part_base.html:109 -#: stock/models.py:431 stock/templates/stock/item_base.html:310 -#: templates/js/stock.js:695 +#: company/models.py:566 company/templates/company/supplier_part_base.html:109 +#: stock/models.py:435 stock/templates/stock/item_base.html:310 +#: templates/js/stock.js:709 msgid "Packaging" msgstr "" -#: company/models.py:544 +#: company/models.py:566 msgid "Part packaging" msgstr "" -#: company/models.py:546 part/models.py:1608 +#: company/models.py:568 part/models.py:1617 msgid "multiple" msgstr "" -#: company/models.py:546 +#: company/models.py:568 msgid "Order multiple" msgstr "" +#: company/serializers.py:68 +msgid "Default currency used for this supplier" +msgstr "" + +#: company/serializers.py:69 +msgid "Currency Code" +msgstr "" + #: company/templates/company/assigned_stock.html:10 #: company/templates/company/navbar.html:62 -#: company/templates/company/navbar.html:65 templates/js/build.js:562 +#: company/templates/company/navbar.html:65 templates/js/build.js:563 msgid "Assigned Stock" msgstr "" #: company/templates/company/company_base.html:9 #: company/templates/company/company_base.html:35 -#: templates/InvenTree/search.html:304 templates/js/company.js:33 +#: templates/InvenTree/search.html:304 templates/js/company.js:102 msgid "Company" msgstr "" @@ -2173,7 +2229,7 @@ msgstr "" msgid "Download image from URL" msgstr "" -#: company/templates/company/company_base.html:46 order/views.py:311 +#: company/templates/company/company_base.html:46 templates/js/order.js:61 msgid "Create Purchase Order" msgstr "" @@ -2181,7 +2237,8 @@ msgstr "" msgid "Edit company information" msgstr "" -#: company/templates/company/company_base.html:56 company/views.py:326 +#: company/templates/company/company_base.html:56 +#: company/templates/company/company_base.html:126 msgid "Delete Company" msgstr "" @@ -2195,15 +2252,9 @@ msgstr "" msgid "Phone" msgstr "" -#: company/templates/company/delete.html:7 -#, python-format -msgid "Are you sure you want to delete company '%(name)s'?" -msgstr "" - -#: company/templates/company/delete.html:12 -#, python-format -msgid "There are %(count)s parts sourced from this company.
                \n" -"If this supplier is deleted, these supplier part entries will also be deleted." +#: company/templates/company/company_base.html:166 +#: part/templates/part/part_base.html:307 +msgid "Upload Image" msgstr "" #: company/templates/company/detail.html:21 @@ -2218,11 +2269,11 @@ msgstr "" msgid "Uses default currency" msgstr "" -#: company/templates/company/detail.html:67 order/models.py:464 -#: order/templates/order/sales_order_base.html:94 stock/models.py:449 -#: stock/models.py:450 stock/templates/stock/item_base.html:262 -#: templates/js/company.js:40 templates/js/order.js:267 -#: templates/js/stock.js:1097 +#: company/templates/company/detail.html:67 order/models.py:540 +#: order/templates/order/sales_order_base.html:94 stock/models.py:453 +#: stock/models.py:454 stock/templates/stock/item_base.html:262 +#: templates/js/company.js:109 templates/js/order.js:329 +#: templates/js/stock.js:1111 msgid "Customer" msgstr "" @@ -2243,7 +2294,8 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:28 #: company/templates/company/detail_supplier_part.html:27 #: company/templates/company/manufacturer_part_suppliers.html:20 -#: part/templates/part/category.html:122 +#: company/templates/company/manufacturer_part_suppliers.html:46 +#: part/templates/part/category.html:131 #: part/templates/part/manufacturer.html:22 #: part/templates/part/supplier.html:20 msgid "Options" @@ -2251,7 +2303,7 @@ msgstr "" #: company/templates/company/detail_manufacturer_part.html:33 #: company/templates/company/detail_supplier_part.html:32 -#: part/templates/part/category.html:127 +#: part/templates/part/category.html:136 msgid "Order parts" msgstr "" @@ -2265,26 +2317,25 @@ msgstr "" msgid "Delete Parts" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:66 +#: company/templates/company/detail_manufacturer_part.html:68 #: company/templates/company/detail_supplier_part.html:66 -#: part/templates/part/bom.html:159 part/templates/part/category.html:118 -#: templates/js/stock.js:1312 +#: part/templates/part/bom.html:159 part/templates/part/category.html:127 +#: templates/js/stock.js:1326 msgid "New Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:67 +#: company/templates/company/detail_manufacturer_part.html:69 #: company/templates/company/detail_supplier_part.html:67 msgid "Create new Part" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:72 -#: company/views.py:71 part/templates/part/manufacturer.html:52 -#: part/templates/part/supplier.html:56 +#: company/templates/company/detail_manufacturer_part.html:74 +#: company/views.py:66 part/templates/part/manufacturer.html:52 +#: part/templates/part/supplier.html:55 msgid "New Manufacturer" msgstr "" -#: company/templates/company/detail_manufacturer_part.html:73 -#: company/views.py:284 +#: company/templates/company/detail_manufacturer_part.html:75 msgid "Create new Manufacturer" msgstr "" @@ -2294,8 +2345,8 @@ msgstr "" #: company/templates/company/detail_stock.html:37 #: company/templates/company/supplier_part_stock.html:34 -#: part/templates/part/category.html:114 part/templates/part/category.html:128 -#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163 +#: part/templates/part/category.html:123 part/templates/part/category.html:137 +#: part/templates/part/stock.html:55 stock/templates/stock/location.html:163 msgid "Export" msgstr "" @@ -2307,26 +2358,24 @@ msgstr "" #: company/templates/company/detail_supplier_part.html:21 #: order/templates/order/order_wizard/select_parts.html:44 -#: order/templates/order/purchase_order_detail.html:50 +#: part/templates/part/part_base.html:429 msgid "Create new supplier part" 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:1318 +#: part/templates/part/part_base.html:428 part/templates/part/supplier.html:17 +#: templates/js/stock.js:1332 msgid "New Supplier Part" msgstr "" #: company/templates/company/detail_supplier_part.html:72 -#: company/templates/company/manufacturer_part_suppliers.html:82 -#: company/views.py:64 order/templates/order/purchase_orders.html:185 -#: part/templates/part/supplier.html:50 +#: company/templates/company/manufacturer_part_suppliers.html:96 +#: company/views.py:60 part/templates/part/supplier.html:50 msgid "New Supplier" msgstr "" -#: company/templates/company/detail_supplier_part.html:73 company/views.py:281 -#: order/templates/order/purchase_orders.html:186 +#: company/templates/company/detail_supplier_part.html:73 msgid "Create new Supplier" msgstr "" @@ -2361,20 +2410,19 @@ msgstr "" msgid "Internal Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:6 -msgid "Are you sure you want to delete the following Manufacturer Parts?" +#: company/templates/company/manufacturer_part_base.html:125 +msgid "Edit Manufacturer Part" msgstr "" -#: company/templates/company/manufacturer_part_delete.html:36 -#, python-format -msgid "There are %(count)s suppliers defined for this manufacturer part. If you delete it, the following supplier parts will also be deleted:" +#: company/templates/company/manufacturer_part_base.html:134 +msgid "Delete Manufacturer Part" msgstr "" #: company/templates/company/manufacturer_part_navbar.html:14 #: company/templates/company/manufacturer_part_suppliers.html:10 -#: company/views.py:63 part/templates/part/navbar.html:86 -#: part/templates/part/navbar.html:89 templates/InvenTree/search.html:316 -#: templates/navbar.html:35 +#: company/views.py:59 part/templates/part/navbar.html:87 +#: part/templates/part/navbar.html:90 part/templates/part/prices.html:153 +#: templates/InvenTree/search.html:316 templates/navbar.html:35 msgid "Suppliers" msgstr "" @@ -2385,7 +2433,7 @@ msgstr "" #: company/templates/company/manufacturer_part_navbar.html:22 #: company/templates/company/navbar.html:41 #: company/templates/company/supplier_part_navbar.html:15 -#: part/templates/part/navbar.html:38 stock/api.py:54 +#: part/templates/part/navbar.html:39 stock/api.py:53 #: stock/templates/stock/loc_link.html:7 stock/templates/stock/location.html:36 #: stock/templates/stock/stock_app_base.html:10 #: templates/InvenTree/index.html:128 templates/InvenTree/search.html:196 @@ -2411,31 +2459,49 @@ msgid "Delete supplier parts" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:22 +#: company/templates/company/manufacturer_part_suppliers.html:48 +#: company/templates/company/manufacturer_part_suppliers.html:142 #: part/templates/part/manufacturer.html:24 part/templates/part/params.html:44 #: part/templates/part/related.html:44 part/templates/part/supplier.html:22 -#: stock/views.py:1002 users/models.py:191 +#: stock/views.py:855 templates/js/company.js:203 users/models.py:192 msgid "Delete" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:37 -#: part/templates/part/category_navbar.html:34 -#: part/templates/part/category_navbar.html:37 -#: part/templates/part/navbar.html:24 +#: part/templates/part/category_navbar.html:46 +#: part/templates/part/category_navbar.html:49 +#: part/templates/part/navbar.html:25 msgid "Parameters" msgstr "" #: company/templates/company/manufacturer_part_suppliers.html:43 #: part/templates/part/params.html:18 #: templates/InvenTree/settings/category.html:29 -#: templates/InvenTree/settings/part.html:48 +#: templates/InvenTree/settings/part.html:65 msgid "New Parameter" msgstr "" -#: company/templates/company/manufacturer_part_suppliers.html:83 +#: company/templates/company/manufacturer_part_suppliers.html:48 +msgid "Delete parameters" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:80 +msgid "Add Parameter" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:97 #: part/templates/part/supplier.html:51 msgid "Create new supplier" msgstr "" +#: company/templates/company/manufacturer_part_suppliers.html:127 +msgid "Selected parameters will be deleted" +msgstr "" + +#: company/templates/company/manufacturer_part_suppliers.html:139 +msgid "Delete Parameters" +msgstr "" + #: company/templates/company/navbar.html:20 #: company/templates/company/navbar.html:23 msgid "Manufactured Parts" @@ -2446,14 +2512,14 @@ msgstr "" msgid "Supplied Parts" msgstr "" -#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:35 +#: company/templates/company/navbar.html:38 part/templates/part/navbar.html:36 #: stock/templates/stock/location.html:107 #: stock/templates/stock/location.html:122 #: stock/templates/stock/location.html:136 #: stock/templates/stock/location_navbar.html:22 #: stock/templates/stock/location_navbar.html:29 -#: templates/InvenTree/search.html:198 templates/js/stock.js:996 -#: templates/stats.html:93 templates/stats.html:102 users/models.py:42 +#: templates/InvenTree/search.html:198 templates/js/stock.js:1010 +#: templates/stats.html:93 templates/stats.html:102 users/models.py:43 msgid "Stock Items" msgstr "" @@ -2463,11 +2529,11 @@ msgstr "" #: company/templates/company/sales_orders.html:11 #: order/templates/order/sales_orders.html:8 #: order/templates/order/sales_orders.html:13 -#: part/templates/part/navbar.html:112 part/templates/part/navbar.html:115 -#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:228 +#: part/templates/part/navbar.html:101 part/templates/part/navbar.html:104 +#: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:236 #: templates/InvenTree/search.html:345 #: templates/InvenTree/settings/tabs.html:40 templates/navbar.html:46 -#: users/models.py:45 +#: users/models.py:46 msgid "Sales Orders" msgstr "" @@ -2475,11 +2541,11 @@ msgstr "" #: company/templates/company/purchase_orders.html:10 #: order/templates/order/purchase_orders.html:8 #: order/templates/order/purchase_orders.html:13 -#: part/templates/part/navbar.html:92 part/templates/part/navbar.html:95 -#: part/templates/part/orders.html:10 templates/InvenTree/index.html:205 +#: part/templates/part/navbar.html:93 part/templates/part/navbar.html:96 +#: part/templates/part/orders.html:10 templates/InvenTree/index.html:213 #: templates/InvenTree/search.html:325 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:37 -#: users/models.py:44 +#: users/models.py:45 msgid "Purchase Orders" msgstr "" @@ -2508,8 +2574,9 @@ msgid "New Sales Order" msgstr "" #: company/templates/company/supplier_part_base.html:7 -#: company/templates/company/supplier_part_base.html:20 stock/models.py:416 -#: stock/templates/stock/item_base.html:374 templates/js/company.js:380 +#: company/templates/company/supplier_part_base.html:20 stock/models.py:420 +#: stock/templates/stock/item_base.html:374 templates/js/company.js:505 +#: templates/js/stock.js:690 msgid "Supplier Part" msgstr "" @@ -2554,459 +2621,401 @@ msgid "Order Part" msgstr "" #: company/templates/company/supplier_part_pricing.html:11 +#: part/templates/part/navbar.html:74 msgid "Pricing Information" msgstr "" -#: company/templates/company/supplier_part_pricing.html:19 company/views.py:855 -#: part/templates/part/sale_prices.html:17 part/views.py:2751 +#: company/templates/company/supplier_part_pricing.html:19 +#: company/templates/company/supplier_part_pricing.html:118 +#: part/templates/part/prices.html:264 part/views.py:2788 msgid "Add Price Break" msgstr "" #: company/templates/company/supplier_part_pricing.html:38 -#: part/templates/part/sale_prices.html:46 msgid "No price break information found" msgstr "" -#: company/templates/company/supplier_part_pricing.html:89 -#: part/templates/part/sale_prices.html:97 +#: company/templates/company/supplier_part_pricing.html:52 part/views.py:2850 +msgid "Delete Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:66 part/views.py:2836 +msgid "Edit Price Break" +msgstr "" + +#: company/templates/company/supplier_part_pricing.html:91 msgid "Edit price break" msgstr "" -#: company/templates/company/supplier_part_pricing.html:90 -#: part/templates/part/sale_prices.html:98 +#: company/templates/company/supplier_part_pricing.html:92 msgid "Delete price break" msgstr "" -#: company/views.py:70 part/templates/part/navbar.html:80 -#: part/templates/part/navbar.html:83 templates/InvenTree/search.html:306 -#: templates/navbar.html:36 +#: company/views.py:65 part/templates/part/navbar.html:81 +#: part/templates/part/navbar.html:84 part/templates/part/prices.html:157 +#: templates/InvenTree/search.html:306 templates/navbar.html:36 msgid "Manufacturers" msgstr "" -#: company/views.py:77 templates/InvenTree/search.html:336 +#: company/views.py:71 templates/InvenTree/search.html:336 #: templates/navbar.html:45 msgid "Customers" msgstr "" -#: company/views.py:78 order/templates/order/sales_orders.html:187 +#: company/views.py:72 msgid "New Customer" msgstr "" -#: company/views.py:86 +#: company/views.py:79 msgid "Companies" msgstr "" -#: company/views.py:87 +#: company/views.py:80 msgid "New Company" msgstr "" -#: company/views.py:169 part/views.py:948 +#: company/views.py:161 part/views.py:1007 msgid "Download Image" msgstr "" -#: company/views.py:198 part/views.py:980 +#: company/views.py:190 part/views.py:1039 msgid "Image size exceeds maximum allowable size for download" msgstr "" -#: company/views.py:205 part/views.py:987 +#: company/views.py:197 part/views.py:1046 #, python-brace-format msgid "Invalid response: {code}" msgstr "" -#: company/views.py:214 part/views.py:996 +#: company/views.py:206 part/views.py:1055 msgid "Supplied URL is not a valid image file" msgstr "" -#: company/views.py:243 -msgid "Update Company Image" -msgstr "" - -#: company/views.py:249 -msgid "Updated company image" -msgstr "" - -#: company/views.py:259 -msgid "Edit Company" -msgstr "" - -#: company/views.py:264 -msgid "Edited company information" -msgstr "" - -#: company/views.py:287 order/templates/order/sales_orders.html:188 -msgid "Create new Customer" -msgstr "" - -#: company/views.py:289 -msgid "Create new Company" -msgstr "" - -#: company/views.py:316 -msgid "Created new company" -msgstr "" - -#: company/views.py:332 -msgid "Company was deleted" -msgstr "" - -#: company/views.py:357 -msgid "Edit Manufacturer Part" -msgstr "" - -#: company/views.py:366 +#: company/views.py:251 msgid "Create New Manufacturer Part" msgstr "" -#: company/views.py:440 -msgid "Delete Manufacturer Part" -msgstr "" - -#: company/views.py:514 -msgid "Add Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:548 -msgid "Edit Manufacturer Part Parameter" -msgstr "" - -#: company/views.py:588 +#: company/views.py:334 msgid "Edit Supplier Part" msgstr "" -#: company/views.py:639 templates/js/stock.js:1319 +#: company/views.py:385 templates/js/stock.js:1333 msgid "Create new Supplier Part" msgstr "" -#: company/views.py:783 +#: company/views.py:529 msgid "Delete Supplier Part" msgstr "" -#: company/views.py:860 part/views.py:2755 -msgid "Added new price break" -msgstr "" - -#: company/views.py:916 part/views.py:2799 -msgid "Edit Price Break" -msgstr "" - -#: company/views.py:931 part/views.py:2813 -msgid "Delete Price Break" -msgstr "" - #: label/api.py:56 report/api.py:201 msgid "No valid objects provided to template" msgstr "" -#: label/models.py:103 +#: label/models.py:104 msgid "Label name" msgstr "" -#: label/models.py:110 +#: label/models.py:111 msgid "Label description" msgstr "" -#: label/models.py:117 stock/forms.py:202 +#: label/models.py:118 stock/forms.py:169 msgid "Label" msgstr "" -#: label/models.py:118 +#: label/models.py:119 msgid "Label template file" msgstr "" -#: label/models.py:124 report/models.py:297 +#: label/models.py:125 report/models.py:297 msgid "Enabled" msgstr "" -#: label/models.py:125 +#: label/models.py:126 msgid "Label template is enabled" msgstr "" -#: label/models.py:130 +#: label/models.py:131 msgid "Width [mm]" msgstr "" -#: label/models.py:131 +#: label/models.py:132 msgid "Label width, specified in mm" msgstr "" -#: label/models.py:137 +#: label/models.py:138 msgid "Height [mm]" msgstr "" -#: label/models.py:138 +#: label/models.py:139 msgid "Label height, specified in mm" msgstr "" -#: label/models.py:144 report/models.py:290 +#: label/models.py:145 report/models.py:290 msgid "Filename Pattern" msgstr "" -#: label/models.py:145 +#: label/models.py:146 msgid "Pattern for generating label filenames" msgstr "" -#: label/models.py:244 label/models.py:297 +#: label/models.py:249 label/models.py:306 msgid "Query filters (comma-separated list of key=value pairs" msgstr "" -#: label/models.py:245 label/models.py:298 report/models.py:317 +#: label/models.py:250 label/models.py:307 report/models.py:317 #: report/models.py:440 report/models.py:474 msgid "Filters" msgstr "" -#: order/forms.py:27 order/templates/order/order_base.html:47 +#: order/forms.py:30 order/templates/order/order_base.html:47 msgid "Place order" msgstr "" -#: order/forms.py:38 order/templates/order/order_base.html:54 +#: order/forms.py:41 order/templates/order/order_base.html:54 msgid "Mark order as complete" msgstr "" -#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59 +#: order/forms.py:52 order/forms.py:63 order/templates/order/order_base.html:59 #: order/templates/order/sales_order_base.html:61 msgid "Cancel order" msgstr "" -#: order/forms.py:71 order/templates/order/sales_order_base.html:58 +#: order/forms.py:74 order/templates/order/sales_order_base.html:58 msgid "Ship order" msgstr "" -#: order/forms.py:86 +#: order/forms.py:89 msgid "Receive parts to this location" msgstr "" -#: order/forms.py:108 -msgid "Purchase Order reference" -msgstr "" - -#: order/forms.py:115 -msgid "Target date for order delivery. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:143 -msgid "Enter sales order number" -msgstr "" - -#: order/forms.py:150 order/models.py:476 -msgid "Target date for order completion. Order will be overdue after this date." -msgstr "" - -#: order/forms.py:242 +#: order/forms.py:116 msgid "Enter stock item serial numbers" msgstr "" -#: order/forms.py:248 +#: order/forms.py:122 msgid "Enter quantity of stock items" msgstr "" -#: order/models.py:102 -msgid "Order reference" -msgstr "" - -#: order/models.py:104 +#: order/models.py:154 msgid "Order description" msgstr "" -#: order/models.py:106 +#: order/models.py:156 msgid "Link to external page" msgstr "" -#: order/models.py:114 part/templates/part/detail.html:132 +#: order/models.py:164 part/templates/part/detail.html:132 msgid "Created By" msgstr "" -#: order/models.py:121 +#: order/models.py:171 msgid "User or group responsible for this order" msgstr "" -#: order/models.py:126 +#: order/models.py:176 msgid "Order notes" msgstr "" -#: order/models.py:185 order/models.py:469 +#: order/models.py:243 order/models.py:530 +msgid "Order reference" +msgstr "" + +#: order/models.py:248 order/models.py:545 msgid "Purchase order status" msgstr "" -#: order/models.py:194 +#: order/models.py:257 msgid "Company from which the items are being ordered" msgstr "" -#: order/models.py:197 order/templates/order/order_base.html:98 -#: templates/js/order.js:179 +#: order/models.py:260 order/templates/order/order_base.html:98 +#: templates/js/order.js:241 msgid "Supplier Reference" msgstr "" -#: order/models.py:197 +#: order/models.py:260 msgid "Supplier order reference code" msgstr "" -#: order/models.py:204 +#: order/models.py:267 msgid "received by" msgstr "" -#: order/models.py:209 +#: order/models.py:272 msgid "Issue Date" msgstr "" -#: order/models.py:210 +#: order/models.py:273 msgid "Date order was issued" msgstr "" -#: order/models.py:215 +#: order/models.py:278 msgid "Target Delivery Date" msgstr "" -#: order/models.py:216 +#: order/models.py:279 msgid "Expected date for order delivery. Order will be overdue after this date." msgstr "" -#: order/models.py:222 +#: order/models.py:285 msgid "Date order was completed" msgstr "" -#: order/models.py:246 part/views.py:1686 stock/models.py:304 -#: stock/models.py:1020 +#: order/models.py:309 part/views.py:1730 stock/models.py:308 +#: stock/models.py:1023 msgid "Quantity must be greater than zero" msgstr "" -#: order/models.py:251 +#: order/models.py:314 msgid "Part supplier must match PO supplier" msgstr "" -#: order/models.py:349 +#: order/models.py:412 msgid "Lines can only be received against an order marked as 'Placed'" msgstr "" -#: order/models.py:353 +#: order/models.py:416 msgid "Quantity must be an integer" msgstr "" -#: order/models.py:355 +#: order/models.py:418 msgid "Quantity must be a positive number" msgstr "" -#: order/models.py:465 +#: order/models.py:541 msgid "Company to which the items are being sold" msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer Reference " msgstr "" -#: order/models.py:471 +#: order/models.py:547 msgid "Customer order reference code" msgstr "" -#: order/models.py:479 templates/js/order.js:303 +#: order/models.py:552 +msgid "Target date for order completion. Order will be overdue after this date." +msgstr "" + +#: order/models.py:555 templates/js/order.js:370 msgid "Shipment Date" msgstr "" -#: order/models.py:486 +#: order/models.py:562 msgid "shipped by" msgstr "" -#: order/models.py:530 +#: order/models.py:606 msgid "SalesOrder cannot be shipped as it is not currently pending" msgstr "" -#: order/models.py:617 +#: order/models.py:703 msgid "Item quantity" msgstr "" -#: order/models.py:619 +#: order/models.py:709 msgid "Line item reference" msgstr "" -#: order/models.py:621 +#: order/models.py:711 msgid "Line item notes" msgstr "" -#: order/models.py:647 order/models.py:715 templates/js/order.js:353 +#: order/models.py:741 order/models.py:812 templates/js/order.js:420 msgid "Order" msgstr "" -#: order/models.py:648 order/templates/order/order_base.html:9 +#: order/models.py:742 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:669 templates/js/stock.js:1078 +#: stock/templates/stock/item_base.html:324 templates/js/order.js:210 +#: templates/js/stock.js:669 templates/js/stock.js:1092 msgid "Purchase Order" msgstr "" -#: order/models.py:662 +#: order/models.py:756 msgid "Supplier part" msgstr "" -#: order/models.py:665 order/templates/order/order_base.html:131 -#: order/templates/order/purchase_order_detail.html:219 +#: order/models.py:759 order/templates/order/order_base.html:131 +#: order/templates/order/purchase_order_detail.html:246 #: order/templates/order/receive_parts.html:22 #: order/templates/order/sales_order_base.html:133 msgid "Received" msgstr "" -#: order/models.py:665 +#: order/models.py:759 msgid "Number of items received" msgstr "" -#: order/models.py:672 stock/models.py:542 -#: stock/templates/stock/item_base.html:331 templates/js/stock.js:690 +#: order/models.py:765 part/templates/part/prices.html:166 stock/models.py:545 +#: stock/templates/stock/item_base.html:331 templates/js/stock.js:704 msgid "Purchase Price" msgstr "" -#: order/models.py:673 +#: order/models.py:766 msgid "Unit purchase price" msgstr "" -#: order/models.py:681 +#: order/models.py:774 msgid "Where does the Purchaser want this item to be stored?" msgstr "" -#: order/models.py:724 part/templates/part/navbar.html:109 -#: part/templates/part/order_prices.html:107 -#: part/templates/part/part_pricing.html:97 +#: order/models.py:820 part/templates/part/part_pricing.html:97 +#: part/templates/part/prices.html:103 part/templates/part/prices.html:278 msgid "Sale Price" msgstr "" -#: order/models.py:725 +#: order/models.py:821 msgid "Unit sale price" msgstr "" -#: order/models.py:800 order/models.py:802 +#: order/models.py:900 order/models.py:902 msgid "Stock item has not been assigned" msgstr "" -#: order/models.py:806 +#: order/models.py:906 msgid "Cannot allocate stock item to a line with a different part" msgstr "" -#: order/models.py:808 +#: order/models.py:908 msgid "Cannot allocate stock to a line without a part" msgstr "" -#: order/models.py:811 +#: order/models.py:911 msgid "Allocation quantity cannot exceed stock quantity" msgstr "" -#: order/models.py:821 +#: order/models.py:921 msgid "Quantity must be 1 for serialized stock item" msgstr "" -#: order/models.py:826 +#: order/models.py:926 msgid "Line" msgstr "" -#: order/models.py:837 +#: order/models.py:937 msgid "Item" msgstr "" -#: order/models.py:838 +#: order/models.py:938 msgid "Select stock item to allocate" msgstr "" -#: order/models.py:841 +#: order/models.py:941 msgid "Enter stock allocation quantity" msgstr "" +#: order/serializers.py:139 +msgid "Purchase price currency" +msgstr "" + +#: order/serializers.py:359 +msgid "Sale price currency" +msgstr "" + #: order/templates/order/delete_attachment.html:5 #: stock/templates/stock/attachment_delete.html:5 #: templates/attachment_delete.html:5 @@ -3051,16 +3060,22 @@ msgstr "" msgid "Issued" 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:736 -#: templates/js/stock.js:1324 +#: order/templates/order/order_base.html:188 +msgid "Edit Purchase Order" +msgstr "" + +#: order/templates/order/order_base.html:199 +#: order/templates/order/purchase_order_detail.html:127 +#: part/templates/part/category.html:217 part/templates/part/category.html:259 +#: part/templates/part/part_base.html:415 +#: stock/templates/stock/location.html:191 templates/js/stock.js:750 +#: templates/js/stock.js:1338 msgid "New Location" msgstr "" -#: order/templates/order/order_base.html:181 -#: order/templates/order/purchase_order_detail.html:101 +#: order/templates/order/order_base.html:200 +#: order/templates/order/purchase_order_detail.html:128 +#: part/templates/part/part_base.html:416 #: stock/templates/stock/location.html:42 msgid "Create new stock location" msgstr "" @@ -3091,57 +3106,71 @@ msgstr "" #: order/templates/order/order_wizard/match_fields.html:9 #: part/templates/part/bom_upload/select_fields.html:21 +#: part/templates/part/import_wizard/ajax_match_fields.html:9 +#: part/templates/part/import_wizard/match_fields.html:9 msgid "Missing selections for the following required columns" msgstr "" #: order/templates/order/order_wizard/match_fields.html:20 +#: part/templates/part/import_wizard/ajax_match_fields.html:20 +#: part/templates/part/import_wizard/match_fields.html:20 msgid "Duplicate selections found, see below. Fix them then retry submitting." msgstr "" -#: order/templates/order/order_wizard/match_fields.html:27 -#: order/templates/order/order_wizard/match_parts.html:18 -#: order/templates/order/order_wizard/po_upload.html:40 -msgid "Previous Step" -msgstr "" - #: order/templates/order/order_wizard/match_fields.html:29 -#: order/templates/order/order_wizard/match_parts.html:20 +#: order/templates/order/order_wizard/match_parts.html:21 #: part/templates/part/bom_upload/select_fields.html:32 +#: part/templates/part/import_wizard/match_fields.html:29 +#: part/templates/part/import_wizard/match_references.html:21 msgid "Submit Selections" msgstr "" #: order/templates/order/order_wizard/match_fields.html:35 #: part/templates/part/bom_upload/select_fields.html:41 +#: part/templates/part/import_wizard/ajax_match_fields.html:28 +#: part/templates/part/import_wizard/match_fields.html:35 msgid "File Fields" msgstr "" #: order/templates/order/order_wizard/match_fields.html:42 #: part/templates/part/bom_upload/select_fields.html:47 +#: part/templates/part/import_wizard/ajax_match_fields.html:35 +#: part/templates/part/import_wizard/match_fields.html:42 msgid "Remove column" msgstr "" #: order/templates/order/order_wizard/match_fields.html:60 +#: part/templates/part/import_wizard/ajax_match_fields.html:53 +#: part/templates/part/import_wizard/match_fields.html:60 msgid "Duplicate selection" msgstr "" #: order/templates/order/order_wizard/match_fields.html:71 -#: order/templates/order/order_wizard/match_parts.html:51 +#: order/templates/order/order_wizard/match_parts.html:52 #: part/templates/part/bom_upload/select_fields.html:76 #: part/templates/part/bom_upload/select_parts.html:58 +#: part/templates/part/import_wizard/ajax_match_fields.html:64 +#: part/templates/part/import_wizard/ajax_match_references.html:42 +#: part/templates/part/import_wizard/match_fields.html:71 +#: part/templates/part/import_wizard/match_references.html:49 msgid "Remove row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:11 +#: order/templates/order/order_wizard/match_parts.html:12 #: part/templates/part/bom_upload/select_parts.html:21 +#: part/templates/part/import_wizard/ajax_match_references.html:12 +#: part/templates/part/import_wizard/match_references.html:12 msgid "Errors exist in the submitted data" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:27 +#: order/templates/order/order_wizard/match_parts.html:28 #: part/templates/part/bom_upload/select_parts.html:39 +#: part/templates/part/import_wizard/ajax_match_references.html:21 +#: part/templates/part/import_wizard/match_references.html:28 msgid "Row" msgstr "" -#: order/templates/order/order_wizard/match_parts.html:28 +#: order/templates/order/order_wizard/match_parts.html:29 msgid "Select Supplier Part" msgstr "" @@ -3150,6 +3179,8 @@ msgid "Upload File for Purchase Order" msgstr "" #: order/templates/order/order_wizard/po_upload.html:18 +#: part/templates/part/import_wizard/ajax_part_upload.html:10 +#: part/templates/part/import_wizard/part_upload.html:21 #, python-format msgid "Step %(step)s of %(count)s" msgstr "" @@ -3197,7 +3228,7 @@ msgid "Select existing purchase orders, or create new orders." msgstr "" #: order/templates/order/order_wizard/select_pos.html:31 -#: templates/js/order.js:205 templates/js/order.js:308 +#: templates/js/order.js:267 templates/js/order.js:375 msgid "Items" msgstr "" @@ -3221,7 +3252,6 @@ msgid "Purchase Order Attachments" msgstr "" #: order/templates/order/po_lineitem_delete.html:5 -#: order/templates/order/so_lineitem_delete.html:5 msgid "Are you sure you wish to delete this line item?" msgstr "" @@ -3239,40 +3269,52 @@ msgid "Purchase Order Items" msgstr "" #: order/templates/order/purchase_order_detail.html:24 -#: order/templates/order/sales_order_detail.html:22 order/views.py:1321 -#: order/views.py:1404 +#: order/templates/order/purchase_order_detail.html:64 +#: order/templates/order/sales_order_detail.html:22 +#: order/templates/order/sales_order_detail.html:56 msgid "Add Line Item" msgstr "" -#: order/templates/order/purchase_order_detail.html:114 +#: order/templates/order/purchase_order_detail.html:100 +#: order/templates/order/sales_order_detail.html:398 +msgid "Edit Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:110 +#: order/templates/order/sales_order_detail.html:408 +msgid "Delete Line Item" +msgstr "" + +#: order/templates/order/purchase_order_detail.html:141 msgid "No line items found" msgstr "" -#: order/templates/order/purchase_order_detail.html:142 -#: order/templates/order/sales_order_detail.html:223 +#: order/templates/order/purchase_order_detail.html:169 +#: order/templates/order/sales_order_detail.html:233 msgid "Total" msgstr "" -#: order/templates/order/purchase_order_detail.html:191 -#: order/templates/order/sales_order_detail.html:246 +#: order/templates/order/purchase_order_detail.html:218 +#: order/templates/order/sales_order_detail.html:256 templates/js/part.js:807 +#: templates/js/part.js:996 msgid "Unit Price" msgstr "" -#: order/templates/order/purchase_order_detail.html:198 -#: order/templates/order/sales_order_detail.html:253 +#: order/templates/order/purchase_order_detail.html:225 +#: order/templates/order/sales_order_detail.html:263 msgid "Total price" msgstr "" -#: order/templates/order/purchase_order_detail.html:255 -#: order/templates/order/sales_order_detail.html:359 +#: order/templates/order/purchase_order_detail.html:282 +#: order/templates/order/sales_order_detail.html:369 msgid "Edit line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:256 +#: order/templates/order/purchase_order_detail.html:283 msgid "Delete line item" msgstr "" -#: order/templates/order/purchase_order_detail.html:261 +#: order/templates/order/purchase_order_detail.html:288 msgid "Receive line item" msgstr "" @@ -3287,15 +3329,15 @@ msgid "Receive outstanding parts for %(order)s - %(desc)s" msgstr "" #: order/templates/order/receive_parts.html:14 part/api.py:45 -#: part/models.py:322 part/templates/part/cat_link.html:7 -#: part/templates/part/category.html:99 part/templates/part/category.html:148 -#: part/templates/part/category_navbar.html:22 -#: part/templates/part/category_navbar.html:29 +#: part/models.py:326 part/templates/part/cat_link.html:7 +#: part/templates/part/category.html:108 part/templates/part/category.html:157 +#: part/templates/part/category_navbar.html:25 +#: part/templates/part/category_navbar.html:32 #: part/templates/part/category_partlist.html:10 #: templates/InvenTree/index.html:97 templates/InvenTree/search.html:114 #: templates/InvenTree/settings/tabs.html:28 templates/js/part.js:666 #: templates/navbar.html:23 templates/stats.html:80 templates/stats.html:89 -#: users/models.py:40 +#: users/models.py:41 msgid "Parts" msgstr "" @@ -3337,10 +3379,14 @@ msgstr "" msgid "Sales Order Details" msgstr "" -#: order/templates/order/sales_order_base.html:100 templates/js/order.js:275 +#: order/templates/order/sales_order_base.html:100 templates/js/order.js:342 msgid "Customer Reference" msgstr "" +#: order/templates/order/sales_order_base.html:177 +msgid "Edit Sales Order" +msgstr "" + #: order/templates/order/sales_order_cancel.html:8 #: order/templates/order/sales_order_ship.html:9 #: part/templates/part/bom_duplicate.html:12 @@ -3356,69 +3402,69 @@ msgstr "" msgid "Sales Order Items" msgstr "" -#: order/templates/order/sales_order_detail.html:95 templates/js/bom.js:365 -#: templates/js/build.js:724 templates/js/build.js:1141 +#: order/templates/order/sales_order_detail.html:105 templates/js/bom.js:358 +#: templates/js/build.js:725 templates/js/build.js:1142 msgid "Actions" msgstr "" -#: order/templates/order/sales_order_detail.html:102 templates/js/build.js:610 -#: templates/js/build.js:946 +#: order/templates/order/sales_order_detail.html:112 templates/js/build.js:611 +#: templates/js/build.js:947 msgid "Edit stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:103 templates/js/build.js:612 -#: templates/js/build.js:947 +#: order/templates/order/sales_order_detail.html:113 templates/js/build.js:613 +#: templates/js/build.js:948 msgid "Delete stock allocation" msgstr "" -#: order/templates/order/sales_order_detail.html:176 +#: order/templates/order/sales_order_detail.html:186 msgid "No matching line items" msgstr "" -#: order/templates/order/sales_order_detail.html:206 +#: order/templates/order/sales_order_detail.html:216 msgid "ID" msgstr "" -#: order/templates/order/sales_order_detail.html:274 templates/js/build.js:675 -#: templates/js/build.js:942 +#: order/templates/order/sales_order_detail.html:284 templates/js/build.js:676 +#: templates/js/build.js:943 msgid "Allocated" msgstr "" -#: order/templates/order/sales_order_detail.html:276 +#: order/templates/order/sales_order_detail.html:286 msgid "Fulfilled" msgstr "" -#: order/templates/order/sales_order_detail.html:313 +#: order/templates/order/sales_order_detail.html:323 msgid "PO" msgstr "" -#: order/templates/order/sales_order_detail.html:343 +#: order/templates/order/sales_order_detail.html:353 msgid "Allocate serial numbers" msgstr "" -#: order/templates/order/sales_order_detail.html:346 templates/js/build.js:738 +#: order/templates/order/sales_order_detail.html:356 templates/js/build.js:739 msgid "Allocate stock" msgstr "" -#: order/templates/order/sales_order_detail.html:349 +#: order/templates/order/sales_order_detail.html:359 msgid "Purchase stock" msgstr "" -#: order/templates/order/sales_order_detail.html:353 templates/js/build.js:731 -#: templates/js/build.js:1149 +#: order/templates/order/sales_order_detail.html:363 templates/js/build.js:732 +#: templates/js/build.js:1150 msgid "Build stock" msgstr "" -#: order/templates/order/sales_order_detail.html:356 -#: order/templates/order/sales_order_detail.html:465 +#: order/templates/order/sales_order_detail.html:366 +#: order/templates/order/sales_order_detail.html:485 msgid "Calculate price" msgstr "" -#: order/templates/order/sales_order_detail.html:360 +#: order/templates/order/sales_order_detail.html:370 msgid "Delete line item " msgstr "" -#: order/templates/order/sales_order_detail.html:471 +#: order/templates/order/sales_order_detail.html:491 msgid "Update Unit Price" msgstr "" @@ -3459,195 +3505,155 @@ msgstr "" msgid "Sales Order Attachments" msgstr "" -#: order/views.py:104 -msgid "Add Purchase Order Attachment" -msgstr "" - -#: order/views.py:154 -msgid "Add Sales Order Attachment" -msgstr "" - -#: order/views.py:346 -msgid "Create Sales Order" -msgstr "" - -#: order/views.py:381 -msgid "Edit Purchase Order" -msgstr "" - -#: order/views.py:401 -msgid "Edit Sales Order" -msgstr "" - -#: order/views.py:417 +#: order/views.py:151 msgid "Cancel Order" msgstr "" -#: order/views.py:426 order/views.py:452 +#: order/views.py:160 order/views.py:186 msgid "Confirm order cancellation" msgstr "" -#: order/views.py:429 order/views.py:455 +#: order/views.py:163 order/views.py:189 msgid "Order cannot be cancelled" msgstr "" -#: order/views.py:443 +#: order/views.py:177 msgid "Cancel sales order" msgstr "" -#: order/views.py:469 +#: order/views.py:203 msgid "Issue Order" msgstr "" -#: order/views.py:478 +#: order/views.py:212 msgid "Confirm order placement" msgstr "" -#: order/views.py:488 +#: order/views.py:222 msgid "Purchase order issued" msgstr "" -#: order/views.py:499 +#: order/views.py:233 msgid "Complete Order" msgstr "" -#: order/views.py:515 +#: order/views.py:249 msgid "Confirm order completion" msgstr "" -#: order/views.py:526 +#: order/views.py:260 msgid "Purchase order completed" msgstr "" -#: order/views.py:536 +#: order/views.py:270 msgid "Ship Order" msgstr "" -#: order/views.py:552 +#: order/views.py:286 msgid "Confirm order shipment" msgstr "" -#: order/views.py:558 +#: order/views.py:292 msgid "Could not ship order" msgstr "" -#: order/views.py:584 +#: order/views.py:339 msgid "Match Supplier Parts" msgstr "" -#: order/views.py:798 +#: order/views.py:536 msgid "Receive Parts" msgstr "" -#: order/views.py:868 +#: order/views.py:606 msgid "Items received" msgstr "" -#: order/views.py:882 +#: order/views.py:620 msgid "No destination set" msgstr "" -#: order/views.py:927 +#: order/views.py:665 msgid "Error converting quantity to number" msgstr "" -#: order/views.py:933 +#: order/views.py:671 msgid "Receive quantity less than zero" msgstr "" -#: order/views.py:939 +#: order/views.py:677 msgid "No lines specified" msgstr "" -#: order/views.py:1012 +#: order/views.py:750 msgid "Update prices" msgstr "" -#: order/views.py:1270 +#: order/views.py:1008 #, python-brace-format msgid "Ordered {n} parts" msgstr "" -#: order/views.py:1330 -msgid "Supplier part must be specified" -msgstr "" - -#: order/views.py:1336 -msgid "Supplier must match for Part and Order" -msgstr "" - -#: order/views.py:1467 order/views.py:1485 -msgid "Edit Line Item" -msgstr "" - -#: order/views.py:1501 order/views.py:1513 -msgid "Delete Line Item" -msgstr "" - -#: order/views.py:1506 order/views.py:1518 -msgid "Deleted line item" -msgstr "" - -#: order/views.py:1531 +#: order/views.py:1061 msgid "Allocate Serial Numbers" msgstr "" -#: order/views.py:1576 +#: order/views.py:1106 #, python-brace-format msgid "Allocated {n} items" msgstr "" -#: order/views.py:1592 +#: order/views.py:1122 msgid "Select line item" msgstr "" -#: order/views.py:1623 +#: order/views.py:1153 #, python-brace-format msgid "No matching item for serial {serial}" msgstr "" -#: order/views.py:1633 +#: order/views.py:1163 #, python-brace-format msgid "{serial} is not in stock" msgstr "" -#: order/views.py:1641 +#: order/views.py:1171 #, python-brace-format msgid "{serial} already allocated to an order" msgstr "" -#: order/views.py:1695 +#: order/views.py:1225 msgid "Allocate Stock to Order" msgstr "" -#: order/views.py:1769 +#: order/views.py:1299 msgid "Edit Allocation Quantity" msgstr "" -#: order/views.py:1784 +#: order/views.py:1314 msgid "Remove allocation" msgstr "" -#: order/views.py:1856 +#: order/views.py:1386 msgid "Sales order not found" msgstr "" -#: order/views.py:1862 +#: order/views.py:1392 msgid "Price not found" msgstr "" -#: order/views.py:1865 +#: order/views.py:1395 #, python-brace-format msgid "Updated {part} unit-price to {price}" msgstr "" -#: order/views.py:1870 +#: order/views.py:1400 #, python-brace-format msgid "Updated {part} unit-price to {price} and quantity to {qty}" msgstr "" -#: part/bom.py:138 part/models.py:72 part/models.py:747 -#: part/templates/part/category.html:66 part/templates/part/detail.html:90 +#: part/bom.py:138 part/models.py:72 part/models.py:756 +#: part/templates/part/category.html:75 part/templates/part/detail.html:90 msgid "Default Location" msgstr "" @@ -3668,143 +3674,143 @@ msgstr "" msgid "Error reading BOM file (incorrect row size)" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "File Format" msgstr "" -#: part/forms.py:89 stock/forms.py:265 +#: part/forms.py:73 stock/forms.py:232 msgid "Select output file format" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Cascading" msgstr "" -#: part/forms.py:91 +#: part/forms.py:75 msgid "Download cascading / multi-level BOM" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Levels" msgstr "" -#: part/forms.py:93 +#: part/forms.py:77 msgid "Select maximum number of BOM levels to export (0 = all levels)" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include Parameter Data" msgstr "" -#: part/forms.py:95 +#: part/forms.py:79 msgid "Include part parameters data in exported BOM" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include Stock Data" msgstr "" -#: part/forms.py:97 +#: part/forms.py:81 msgid "Include part stock data in exported BOM" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include Manufacturer Data" msgstr "" -#: part/forms.py:99 +#: part/forms.py:83 msgid "Include part manufacturer data in exported BOM" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include Supplier Data" msgstr "" -#: part/forms.py:101 +#: part/forms.py:85 msgid "Include part supplier data in exported BOM" msgstr "" -#: part/forms.py:122 part/models.py:2191 +#: part/forms.py:106 part/models.py:2224 msgid "Parent Part" msgstr "" -#: part/forms.py:123 part/templates/part/bom_duplicate.html:7 +#: part/forms.py:107 part/templates/part/bom_duplicate.html:7 msgid "Select parent part to copy BOM from" msgstr "" -#: part/forms.py:129 +#: part/forms.py:113 msgid "Clear existing BOM items" msgstr "" -#: part/forms.py:135 +#: part/forms.py:119 msgid "Confirm BOM duplication" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "validate" msgstr "" -#: part/forms.py:153 +#: part/forms.py:137 msgid "Confirm that the BOM is correct" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "BOM file" msgstr "" -#: part/forms.py:165 +#: part/forms.py:149 msgid "Select BOM file to upload" msgstr "" -#: part/forms.py:184 +#: part/forms.py:168 msgid "Related Part" msgstr "" -#: part/forms.py:203 +#: part/forms.py:175 msgid "Select part category" msgstr "" -#: part/forms.py:220 +#: part/forms.py:192 msgid "Duplicate all BOM data for this part" msgstr "" -#: part/forms.py:221 +#: part/forms.py:193 msgid "Copy BOM" msgstr "" -#: part/forms.py:226 +#: part/forms.py:198 msgid "Duplicate all parameter data for this part" msgstr "" -#: part/forms.py:227 +#: part/forms.py:199 msgid "Copy Parameters" msgstr "" -#: part/forms.py:232 +#: part/forms.py:204 msgid "Confirm part creation" msgstr "" -#: part/forms.py:237 +#: part/forms.py:209 msgid "Include category parameter templates" msgstr "" -#: part/forms.py:242 +#: part/forms.py:214 msgid "Include parent categories parameter templates" msgstr "" -#: part/forms.py:322 +#: part/forms.py:294 msgid "Add parameter template to same level categories" msgstr "" -#: part/forms.py:326 +#: part/forms.py:298 msgid "Add parameter template to all categories" msgstr "" -#: part/forms.py:344 part/models.py:2286 +#: part/forms.py:316 part/models.py:2323 msgid "Sub part" msgstr "" -#: part/forms.py:373 +#: part/forms.py:345 msgid "Input quantity for price calculation" msgstr "" @@ -3820,362 +3826,362 @@ msgstr "" msgid "Default keywords for parts in this category" msgstr "" -#: part/models.py:82 part/models.py:2237 +#: part/models.py:86 part/models.py:2270 #: part/templates/part/part_app_base.html:10 msgid "Part Category" msgstr "" -#: part/models.py:83 part/templates/part/category.html:23 -#: part/templates/part/category.html:94 templates/InvenTree/search.html:127 -#: templates/stats.html:84 users/models.py:39 +#: part/models.py:87 part/templates/part/category.html:32 +#: part/templates/part/category.html:103 templates/InvenTree/search.html:127 +#: templates/stats.html:84 users/models.py:40 msgid "Part Categories" msgstr "" -#: part/models.py:448 part/models.py:460 +#: part/models.py:457 part/models.py:469 #, python-brace-format msgid "Part '{p1}' is used in BOM for '{p2}' (recursive)" msgstr "" -#: part/models.py:557 +#: part/models.py:566 msgid "Next available serial numbers are" msgstr "" -#: part/models.py:561 +#: part/models.py:570 msgid "Next available serial number is" msgstr "" -#: part/models.py:566 +#: part/models.py:575 msgid "Most recent serial number is" msgstr "" -#: part/models.py:645 +#: part/models.py:654 msgid "Duplicate IPN not allowed in part settings" msgstr "" -#: part/models.py:670 part/templates/part/detail.html:22 +#: part/models.py:679 part/templates/part/detail.html:22 msgid "Part name" msgstr "" -#: part/models.py:677 +#: part/models.py:686 msgid "Is Template" msgstr "" -#: part/models.py:678 +#: part/models.py:687 msgid "Is this part a template part?" msgstr "" -#: part/models.py:689 +#: part/models.py:698 msgid "Is this part a variant of another part?" msgstr "" -#: part/models.py:690 part/templates/part/detail.html:60 +#: part/models.py:699 part/templates/part/detail.html:60 msgid "Variant Of" msgstr "" -#: part/models.py:696 +#: part/models.py:705 msgid "Part description" msgstr "" -#: part/models.py:701 part/templates/part/category.html:73 +#: part/models.py:710 part/templates/part/category.html:82 #: part/templates/part/detail.html:67 msgid "Keywords" msgstr "" -#: part/models.py:702 +#: part/models.py:711 msgid "Part keywords to improve visibility in search results" msgstr "" -#: part/models.py:709 part/models.py:2236 part/templates/part/detail.html:73 +#: part/models.py:718 part/models.py:2269 part/templates/part/detail.html:73 #: part/templates/part/set_category.html:15 templates/js/part.js:452 msgid "Category" msgstr "" -#: part/models.py:710 +#: part/models.py:719 msgid "Part category" msgstr "" -#: part/models.py:715 part/templates/part/detail.html:28 +#: part/models.py:724 part/templates/part/detail.html:28 #: part/templates/part/part_base.html:87 templates/js/part.js:169 #: templates/js/part.js:296 msgid "IPN" msgstr "" -#: part/models.py:716 +#: part/models.py:725 msgid "Internal Part Number" msgstr "" -#: part/models.py:722 +#: part/models.py:731 msgid "Part revision or version number" msgstr "" -#: part/models.py:723 part/templates/part/detail.html:35 report/models.py:199 +#: part/models.py:732 part/templates/part/detail.html:35 report/models.py:199 #: templates/js/part.js:173 msgid "Revision" msgstr "" -#: part/models.py:745 +#: part/models.py:754 msgid "Where is this item normally stored?" msgstr "" -#: part/models.py:792 part/templates/part/detail.html:97 +#: part/models.py:801 part/templates/part/detail.html:97 msgid "Default Supplier" msgstr "" -#: part/models.py:793 +#: part/models.py:802 msgid "Default supplier part" msgstr "" -#: part/models.py:800 +#: part/models.py:809 msgid "Default Expiry" msgstr "" -#: part/models.py:801 +#: part/models.py:810 msgid "Expiry time (in days) for stock items of this part" msgstr "" -#: part/models.py:806 part/templates/part/detail.html:113 +#: part/models.py:815 part/templates/part/detail.html:113 msgid "Minimum Stock" msgstr "" -#: part/models.py:807 +#: part/models.py:816 msgid "Minimum allowed stock level" msgstr "" -#: part/models.py:814 +#: part/models.py:823 msgid "Stock keeping units for this part" msgstr "" -#: part/models.py:820 +#: part/models.py:829 msgid "Can this part be built from other parts?" msgstr "" -#: part/models.py:826 +#: part/models.py:835 msgid "Can this part be used to build other parts?" msgstr "" -#: part/models.py:832 +#: part/models.py:841 msgid "Does this part have tracking for unique items?" msgstr "" -#: part/models.py:837 +#: part/models.py:846 msgid "Can this part be purchased from external suppliers?" msgstr "" -#: part/models.py:842 +#: part/models.py:851 msgid "Can this part be sold to customers?" msgstr "" -#: part/models.py:846 part/templates/part/detail.html:227 +#: part/models.py:855 part/templates/part/detail.html:227 #: templates/js/table_filters.js:21 templates/js/table_filters.js:65 -#: templates/js/table_filters.js:241 templates/js/table_filters.js:310 +#: templates/js/table_filters.js:246 templates/js/table_filters.js:315 msgid "Active" msgstr "" -#: part/models.py:847 +#: part/models.py:856 msgid "Is this part active?" msgstr "" -#: part/models.py:852 +#: part/models.py:861 msgid "Is this a virtual part, such as a software product or license?" msgstr "" -#: part/models.py:857 +#: part/models.py:866 msgid "Part notes - supports Markdown formatting" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "BOM checksum" msgstr "" -#: part/models.py:860 +#: part/models.py:869 msgid "Stored BOM checksum" msgstr "" -#: part/models.py:863 +#: part/models.py:872 msgid "BOM checked by" msgstr "" -#: part/models.py:865 +#: part/models.py:874 msgid "BOM checked date" msgstr "" -#: part/models.py:869 +#: part/models.py:878 msgid "Creation User" msgstr "" -#: part/models.py:1608 +#: part/models.py:1617 msgid "Sell multiple" msgstr "" -#: part/models.py:2063 +#: part/models.py:2088 msgid "Test templates can only be created for trackable parts" msgstr "" -#: part/models.py:2080 +#: part/models.py:2105 msgid "Test with this name already exists for this part" msgstr "" -#: part/models.py:2100 templates/js/part.js:717 templates/js/stock.js:117 +#: part/models.py:2125 templates/js/part.js:717 templates/js/stock.js:117 msgid "Test Name" msgstr "" -#: part/models.py:2101 +#: part/models.py:2126 msgid "Enter a name for the test" msgstr "" -#: part/models.py:2106 +#: part/models.py:2131 msgid "Test Description" msgstr "" -#: part/models.py:2107 +#: part/models.py:2132 msgid "Enter description for this test" msgstr "" -#: part/models.py:2112 templates/js/part.js:726 -#: templates/js/table_filters.js:227 +#: part/models.py:2137 templates/js/part.js:726 +#: templates/js/table_filters.js:232 msgid "Required" msgstr "" -#: part/models.py:2113 +#: part/models.py:2138 msgid "Is this test required to pass?" msgstr "" -#: part/models.py:2118 templates/js/part.js:734 +#: part/models.py:2143 templates/js/part.js:734 msgid "Requires Value" msgstr "" -#: part/models.py:2119 +#: part/models.py:2144 msgid "Does this test require a value when adding a test result?" msgstr "" -#: part/models.py:2124 templates/js/part.js:741 +#: part/models.py:2149 templates/js/part.js:741 msgid "Requires Attachment" msgstr "" -#: part/models.py:2125 +#: part/models.py:2150 msgid "Does this test require a file attachment when adding a test result?" msgstr "" -#: part/models.py:2158 +#: part/models.py:2187 msgid "Parameter template name must be unique" msgstr "" -#: part/models.py:2163 +#: part/models.py:2192 msgid "Parameter Name" msgstr "" -#: part/models.py:2165 +#: part/models.py:2194 msgid "Parameter Units" msgstr "" -#: part/models.py:2193 part/models.py:2242 part/models.py:2243 +#: part/models.py:2226 part/models.py:2275 part/models.py:2276 #: templates/InvenTree/settings/category.html:62 msgid "Parameter Template" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Data" msgstr "" -#: part/models.py:2195 +#: part/models.py:2228 msgid "Parameter Value" msgstr "" -#: part/models.py:2247 templates/InvenTree/settings/category.html:67 +#: part/models.py:2280 templates/InvenTree/settings/category.html:67 msgid "Default Value" msgstr "" -#: part/models.py:2248 +#: part/models.py:2281 msgid "Default Parameter Value" msgstr "" -#: part/models.py:2278 +#: part/models.py:2315 msgid "Select parent part" msgstr "" -#: part/models.py:2287 +#: part/models.py:2324 msgid "Select part to be used in BOM" msgstr "" -#: part/models.py:2293 +#: part/models.py:2330 msgid "BOM quantity for this BOM item" msgstr "" -#: part/models.py:2295 templates/js/bom.js:216 templates/js/bom.js:285 +#: part/models.py:2332 templates/js/bom.js:216 templates/js/bom.js:278 msgid "Optional" msgstr "" -#: part/models.py:2295 +#: part/models.py:2332 msgid "This BOM item is optional" msgstr "" -#: part/models.py:2298 +#: part/models.py:2335 msgid "Overage" msgstr "" -#: part/models.py:2299 +#: part/models.py:2336 msgid "Estimated build wastage quantity (absolute or percentage)" msgstr "" -#: part/models.py:2302 +#: part/models.py:2339 msgid "BOM item reference" msgstr "" -#: part/models.py:2305 +#: part/models.py:2342 msgid "BOM item notes" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "Checksum" msgstr "" -#: part/models.py:2307 +#: part/models.py:2344 msgid "BOM line checksum" msgstr "" -#: part/models.py:2311 templates/js/bom.js:302 templates/js/bom.js:309 +#: part/models.py:2348 templates/js/bom.js:295 templates/js/bom.js:302 #: templates/js/table_filters.js:51 msgid "Inherited" msgstr "" -#: part/models.py:2312 +#: part/models.py:2349 msgid "This BOM item is inherited by BOMs for variant parts" msgstr "" -#: part/models.py:2317 templates/js/bom.js:294 +#: part/models.py:2354 templates/js/bom.js:287 msgid "Allow Variants" msgstr "" -#: part/models.py:2318 +#: part/models.py:2355 msgid "Stock items for variant parts can be used for this BOM item" msgstr "" -#: part/models.py:2394 part/views.py:1692 part/views.py:1744 -#: stock/models.py:294 +#: part/models.py:2431 part/views.py:1736 part/views.py:1788 +#: stock/models.py:298 msgid "Quantity must be integer value for trackable parts" msgstr "" -#: part/models.py:2403 part/models.py:2405 +#: part/models.py:2440 part/models.py:2442 msgid "Sub part must be specified" msgstr "" -#: part/models.py:2408 +#: part/models.py:2445 msgid "BOM Item" msgstr "" -#: part/models.py:2527 +#: part/models.py:2564 msgid "Part 1" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Part 2" msgstr "" -#: part/models.py:2531 +#: part/models.py:2568 msgid "Select Related Part" msgstr "" -#: part/models.py:2563 +#: part/models.py:2600 msgid "Error creating relationship: check that the part is not related to itself and that the relationship is unique" msgstr "" @@ -4191,16 +4197,8 @@ msgstr "" msgid "Part Attachments" msgstr "" -#: part/templates/part/bom-delete.html:6 -msgid "Are you sure you want to delete this BOM item?" -msgstr "" - -#: part/templates/part/bom-delete.html:8 -msgid "Deleting this entry will remove the BOM row from the following part" -msgstr "" - -#: part/templates/part/bom.html:10 part/templates/part/navbar.html:50 -#: part/templates/part/navbar.html:53 +#: part/templates/part/bom.html:10 part/templates/part/navbar.html:51 +#: part/templates/part/navbar.html:54 msgid "Bill of Materials" msgstr "" @@ -4247,7 +4245,7 @@ msgstr "" msgid "Validate Bill of Materials" msgstr "" -#: part/templates/part/bom.html:61 part/views.py:1987 +#: part/templates/part/bom.html:61 part/views.py:2031 msgid "Export Bill of Materials" msgstr "" @@ -4263,8 +4261,8 @@ msgstr "" msgid "All selected BOM items will be deleted" msgstr "" -#: part/templates/part/bom.html:160 part/views.py:585 -#: templates/js/stock.js:1313 +#: part/templates/part/bom.html:160 part/views.py:450 +#: templates/js/stock.js:1327 msgid "Create New Part" msgstr "" @@ -4300,7 +4298,7 @@ msgid "Select Part" msgstr "" #: part/templates/part/bom_upload/select_parts.html:65 -#: part/templates/part/category.html:117 +#: part/templates/part/category.html:126 msgid "Create new part" msgstr "" @@ -4341,90 +4339,99 @@ msgstr "" msgid "Start New Build" msgstr "" -#: part/templates/part/category.html:24 +#: part/templates/part/category.html:33 msgid "All parts" msgstr "" -#: part/templates/part/category.html:29 part/views.py:2397 +#: part/templates/part/category.html:38 part/views.py:2441 msgid "Create new part category" msgstr "" -#: part/templates/part/category.html:35 +#: part/templates/part/category.html:44 msgid "Edit part category" msgstr "" -#: part/templates/part/category.html:40 +#: part/templates/part/category.html:49 msgid "Delete part category" msgstr "" -#: part/templates/part/category.html:50 part/templates/part/category.html:89 +#: part/templates/part/category.html:59 part/templates/part/category.html:98 msgid "Category Details" msgstr "" -#: part/templates/part/category.html:55 +#: part/templates/part/category.html:64 msgid "Category Path" msgstr "" -#: part/templates/part/category.html:60 +#: part/templates/part/category.html:69 msgid "Category Description" msgstr "" -#: part/templates/part/category.html:79 -#: part/templates/part/category_navbar.html:11 -#: part/templates/part/category_navbar.html:18 +#: part/templates/part/category.html:88 +#: part/templates/part/category_navbar.html:14 +#: part/templates/part/category_navbar.html:21 #: part/templates/part/subcategory.html:16 msgid "Subcategories" msgstr "" -#: part/templates/part/category.html:84 +#: part/templates/part/category.html:93 msgid "Parts (Including subcategories)" msgstr "" -#: part/templates/part/category.html:113 +#: part/templates/part/category.html:122 msgid "Export Part Data" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set category" msgstr "" -#: part/templates/part/category.html:125 +#: part/templates/part/category.html:134 msgid "Set Category" msgstr "" -#: part/templates/part/category.html:128 +#: part/templates/part/category.html:137 msgid "Export Data" msgstr "" -#: part/templates/part/category.html:132 +#: part/templates/part/category.html:141 msgid "View list display" msgstr "" -#: part/templates/part/category.html:135 +#: part/templates/part/category.html:144 msgid "View grid display" msgstr "" -#: part/templates/part/category.html:209 -#: stock/templates/stock/location.html:192 templates/js/stock.js:737 +#: part/templates/part/category.html:218 +#: stock/templates/stock/location.html:192 templates/js/stock.js:751 msgid "Create new location" msgstr "" -#: part/templates/part/category.html:214 part/templates/part/category.html:244 +#: part/templates/part/category.html:223 part/templates/part/category.html:253 +#: part/templates/part/part_base.html:378 msgid "New Category" msgstr "" -#: part/templates/part/category.html:215 +#: part/templates/part/category.html:224 msgid "Create new category" msgstr "" -#: part/templates/part/category.html:245 +#: part/templates/part/category.html:254 msgid "Create new Part Category" msgstr "" -#: part/templates/part/category.html:251 stock/views.py:1391 +#: part/templates/part/category.html:260 stock/views.py:1223 msgid "Create new Stock Location" msgstr "" +#: part/templates/part/category.html:279 +msgid "Select parent category" +msgstr "" + +#: part/templates/part/category.html:286 part/views.py:2389 +msgid "Edit Part Category" +msgstr "" + #: part/templates/part/category_delete.html:5 msgid "Are you sure you want to delete category" msgstr "" @@ -4460,12 +4467,17 @@ msgstr "" msgid "If this category is deleted, these parts will be moved to the top-level category Teile" msgstr "" +#: part/templates/part/category_navbar.html:37 +#: part/templates/part/category_navbar.html:40 +msgid "Import Parts" +msgstr "" + #: part/templates/part/category_parametric.html:10 -#: part/templates/part/navbar.html:21 part/templates/part/params.html:10 +#: part/templates/part/navbar.html:22 part/templates/part/params.html:10 msgid "Part Parameters" msgstr "" -#: part/templates/part/copy_part.html:9 part/views.py:461 +#: part/templates/part/copy_part.html:9 part/views.py:326 msgid "Duplicate Part" msgstr "" @@ -4489,7 +4501,7 @@ msgstr "" msgid "%(full_name)s - %(desc)s (%(match_per)s%% match)" msgstr "" -#: part/templates/part/detail.html:11 part/templates/part/navbar.html:13 +#: part/templates/part/detail.html:11 part/templates/part/navbar.html:14 msgid "Part Details" msgstr "" @@ -4569,34 +4581,13 @@ msgstr "" msgid "Part is not active" msgstr "" -#: part/templates/part/internal_prices.html:11 -#: part/templates/part/navbar.html:100 -msgid "Internal Price Information" +#: part/templates/part/import_wizard/ajax_part_upload.html:29 +#: part/templates/part/import_wizard/part_upload.html:51 +msgid "Unsuffitient privileges." msgstr "" -#: part/templates/part/internal_prices.html:19 part/views.py:2822 -msgid "Add Internal Price Break" -msgstr "" - -#: part/templates/part/internal_prices.html:28 templates/403.html:5 -#: templates/403.html:11 -msgid "Permission Denied" -msgstr "" - -#: part/templates/part/internal_prices.html:31 templates/403.html:14 -msgid "You do not have permission to view this page." -msgstr "" - -#: part/templates/part/internal_prices.html:59 -msgid "No internal price break information found" -msgstr "" - -#: part/templates/part/internal_prices.html:110 -msgid "Edit internal price break" -msgstr "" - -#: part/templates/part/internal_prices.html:111 -msgid "Delete internal price break" +#: part/templates/part/import_wizard/part_upload.html:14 +msgid "Import Parts from File" msgstr "" #: part/templates/part/manufacturer.html:11 @@ -4608,149 +4599,51 @@ msgid "Delete manufacturer parts" msgstr "" #: part/templates/part/manufacturer.html:53 -#: part/templates/part/supplier.html:57 +#: part/templates/part/supplier.html:56 msgid "Create new manufacturer" msgstr "" -#: part/templates/part/navbar.html:28 part/templates/part/variants.html:11 +#: part/templates/part/navbar.html:29 part/templates/part/variants.html:11 msgid "Part Variants" msgstr "" -#: part/templates/part/navbar.html:31 +#: part/templates/part/navbar.html:32 msgid "Variants" msgstr "" -#: part/templates/part/navbar.html:42 +#: part/templates/part/navbar.html:43 msgid "Allocated Stock" msgstr "" -#: part/templates/part/navbar.html:45 +#: part/templates/part/navbar.html:46 msgid "Allocations" msgstr "" -#: part/templates/part/navbar.html:66 part/templates/part/navbar.html:69 +#: part/templates/part/navbar.html:67 part/templates/part/navbar.html:70 msgid "Used In" msgstr "" -#: part/templates/part/navbar.html:74 part/templates/part/order_prices.html:12 -msgid "Order Price Information" -msgstr "" - #: part/templates/part/navbar.html:77 -msgid "Order Price" +msgid "Prices" msgstr "" -#: part/templates/part/navbar.html:103 part/templates/part/order_prices.html:93 -#: part/templates/part/part_pricing.html:82 -msgid "Internal Price" -msgstr "" - -#: part/templates/part/navbar.html:106 -msgid "Sales Price Information" -msgstr "" - -#: part/templates/part/navbar.html:120 part/templates/part/part_tests.html:10 +#: part/templates/part/navbar.html:109 part/templates/part/part_tests.html:10 msgid "Part Test Templates" msgstr "" -#: part/templates/part/navbar.html:123 stock/templates/stock/item_base.html:414 +#: part/templates/part/navbar.html:112 stock/templates/stock/item_base.html:414 msgid "Tests" msgstr "" -#: part/templates/part/navbar.html:127 part/templates/part/navbar.html:130 +#: part/templates/part/navbar.html:117 part/templates/part/navbar.html:120 #: part/templates/part/related.html:10 msgid "Related Parts" msgstr "" -#: part/templates/part/navbar.html:139 part/templates/part/notes.html:12 +#: part/templates/part/navbar.html:130 part/templates/part/notes.html:12 msgid "Part Notes" msgstr "" -#: part/templates/part/order_prices.html:24 -#: part/templates/part/part_base.html:282 -msgid "Calculate" -msgstr "" - -#: part/templates/part/order_prices.html:31 -msgid "Pricing ranges" -msgstr "" - -#: part/templates/part/order_prices.html:36 -#: part/templates/part/part_pricing.html:22 -msgid "Supplier Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:37 -#: part/templates/part/order_prices.html:62 -#: part/templates/part/order_prices.html:94 -#: part/templates/part/order_prices.html:108 -#: part/templates/part/part_pricing.html:26 -#: part/templates/part/part_pricing.html:52 -#: part/templates/part/part_pricing.html:85 -#: part/templates/part/part_pricing.html:100 -msgid "Unit Cost" -msgstr "" - -#: part/templates/part/order_prices.html:44 -#: part/templates/part/order_prices.html:69 -#: part/templates/part/order_prices.html:99 -#: part/templates/part/order_prices.html:113 -#: part/templates/part/part_pricing.html:32 -#: part/templates/part/part_pricing.html:58 -#: part/templates/part/part_pricing.html:89 -#: part/templates/part/part_pricing.html:104 -msgid "Total Cost" -msgstr "" - -#: part/templates/part/order_prices.html:52 -#: part/templates/part/part_pricing.html:40 -msgid "No supplier pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:61 -#: part/templates/part/order_prices.html:128 -#: part/templates/part/part_pricing.html:48 -msgid "BOM Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:77 -#: part/templates/part/part_pricing.html:66 -msgid "Note: BOM pricing is incomplete for this part" -msgstr "" - -#: part/templates/part/order_prices.html:84 -#: part/templates/part/part_pricing.html:73 -msgid "No BOM pricing available" -msgstr "" - -#: part/templates/part/order_prices.html:122 -#: part/templates/part/part_pricing.html:113 -msgid "No pricing information is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:138 -msgid "Stock Pricing" -msgstr "" - -#: part/templates/part/order_prices.html:146 -msgid "No stock pricing history is available for this part." -msgstr "" - -#: part/templates/part/order_prices.html:165 -#, python-format -msgid "Single Price - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:177 -#, python-format -msgid "Single Price Difference - %(currency)s" -msgstr "" - -#: part/templates/part/order_prices.html:189 -#, python-format -msgid "Part Single Price - %(currency)s" -msgstr "" - #: part/templates/part/params.html:17 msgid "Add new parameter" msgstr "" @@ -4771,8 +4664,8 @@ msgstr "" msgid "Part List" msgstr "" -#: part/templates/part/part_base.html:26 templates/js/company.js:156 -#: templates/js/company.js:355 templates/js/part.js:84 templates/js/part.js:161 +#: part/templates/part/part_base.html:26 templates/js/company.js:280 +#: templates/js/company.js:480 templates/js/part.js:84 templates/js/part.js:161 msgid "Inactive" msgstr "" @@ -4835,7 +4728,7 @@ msgstr "" msgid "In Stock" msgstr "" -#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:131 +#: part/templates/part/part_base.html:143 templates/InvenTree/index.html:132 msgid "Required for Build Orders" msgstr "" @@ -4847,7 +4740,7 @@ msgstr "" msgid "Allocated to Orders" msgstr "" -#: part/templates/part/part_base.html:172 templates/js/bom.js:323 +#: part/templates/part/part_base.html:172 templates/js/bom.js:316 msgid "Can Build" msgstr "" @@ -4856,10 +4749,86 @@ msgstr "" msgid "Building" msgstr "" +#: part/templates/part/part_base.html:285 part/templates/part/prices.html:131 +msgid "Calculate" +msgstr "" + +#: part/templates/part/part_base.html:379 +msgid "Create New Part Category" +msgstr "" + +#: part/templates/part/part_base.html:387 +msgid "New Parent" +msgstr "" + +#: part/templates/part/part_base.html:435 +msgid "Edit Part" +msgstr "" + +#: part/templates/part/part_pricing.html:22 part/templates/part/prices.html:27 +msgid "Supplier Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:26 +#: part/templates/part/part_pricing.html:52 +#: part/templates/part/part_pricing.html:85 +#: part/templates/part/part_pricing.html:100 part/templates/part/prices.html:31 +#: part/templates/part/prices.html:58 part/templates/part/prices.html:90 +#: part/templates/part/prices.html:107 +msgid "Unit Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:32 +#: part/templates/part/part_pricing.html:58 +#: part/templates/part/part_pricing.html:89 +#: part/templates/part/part_pricing.html:104 part/templates/part/prices.html:38 +#: part/templates/part/prices.html:65 part/templates/part/prices.html:95 +#: part/templates/part/prices.html:112 +msgid "Total Cost" +msgstr "" + +#: part/templates/part/part_pricing.html:40 part/templates/part/prices.html:46 +msgid "No supplier pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:48 part/templates/part/prices.html:55 +#: part/templates/part/prices.html:235 +msgid "BOM Pricing" +msgstr "" + +#: part/templates/part/part_pricing.html:66 part/templates/part/prices.html:73 +msgid "Note: BOM pricing is incomplete for this part" +msgstr "" + +#: part/templates/part/part_pricing.html:73 part/templates/part/prices.html:80 +msgid "No BOM pricing available" +msgstr "" + +#: part/templates/part/part_pricing.html:82 part/templates/part/prices.html:89 +msgid "Internal Price" +msgstr "" + +#: part/templates/part/part_pricing.html:113 +#: part/templates/part/prices.html:121 +msgid "No pricing information is available for this part." +msgstr "" + #: part/templates/part/part_tests.html:17 msgid "Add Test Template" msgstr "" +#: part/templates/part/part_tests.html:61 +msgid "Add Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:79 +msgid "Edit Test Result Template" +msgstr "" + +#: part/templates/part/part_tests.html:91 +msgid "Delete Test Result Template" +msgstr "" + #: part/templates/part/part_thumb.html:20 msgid "Select from existing images" msgstr "" @@ -4894,12 +4863,98 @@ msgstr "" msgid "There are %(count)s unique parts tracked for '%(full_name)s'. Deleting this part will permanently remove this tracking information." msgstr "" -#: part/templates/part/related.html:18 -msgid "Add Related" +#: part/templates/part/prices.html:12 +msgid "General Price Information" msgstr "" -#: part/templates/part/sale_prices.html:10 -msgid "Sell Price Information" +#: part/templates/part/prices.html:22 +msgid "Pricing ranges" +msgstr "" + +#: part/templates/part/prices.html:28 +msgid "Show supplier cost" +msgstr "" + +#: part/templates/part/prices.html:29 +msgid "Show purchase price" +msgstr "" + +#: part/templates/part/prices.html:56 +msgid "Show BOM cost" +msgstr "" + +#: part/templates/part/prices.html:104 +msgid "Show sale cost" +msgstr "" + +#: part/templates/part/prices.html:105 +msgid "Show sale price" +msgstr "" + +#: part/templates/part/prices.html:127 +msgid "Calculation parameters" +msgstr "" + +#: part/templates/part/prices.html:146 +msgid "Supplier Cost" +msgstr "" + +#: part/templates/part/prices.html:147 part/templates/part/prices.html:167 +#: part/templates/part/prices.html:193 part/templates/part/prices.html:224 +#: part/templates/part/prices.html:251 part/templates/part/prices.html:279 +msgid "Jump to overview" +msgstr "" + +#: part/templates/part/prices.html:172 +msgid "Stock Pricing" +msgstr "" + +#: part/templates/part/prices.html:180 +msgid "No stock pricing history is available for this part." +msgstr "" + +#: part/templates/part/prices.html:192 +msgid "Internal Cost" +msgstr "" + +#: part/templates/part/prices.html:206 part/views.py:2859 +msgid "Add Internal Price Break" +msgstr "" + +#: part/templates/part/prices.html:223 +msgid "BOM Cost" +msgstr "" + +#: part/templates/part/prices.html:250 +msgid "Sale Cost" +msgstr "" + +#: part/templates/part/prices.html:290 +msgid "No sale pice history available for this part." +msgstr "" + +#: part/templates/part/prices.html:340 +#, python-format +msgid "Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:352 +#, python-format +msgid "Single Price Difference - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:364 +#, python-format +msgid "Part Single Price - %(currency)s" +msgstr "" + +#: part/templates/part/prices.html:464 +#, python-format +msgid "Unit Price - %(currency)s" +msgstr "" + +#: part/templates/part/related.html:18 +msgid "Add Related" msgstr "" #: part/templates/part/sales_orders.html:18 @@ -4965,220 +5020,188 @@ msgstr "" msgid "Unknown database" msgstr "" -#: part/views.py:90 +#: part/views.py:95 msgid "Add Related Part" msgstr "" -#: part/views.py:145 +#: part/views.py:150 msgid "Delete Related Part" msgstr "" -#: part/views.py:159 -msgid "Add part attachment" -msgstr "" - -#: part/views.py:212 templates/attachment_table.html:32 -msgid "Edit attachment" -msgstr "" - -#: part/views.py:216 -msgid "Part attachment updated" -msgstr "" - -#: part/views.py:231 -msgid "Delete Part Attachment" -msgstr "" - -#: part/views.py:239 -msgid "Deleted part attachment" -msgstr "" - -#: part/views.py:248 -msgid "Create Test Template" -msgstr "" - -#: part/views.py:275 -msgid "Edit Test Template" -msgstr "" - -#: part/views.py:289 -msgid "Delete Test Template" -msgstr "" - -#: part/views.py:296 +#: part/views.py:161 msgid "Set Part Category" msgstr "" -#: part/views.py:346 +#: part/views.py:211 #, python-brace-format msgid "Set category for {n} parts" msgstr "" -#: part/views.py:381 +#: part/views.py:246 msgid "Create Variant" msgstr "" -#: part/views.py:466 +#: part/views.py:331 msgid "Copied part" msgstr "" -#: part/views.py:520 part/views.py:658 +#: part/views.py:385 part/views.py:523 msgid "Possible matches exist - confirm creation of new part" msgstr "" -#: part/views.py:590 +#: part/views.py:455 msgid "Created new part" msgstr "" +#: part/views.py:623 +msgid "Match References" +msgstr "" + #: part/views.py:925 +msgid "None" +msgstr "" + +#: part/views.py:984 msgid "Part QR Code" msgstr "" -#: part/views.py:1027 -msgid "Upload Part Image" -msgstr "" - -#: part/views.py:1033 part/views.py:1068 -msgid "Updated part image" -msgstr "" - -#: part/views.py:1042 +#: part/views.py:1086 msgid "Select Part Image" msgstr "" -#: part/views.py:1071 +#: part/views.py:1112 +msgid "Updated part image" +msgstr "" + +#: part/views.py:1115 msgid "Part image not found" msgstr "" -#: part/views.py:1082 +#: part/views.py:1126 msgid "Edit Part Properties" msgstr "" -#: part/views.py:1117 +#: part/views.py:1161 msgid "Duplicate BOM" msgstr "" -#: part/views.py:1147 +#: part/views.py:1191 msgid "Confirm duplication of BOM from parent" msgstr "" -#: part/views.py:1168 +#: part/views.py:1212 msgid "Validate BOM" msgstr "" -#: part/views.py:1189 +#: part/views.py:1233 msgid "Confirm that the BOM is valid" msgstr "" -#: part/views.py:1200 +#: part/views.py:1244 msgid "Validated Bill of Materials" msgstr "" -#: part/views.py:1334 +#: part/views.py:1378 msgid "No BOM file provided" msgstr "" -#: part/views.py:1695 +#: part/views.py:1739 msgid "Enter a valid quantity" msgstr "" -#: part/views.py:1720 part/views.py:1723 +#: part/views.py:1764 part/views.py:1767 msgid "Select valid part" msgstr "" -#: part/views.py:1729 +#: part/views.py:1773 msgid "Duplicate part selected" msgstr "" -#: part/views.py:1767 +#: part/views.py:1811 msgid "Select a part" msgstr "" -#: part/views.py:1773 +#: part/views.py:1817 msgid "Selected part creates a circular BOM" msgstr "" -#: part/views.py:1777 +#: part/views.py:1821 msgid "Specify quantity" msgstr "" -#: part/views.py:2039 +#: part/views.py:2083 msgid "Confirm Part Deletion" msgstr "" -#: part/views.py:2046 +#: part/views.py:2090 msgid "Part was deleted" msgstr "" -#: part/views.py:2055 +#: part/views.py:2099 msgid "Part Pricing" msgstr "" -#: part/views.py:2196 +#: part/views.py:2240 msgid "Create Part Parameter Template" msgstr "" -#: part/views.py:2206 +#: part/views.py:2250 msgid "Edit Part Parameter Template" msgstr "" -#: part/views.py:2213 +#: part/views.py:2257 msgid "Delete Part Parameter Template" msgstr "" -#: part/views.py:2221 +#: part/views.py:2265 msgid "Create Part Parameter" msgstr "" -#: part/views.py:2271 +#: part/views.py:2315 msgid "Edit Part Parameter" msgstr "" -#: part/views.py:2285 +#: part/views.py:2329 msgid "Delete Part Parameter" msgstr "" -#: part/views.py:2345 -msgid "Edit Part Category" -msgstr "" - -#: part/views.py:2383 +#: part/views.py:2427 msgid "Delete Part Category" msgstr "" -#: part/views.py:2389 +#: part/views.py:2433 msgid "Part category was deleted" msgstr "" -#: part/views.py:2441 +#: part/views.py:2485 msgid "Create Category Parameter Template" msgstr "" -#: part/views.py:2542 +#: part/views.py:2586 msgid "Edit Category Parameter Template" msgstr "" -#: part/views.py:2598 +#: part/views.py:2642 msgid "Delete Category Parameter Template" msgstr "" -#: part/views.py:2617 +#: part/views.py:2661 msgid "Create BOM Item" msgstr "" -#: part/views.py:2687 +#: part/views.py:2731 msgid "Edit BOM item" msgstr "" -#: part/views.py:2743 -msgid "Confim BOM item deletion" +#: part/views.py:2792 +msgid "Added new price break" msgstr "" -#: part/views.py:2831 +#: part/views.py:2868 msgid "Edit Internal Price Break" msgstr "" -#: part/views.py:2839 +#: part/views.py:2876 msgid "Delete Internal Price Break" msgstr "" @@ -5284,17 +5307,17 @@ msgid "Test Results" msgstr "" #: report/templates/report/inventree_test_report_base.html:88 -#: stock/models.py:1744 +#: stock/models.py:1759 msgid "Test" msgstr "" #: report/templates/report/inventree_test_report_base.html:89 -#: stock/models.py:1750 +#: stock/models.py:1765 msgid "Result" msgstr "" #: report/templates/report/inventree_test_report_base.html:92 -#: templates/js/order.js:195 templates/js/stock.js:1012 +#: templates/js/order.js:257 templates/js/stock.js:1026 msgid "Date" msgstr "" @@ -5306,287 +5329,287 @@ msgstr "" msgid "Fail" msgstr "" -#: stock/api.py:212 +#: stock/api.py:211 #, python-brace-format msgid "Updated stock for {n} items" msgstr "" -#: stock/api.py:281 +#: stock/api.py:280 #, python-brace-format msgid "Moved {n} parts to {loc}" msgstr "" -#: stock/forms.py:114 stock/forms.py:418 stock/models.py:509 +#: stock/forms.py:81 stock/forms.py:385 stock/models.py:513 #: stock/templates/stock/item_base.html:381 templates/js/stock.js:658 msgid "Expiry Date" msgstr "" -#: stock/forms.py:115 stock/forms.py:419 +#: stock/forms.py:82 stock/forms.py:386 msgid "Expiration date for this stock item" msgstr "" -#: stock/forms.py:118 +#: stock/forms.py:85 msgid "Enter unique serial numbers (or leave blank)" msgstr "" -#: stock/forms.py:169 +#: stock/forms.py:136 msgid "Destination for serialized stock (by default, will remain in current location)" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Serial numbers" msgstr "" -#: stock/forms.py:171 +#: stock/forms.py:138 msgid "Unique serial numbers (must match quantity)" msgstr "" -#: stock/forms.py:173 stock/forms.py:349 +#: stock/forms.py:140 stock/forms.py:316 msgid "Add transaction note (optional)" msgstr "" -#: stock/forms.py:203 stock/forms.py:259 +#: stock/forms.py:170 stock/forms.py:226 msgid "Select test report template" msgstr "" -#: stock/forms.py:267 templates/js/table_filters.js:75 +#: stock/forms.py:234 templates/js/table_filters.js:75 #: templates/js/table_filters.js:138 msgid "Include sublocations" msgstr "" -#: stock/forms.py:267 +#: stock/forms.py:234 msgid "Include stock items in sub locations" msgstr "" -#: stock/forms.py:302 +#: stock/forms.py:269 msgid "Stock item to install" msgstr "" -#: stock/forms.py:309 +#: stock/forms.py:276 msgid "Stock quantity to assign" msgstr "" -#: stock/forms.py:337 +#: stock/forms.py:304 msgid "Must not exceed available quantity" msgstr "" -#: stock/forms.py:347 +#: stock/forms.py:314 msgid "Destination location for uninstalled items" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm uninstall" msgstr "" -#: stock/forms.py:351 +#: stock/forms.py:318 msgid "Confirm removal of installed stock items" msgstr "" -#: stock/forms.py:375 +#: stock/forms.py:342 msgid "Destination stock location" msgstr "" -#: stock/forms.py:377 +#: stock/forms.py:344 msgid "Add note (required)" msgstr "" -#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051 +#: stock/forms.py:348 stock/views.py:705 stock/views.py:904 msgid "Confirm stock adjustment" msgstr "" -#: stock/forms.py:381 +#: stock/forms.py:348 msgid "Confirm movement of stock items" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set Default Location" msgstr "" -#: stock/forms.py:383 +#: stock/forms.py:350 msgid "Set the destination as the default location for selected parts" msgstr "" -#: stock/models.py:56 stock/models.py:547 +#: stock/models.py:56 stock/models.py:550 msgid "Owner" msgstr "" -#: stock/models.py:57 stock/models.py:548 +#: stock/models.py:57 stock/models.py:551 msgid "Select Owner" msgstr "" -#: stock/models.py:275 +#: stock/models.py:279 msgid "StockItem with this serial number already exists" msgstr "" -#: stock/models.py:311 +#: stock/models.py:315 #, python-brace-format msgid "Part type ('{pf}') must be {pe}" msgstr "" -#: stock/models.py:321 stock/models.py:330 +#: stock/models.py:325 stock/models.py:334 msgid "Quantity must be 1 for item with a serial number" msgstr "" -#: stock/models.py:322 +#: stock/models.py:326 msgid "Serial number cannot be set if quantity greater than 1" msgstr "" -#: stock/models.py:344 +#: stock/models.py:348 msgid "Item cannot belong to itself" msgstr "" -#: stock/models.py:350 +#: stock/models.py:354 msgid "Item must have a build reference if is_building=True" msgstr "" -#: stock/models.py:357 +#: stock/models.py:361 msgid "Build reference does not point to the same part object" msgstr "" -#: stock/models.py:399 +#: stock/models.py:403 msgid "Parent Stock Item" msgstr "" -#: stock/models.py:408 +#: stock/models.py:412 msgid "Base part" msgstr "" -#: stock/models.py:417 +#: stock/models.py:421 msgid "Select a matching supplier part for this stock item" msgstr "" -#: stock/models.py:422 stock/templates/stock/stock_app_base.html:8 +#: stock/models.py:426 stock/templates/stock/stock_app_base.html:8 msgid "Stock Location" msgstr "" -#: stock/models.py:425 +#: stock/models.py:429 msgid "Where is this stock item located?" msgstr "" -#: stock/models.py:432 +#: stock/models.py:436 msgid "Packaging this stock item is stored in" msgstr "" -#: stock/models.py:437 stock/templates/stock/item_base.html:270 +#: stock/models.py:441 stock/templates/stock/item_base.html:270 msgid "Installed In" msgstr "" -#: stock/models.py:440 +#: stock/models.py:444 msgid "Is this item installed in another item?" msgstr "" -#: stock/models.py:456 +#: stock/models.py:460 msgid "Serial number for this item" msgstr "" -#: stock/models.py:468 +#: stock/models.py:472 msgid "Batch code for this stock item" msgstr "" -#: stock/models.py:472 +#: stock/models.py:476 msgid "Stock Quantity" msgstr "" -#: stock/models.py:481 +#: stock/models.py:485 msgid "Source Build" msgstr "" -#: stock/models.py:483 +#: stock/models.py:487 msgid "Build for this stock item" msgstr "" -#: stock/models.py:494 +#: stock/models.py:498 msgid "Source Purchase Order" msgstr "" -#: stock/models.py:497 +#: stock/models.py:501 msgid "Purchase order for this stock item" msgstr "" -#: stock/models.py:503 +#: stock/models.py:507 msgid "Destination Sales Order" msgstr "" -#: stock/models.py:510 +#: stock/models.py:514 msgid "Expiry date for stock item. Stock will be considered expired after this date" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete on deplete" msgstr "" -#: stock/models.py:523 +#: stock/models.py:527 msgid "Delete this Stock Item when stock is depleted" msgstr "" -#: stock/models.py:533 stock/templates/stock/item_notes.html:13 +#: stock/models.py:537 stock/templates/stock/item_notes.html:13 #: stock/templates/stock/navbar.html:54 msgid "Stock Item Notes" msgstr "" -#: stock/models.py:543 +#: stock/models.py:546 msgid "Single unit purchase price at time of purchase" msgstr "" -#: stock/models.py:1011 +#: stock/models.py:1014 msgid "Part is not set as trackable" msgstr "" -#: stock/models.py:1017 +#: stock/models.py:1020 msgid "Quantity must be integer" msgstr "" -#: stock/models.py:1023 +#: stock/models.py:1026 #, python-brace-format msgid "Quantity must not exceed available stock quantity ({n})" msgstr "" -#: stock/models.py:1026 +#: stock/models.py:1029 msgid "Serial numbers must be a list of integers" msgstr "" -#: stock/models.py:1029 +#: stock/models.py:1032 msgid "Quantity does not match serial numbers" msgstr "" -#: stock/models.py:1036 +#: stock/models.py:1039 #, python-brace-format msgid "Serial numbers already exist: {exists}" msgstr "" -#: stock/models.py:1194 +#: stock/models.py:1197 msgid "StockItem cannot be moved as it is not in stock" msgstr "" -#: stock/models.py:1668 +#: stock/models.py:1679 msgid "Entry notes" msgstr "" -#: stock/models.py:1721 +#: stock/models.py:1736 msgid "Value must be provided for this test" msgstr "" -#: stock/models.py:1727 +#: stock/models.py:1742 msgid "Attachment must be uploaded for this test" msgstr "" -#: stock/models.py:1745 +#: stock/models.py:1760 msgid "Test name" msgstr "" -#: stock/models.py:1751 templates/js/table_filters.js:217 +#: stock/models.py:1766 templates/js/table_filters.js:222 msgid "Test result" msgstr "" -#: stock/models.py:1757 +#: stock/models.py:1772 msgid "Test output value" msgstr "" -#: stock/models.py:1764 +#: stock/models.py:1779 msgid "Test result attachment" msgstr "" -#: stock/models.py:1770 +#: stock/models.py:1785 msgid "Test notes" msgstr "" @@ -5738,7 +5761,7 @@ msgstr "" msgid "Stock Item Details" msgstr "" -#: stock/templates/stock/item_base.html:289 templates/js/build.js:593 +#: stock/templates/stock/item_base.html:289 templates/js/build.js:594 msgid "No location set" msgstr "" @@ -5776,6 +5799,10 @@ msgstr "" msgid "No stocktake performed" msgstr "" +#: stock/templates/stock/item_base.html:499 +msgid "Edit Stock Status" +msgstr "" + #: stock/templates/stock/item_childs.html:12 msgid "Child Stock Items" msgstr "" @@ -5835,6 +5862,19 @@ msgstr "" msgid "Add Test Data" msgstr "" +#: stock/templates/stock/item_tests.html:86 +#: stock/templates/stock/item_tests.html:111 +msgid "Add Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:131 +msgid "Edit Test Result" +msgstr "" + +#: stock/templates/stock/item_tests.html:145 +msgid "Delete Test Result" +msgstr "" + #: stock/templates/stock/location.html:20 msgid "You are not in the list of owners of this location. This stock location cannot be edited." msgstr "" @@ -5883,7 +5923,7 @@ msgid "Stock Details" msgstr "" #: stock/templates/stock/location.html:117 templates/InvenTree/search.html:279 -#: templates/stats.html:97 users/models.py:41 +#: templates/stats.html:97 users/models.py:42 msgid "Stock Locations" msgstr "" @@ -5923,7 +5963,7 @@ msgstr "" msgid "The following stock items will be uninstalled" msgstr "" -#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1364 +#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1196 msgid "Convert Stock Item" msgstr "" @@ -5956,8 +5996,8 @@ msgstr "" msgid "Edit Stock Location" msgstr "" -#: stock/views.py:230 stock/views.py:1343 stock/views.py:1465 -#: stock/views.py:1830 +#: stock/views.py:230 stock/views.py:1175 stock/views.py:1297 +#: stock/views.py:1662 msgid "Owner is required (ownership control is enabled)" msgstr "" @@ -5965,208 +6005,188 @@ msgstr "" msgid "Stock Location QR code" msgstr "" -#: stock/views.py:265 -msgid "Add Stock Item Attachment" -msgstr "" - -#: stock/views.py:311 -msgid "Edit Stock Item Attachment" -msgstr "" - -#: stock/views.py:327 -msgid "Delete Stock Item Attachment" -msgstr "" - -#: stock/views.py:343 +#: stock/views.py:264 msgid "Assign to Customer" msgstr "" -#: stock/views.py:352 +#: stock/views.py:273 msgid "Customer must be specified" msgstr "" -#: stock/views.py:376 +#: stock/views.py:297 msgid "Return to Stock" msgstr "" -#: stock/views.py:385 +#: stock/views.py:306 msgid "Specify a valid location" msgstr "" -#: stock/views.py:396 +#: stock/views.py:317 msgid "Stock item returned from customer" msgstr "" -#: stock/views.py:407 +#: stock/views.py:328 msgid "Delete All Test Data" msgstr "" -#: stock/views.py:424 +#: stock/views.py:345 msgid "Confirm test data deletion" msgstr "" -#: stock/views.py:444 -msgid "Add Test Result" -msgstr "" - -#: stock/views.py:484 -msgid "Edit Test Result" -msgstr "" - -#: stock/views.py:501 -msgid "Delete Test Result" -msgstr "" - -#: stock/views.py:509 +#: stock/views.py:362 msgid "Stock Export Options" msgstr "" -#: stock/views.py:630 +#: stock/views.py:483 msgid "Stock Item QR Code" msgstr "" -#: stock/views.py:656 +#: stock/views.py:509 msgid "Install Stock Item" msgstr "" -#: stock/views.py:755 +#: stock/views.py:608 msgid "Uninstall Stock Items" msgstr "" -#: stock/views.py:863 +#: stock/views.py:716 msgid "Uninstalled stock items" msgstr "" -#: stock/views.py:888 +#: stock/views.py:741 msgid "Adjust Stock" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move Stock Items" msgstr "" -#: stock/views.py:998 +#: stock/views.py:851 msgid "Move" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count Stock Items" msgstr "" -#: stock/views.py:999 +#: stock/views.py:852 msgid "Count" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Remove From Stock" msgstr "" -#: stock/views.py:1000 +#: stock/views.py:853 msgid "Take" msgstr "" -#: stock/views.py:1001 +#: stock/views.py:854 msgid "Add Stock Items" msgstr "" -#: stock/views.py:1001 users/models.py:187 +#: stock/views.py:854 users/models.py:188 msgid "Add" msgstr "" -#: stock/views.py:1002 +#: stock/views.py:855 msgid "Delete Stock Items" msgstr "" -#: stock/views.py:1031 +#: stock/views.py:884 msgid "Must enter integer value" msgstr "" -#: stock/views.py:1036 +#: stock/views.py:889 msgid "Quantity must be positive" msgstr "" -#: stock/views.py:1043 +#: stock/views.py:896 #, python-brace-format msgid "Quantity must not exceed {x}" msgstr "" -#: stock/views.py:1107 +#: stock/views.py:960 msgid "No action performed" msgstr "" -#: stock/views.py:1122 +#: stock/views.py:975 #, python-brace-format msgid "Added stock to {n} items" msgstr "" -#: stock/views.py:1137 +#: stock/views.py:990 #, python-brace-format msgid "Removed stock from {n} items" msgstr "" -#: stock/views.py:1150 +#: stock/views.py:1003 #, python-brace-format msgid "Counted stock for {n} items" msgstr "" -#: stock/views.py:1190 +#: stock/views.py:1043 msgid "No items were moved" msgstr "" -#: stock/views.py:1193 +#: stock/views.py:1046 #, python-brace-format msgid "Moved {n} items to {dest}" msgstr "" -#: stock/views.py:1212 +#: stock/views.py:1065 #, python-brace-format msgid "Deleted {n} stock items" msgstr "" -#: stock/views.py:1222 -msgid "Edit Stock Item Status" -msgstr "" - -#: stock/views.py:1245 +#: stock/views.py:1077 msgid "Edit Stock Item" msgstr "" -#: stock/views.py:1482 +#: stock/views.py:1314 msgid "Serialize Stock" msgstr "" -#: stock/views.py:1575 templates/js/build.js:326 +#: stock/views.py:1407 templates/js/build.js:327 msgid "Create new Stock Item" msgstr "" -#: stock/views.py:1717 +#: stock/views.py:1549 msgid "Duplicate Stock Item" msgstr "" -#: stock/views.py:1799 +#: stock/views.py:1631 msgid "Quantity cannot be negative" msgstr "" -#: stock/views.py:1899 +#: stock/views.py:1731 msgid "Delete Stock Location" msgstr "" -#: stock/views.py:1912 +#: stock/views.py:1744 msgid "Delete Stock Item" msgstr "" -#: stock/views.py:1923 +#: stock/views.py:1755 msgid "Delete Stock Tracking Entry" msgstr "" -#: stock/views.py:1930 +#: stock/views.py:1762 msgid "Edit Stock Tracking Entry" msgstr "" -#: stock/views.py:1939 +#: stock/views.py:1771 msgid "Add Stock Tracking Entry" msgstr "" +#: templates/403.html:5 templates/403.html:11 +msgid "Permission Denied" +msgstr "" + +#: templates/403.html:14 +msgid "You do not have permission to view this page." +msgstr "" + #: templates/404.html:5 templates/404.html:11 msgid "Page Not Found" msgstr "" @@ -6195,35 +6215,39 @@ msgstr "" msgid "Recently Updated" msgstr "" -#: templates/InvenTree/index.html:145 -msgid "Expired Stock" +#: templates/InvenTree/index.html:131 +msgid "Depleted Stock" msgstr "" #: templates/InvenTree/index.html:146 +msgid "Expired Stock" +msgstr "" + +#: templates/InvenTree/index.html:147 msgid "Stale Stock" msgstr "" -#: templates/InvenTree/index.html:184 +#: templates/InvenTree/index.html:192 msgid "Build Orders In Progress" msgstr "" -#: templates/InvenTree/index.html:185 +#: templates/InvenTree/index.html:193 msgid "Overdue Build Orders" msgstr "" -#: templates/InvenTree/index.html:206 +#: templates/InvenTree/index.html:214 msgid "Outstanding Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:207 +#: templates/InvenTree/index.html:215 msgid "Overdue Purchase Orders" msgstr "" -#: templates/InvenTree/index.html:229 +#: templates/InvenTree/index.html:237 msgid "Outstanding Sales Orders" msgstr "" -#: templates/InvenTree/index.html:230 +#: templates/InvenTree/index.html:238 msgid "Overdue Sales Orders" msgstr "" @@ -6284,12 +6308,12 @@ msgid "No category parameter templates found" msgstr "" #: templates/InvenTree/settings/category.html:70 -#: templates/InvenTree/settings/part.html:85 +#: templates/InvenTree/settings/part.html:102 msgid "Edit Template" msgstr "" #: templates/InvenTree/settings/category.html:71 -#: templates/InvenTree/settings/part.html:86 +#: templates/InvenTree/settings/part.html:103 msgid "Delete Template" msgstr "" @@ -6297,23 +6321,23 @@ msgstr "" msgid "Currency Settings" msgstr "" -#: templates/InvenTree/settings/currencies.html:18 +#: templates/InvenTree/settings/currencies.html:25 msgid "Base Currency" msgstr "" -#: templates/InvenTree/settings/currencies.html:22 +#: templates/InvenTree/settings/currencies.html:29 msgid "Exchange Rates" msgstr "" -#: templates/InvenTree/settings/currencies.html:32 +#: templates/InvenTree/settings/currencies.html:39 msgid "Last Update" msgstr "" -#: templates/InvenTree/settings/currencies.html:38 +#: templates/InvenTree/settings/currencies.html:45 msgid "Never" msgstr "" -#: templates/InvenTree/settings/currencies.html:43 +#: templates/InvenTree/settings/currencies.html:50 msgid "Update Now" msgstr "" @@ -6337,11 +6361,19 @@ msgstr "" msgid "Part Options" msgstr "" -#: templates/InvenTree/settings/part.html:44 +#: templates/InvenTree/settings/part.html:45 +msgid "Part Import" +msgstr "" + +#: templates/InvenTree/settings/part.html:48 +msgid "Import Part" +msgstr "" + +#: templates/InvenTree/settings/part.html:61 msgid "Part Parameter Templates" msgstr "" -#: templates/InvenTree/settings/part.html:65 +#: templates/InvenTree/settings/part.html:82 msgid "No part parameter templates found" msgstr "" @@ -6500,24 +6532,12 @@ msgstr "" msgid "copy version information" msgstr "" -#: templates/about.html:100 templates/js/modals.js:568 -#: templates/js/modals.js:861 templates/modals.html:29 templates/modals.html:54 -#: templates/modals.html:97 +#: templates/about.html:100 templates/js/modals.js:34 +#: templates/js/modals.js:677 templates/js/modals.js:970 +#: templates/modals.html:29 templates/modals.html:54 templates/modals.html:97 msgid "Close" msgstr "" -#: templates/attachment_table.html:6 -msgid "Add Attachment" -msgstr "" - -#: templates/attachment_table.html:17 -msgid "Uploaded" -msgstr "" - -#: templates/attachment_table.html:35 -msgid "Delete attachment" -msgstr "" - #: templates/image_download.html:8 msgid "Specify URL for downloading image" msgstr "" @@ -6534,6 +6554,22 @@ msgstr "" msgid "Remote image must not exceed maximum allowable file size" msgstr "" +#: templates/js/attachment.js:16 +msgid "No attachments found" +msgstr "" + +#: templates/js/attachment.js:56 +msgid "Upload Date" +msgstr "" + +#: templates/js/attachment.js:69 +msgid "Edit attachment" +msgstr "" + +#: templates/js/attachment.js:76 +msgid "Delete attachment" +msgstr "" + #: templates/js/barcode.js:8 msgid "Scan barcode data here using wedge scanner" msgstr "" @@ -6562,7 +6598,7 @@ msgstr "" msgid "Unknown response from server" msgstr "" -#: templates/js/barcode.js:119 templates/js/modals.js:921 +#: templates/js/barcode.js:119 templates/js/modals.js:1030 msgid "Invalid server response" msgstr "" @@ -6626,7 +6662,7 @@ msgstr "" msgid "Barcode does not match a valid location" msgstr "" -#: templates/js/bom.js:175 templates/js/build.js:1091 +#: templates/js/bom.js:175 templates/js/build.js:1092 msgid "Open subassembly" msgstr "" @@ -6638,31 +6674,35 @@ msgstr "" msgid "Purchase Price Average" msgstr "" -#: templates/js/bom.js:277 +#: templates/js/bom.js:265 +msgid "Buy Price" +msgstr "" + +#: templates/js/bom.js:271 msgid "No pricing available" msgstr "" -#: templates/js/bom.js:313 templates/js/bom.js:399 +#: templates/js/bom.js:306 templates/js/bom.js:392 msgid "View BOM" msgstr "" -#: templates/js/bom.js:373 +#: templates/js/bom.js:366 msgid "Validate BOM Item" msgstr "" -#: templates/js/bom.js:375 +#: templates/js/bom.js:368 msgid "This line has been validated" msgstr "" -#: templates/js/bom.js:377 +#: templates/js/bom.js:370 msgid "Edit BOM Item" msgstr "" -#: templates/js/bom.js:379 +#: templates/js/bom.js:372 templates/js/bom.js:519 msgid "Delete BOM Item" msgstr "" -#: templates/js/bom.js:470 templates/js/build.js:423 templates/js/build.js:1189 +#: templates/js/bom.js:463 templates/js/build.js:424 templates/js/build.js:1190 msgid "No BOM items found" msgstr "" @@ -6686,83 +6726,107 @@ msgstr "" msgid "No build order allocations found" msgstr "" -#: templates/js/build.js:222 templates/js/order.js:382 +#: templates/js/build.js:222 templates/js/order.js:449 msgid "Location not specified" msgstr "" -#: templates/js/build.js:325 templates/stock_table.html:20 +#: templates/js/build.js:326 templates/stock_table.html:20 msgid "New Stock Item" msgstr "" -#: templates/js/build.js:644 +#: templates/js/build.js:645 msgid "Required Part" msgstr "" -#: templates/js/build.js:665 +#: templates/js/build.js:666 msgid "Quantity Per" msgstr "" -#: templates/js/build.js:735 templates/js/build.js:1153 +#: templates/js/build.js:736 templates/js/build.js:1154 #: templates/stock_table.html:59 msgid "Order stock" msgstr "" -#: templates/js/build.js:788 +#: templates/js/build.js:789 msgid "No builds matching query" msgstr "" -#: templates/js/build.js:805 templates/js/part.js:390 templates/js/part.js:635 -#: templates/js/stock.js:514 templates/js/stock.js:966 +#: templates/js/build.js:806 templates/js/part.js:390 templates/js/part.js:635 +#: templates/js/stock.js:514 templates/js/stock.js:980 msgid "Select" msgstr "" -#: templates/js/build.js:825 +#: templates/js/build.js:826 msgid "Build order is overdue" msgstr "" -#: templates/js/build.js:924 +#: templates/js/build.js:925 msgid "No parts allocated for" msgstr "" -#: templates/js/company.js:74 +#: templates/js/company.js:45 +msgid "Edit Company" +msgstr "" + +#: templates/js/company.js:66 +msgid "Add new Company" +msgstr "" + +#: templates/js/company.js:143 msgid "Parts Supplied" msgstr "" -#: templates/js/company.js:83 +#: templates/js/company.js:152 msgid "Parts Manufactured" msgstr "" -#: templates/js/company.js:96 +#: templates/js/company.js:165 msgid "No company information found" msgstr "" -#: templates/js/company.js:129 +#: templates/js/company.js:183 +msgid "The following manufacturer parts will be deleted" +msgstr "" + +#: templates/js/company.js:200 +msgid "Delete Manufacturer Parts" +msgstr "" + +#: templates/js/company.js:253 msgid "No manufacturer parts found" msgstr "" -#: templates/js/company.js:148 templates/js/company.js:347 +#: templates/js/company.js:272 templates/js/company.js:472 #: templates/js/part.js:68 templates/js/part.js:153 msgid "Template part" msgstr "" -#: templates/js/company.js:152 templates/js/company.js:351 +#: templates/js/company.js:276 templates/js/company.js:476 #: templates/js/part.js:72 templates/js/part.js:157 msgid "Assembled part" msgstr "" -#: templates/js/company.js:226 +#: templates/js/company.js:350 msgid "No parameters found" msgstr "" -#: templates/js/company.js:262 +#: templates/js/company.js:386 msgid "Edit parameter" msgstr "" -#: templates/js/company.js:263 +#: templates/js/company.js:387 msgid "Delete parameter" msgstr "" -#: templates/js/company.js:328 +#: templates/js/company.js:406 +msgid "Edit Parameter" +msgstr "" + +#: templates/js/company.js:417 +msgid "Delete Parameter" +msgstr "" + +#: templates/js/company.js:453 msgid "No supplier parts found" msgstr "" @@ -6790,6 +6854,83 @@ msgstr "" msgid "Create filter" msgstr "" +#: templates/js/forms.js:278 templates/js/forms.js:291 +#: templates/js/forms.js:303 templates/js/forms.js:315 +msgid "Action Prohibited" +msgstr "" + +#: templates/js/forms.js:279 +msgid "Create operation not allowed" +msgstr "" + +#: templates/js/forms.js:292 +msgid "Update operation not allowed" +msgstr "" + +#: templates/js/forms.js:304 +msgid "Delete operation not allowed" +msgstr "" + +#: templates/js/forms.js:316 +msgid "View operation not allowed" +msgstr "" + +#: templates/js/forms.js:583 templates/js/modals.js:1040 +msgid "No Response" +msgstr "" + +#: templates/js/forms.js:584 templates/js/modals.js:1041 +msgid "No response from the InvenTree server" +msgstr "" + +#: templates/js/forms.js:590 templates/js/modals.js:1050 +msgid "Error 401: Not Authenticated" +msgstr "" + +#: templates/js/forms.js:591 templates/js/modals.js:1051 +msgid "Authentication credentials not supplied" +msgstr "" + +#: templates/js/forms.js:597 templates/js/modals.js:1055 +msgid "Error 403: Permission Denied" +msgstr "" + +#: templates/js/forms.js:598 templates/js/modals.js:1056 +msgid "You do not have the required permissions to access this function" +msgstr "" + +#: templates/js/forms.js:604 templates/js/modals.js:1060 +msgid "Error 404: Resource Not Found" +msgstr "" + +#: templates/js/forms.js:605 templates/js/modals.js:1061 +msgid "The requested resource could not be located on the server" +msgstr "" + +#: templates/js/forms.js:611 templates/js/modals.js:1065 +msgid "Error 408: Timeout" +msgstr "" + +#: templates/js/forms.js:612 templates/js/modals.js:1066 +msgid "Connection timeout while requesting data from server" +msgstr "" + +#: templates/js/forms.js:618 templates/js/modals.js:1069 +msgid "Error requesting form data" +msgstr "" + +#: templates/js/forms.js:788 templates/modals.html:21 templates/modals.html:47 +msgid "Form errors exist" +msgstr "" + +#: templates/js/forms.js:1161 +msgid "Searching" +msgstr "" + +#: templates/js/forms.js:1301 +msgid "Clear input" +msgstr "" + #: templates/js/label.js:10 templates/js/report.js:98 msgid "Select Stock Items" msgstr "" @@ -6830,112 +6971,102 @@ msgstr "" msgid "Select Label Template" msgstr "" -#: templates/js/modals.js:265 -msgid "Waiting for server..." -msgstr "" - -#: templates/js/modals.js:424 -msgid "Show Error Information" -msgstr "" - -#: templates/js/modals.js:491 templates/modals.html:76 -msgid "Accept" -msgstr "" - -#: templates/js/modals.js:492 templates/modals.html:75 +#: templates/js/modals.js:59 templates/js/modals.js:105 +#: templates/js/modals.js:601 templates/modals.html:75 msgid "Cancel" msgstr "" -#: templates/js/modals.js:556 -msgid "Loading Data" -msgstr "" - -#: templates/js/modals.js:567 templates/js/modals.js:860 +#: templates/js/modals.js:60 templates/js/modals.js:104 +#: templates/js/modals.js:676 templates/js/modals.js:969 #: templates/modals.html:30 templates/modals.html:55 msgid "Submit" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:103 +msgid "Form Title" +msgstr "" + +#: templates/js/modals.js:374 +msgid "Waiting for server..." +msgstr "" + +#: templates/js/modals.js:533 +msgid "Show Error Information" +msgstr "" + +#: templates/js/modals.js:600 templates/modals.html:76 +msgid "Accept" +msgstr "" + +#: templates/js/modals.js:665 +msgid "Loading Data" +msgstr "" + +#: templates/js/modals.js:920 msgid "Invalid response from server" msgstr "" -#: templates/js/modals.js:811 +#: templates/js/modals.js:920 msgid "Form data missing from server response" msgstr "" -#: templates/js/modals.js:824 +#: templates/js/modals.js:933 msgid "Error posting form data" msgstr "" -#: templates/js/modals.js:921 +#: templates/js/modals.js:1030 msgid "JSON response missing form data" msgstr "" -#: templates/js/modals.js:931 -msgid "No Response" -msgstr "" - -#: templates/js/modals.js:932 -msgid "No response from the InvenTree server" -msgstr "" - -#: templates/js/modals.js:936 +#: templates/js/modals.js:1045 msgid "Error 400: Bad Request" msgstr "" -#: templates/js/modals.js:937 +#: templates/js/modals.js:1046 msgid "Server returned error code 400" msgstr "" -#: templates/js/modals.js:941 -msgid "Error 401: Not Authenticated" +#: templates/js/model_renderers.js:21 +msgid "Company ID" msgstr "" -#: templates/js/modals.js:942 -msgid "Authentication credentials not supplied" +#: templates/js/model_renderers.js:63 +msgid "Location ID" msgstr "" -#: templates/js/modals.js:946 -msgid "Error 403: Permission Denied" +#: templates/js/model_renderers.js:90 +msgid "Part ID" msgstr "" -#: templates/js/modals.js:947 -msgid "You do not have the required permissions to access this function" +#: templates/js/model_renderers.js:126 +msgid "Category ID" msgstr "" -#: templates/js/modals.js:951 -msgid "Error 404: Resource Not Found" +#: templates/js/model_renderers.js:150 +msgid "Supplier Part ID" msgstr "" -#: templates/js/modals.js:952 -msgid "The requested resource could not be located on the server" +#: templates/js/order.js:31 +msgid "Create Sales Order" msgstr "" -#: templates/js/modals.js:956 -msgid "Error 408: Timeout" -msgstr "" - -#: templates/js/modals.js:957 -msgid "Connection timeout while requesting data from server" -msgstr "" - -#: templates/js/modals.js:960 -msgid "Error requesting form data" -msgstr "" - -#: templates/js/order.js:138 +#: templates/js/order.js:200 msgid "No purchase orders found" msgstr "" -#: templates/js/order.js:162 templates/js/order.js:257 +#: templates/js/order.js:224 templates/js/order.js:319 msgid "Order is overdue" msgstr "" -#: templates/js/order.js:234 +#: templates/js/order.js:296 msgid "No sales orders found" msgstr "" -#: templates/js/order.js:343 +#: templates/js/order.js:333 +msgid "Invalid Customer" +msgstr "" + +#: templates/js/order.js:410 msgid "No sales order allocations found" msgstr "" @@ -6975,11 +7106,11 @@ msgstr "" msgid "No category" msgstr "" -#: templates/js/part.js:476 templates/js/table_filters.js:323 +#: templates/js/part.js:476 templates/js/table_filters.js:328 msgid "Low stock" msgstr "" -#: templates/js/part.js:660 templates/js/stock.js:990 +#: templates/js/part.js:660 templates/js/stock.js:1004 msgid "Path" msgstr "" @@ -6999,7 +7130,22 @@ msgstr "" msgid "This test is defined for a parent part" msgstr "" -#: templates/js/part.js:806 +#: templates/js/part.js:786 +#, python-brace-format +msgid "No ${human_name} information found" +msgstr "" + +#: templates/js/part.js:839 +#, python-brace-format +msgid "Edit ${human_name}" +msgstr "" + +#: templates/js/part.js:840 +#, python-brace-format +msgid "Delete ${human_name}" +msgstr "" + +#: templates/js/part.js:959 msgid "Single Price Difference" msgstr "" @@ -7177,75 +7323,75 @@ msgstr "" msgid "Stocktake" msgstr "" -#: templates/js/stock.js:853 +#: templates/js/stock.js:867 msgid "Stock Status" msgstr "" -#: templates/js/stock.js:868 +#: templates/js/stock.js:882 msgid "Set Stock Status" msgstr "" -#: templates/js/stock.js:882 +#: templates/js/stock.js:896 msgid "Select Status Code" msgstr "" -#: templates/js/stock.js:883 +#: templates/js/stock.js:897 msgid "Status code must be selected" msgstr "" -#: templates/js/stock.js:1022 +#: templates/js/stock.js:1036 msgid "Invalid date" msgstr "" -#: templates/js/stock.js:1069 +#: templates/js/stock.js:1083 msgid "Location no longer exists" msgstr "" -#: templates/js/stock.js:1088 +#: templates/js/stock.js:1102 msgid "Purchase order no longer exists" msgstr "" -#: templates/js/stock.js:1107 +#: templates/js/stock.js:1121 msgid "Customer no longer exists" msgstr "" -#: templates/js/stock.js:1125 +#: templates/js/stock.js:1139 msgid "Stock item no longer exists" msgstr "" -#: templates/js/stock.js:1148 +#: templates/js/stock.js:1162 msgid "Added" msgstr "" -#: templates/js/stock.js:1156 +#: templates/js/stock.js:1170 msgid "Removed" msgstr "" -#: templates/js/stock.js:1188 +#: templates/js/stock.js:1202 msgid "No user information" msgstr "" -#: templates/js/stock.js:1200 +#: templates/js/stock.js:1214 msgid "Edit tracking entry" msgstr "" -#: templates/js/stock.js:1201 +#: templates/js/stock.js:1215 msgid "Delete tracking entry" msgstr "" -#: templates/js/stock.js:1325 +#: templates/js/stock.js:1339 msgid "Create New Location" msgstr "" -#: templates/js/stock.js:1366 +#: templates/js/stock.js:1380 msgid "No installed items" msgstr "" -#: templates/js/stock.js:1389 +#: templates/js/stock.js:1403 msgid "Serial" msgstr "" -#: templates/js/stock.js:1417 +#: templates/js/stock.js:1431 msgid "Uninstall Stock Item" msgstr "" @@ -7266,7 +7412,7 @@ msgid "Include locations" msgstr "" #: templates/js/table_filters.js:86 templates/js/table_filters.js:87 -#: templates/js/table_filters.js:300 +#: templates/js/table_filters.js:305 msgid "Include subcategories" msgstr "" @@ -7299,7 +7445,7 @@ msgstr "" msgid "Batch code" msgstr "" -#: templates/js/table_filters.js:123 templates/js/table_filters.js:290 +#: templates/js/table_filters.js:123 templates/js/table_filters.js:295 msgid "Active parts" msgstr "" @@ -7371,43 +7517,51 @@ msgstr "" msgid "Stock status" msgstr "" -#: templates/js/table_filters.js:236 +#: templates/js/table_filters.js:211 +msgid "Has purchase price" +msgstr "" + +#: templates/js/table_filters.js:212 +msgid "Show stock items which have a purchase price set" +msgstr "" + +#: templates/js/table_filters.js:241 msgid "Build status" msgstr "" -#: templates/js/table_filters.js:255 templates/js/table_filters.js:272 +#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 msgid "Order status" msgstr "" -#: templates/js/table_filters.js:260 templates/js/table_filters.js:277 +#: templates/js/table_filters.js:265 templates/js/table_filters.js:282 msgid "Outstanding" msgstr "" -#: templates/js/table_filters.js:301 +#: templates/js/table_filters.js:306 msgid "Include parts in subcategories" msgstr "" -#: templates/js/table_filters.js:305 +#: templates/js/table_filters.js:310 msgid "Has IPN" msgstr "" -#: templates/js/table_filters.js:306 +#: templates/js/table_filters.js:311 msgid "Part has internal part number" msgstr "" -#: templates/js/table_filters.js:311 +#: templates/js/table_filters.js:316 msgid "Show active parts" msgstr "" -#: templates/js/table_filters.js:319 +#: templates/js/table_filters.js:324 msgid "Stock available" msgstr "" -#: templates/js/table_filters.js:335 +#: templates/js/table_filters.js:340 msgid "Starred" msgstr "" -#: templates/js/table_filters.js:347 +#: templates/js/table_filters.js:352 msgid "Purchasable" msgstr "" @@ -7464,10 +7618,6 @@ msgstr "" msgid "All" msgstr "" -#: templates/modals.html:21 templates/modals.html:47 -msgid "Form errors exist" -msgstr "" - #: templates/navbar.html:13 msgid "Toggle navigation" msgstr "" @@ -7484,7 +7634,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: templates/navbar.html:77 users/models.py:38 +#: templates/navbar.html:77 users/models.py:39 msgid "Admin" msgstr "" @@ -7704,35 +7854,35 @@ msgstr "" msgid "Important dates" msgstr "" -#: users/models.py:174 +#: users/models.py:175 msgid "Permission set" msgstr "" -#: users/models.py:182 +#: users/models.py:183 msgid "Group" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "View" msgstr "" -#: users/models.py:185 +#: users/models.py:186 msgid "Permission to view items" msgstr "" -#: users/models.py:187 +#: users/models.py:188 msgid "Permission to add items" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Change" msgstr "" -#: users/models.py:189 +#: users/models.py:190 msgid "Permissions to edit items" msgstr "" -#: users/models.py:191 +#: users/models.py:192 msgid "Permission to delete items" msgstr "" diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index c22d76a52e..a834989fd9 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -5,11 +5,12 @@ JSON API for the Order app # -*- coding: utf-8 -*- from __future__ import unicode_literals +from django.conf.urls import url, include + from django_filters.rest_framework import DjangoFilterBackend from rest_framework import generics -from rest_framework import filters - -from django.conf.urls import url, include +from rest_framework import filters, status +from rest_framework.response import Response from InvenTree.helpers import str2bool from InvenTree.api import AttachmentMixin @@ -38,6 +39,20 @@ class POList(generics.ListCreateAPIView): queryset = PurchaseOrder.objects.all() serializer_class = POSerializer + def create(self, request, *args, **kwargs): + """ + Save user information on create + """ + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + + item = serializer.save() + item.created_by = request.user + item.save() + + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + def get_serializer(self, *args, **kwargs): try: @@ -239,10 +254,12 @@ class POLineItemList(generics.ListCreateAPIView): ] -class POLineItemDetail(generics.RetrieveUpdateAPIView): - """ API endpoint for detail view of a PurchaseOrderLineItem object """ +class POLineItemDetail(generics.RetrieveUpdateDestroyAPIView): + """ + Detail API endpoint for PurchaseOrderLineItem object + """ - queryset = PurchaseOrderLineItem + queryset = PurchaseOrderLineItem.objects.all() serializer_class = POLineItemSerializer @@ -254,11 +271,24 @@ class SOAttachmentList(generics.ListCreateAPIView, AttachmentMixin): queryset = SalesOrderAttachment.objects.all() serializer_class = SOAttachmentSerializer + filter_backends = [ + DjangoFilterBackend, + ] + filter_fields = [ 'order', ] +class SOAttachmentDetail(generics.RetrieveUpdateDestroyAPIView, AttachmentMixin): + """ + Detail endpoint for SalesOrderAttachment + """ + + queryset = SalesOrderAttachment.objects.all() + serializer_class = SOAttachmentSerializer + + class SOList(generics.ListCreateAPIView): """ API endpoint for accessing a list of SalesOrder objects. @@ -270,6 +300,20 @@ class SOList(generics.ListCreateAPIView): queryset = SalesOrder.objects.all() serializer_class = SalesOrderSerializer + def create(self, request, *args, **kwargs): + """ + Save user information on create + """ + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + + item = serializer.save() + item.created_by = request.user + item.save() + + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + def get_serializer(self, *args, **kwargs): try: @@ -474,7 +518,7 @@ class SOLineItemList(generics.ListCreateAPIView): ] -class SOLineItemDetail(generics.RetrieveUpdateAPIView): +class SOLineItemDetail(generics.RetrieveUpdateDestroyAPIView): """ API endpoint for detail view of a SalesOrderLineItem object """ queryset = SalesOrderLineItem.objects.all() @@ -553,13 +597,31 @@ class POAttachmentList(generics.ListCreateAPIView, AttachmentMixin): queryset = PurchaseOrderAttachment.objects.all() serializer_class = POAttachmentSerializer + filter_backends = [ + DjangoFilterBackend, + ] + + filter_fields = [ + 'order', + ] + + +class POAttachmentDetail(generics.RetrieveUpdateDestroyAPIView, AttachmentMixin): + """ + Detail endpoint for a PurchaseOrderAttachment + """ + + queryset = PurchaseOrderAttachment.objects.all() + serializer_class = POAttachmentSerializer + order_api_urls = [ # API endpoints for purchase orders - url(r'^po/(?P\d+)/$', PODetail.as_view(), name='api-po-detail'), url(r'po/attachment/', include([ + url(r'^(?P\d+)/$', POAttachmentDetail.as_view(), name='api-po-attachment-detail'), url(r'^.*$', POAttachmentList.as_view(), name='api-po-attachment-list'), ])), + url(r'^po/(?P\d+)/$', PODetail.as_view(), name='api-po-detail'), url(r'^po/.*$', POList.as_view(), name='api-po-list'), # API endpoints for purchase order line items @@ -568,12 +630,12 @@ order_api_urls = [ # API endpoints for sales ordesr url(r'^so/', include([ - url(r'^(?P\d+)/$', SODetail.as_view(), name='api-so-detail'), url(r'attachment/', include([ + url(r'^(?P\d+)/$', SOAttachmentDetail.as_view(), name='api-so-attachment-detail'), url(r'^.*$', SOAttachmentList.as_view(), name='api-so-attachment-list'), ])), - # List all sales orders + url(r'^(?P\d+)/$', SODetail.as_view(), name='api-so-detail'), url(r'^.*$', SOList.as_view(), name='api-so-list'), ])), diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py index f094caafbe..b8a66a825d 100644 --- a/InvenTree/order/forms.py +++ b/InvenTree/order/forms.py @@ -12,7 +12,6 @@ from mptt.fields import TreeNodeChoiceField from InvenTree.forms import HelperForm from InvenTree.fields import InvenTreeMoneyField, RoundingDecimalFormField -from InvenTree.fields import DatePickerFormField from InvenTree.helpers import clean_decimal @@ -21,8 +20,8 @@ from common.forms import MatchItemForm import part.models from stock.models import StockLocation -from .models import PurchaseOrder, PurchaseOrderLineItem, PurchaseOrderAttachment -from .models import SalesOrder, SalesOrderLineItem, SalesOrderAttachment +from .models import PurchaseOrder +from .models import SalesOrder, SalesOrderLineItem from .models import SalesOrderAllocation @@ -97,135 +96,6 @@ class ReceivePurchaseOrderForm(HelperForm): ] -class EditPurchaseOrderForm(HelperForm): - """ Form for editing a PurchaseOrder object """ - - def __init__(self, *args, **kwargs): - - self.field_prefix = { - 'reference': 'PO', - 'link': 'fa-link', - 'target_date': 'fa-calendar-alt', - } - - self.field_placeholder = { - 'reference': _('Purchase Order reference'), - } - - super().__init__(*args, **kwargs) - - target_date = DatePickerFormField( - label=_('Target Date'), - help_text=_('Target date for order delivery. Order will be overdue after this date.'), - ) - - class Meta: - model = PurchaseOrder - fields = [ - 'reference', - 'supplier', - 'supplier_reference', - 'description', - 'target_date', - 'link', - 'responsible', - ] - - -class EditSalesOrderForm(HelperForm): - """ Form for editing a SalesOrder object """ - - def __init__(self, *args, **kwargs): - - self.field_prefix = { - 'reference': 'SO', - 'link': 'fa-link', - 'target_date': 'fa-calendar-alt', - } - - self.field_placeholder = { - 'reference': _('Enter sales order number'), - } - - super().__init__(*args, **kwargs) - - target_date = DatePickerFormField( - label=_('Target Date'), - help_text=_('Target date for order completion. Order will be overdue after this date.'), - ) - - class Meta: - model = SalesOrder - fields = [ - 'reference', - 'customer', - 'customer_reference', - 'description', - 'target_date', - 'link', - 'responsible', - ] - - -class EditPurchaseOrderAttachmentForm(HelperForm): - """ Form for editing a PurchaseOrderAttachment object """ - - class Meta: - model = PurchaseOrderAttachment - fields = [ - 'order', - 'attachment', - 'comment' - ] - - -class EditSalesOrderAttachmentForm(HelperForm): - """ Form for editing a SalesOrderAttachment object """ - - class Meta: - model = SalesOrderAttachment - fields = [ - 'order', - 'attachment', - 'comment' - ] - - -class EditPurchaseOrderLineItemForm(HelperForm): - """ Form for editing a PurchaseOrderLineItem object """ - - quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity')) - - class Meta: - model = PurchaseOrderLineItem - fields = [ - 'order', - 'part', - 'quantity', - 'reference', - 'purchase_price', - 'destination', - 'notes', - ] - - -class EditSalesOrderLineItemForm(HelperForm): - """ Form for editing a SalesOrderLineItem object """ - - quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity')) - - class Meta: - model = SalesOrderLineItem - fields = [ - 'order', - 'part', - 'quantity', - 'reference', - 'sale_price', - 'notes' - ] - - class AllocateSerialsToSalesOrderForm(forms.Form): """ Form for assigning stock to a sales order, diff --git a/InvenTree/order/migrations/0048_auto_20210702_2321.py b/InvenTree/order/migrations/0048_auto_20210702_2321.py new file mode 100644 index 0000000000..d6785e669e --- /dev/null +++ b/InvenTree/order/migrations/0048_auto_20210702_2321.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.4 on 2021-07-02 13:21 + +from django.db import migrations, models +import order.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0047_auto_20210701_0509'), + ] + + operations = [ + migrations.AlterField( + model_name='purchaseorder', + name='reference', + field=models.CharField(default=order.models.get_next_po_number, help_text='Order reference', max_length=64, unique=True, verbose_name='Reference'), + ), + migrations.AlterField( + model_name='salesorder', + name='reference', + field=models.CharField(default=order.models.get_next_so_number, help_text='Order reference', max_length=64, unique=True, verbose_name='Reference'), + ), + ] diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 669603f5ec..22f70d0f3c 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -31,6 +31,60 @@ from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus, StockS from InvenTree.models import InvenTreeAttachment +def get_next_po_number(): + """ + Returns the next available PurchaseOrder reference number + """ + + if PurchaseOrder.objects.count() == 0: + return + + order = PurchaseOrder.objects.exclude(reference=None).last() + + attempts = set([order.reference]) + + while 1: + reference = increment(order.reference) + + if reference in attempts: + # Escape infinite recursion + return reference + + if PurchaseOrder.objects.filter(reference=reference).exists(): + attempts.add(reference) + else: + break + + return reference + + +def get_next_so_number(): + """ + Returns the next available SalesOrder reference number + """ + + if SalesOrder.objects.count() == 0: + return + + order = SalesOrder.objects.exclude(reference=None).last() + + attempts = set([order.reference]) + + while 1: + reference = increment(order.reference) + + if reference in attempts: + # Escape infinite recursion + return reference + + if SalesOrder.objects.filter(reference=reference).exists(): + attempts.add(reference) + else: + break + + return reference + + class Order(models.Model): """ Abstract model for an order. @@ -72,6 +126,8 @@ class Order(models.Model): while 1: new_ref = increment(ref) + print("Reference:", new_ref) + if new_ref in tries: # We are in a looping situation - simply return the original one return ref @@ -95,8 +151,6 @@ class Order(models.Model): class Meta: abstract = True - reference = models.CharField(unique=True, max_length=64, blank=False, verbose_name=_('Reference'), help_text=_('Order reference')) - description = models.CharField(max_length=250, verbose_name=_('Description'), help_text=_('Order description')) link = models.URLField(blank=True, verbose_name=_('Link'), help_text=_('Link to external page')) @@ -132,6 +186,10 @@ class PurchaseOrder(Order): target_date: Expected delivery target date for PurchaseOrder completion (optional) """ + @staticmethod + def get_api_url(): + return reverse('api-po-list') + OVERDUE_FILTER = Q(status__in=PurchaseOrderStatus.OPEN) & ~Q(target_date=None) & Q(target_date__lte=datetime.now().date()) @staticmethod @@ -177,6 +235,15 @@ class PurchaseOrder(Order): return f"{prefix}{self.reference} - {self.supplier.name}" + reference = models.CharField( + unique=True, + max_length=64, + blank=False, + verbose_name=_('Reference'), + help_text=_('Order reference'), + default=get_next_po_number, + ) + status = models.PositiveIntegerField(default=PurchaseOrderStatus.PENDING, choices=PurchaseOrderStatus.items(), help_text=_('Purchase order status')) @@ -403,6 +470,10 @@ class SalesOrder(Order): target_date: Target date for SalesOrder completion (optional) """ + @staticmethod + def get_api_url(): + return reverse('api-so-list') + OVERDUE_FILTER = Q(status__in=SalesOrderStatus.OPEN) & ~Q(target_date=None) & Q(target_date__lte=datetime.now().date()) @staticmethod @@ -451,6 +522,15 @@ class SalesOrder(Order): def get_absolute_url(self): return reverse('so-detail', kwargs={'pk': self.id}) + reference = models.CharField( + unique=True, + max_length=64, + blank=False, + verbose_name=_('Reference'), + help_text=_('Order reference'), + default=get_next_so_number, + ) + customer = models.ForeignKey( Company, on_delete=models.SET_NULL, @@ -581,6 +661,10 @@ class PurchaseOrderAttachment(InvenTreeAttachment): Model for storing file attachments against a PurchaseOrder object """ + @staticmethod + def get_api_url(): + return reverse('api-po-attachment-list') + def getSubdir(self): return os.path.join("po_files", str(self.order.id)) @@ -592,6 +676,10 @@ class SalesOrderAttachment(InvenTreeAttachment): Model for storing file attachments against a SalesOrder object """ + @staticmethod + def get_api_url(): + return reverse('api-so-attachment-list') + def getSubdir(self): return os.path.join("so_files", str(self.order.id)) @@ -610,7 +698,13 @@ class OrderLineItem(models.Model): class Meta: abstract = True - quantity = RoundingDecimalField(max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], default=1, verbose_name=_('Quantity'), help_text=_('Item quantity')) + quantity = RoundingDecimalField( + verbose_name=_('Quantity'), + help_text=_('Item quantity'), + default=1, + max_digits=15, decimal_places=5, + validators=[MinValueValidator(0)], + ) reference = models.CharField(max_length=100, blank=True, verbose_name=_('Reference'), help_text=_('Line item reference')) @@ -625,6 +719,10 @@ class PurchaseOrderLineItem(OrderLineItem): """ + @staticmethod + def get_api_url(): + return reverse('api-po-line-list') + class Meta: unique_together = ( ('order', 'part') @@ -707,6 +805,10 @@ class SalesOrderLineItem(OrderLineItem): sale_price: The unit sale price for this OrderLineItem """ + @staticmethod + def get_api_url(): + return reverse('api-so-line-list') + order = models.ForeignKey(SalesOrder, on_delete=models.CASCADE, related_name='lines', verbose_name=_('Order'), help_text=_('Sales Order')) part = models.ForeignKey('part.Part', on_delete=models.SET_NULL, related_name='sales_order_line_items', null=True, verbose_name=_('Part'), help_text=_('Part'), limit_choices_to={'salable': True}) @@ -768,6 +870,10 @@ class SalesOrderAllocation(models.Model): """ + @staticmethod + def get_api_url(): + return reverse('api-so-allocation-list') + class Meta: unique_together = [ # Cannot allocate any given StockItem to the same line more than once diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index e527b3cec9..809dd0e8fb 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -5,14 +5,16 @@ JSON serializers for the Order API # -*- coding: utf-8 -*- from __future__ import unicode_literals -from rest_framework import serializers - -from sql_util.utils import SubqueryCount +from django.utils.translation import ugettext_lazy as _ from django.db.models import Case, When, Value from django.db.models import BooleanField +from rest_framework import serializers +from sql_util.utils import SubqueryCount + from InvenTree.serializers import InvenTreeModelSerializer +from InvenTree.serializers import InvenTreeMoneySerializer from InvenTree.serializers import InvenTreeAttachmentSerializerField from company.serializers import CompanyBriefSerializer, SupplierPartSerializer @@ -24,6 +26,8 @@ from .models import PurchaseOrderAttachment, SalesOrderAttachment from .models import SalesOrder, SalesOrderLineItem from .models import SalesOrderAllocation +from common.settings import currency_code_mappings + class POSerializer(InvenTreeModelSerializer): """ Serializer for a PurchaseOrder object """ @@ -69,6 +73,8 @@ class POSerializer(InvenTreeModelSerializer): overdue = serializers.BooleanField(required=False, read_only=True) + reference = serializers.CharField(required=True) + class Meta: model = PurchaseOrder @@ -82,6 +88,7 @@ class POSerializer(InvenTreeModelSerializer): 'link', 'overdue', 'reference', + 'responsible', 'supplier', 'supplier_detail', 'supplier_reference', @@ -118,10 +125,20 @@ class POLineItemSerializer(InvenTreeModelSerializer): part_detail = PartBriefSerializer(source='get_base_part', many=False, read_only=True) supplier_part_detail = SupplierPartSerializer(source='part', many=False, read_only=True) + purchase_price = InvenTreeMoneySerializer( + max_digits=19, decimal_places=4, + allow_null=True + ) + purchase_price_string = serializers.CharField(source='purchase_price', read_only=True) destination = LocationBriefSerializer(source='get_destination', read_only=True) + purchase_price_currency = serializers.ChoiceField( + choices=currency_code_mappings(), + help_text=_('Purchase price currency'), + ) + class Meta: model = PurchaseOrderLineItem @@ -157,6 +174,11 @@ class POAttachmentSerializer(InvenTreeModelSerializer): 'order', 'attachment', 'comment', + 'upload_date', + ] + + read_only_fields = [ + 'upload_date', ] @@ -206,6 +228,8 @@ class SalesOrderSerializer(InvenTreeModelSerializer): overdue = serializers.BooleanField(required=False, read_only=True) + reference = serializers.CharField(required=True) + class Meta: model = SalesOrder @@ -221,6 +245,7 @@ class SalesOrderSerializer(InvenTreeModelSerializer): 'notes', 'overdue', 'reference', + 'responsible', 'status', 'status_text', 'shipment_date', @@ -316,13 +341,24 @@ class SOLineItemSerializer(InvenTreeModelSerializer): part_detail = PartBriefSerializer(source='part', many=False, read_only=True) allocations = SalesOrderAllocationSerializer(many=True, read_only=True) - # TODO: Once https://github.com/inventree/InvenTree/issues/1687 is fixed, remove default values - quantity = serializers.FloatField(default=1) + quantity = serializers.FloatField() allocated = serializers.FloatField(source='allocated_quantity', read_only=True) fulfilled = serializers.FloatField(source='fulfilled_quantity', read_only=True) + + sale_price = InvenTreeMoneySerializer( + max_digits=19, + decimal_places=4, + allow_null=True + ) + sale_price_string = serializers.CharField(source='sale_price', read_only=True) + sale_price_currency = serializers.ChoiceField( + choices=currency_code_mappings(), + help_text=_('Sale price currency'), + ) + class Meta: model = SalesOrderLineItem @@ -359,4 +395,9 @@ class SOAttachmentSerializer(InvenTreeModelSerializer): 'order', 'attachment', 'comment', + 'upload_date', + ] + + read_only_fields = [ + 'upload_date', ] diff --git a/InvenTree/order/templates/order/order_base.html b/InvenTree/order/templates/order/order_base.html index c7ba6be8a4..85d8fd5c51 100644 --- a/InvenTree/order/templates/order/order_base.html +++ b/InvenTree/order/templates/order/order_base.html @@ -164,11 +164,30 @@ $('#print-order-report').click(function() { }); $("#edit-order").click(function() { - launchModalForm("{% url 'po-edit' order.id %}", - { - reload: true, - } - ); + + constructForm('{% url "api-po-detail" order.pk %}', { + fields: { + reference: { + prefix: "{% settings_value 'PURCHASEORDER_REFERENCE_PREFIX' %}", + }, + {% if order.lines.count == 0 and order.status == PurchaseOrderStatus.PENDING %} + supplier: { + }, + {% endif %} + description: {}, + target_date: { + icon: 'fa-calendar-alt', + }, + link: { + icon: 'fa-link', + }, + responsible: { + icon: 'fa-user', + }, + }, + title: '{% trans "Edit Purchase Order" %}', + reload: true, + }); }); $("#receive-order").click(function() { diff --git a/InvenTree/order/templates/order/po_attachments.html b/InvenTree/order/templates/order/po_attachments.html index 40052c1ec6..07e425016b 100644 --- a/InvenTree/order/templates/order/po_attachments.html +++ b/InvenTree/order/templates/order/po_attachments.html @@ -22,7 +22,7 @@ enableDragAndDrop( '#attachment-dropzone', - "{% url 'po-attachment-create' %}", + '{% url "api-po-attachment-list" %}', { data: { order: {{ order.id }}, @@ -34,35 +34,50 @@ enableDragAndDrop( } ); -$("#new-attachment").click(function() { - launchModalForm("{% url 'po-attachment-create' %}?order={{ order.id }}", - { - reload: true, +loadAttachmentTable( + '{% url "api-po-attachment-list" %}', + { + filters: { + order: {{ order.pk }}, + }, + onEdit: function(pk) { + var url = `/api/order/po/attachment/${pk}/`; + + constructForm(url, { + fields: { + comment: {}, + }, + onSuccess: reloadAttachmentTable, + title: '{% trans "Edit Attachment" %}', + }); + }, + onDelete: function(pk) { + + constructForm(`/api/order/po/attachment/${pk}/`, { + method: 'DELETE', + confirmMessage: '{% trans "Confirm Delete Operation" %}', + title: '{% trans "Delete Attachment" %}', + onSuccess: reloadAttachmentTable, + }); } - ); -}); + } +); -$("#attachment-table").on('click', '.attachment-edit-button', function() { - var button = $(this); +$("#new-attachment").click(function() { - var url = `/order/purchase-order/attachment/${button.attr('pk')}/edit/`; - - launchModalForm(url, { + constructForm('{% url "api-po-attachment-list" %}', { + method: 'POST', + fields: { + attachment: {}, + comment: {}, + order: { + value: {{ order.pk }}, + hidden: true, + }, + }, reload: true, + title: '{% trans "Add Attachment" %}', }); }); -$("#attachment-table").on('click', '.attachment-delete-button', function() { - var button = $(this); - - var url = `/order/purchase-order/attachment/${button.attr('pk')}/delete/`; - - launchModalForm(url, { - reload: true, - }); -}); - -$("#attachment-table").inventreeTable({ -}); - {% endblock %} \ No newline at end of file diff --git a/InvenTree/order/templates/order/po_lineitem_delete.html b/InvenTree/order/templates/order/po_lineitem_delete.html deleted file mode 100644 index 1d9f80d137..0000000000 --- a/InvenTree/order/templates/order/po_lineitem_delete.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "modal_delete_form.html" %} -{% load i18n %} - -{% block pre_form_content %} -{% trans "Are you sure you wish to delete this line item?" %} -{% endblock %} \ No newline at end of file diff --git a/InvenTree/order/templates/order/po_received_items.html b/InvenTree/order/templates/order/po_received_items.html index 96dcb4fcf7..487dbd1284 100644 --- a/InvenTree/order/templates/order/po_received_items.html +++ b/InvenTree/order/templates/order/po_received_items.html @@ -25,7 +25,7 @@ loadStockTable($("#stock-table"), { params: { purchase_order: {{ order.id }}, part_detail: true, - supplier_detail: true, + supplier_part_detail: true, location_detail: true, }, buttons: [ diff --git a/InvenTree/order/templates/order/purchase_order_detail.html b/InvenTree/order/templates/order/purchase_order_detail.html index 0ad73923a2..9746103c89 100644 --- a/InvenTree/order/templates/order/purchase_order_detail.html +++ b/InvenTree/order/templates/order/purchase_order_detail.html @@ -21,7 +21,8 @@
                {% if order.status == PurchaseOrderStatus.PENDING and roles.purchase_order.change %} + {% trans "Add Line Item" %} + {% endif %}
                @@ -37,26 +38,34 @@ {% if order.status == PurchaseOrderStatus.PENDING %} $('#new-po-line').click(function() { - launchModalForm("{% url 'po-line-item-create' %}", - { - reload: true, - data: { - order: {{ order.id }}, + + + constructForm('{% url "api-po-line-list" %}', { + fields: { + order: { + value: {{ order.pk }}, + hidden: true, }, - secondary: [ - { - field: 'part', - label: '{% trans "New Supplier Part" %}', - title: '{% trans "Create new supplier part" %}', - url: "{% url 'supplier-part-create' %}", - data: { - supplier: {{ order.supplier.id }}, - }, + part: { + filters: { + part_detail: true, + supplier_detail: true, + supplier: {{ order.supplier.pk }}, }, - ], - } - ); + }, + quantity: {}, + reference: {}, + purchase_price: {}, + purchase_price_currency: {}, + destination: {}, + notes: {}, + }, + method: 'POST', + title: '{% trans "Add Line Item" %}', + onSuccess: reloadTable, + }); }); + {% endif %} function reloadTable() { @@ -72,16 +81,34 @@ function setupCallbacks() { table.find(".button-line-edit").click(function() { var pk = $(this).attr('pk'); - launchModalForm(`/order/purchase-order/line/${pk}/edit/`, { - success: reloadTable, + constructForm(`/api/order/po-line/${pk}/`, { + fields: { + part: { + filters: { + part_detail: true, + supplier_detail: true, + supplier: {{ order.supplier.pk }}, + } + }, + quantity: {}, + reference: {}, + purchase_price: {}, + purchase_price_currency: {}, + destination: {}, + notes: {}, + }, + title: '{% trans "Edit Line Item" %}', + onSuccess: reloadTable, }); }); table.find(".button-line-delete").click(function() { var pk = $(this).attr('pk'); - launchModalForm(`/order/purchase-order/line/${pk}/delete/`, { - success: reloadTable, + constructForm(`/api/order/po-line/${pk}/`, { + method: 'DELETE', + title: '{% trans "Delete Line Item" %}', + onSuccess: reloadTable, }); }); {% endif %} diff --git a/InvenTree/order/templates/order/purchase_orders.html b/InvenTree/order/templates/order/purchase_orders.html index a2a5d5d0fa..de1c0dd8a9 100644 --- a/InvenTree/order/templates/order/purchase_orders.html +++ b/InvenTree/order/templates/order/purchase_orders.html @@ -176,19 +176,7 @@ $("#order-print").click(function() { }) $("#po-create").click(function() { - launchModalForm("{% url 'po-create' %}", - { - follow: true, - secondary: [ - { - field: 'supplier', - label: '{% trans "New Supplier" %}', - title: '{% trans "Create new Supplier" %}', - url: '{% url "supplier-create" %}', - } - ] - } - ); + createPurchaseOrder(); }); loadPurchaseOrderTable("#purchase-order-table", { diff --git a/InvenTree/order/templates/order/sales_order_base.html b/InvenTree/order/templates/order/sales_order_base.html index b342cefe66..7a2c63c5a6 100644 --- a/InvenTree/order/templates/order/sales_order_base.html +++ b/InvenTree/order/templates/order/sales_order_base.html @@ -153,7 +153,28 @@ enableNavbar({ }); $("#edit-order").click(function() { - launchModalForm("{% url 'so-edit' order.id %}", { + + constructForm('{% url "api-so-detail" order.pk %}', { + fields: { + reference: { + prefix: "{% settings_value 'SALESORDER_REFERENCE_PREFIX' %}", + }, + {% if order.lines.count == 0 and order.status == SalesOrderStatus.PENDING %} + customer: { + }, + {% endif %} + description: {}, + target_date: { + icon: 'fa-calendar-alt', + }, + link: { + icon: 'fa-link', + }, + responsible: { + icon: 'fa-user', + }, + }, + title: '{% trans "Edit Sales Order" %}', reload: true, }); }); diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html index b760409fe4..4af0e219d6 100644 --- a/InvenTree/order/templates/order/sales_order_detail.html +++ b/InvenTree/order/templates/order/sales_order_detail.html @@ -38,13 +38,23 @@ function reloadTable() { } $("#new-so-line").click(function() { - launchModalForm("{% url 'so-line-item-create' %}", { - success: reloadTable, - data: { - order: {{ order.id }}, + + constructForm('{% url "api-so-line-list" %}', { + fields: { + order: { + value: {{ order.pk }}, + hidden: true, + }, + part: {}, + quantity: {}, + reference: {}, + sale_price: {}, + sale_price_currency: {}, + notes: {}, }, - secondary: [ - ] + method: 'POST', + title: '{% trans "Add Line Item" %}', + onSuccess: reloadTable, }); }); @@ -377,16 +387,26 @@ function setupCallbacks() { var pk = $(this).attr('pk'); - launchModalForm(`/order/sales-order/line/${pk}/edit/`, { - success: reloadTable, + constructForm(`/api/order/so-line/${pk}/`, { + fields: { + quantity: {}, + reference: {}, + sale_price: {}, + sale_price_currency: {}, + notes: {}, + }, + title: '{% trans "Edit Line Item" %}', + onSuccess: reloadTable, }); }); table.find(".button-delete").click(function() { var pk = $(this).attr('pk'); - launchModalForm(`/order/sales-order/line/${pk}/delete/`, { - success: reloadTable, + constructForm(`/api/order/so-line/${pk}/`, { + method: 'DELETE', + title: '{% trans "Delete Line Item" %}', + onSuccess: reloadTable, }); }); diff --git a/InvenTree/order/templates/order/sales_orders.html b/InvenTree/order/templates/order/sales_orders.html index 448ab4b095..d4ebbd4ca8 100644 --- a/InvenTree/order/templates/order/sales_orders.html +++ b/InvenTree/order/templates/order/sales_orders.html @@ -178,19 +178,7 @@ $("#order-print").click(function() { }) $("#so-create").click(function() { - launchModalForm("{% url 'so-create' %}", - { - follow: true, - secondary: [ - { - field: 'customer', - label: '{% trans "New Customer" %}', - title: '{% trans "Create new Customer" %}', - url: '{% url "customer-create" %}', - } - ] - } - ); + createSalesOrder(); }); {% endblock %} \ No newline at end of file diff --git a/InvenTree/order/templates/order/so_attachments.html b/InvenTree/order/templates/order/so_attachments.html index b868aea48e..9c29fe5abe 100644 --- a/InvenTree/order/templates/order/so_attachments.html +++ b/InvenTree/order/templates/order/so_attachments.html @@ -23,7 +23,7 @@ enableDragAndDrop( '#attachment-dropzone', - "{% url 'so-attachment-create' %}", + '{% url "api-so-attachment-list" %}', { data: { order: {{ order.id }}, @@ -35,35 +35,49 @@ enableDragAndDrop( } ); -$("#new-attachment").click(function() { - launchModalForm("{% url 'so-attachment-create' %}?order={{ order.id }}", - { - reload: true, +loadAttachmentTable( + '{% url "api-so-attachment-list" %}', + { + filters: { + order: {{ order.pk }}, + }, + onEdit: function(pk) { + var url = `/api/order/so/attachment/${pk}/`; + + constructForm(url, { + fields: { + comment: {}, + }, + onSuccess: reloadAttachmentTable, + title: '{% trans "Edit Attachment" %}', + }); + }, + onDelete: function(pk) { + constructForm(`/api/order/so/attachment/${pk}/`, { + method: 'DELETE', + confirmMessage: '{% trans "Confirm Delete Operation" %}', + title: '{% trans "Delete Attachment" %}', + onSuccess: reloadAttachmentTable, + }); } - ); -}); + } +); -$("#attachment-table").on('click', '.attachment-edit-button', function() { - var button = $(this); +$("#new-attachment").click(function() { - var url = `/order/sales-order/attachment/${button.attr('pk')}/edit/`; - - launchModalForm(url, { - reload: true, + constructForm('{% url "api-so-attachment-list" %}', { + method: 'POST', + fields: { + attachment: {}, + comment: {}, + order: { + value: {{ order.pk }}, + hidden: true + } + }, + onSuccess: reloadAttachmentTable, + title: '{% trans "Add Attachment" %}' }); }); -$("#attachment-table").on('click', '.attachment-delete-button', function() { - var button = $(this); - - var url = `/order/sales-order/attachment/${button.attr('pk')}/delete/`; - - launchModalForm(url, { - reload: true, - }); -}); - -$("#attachment-table").inventreeTable({ -}); - {% endblock %} \ No newline at end of file diff --git a/InvenTree/order/templates/order/so_lineitem_delete.html b/InvenTree/order/templates/order/so_lineitem_delete.html deleted file mode 100644 index 1d9f80d137..0000000000 --- a/InvenTree/order/templates/order/so_lineitem_delete.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "modal_delete_form.html" %} -{% load i18n %} - -{% block pre_form_content %} -{% trans "Are you sure you wish to delete this line item?" %} -{% endblock %} \ No newline at end of file diff --git a/InvenTree/order/test_views.py b/InvenTree/order/test_views.py index 23122d079d..4b49b6c94e 100644 --- a/InvenTree/order/test_views.py +++ b/InvenTree/order/test_views.py @@ -11,7 +11,6 @@ from django.contrib.auth.models import Group from InvenTree.status_codes import PurchaseOrderStatus from .models import PurchaseOrder, PurchaseOrderLineItem -from .models import SalesOrder import json @@ -60,88 +59,6 @@ class OrderListTest(OrderViewTestCase): self.assertEqual(response.status_code, 200) -class SalesOrderCreate(OrderViewTestCase): - """ - Create a SalesOrder using the form view - """ - - URL = reverse('so-create') - - def test_create_view(self): - """ - Retrieve the view for creating a sales order' - """ - - response = self.client.get(self.URL, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - - self.assertEqual(response.status_code, 200) - - def post(self, data, **kwargs): - - return self.client.post(self.URL, data, HTTP_X_REQUESTED_WITH='XMLHttpRequest', **kwargs) - - def test_post_error(self): - """ - POST with errors - """ - - n = SalesOrder.objects.count() - - data = { - 'reference': '12345678', - } - - response = self.post(data) - - data = json.loads(response.content) - - self.assertIn('form_valid', data.keys()) - - # Customer is not specified - should return False - self.assertFalse(data['form_valid']) - - errors = json.loads(data['form_errors']) - - self.assertIn('customer', errors.keys()) - self.assertIn('description', errors.keys()) - - # No new SalesOrder objects should have been created - self.assertEqual(SalesOrder.objects.count(), n) - - def test_post_valid(self): - """ - POST a valid SalesOrder - """ - - n = SalesOrder.objects.count() - - data = { - 'reference': '12345678', - 'customer': 4, - 'description': 'A description', - } - - response = self.post(data) - - json_data = json.loads(response.content) - - self.assertTrue(json_data['form_valid']) - - # Create another SalesOrder, this time with a target date - data = { - 'reference': '12345679', - 'customer': 4, - 'description': 'Another order, this one with a target date!', - 'target_date': '2020-12-25', - } - - response = self.post(data) - - json_data = json.loads(response.content) - - self.assertEqual(SalesOrder.objects.count(), n + 2) - - class POTests(OrderViewTestCase): """ Tests for PurchaseOrder views """ @@ -152,28 +69,6 @@ class POTests(OrderViewTestCase): keys = response.context.keys() self.assertIn('PurchaseOrderStatus', keys) - def test_po_create(self): - """ Launch forms to create new PurchaseOrder""" - url = reverse('po-create') - - # Without a supplier ID - response = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - - # With a valid supplier ID - response = self.client.get(url, {'supplier': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - - # With an invalid supplier ID - response = self.client.get(url, {'supplier': 'goat'}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - - def test_po_edit(self): - """ Launch form to edit a PurchaseOrder """ - - response = self.client.get(reverse('po-edit', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - def test_po_export(self): """ Export PurchaseOrder """ @@ -209,65 +104,6 @@ class POTests(OrderViewTestCase): order = PurchaseOrder.objects.get(pk=1) self.assertEqual(order.status, PurchaseOrderStatus.PLACED) - def test_line_item_create(self): - """ Test the form for adding a new LineItem to a PurchaseOrder """ - - # Record the number of line items in the PurchaseOrder - po = PurchaseOrder.objects.get(pk=1) - n = po.lines.count() - self.assertEqual(po.status, PurchaseOrderStatus.PENDING) - - url = reverse('po-line-item-create') - - # GET the form (pass the correct info) - response = self.client.get(url, {'order': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - - post_data = { - 'part': 100, - 'quantity': 45, - 'reference': 'Test reference field', - 'notes': 'Test notes field' - } - - # POST with an invalid purchase order - post_data['order'] = 99 - response = self.client.post(url, post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - data = json.loads(response.content) - self.assertFalse(data['form_valid']) - - # POST with a part that does not match the purchase order - post_data['order'] = 1 - post_data['part'] = 7 - response = self.client.post(url, post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - data = json.loads(response.content) - self.assertFalse(data['form_valid']) - - # POST with an invalid part - post_data['part'] = 12345 - response = self.client.post(url, post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - data = json.loads(response.content) - self.assertFalse(data['form_valid']) - - # POST the form with valid data - post_data['part'] = 100 - response = self.client.post(url, post_data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - data = json.loads(response.content) - self.assertTrue(data['form_valid']) - - self.assertEqual(n + 1, PurchaseOrder.objects.get(pk=1).lines.count()) - - line = PurchaseOrderLineItem.objects.get(order=1, part=100) - self.assertEqual(line.quantity, 45) - - def test_line_item_edit(self): - """ Test editing form for PO line item """ - - url = reverse('po-line-item-edit', args=(22,)) - - response = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - class TestPOReceive(OrderViewTestCase): """ Tests for receiving a purchase order """ diff --git a/InvenTree/order/tests.py b/InvenTree/order/tests.py index 5452aec383..b68e0c3ff1 100644 --- a/InvenTree/order/tests.py +++ b/InvenTree/order/tests.py @@ -60,12 +60,6 @@ class OrderTest(TestCase): order.save() self.assertFalse(order.is_overdue) - def test_increment(self): - - next_ref = PurchaseOrder.getNextOrderNumber() - - self.assertEqual(next_ref, '0008') - def test_on_order(self): """ There should be 3 separate items on order for the M2x4 LPHS part """ diff --git a/InvenTree/order/urls.py b/InvenTree/order/urls.py index 112a8cf297..16be6e77ce 100644 --- a/InvenTree/order/urls.py +++ b/InvenTree/order/urls.py @@ -12,7 +12,6 @@ from . import views purchase_order_detail_urls = [ url(r'^cancel/', views.PurchaseOrderCancel.as_view(), name='po-cancel'), - url(r'^edit/', views.PurchaseOrderEdit.as_view(), name='po-edit'), url(r'^issue/', views.PurchaseOrderIssue.as_view(), name='po-issue'), url(r'^receive/', views.PurchaseOrderReceive.as_view(), name='po-receive'), url(r'^complete/', views.PurchaseOrderComplete.as_view(), name='po-complete'), @@ -29,35 +28,17 @@ purchase_order_detail_urls = [ purchase_order_urls = [ - url(r'^new/', views.PurchaseOrderCreate.as_view(), name='po-create'), - url(r'^order-parts/', views.OrderParts.as_view(), name='order-parts'), url(r'^pricing/', views.LineItemPricing.as_view(), name='line-pricing'), # Display detail view for a single purchase order url(r'^(?P\d+)/', include(purchase_order_detail_urls)), - url(r'^line/', include([ - url(r'^new/', views.POLineItemCreate.as_view(), name='po-line-item-create'), - url(r'^(?P\d+)/', include([ - url(r'^edit/', views.POLineItemEdit.as_view(), name='po-line-item-edit'), - url(r'^delete/', views.POLineItemDelete.as_view(), name='po-line-item-delete'), - ])), - ])), - - url(r'^attachment/', include([ - url(r'^new/', views.PurchaseOrderAttachmentCreate.as_view(), name='po-attachment-create'), - url(r'^(?P\d+)/edit/', views.PurchaseOrderAttachmentEdit.as_view(), name='po-attachment-edit'), - url(r'^(?P\d+)/delete/', views.PurchaseOrderAttachmentDelete.as_view(), name='po-attachment-delete'), - ])), - # Display complete list of purchase orders url(r'^.*$', views.PurchaseOrderIndex.as_view(), name='po-index'), ] sales_order_detail_urls = [ - - url(r'^edit/', views.SalesOrderEdit.as_view(), name='so-edit'), url(r'^cancel/', views.SalesOrderCancel.as_view(), name='so-cancel'), url(r'^ship/', views.SalesOrderShip.as_view(), name='so-ship'), @@ -69,17 +50,6 @@ sales_order_detail_urls = [ ] sales_order_urls = [ - - url(r'^new/', views.SalesOrderCreate.as_view(), name='so-create'), - - url(r'^line/', include([ - url(r'^new/', views.SOLineItemCreate.as_view(), name='so-line-item-create'), - url(r'^(?P\d+)/', include([ - url(r'^edit/', views.SOLineItemEdit.as_view(), name='so-line-item-edit'), - url(r'^delete/', views.SOLineItemDelete.as_view(), name='so-line-item-delete'), - ])), - ])), - # URLs for sales order allocations url(r'^allocation/', include([ url(r'^new/', views.SalesOrderAllocationCreate.as_view(), name='so-allocation-create'), @@ -90,12 +60,6 @@ sales_order_urls = [ ])), ])), - url(r'^attachment/', include([ - url(r'^new/', views.SalesOrderAttachmentCreate.as_view(), name='so-attachment-create'), - url(r'^(?P\d+)/edit/', views.SalesOrderAttachmentEdit.as_view(), name='so-attachment-edit'), - url(r'^(?P\d+)/delete/', views.SalesOrderAttachmentDelete.as_view(), name='so-attachment-delete'), - ])), - # Display detail view for a single SalesOrder url(r'^(?P\d+)/', include(sales_order_detail_urls)), diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py index 98f3384ca9..2ec06e600e 100644 --- a/InvenTree/order/views.py +++ b/InvenTree/order/views.py @@ -20,8 +20,8 @@ from django.forms import HiddenInput, IntegerField import logging from decimal import Decimal, InvalidOperation -from .models import PurchaseOrder, PurchaseOrderLineItem, PurchaseOrderAttachment -from .models import SalesOrder, SalesOrderLineItem, SalesOrderAttachment +from .models import PurchaseOrder, PurchaseOrderLineItem +from .models import SalesOrder, SalesOrderLineItem from .models import SalesOrderAllocation from .admin import POLineItemResource from build.models import Build @@ -42,7 +42,8 @@ from InvenTree.helpers import DownloadFile, str2bool from InvenTree.helpers import extract_serial_numbers from InvenTree.views import InvenTreeRoleMixin -from InvenTree.status_codes import PurchaseOrderStatus, SalesOrderStatus, StockStatus +from InvenTree.status_codes import PurchaseOrderStatus, StockStatus + logger = logging.getLogger("inventree") @@ -96,167 +97,6 @@ class SalesOrderDetail(InvenTreeRoleMixin, DetailView): template_name = 'order/sales_order_detail.html' -class PurchaseOrderAttachmentCreate(AjaxCreateView): - """ - View for creating a new PurchaseOrderAttachment - """ - - model = PurchaseOrderAttachment - form_class = order_forms.EditPurchaseOrderAttachmentForm - ajax_form_title = _("Add Purchase Order Attachment") - ajax_template_name = "modal_form.html" - - def save(self, form, **kwargs): - - attachment = form.save(commit=False) - attachment.user = self.request.user - attachment.save() - - def get_data(self): - return { - "success": _("Added attachment") - } - - def get_initial(self): - """ - Get initial data for creating a new PurchaseOrderAttachment object. - - - Client must request this form with a parent PurchaseOrder in midn. - - e.g. ?order= - """ - - initials = super(AjaxCreateView, self).get_initial() - - try: - initials["order"] = PurchaseOrder.objects.get(id=self.request.GET.get('order', -1)) - except (ValueError, PurchaseOrder.DoesNotExist): - pass - - return initials - - def get_form(self): - """ - Create a form to upload a new PurchaseOrderAttachment - - - Hide the 'order' field - """ - - form = super(AjaxCreateView, self).get_form() - - form.fields['order'].widget = HiddenInput() - - return form - - -class SalesOrderAttachmentCreate(AjaxCreateView): - """ View for creating a new SalesOrderAttachment """ - - model = SalesOrderAttachment - form_class = order_forms.EditSalesOrderAttachmentForm - ajax_form_title = _('Add Sales Order Attachment') - - def save(self, form, **kwargs): - """ - Save the user that uploaded the attachment - """ - - attachment = form.save(commit=False) - attachment.user = self.request.user - attachment.save() - - def get_data(self): - return { - 'success': _('Added attachment') - } - - def get_initial(self): - initials = super().get_initial().copy() - - try: - initials['order'] = SalesOrder.objects.get(id=self.request.GET.get('order', None)) - except (ValueError, SalesOrder.DoesNotExist): - pass - - return initials - - def get_form(self): - """ Hide the 'order' field """ - - form = super().get_form() - form.fields['order'].widget = HiddenInput() - - return form - - -class PurchaseOrderAttachmentEdit(AjaxUpdateView): - """ View for editing a PurchaseOrderAttachment object """ - - model = PurchaseOrderAttachment - form_class = order_forms.EditPurchaseOrderAttachmentForm - ajax_form_title = _("Edit Attachment") - - def get_data(self): - return { - 'success': _('Attachment updated') - } - - def get_form(self): - form = super(AjaxUpdateView, self).get_form() - - # Hide the 'order' field - form.fields['order'].widget = HiddenInput() - - return form - - -class SalesOrderAttachmentEdit(AjaxUpdateView): - """ View for editing a SalesOrderAttachment object """ - - model = SalesOrderAttachment - form_class = order_forms.EditSalesOrderAttachmentForm - ajax_form_title = _("Edit Attachment") - - def get_data(self): - return { - 'success': _('Attachment updated') - } - - def get_form(self): - form = super().get_form() - - form.fields['order'].widget = HiddenInput() - - return form - - -class PurchaseOrderAttachmentDelete(AjaxDeleteView): - """ View for deleting a PurchaseOrderAttachment """ - - model = PurchaseOrderAttachment - ajax_form_title = _("Delete Attachment") - ajax_template_name = "order/delete_attachment.html" - context_object_name = "attachment" - - def get_data(self): - return { - "danger": _("Deleted attachment") - } - - -class SalesOrderAttachmentDelete(AjaxDeleteView): - """ View for deleting a SalesOrderAttachment """ - - model = SalesOrderAttachment - ajax_form_title = _("Delete Attachment") - ajax_template_name = "order/delete_attachment.html" - context_object_name = "attachment" - - def get_data(self): - return { - "danger": _("Deleted attachment") - } - - class PurchaseOrderNotes(InvenTreeRoleMixin, UpdateView): """ View for updating the 'notes' field of a PurchaseOrder """ @@ -304,114 +144,6 @@ class SalesOrderNotes(InvenTreeRoleMixin, UpdateView): return ctx -class PurchaseOrderCreate(AjaxCreateView): - """ - View for creating a new PurchaseOrder object using a modal form - """ - - model = PurchaseOrder - ajax_form_title = _("Create Purchase Order") - form_class = order_forms.EditPurchaseOrderForm - - def get_initial(self): - initials = super().get_initial().copy() - - initials['reference'] = PurchaseOrder.getNextOrderNumber() - initials['status'] = PurchaseOrderStatus.PENDING - - supplier_id = self.request.GET.get('supplier', None) - - if supplier_id: - try: - supplier = Company.objects.get(id=supplier_id) - initials['supplier'] = supplier - except (Company.DoesNotExist, ValueError): - pass - - return initials - - def save(self, form, **kwargs): - """ - Record the user who created this PurchaseOrder - """ - - order = form.save(commit=False) - order.created_by = self.request.user - - return super().save(form) - - -class SalesOrderCreate(AjaxCreateView): - """ View for creating a new SalesOrder object """ - - model = SalesOrder - ajax_form_title = _("Create Sales Order") - form_class = order_forms.EditSalesOrderForm - - def get_initial(self): - initials = super().get_initial().copy() - - initials['reference'] = SalesOrder.getNextOrderNumber() - initials['status'] = SalesOrderStatus.PENDING - - customer_id = self.request.GET.get('customer', None) - - if customer_id is not None: - try: - customer = Company.objects.get(id=customer_id) - initials['customer'] = customer - except (Company.DoesNotExist, ValueError): - pass - - return initials - - def save(self, form, **kwargs): - """ - Record the user who created this SalesOrder - """ - - order = form.save(commit=False) - order.created_by = self.request.user - - return super().save(form) - - -class PurchaseOrderEdit(AjaxUpdateView): - """ View for editing a PurchaseOrder using a modal form """ - - model = PurchaseOrder - ajax_form_title = _('Edit Purchase Order') - form_class = order_forms.EditPurchaseOrderForm - - def get_form(self): - - form = super(AjaxUpdateView, self).get_form() - - order = self.get_object() - - # Prevent user from editing supplier if there are already lines in the order - if order.lines.count() > 0 or not order.status == PurchaseOrderStatus.PENDING: - form.fields['supplier'].widget = HiddenInput() - - return form - - -class SalesOrderEdit(AjaxUpdateView): - """ View for editing a SalesOrder """ - - model = SalesOrder - ajax_form_title = _('Edit Sales Order') - form_class = order_forms.EditSalesOrderForm - - def get_form(self): - form = super().get_form() - - # Prevent user from editing customer - form.fields['customer'].widget = HiddenInput() - - return form - - class PurchaseOrderCancel(AjaxUpdateView): """ View for cancelling a purchase order """ @@ -1317,214 +1049,6 @@ class OrderParts(AjaxView): order.add_line_item(supplier_part, quantity, purchase_price=purchase_price) -class POLineItemCreate(AjaxCreateView): - """ AJAX view for creating a new PurchaseOrderLineItem object - """ - - model = PurchaseOrderLineItem - context_object_name = 'line' - form_class = order_forms.EditPurchaseOrderLineItemForm - ajax_form_title = _('Add Line Item') - - def validate(self, item, form, **kwargs): - - order = form.cleaned_data.get('order', None) - - part = form.cleaned_data.get('part', None) - - if not part: - form.add_error('part', _('Supplier part must be specified')) - - if part and order: - if not part.supplier == order.supplier: - form.add_error( - 'part', - _('Supplier must match for Part and Order') - ) - - def get_form(self): - """ Limit choice options based on the selected order, etc - """ - - form = super().get_form() - - # Limit the available to orders to ones that are PENDING - query = form.fields['order'].queryset - query = query.filter(status=PurchaseOrderStatus.PENDING) - form.fields['order'].queryset = query - - order_id = form['order'].value() - - try: - order = PurchaseOrder.objects.get(id=order_id) - - query = form.fields['part'].queryset - - # Only allow parts from the selected supplier - query = query.filter(supplier=order.supplier.id) - - exclude = [] - - for line in order.lines.all(): - if line.part and line.part.id not in exclude: - exclude.append(line.part.id) - - # Remove parts that are already in the order - query = query.exclude(id__in=exclude) - - form.fields['part'].queryset = query - form.fields['order'].widget = HiddenInput() - except (ValueError, PurchaseOrder.DoesNotExist): - pass - - return form - - def get_initial(self): - """ Extract initial data for the line item. - - - The 'order' will be passed as a query parameter - - Use this to set the 'order' field and limit the options for 'part' - """ - - initials = super().get_initial().copy() - - order_id = self.request.GET.get('order', None) - - if order_id: - try: - order = PurchaseOrder.objects.get(id=order_id) - initials['order'] = order - - except (PurchaseOrder.DoesNotExist, ValueError): - pass - - return initials - - -class SOLineItemCreate(AjaxCreateView): - """ Ajax view for creating a new SalesOrderLineItem object """ - - model = SalesOrderLineItem - context_order_name = 'line' - form_class = order_forms.EditSalesOrderLineItemForm - ajax_form_title = _('Add Line Item') - - def get_form(self, *args, **kwargs): - - form = super().get_form(*args, **kwargs) - - # If the order is specified, hide the widget - order_id = form['order'].value() - - if SalesOrder.objects.filter(id=order_id).exists(): - form.fields['order'].widget = HiddenInput() - - return form - - def get_initial(self): - """ - Extract initial data for this line item: - - Options: - order: The SalesOrder object - part: The Part object - """ - - initials = super().get_initial().copy() - - order_id = self.request.GET.get('order', None) - part_id = self.request.GET.get('part', None) - - if order_id: - try: - order = SalesOrder.objects.get(id=order_id) - initials['order'] = order - except (SalesOrder.DoesNotExist, ValueError): - pass - - if part_id: - try: - part = Part.objects.get(id=part_id) - if part.salable: - initials['part'] = part - except (Part.DoesNotExist, ValueError): - pass - - return initials - - def save(self, form): - ret = form.save() - # check if price s set in form - else autoset - if not ret.sale_price: - price = ret.part.get_price(ret.quantity) - # only if price is avail - if price: - ret.sale_price = price / ret.quantity - ret.save() - self.object = ret - return ret - - -class SOLineItemEdit(AjaxUpdateView): - """ View for editing a SalesOrderLineItem """ - - model = SalesOrderLineItem - form_class = order_forms.EditSalesOrderLineItemForm - ajax_form_title = _('Edit Line Item') - - def get_form(self): - form = super().get_form() - - form.fields.pop('order') - form.fields.pop('part') - - return form - - -class POLineItemEdit(AjaxUpdateView): - """ View for editing a PurchaseOrderLineItem object in a modal form. - """ - - model = PurchaseOrderLineItem - form_class = order_forms.EditPurchaseOrderLineItemForm - ajax_template_name = 'modal_form.html' - ajax_form_title = _('Edit Line Item') - - def get_form(self): - form = super().get_form() - - # Prevent user from editing order once line item is assigned - form.fields['order'].widget = HiddenInput() - - return form - - -class POLineItemDelete(AjaxDeleteView): - """ View for deleting a PurchaseOrderLineItem object in a modal form - """ - - model = PurchaseOrderLineItem - ajax_form_title = _('Delete Line Item') - ajax_template_name = 'order/po_lineitem_delete.html' - - def get_data(self): - return { - 'danger': _('Deleted line item'), - } - - -class SOLineItemDelete(AjaxDeleteView): - - model = SalesOrderLineItem - ajax_form_title = _("Delete Line Item") - ajax_template_name = "order/so_lineitem_delete.html" - - def get_data(self): - return { - 'danger': _('Deleted line item'), - } - - class SalesOrderAssignSerials(AjaxView, FormMixin): """ View for assigning stock items to a sales order, diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index 60cea121a7..337201c95f 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -127,7 +127,10 @@ class CategoryList(generics.ListCreateAPIView): class CategoryDetail(generics.RetrieveUpdateDestroyAPIView): - """ API endpoint for detail view of a single PartCategory object """ + """ + API endpoint for detail view of a single PartCategory object + """ + serializer_class = part_serializers.CategorySerializer queryset = PartCategory.objects.all() @@ -229,6 +232,24 @@ class PartAttachmentList(generics.ListCreateAPIView, AttachmentMixin): ] +class PartAttachmentDetail(generics.RetrieveUpdateDestroyAPIView, AttachmentMixin): + """ + Detail endpoint for PartAttachment model + """ + + queryset = PartAttachment.objects.all() + serializer_class = part_serializers.PartAttachmentSerializer + + +class PartTestTemplateDetail(generics.RetrieveUpdateDestroyAPIView): + """ + Detail endpoint for PartTestTemplate model + """ + + queryset = PartTestTemplate.objects.all() + serializer_class = part_serializers.PartTestTemplateSerializer + + class PartTestTemplateList(generics.ListCreateAPIView): """ API endpoint for listing (and creating) a PartTestTemplate. @@ -337,8 +358,9 @@ class PartDetail(generics.RetrieveUpdateDestroyAPIView): def get_serializer(self, *args, **kwargs): + # By default, include 'category_detail' information in the detail view try: - kwargs['category_detail'] = str2bool(self.request.query_params.get('category_detail', False)) + kwargs['category_detail'] = str2bool(self.request.query_params.get('category_detail', True)) except AttributeError: pass @@ -651,6 +673,15 @@ class PartList(generics.ListCreateAPIView): # Filter items which have an 'in_stock' level higher than 'minimum_stock' queryset = queryset.filter(Q(in_stock__gte=F('minimum_stock'))) + # Filer by 'depleted_stock' status -> has no stock and stock items + depleted_stock = params.get('depleted_stock', None) + + if depleted_stock is not None: + depleted_stock = str2bool(depleted_stock) + + if depleted_stock: + queryset = queryset.filter(Q(in_stock=0) & ~Q(stock_item_count=0)) + # Filter by "parts which need stock to complete build" stock_to_build = params.get('stock_to_build', None) @@ -1023,11 +1054,13 @@ part_api_urls = [ # Base URL for PartTestTemplate API endpoints url(r'^test-template/', include([ + url(r'^(?P\d+)/', PartTestTemplateDetail.as_view(), name='api-part-test-template-detail'), url(r'^$', PartTestTemplateList.as_view(), name='api-part-test-template-list'), ])), # Base URL for PartAttachment API endpoints url(r'^attachment/', include([ + url(r'^(?P\d+)/', PartAttachmentDetail.as_view(), name='api-part-attachment-detail'), url(r'^$', PartAttachmentList.as_view(), name='api-part-attachment-list'), ])), diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index ec799bcf8d..36a49006b0 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -5,21 +5,21 @@ Django Forms for interacting with Part objects # -*- coding: utf-8 -*- from __future__ import unicode_literals +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from mptt.fields import TreeNodeChoiceField + from InvenTree.forms import HelperForm from InvenTree.helpers import GetExportFormats from InvenTree.fields import RoundingDecimalFormField -from mptt.fields import TreeNodeChoiceField -from django import forms -from django.utils.translation import ugettext_lazy as _ - import common.models -from .models import Part, PartCategory, PartAttachment, PartRelated +from .models import Part, PartCategory, PartRelated from .models import BomItem from .models import PartParameterTemplate, PartParameter from .models import PartCategoryParameterTemplate -from .models import PartTestTemplate from .models import PartSellPriceBreak, PartInternalPriceBreak @@ -65,22 +65,6 @@ class PartImageForm(HelperForm): ] -class EditPartTestTemplateForm(HelperForm): - """ Class for creating / editing a PartTestTemplate object """ - - class Meta: - model = PartTestTemplate - - fields = [ - 'part', - 'test_name', - 'description', - 'required', - 'requires_value', - 'requires_attachment', - ] - - class BomExportForm(forms.Form): """ Simple form to let user set BOM export options, before exporting a BOM (bill of materials) file. @@ -185,18 +169,6 @@ class CreatePartRelatedForm(HelperForm): } -class EditPartAttachmentForm(HelperForm): - """ Form for editing a PartAttachment object """ - - class Meta: - model = PartAttachment - fields = [ - 'part', - 'attachment', - 'comment' - ] - - class SetPartCategoryForm(forms.Form): """ Form for setting the category of multiple Part objects """ diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 9f4da436df..b69177c05b 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -75,6 +75,10 @@ class PartCategory(InvenTreeTree): default_keywords = models.CharField(null=True, blank=True, max_length=250, verbose_name=_('Default keywords'), help_text=_('Default keywords for parts in this category')) + @staticmethod + def get_api_url(): + return reverse('api-part-category-list') + def get_absolute_url(self): return reverse('category-detail', kwargs={'pk': self.id}) @@ -329,6 +333,11 @@ class Part(MPTTModel): # For legacy reasons the 'variant_of' field is used to indicate the MPTT parent parent_attr = 'variant_of' + @staticmethod + def get_api_url(): + + return reverse('api-part-list') + def get_context_data(self, request, **kwargs): """ Return some useful context data about this part for template rendering @@ -1968,6 +1977,10 @@ class PartAttachment(InvenTreeAttachment): Model for storing file attachments against a Part object """ + @staticmethod + def get_api_url(): + return reverse('api-part-attachment-list') + def getSubdir(self): return os.path.join("part_files", str(self.part.id)) @@ -1979,6 +1992,10 @@ class PartSellPriceBreak(common.models.PriceBreak): """ Represents a price break for selling this part """ + + @staticmethod + def get_api_url(): + return reverse('api-part-sale-price-list') part = models.ForeignKey( Part, on_delete=models.CASCADE, @@ -1996,6 +2013,10 @@ class PartInternalPriceBreak(common.models.PriceBreak): Represents a price break for internally selling this part """ + @staticmethod + def get_api_url(): + return reverse('api-part-internal-price-list') + part = models.ForeignKey( Part, on_delete=models.CASCADE, related_name='internalpricebreaks', @@ -2040,6 +2061,10 @@ class PartTestTemplate(models.Model): run on the model (refer to the validate_unique function). """ + @staticmethod + def get_api_url(): + return reverse('api-part-test-template-list') + def save(self, *args, **kwargs): self.clean() @@ -2138,6 +2163,10 @@ class PartParameterTemplate(models.Model): units: The units of the Parameter [string] """ + @staticmethod + def get_api_url(): + return reverse('api-part-param-template-list') + def __str__(self): s = str(self.name) if self.units: @@ -2175,6 +2204,10 @@ class PartParameter(models.Model): data: The data (value) of the Parameter [string] """ + @staticmethod + def get_api_url(): + return reverse('api-part-param-list') + def __str__(self): # String representation of a PartParameter (used in the admin interface) return "{part} : {param} = {data}{units}".format( @@ -2266,6 +2299,10 @@ class BomItem(models.Model): allow_variants: Stock for part variants can be substituted for this BomItem """ + @staticmethod + def get_api_url(): + return reverse('api-bom-list') + def save(self, *args, **kwargs): self.clean() diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 2da2d05d3b..313e2cf920 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -4,6 +4,7 @@ JSON serializers for Part app import imghdr from decimal import Decimal +from django.urls import reverse_lazy from django.db import models from django.db.models import Q from django.db.models.functions import Coalesce @@ -38,6 +39,7 @@ class CategorySerializer(InvenTreeModelSerializer): 'name', 'description', 'default_location', + 'default_keywords', 'pathstring', 'url', 'parent', @@ -59,7 +61,12 @@ class PartAttachmentSerializer(InvenTreeModelSerializer): 'pk', 'part', 'attachment', - 'comment' + 'comment', + 'upload_date', + ] + + read_only_fields = [ + 'upload_date', ] @@ -187,6 +194,9 @@ class PartSerializer(InvenTreeModelSerializer): Used when displaying all details of a single component. """ + def get_api_url(self): + return reverse_lazy('api-part-list') + def __init__(self, *args, **kwargs): """ Custom initialization method for PartSerializer, @@ -326,9 +336,10 @@ class PartSerializer(InvenTreeModelSerializer): 'category', 'category_detail', 'component', - 'description', - 'default_location', 'default_expiry', + 'default_location', + 'default_supplier', + 'description', 'full_name', 'image', 'in_stock', diff --git a/InvenTree/part/templates/part/attachments.html b/InvenTree/part/templates/part/attachments.html index 93440e13ed..7128980472 100644 --- a/InvenTree/part/templates/part/attachments.html +++ b/InvenTree/part/templates/part/attachments.html @@ -19,51 +19,68 @@ {% block js_ready %} {{ block.super }} + loadAttachmentTable( + '{% url "api-part-attachment-list" %}', + { + filters: { + part: {{ part.pk }}, + }, + onEdit: function(pk) { + var url = `/api/part/attachment/${pk}/`; + + constructForm(url, { + fields: { + comment: {}, + }, + title: '{% trans "Edit Attachment" %}', + onSuccess: reloadAttachmentTable, + }); + }, + onDelete: function(pk) { + var url = `/api/part/attachment/${pk}/`; + + constructForm(url, { + method: 'DELETE', + confirmMessage: '{% trans "Confirm Delete Operation" %}', + title: '{% trans "Delete Attachment" %}', + onSuccess: reloadAttachmentTable, + }); + } + } + ); + enableDragAndDrop( '#attachment-dropzone', - "{% url 'part-attachment-create' %}", + '{% url "api-part-attachment-list" %}', { data: { part: {{ part.id }}, }, label: 'attachment', success: function(data, status, xhr) { - location.reload(); + reloadAttachmentTable(); } } ); $("#new-attachment").click(function() { - launchModalForm("{% url 'part-attachment-create' %}?part={{ part.id }}", + + constructForm( + '{% url "api-part-attachment-list" %}', { - reload: true, - }); - }); - - $("#attachment-table").on('click', '.attachment-edit-button', function() { - var button = $(this); - - var url = `/part/attachment/${button.attr('pk')}/edit/`; - - launchModalForm(url, - { - reload: true, - }); - }); - - $("#attachment-table").on('click', '.attachment-delete-button', function() { - var button = $(this); - - var url = `/part/attachment/${button.attr('pk')}/delete/`; - - launchModalForm(url, { - success: function() { - location.reload(); + method: 'POST', + fields: { + attachment: {}, + comment: {}, + part: { + value: {{ part.pk }}, + hidden: true, + } + }, + onSuccess: reloadAttachmentTable, + title: '{% trans "Add Attachment" %}', } - }); - }); - - $("#attachment-table").inventreeTable({ + ) }); {% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/bom-delete.html b/InvenTree/part/templates/part/bom-delete.html deleted file mode 100644 index c2db77c040..0000000000 --- a/InvenTree/part/templates/part/bom-delete.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "modal_delete_form.html" %} -{% load i18n %} - -{% block pre_form_content %} - -{% trans "Are you sure you want to delete this BOM item?" %} -
                -{% trans "Deleting this entry will remove the BOM row from the following part" %}: - -
                  -
                • - {{ item.part.full_name }} - {{ item.part.description }} -
                • -
                - -{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/bom.html b/InvenTree/part/templates/part/bom.html index dc345f9737..ba3e9be2b9 100644 --- a/InvenTree/part/templates/part/bom.html +++ b/InvenTree/part/templates/part/bom.html @@ -124,7 +124,7 @@ // Wait for *all* the requests to complete $.when.apply($, requests).then(function() { - $('#bom-table').bootstrapTable('refresh'); + location.reload(); }); } } diff --git a/InvenTree/part/templates/part/category.html b/InvenTree/part/templates/part/category.html index ef250d4c89..cf7348be76 100644 --- a/InvenTree/part/templates/part/category.html +++ b/InvenTree/part/templates/part/category.html @@ -268,13 +268,25 @@ {% if category %} $("#cat-edit").click(function () { - launchModalForm( - "{% url 'category-edit' category.id %}", + + constructForm( + '{% url "api-part-category-detail" category.pk %}', { + fields: { + name: {}, + description: {}, + parent: { + help_text: '{% trans "Select parent category" %}', + }, + default_location: {}, + default_keywords: { + icon: 'fa-key', + } + }, + title: '{% trans "Edit Part Category" %}', reload: true - }, + } ); - return false; }); {% if category.parent %} diff --git a/InvenTree/part/templates/part/internal_prices.html b/InvenTree/part/templates/part/internal_prices.html deleted file mode 100644 index 2f54f3bb64..0000000000 --- a/InvenTree/part/templates/part/internal_prices.html +++ /dev/null @@ -1,122 +0,0 @@ -{% extends "part/part_base.html" %} -{% load static %} -{% load i18n %} -{% load inventree_extras %} - -{% block menubar %} -{% include 'part/navbar.html' with tab='internal-prices' %} -{% endblock %} - -{% block heading %} -{% trans "Internal Price Information" %} -{% endblock %} - -{% block details %} -{% settings_value "PART_INTERNAL_PRICE" as show_internal_price %} -{% if show_internal_price and roles.sales_order.view %} -
                - -
                - - -
                - -{% 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/manufacturer.html b/InvenTree/part/templates/part/manufacturer.html index 82f02ba85f..ba708d70e8 100644 --- a/InvenTree/part/templates/part/manufacturer.html +++ b/InvenTree/part/templates/part/manufacturer.html @@ -51,7 +51,6 @@ field: 'manufacturer', label: '{% trans "New Manufacturer" %}', title: '{% trans "Create new manufacturer" %}', - url: "{% url 'manufacturer-create' %}", } ] }); @@ -61,17 +60,10 @@ var selections = $("#manufacturer-table").bootstrapTable("getSelections"); - var parts = []; - - selections.forEach(function(item) { - parts.push(item.pk); - }); - - launchModalForm("{% url 'manufacturer-part-delete' %}", { - data: { - parts: parts, - }, - reload: true, + deleteManufacturerParts(selections, { + onSuccess: function() { + $("#manufacturer-table").bootstrapTable("refresh"); + } }); }); @@ -81,7 +73,7 @@ { params: { part: {{ part.id }}, - part_detail: false, + part_detail: true, manufacturer_detail: true, }, } diff --git a/InvenTree/part/templates/part/navbar.html b/InvenTree/part/templates/part/navbar.html index 1fae6aaec2..b4c943dcfa 100644 --- a/InvenTree/part/templates/part/navbar.html +++ b/InvenTree/part/templates/part/navbar.html @@ -71,13 +71,13 @@ {% endif %} - {% if part.purchaseable and roles.purchase_order.view %} -
              • - +
              • + - {% trans "Order Price" %} + {% trans "Prices" %}
              • + {% if part.purchaseable and roles.purchase_order.view %}
              • @@ -97,19 +97,7 @@
              • {% endif %} - {% if show_internal_price and roles.sales_order.view %} -
              • - - - {% trans "Internal Price" %} - -
              • -
              • - - - {% trans "Sale Price" %} - -
              • + {% if roles.sales_order.view %}
              • diff --git a/InvenTree/part/templates/part/order_prices.html b/InvenTree/part/templates/part/order_prices.html deleted file mode 100644 index c8f0ea29a0..0000000000 --- a/InvenTree/part/templates/part/order_prices.html +++ /dev/null @@ -1,236 +0,0 @@ -{% extends "part/part_base.html" %} -{% load static %} -{% load i18n %} -{% load crispy_forms_tags %} -{% load inventree_extras %} - -{% block menubar %} -{% include 'part/navbar.html' with tab='order-prices' %} -{% endblock %} - -{% block heading %} -{% trans "Order Price Information" %} -{% endblock %} - -{% block details %} -{% default_currency as currency %} -{% settings_value "PART_INTERNAL_PRICE" as show_internal_price %} - - -
                - {% csrf_token %} -
                -
                {{ form|crispy }}
                -
                - -
                -
                -
                -
                - -
                -

                {% trans "Pricing ranges" %}

                - -{% if part.supplier_count > 0 %} - {% if min_total_buy_price %} - - - - - - - {% if quantity > 1 %} - - - - - - - {% endif %} - {% else %} - - - - {% endif %} -{% endif %} - -{% if part.bom_count > 0 %} - {% if min_total_bom_price %} - - - - - - - {% if quantity > 1 %} - - - - - - - {% endif %} - {% if part.has_complete_bom_pricing == False %} - - - - {% endif %} - {% else %} - - - - {% endif %} -{% endif %} - -{% if show_internal_price and roles.sales_order.view %} -{% if total_internal_part_price %} - - - - - - - - - - -{% endif %} -{% endif %} - -{% if total_part_price %} - - - - - - - - - - -{% endif %} -
                {% trans 'Supplier Pricing' %}{% trans 'Unit Cost' %}Min: {% include "price.html" with price=min_unit_buy_price %}Max: {% include "price.html" with price=max_unit_buy_price %}
                {% trans 'Total Cost' %}Min: {% include "price.html" with price=min_total_buy_price %}Max: {% include "price.html" with price=max_total_buy_price %}
                - {% trans 'No supplier pricing available' %} -
                {% trans 'BOM Pricing' %}{% trans 'Unit Cost' %}Min: {% include "price.html" with price=min_unit_bom_price %}Max: {% include "price.html" with price=max_unit_bom_price %}
                {% trans 'Total Cost' %}Min: {% include "price.html" with price=min_total_bom_price %}Max: {% include "price.html" with price=max_total_bom_price %}
                - {% trans 'Note: BOM pricing is incomplete for this part' %} -
                - {% trans 'No BOM pricing available' %} -
                {% trans 'Internal Price' %}{% trans 'Unit Cost' %}{% include "price.html" with price=unit_internal_part_price %}
                {% trans 'Total Cost' %}{% include "price.html" with price=total_internal_part_price %}
                {% trans 'Sale Price' %}{% trans 'Unit Cost' %}{% include "price.html" with price=unit_part_price %}
                {% trans 'Total Cost' %}{% include "price.html" with price=total_part_price %}
                - -{% if min_unit_buy_price or min_unit_bom_price %} -{% else %} -
                - {% trans 'No pricing information is available for this part.' %} -
                -{% endif %} -
                -{% if part.bom_count > 0 %} -
                -

                {% trans 'BOM Pricing' %}

                -
                - -
                -
                -{% endif %} -
                - -{% if price_history %} -
                -

                {% trans 'Stock Pricing' %}

                - {% if price_history|length > 0 %} -
                - -
                - {% else %} -
                - {% trans 'No stock pricing history is available for this part.' %} -
                - {% endif %} -{% endif %} -{% endblock %} - - - - -{% block js_ready %} - {{ block.super }} - - {% default_currency as currency %} - {% if price_history %} - var pricedata = { - labels: [ - {% for line in price_history %}'{{ line.date }}',{% endfor %} - ], - datasets: [{ - label: '{% blocktrans %}Single Price - {{currency}}{% endblocktrans %}', - backgroundColor: 'rgba(255, 99, 132, 0.2)', - borderColor: 'rgb(255, 99, 132)', - yAxisID: 'y', - data: [ - {% for line in price_history %}{{ line.price|stringformat:".2f" }},{% endfor %} - ], - borderWidth: 1, - type: 'line' - }, - {% if 'price_diff' in price_history.0 %} - { - label: '{% blocktrans %}Single Price Difference - {{currency}}{% endblocktrans %}', - backgroundColor: 'rgba(68, 157, 68, 0.2)', - borderColor: 'rgb(68, 157, 68)', - yAxisID: 'y2', - data: [ - {% for line in price_history %}{{ line.price_diff|stringformat:".2f" }},{% endfor %} - ], - borderWidth: 1, - type: 'line', - hidden: true, - }, - { - label: '{% blocktrans %}Part Single Price - {{currency}}{% endblocktrans %}', - backgroundColor: 'rgba(70, 127, 155, 0.2)', - borderColor: 'rgb(70, 127, 155)', - yAxisID: 'y', - data: [ - {% for line in price_history %}{{ line.price_part|stringformat:".2f" }},{% endfor %} - ], - borderWidth: 1, - type: 'line', - hidden: true, - }, - {% endif %} - { - label: '{% trans "Quantity" %}', - backgroundColor: 'rgba(255, 206, 86, 0.2)', - borderColor: 'rgb(255, 206, 86)', - yAxisID: 'y1', - data: [ - {% for line in price_history %}{{ line.qty|stringformat:"f" }},{% endfor %} - ], - borderWidth: 1 - }] - } - var StockPriceChart = loadStockPricingChart(document.getElementById('StockPriceChart'), pricedata) - var bom_colors = randomColor({hue: 'green', count: {{ bom_parts|length }} }) - var bomdata = { - labels: [{% for line in bom_parts %}'{{ line.name }}',{% endfor %}], - datasets: [ - { - label: 'Price', - data: [{% for line in bom_parts %}{{ line.min_price }},{% endfor %}], - backgroundColor: bom_colors, - }, - {% if bom_pie_max %} - { - label: 'Max Price', - data: [{% for line in bom_parts %}{{ line.max_price }},{% endfor %}], - backgroundColor: bom_colors, - }, - {% endif %} - ] - }; - var BomChart = loadBomChart(document.getElementById('BomChart'), bomdata) - - {% endif %} - -{% endblock %} diff --git a/InvenTree/part/templates/part/part_base.html b/InvenTree/part/templates/part/part_base.html index b486e2c589..ee9d541762 100644 --- a/InvenTree/part/templates/part/part_base.html +++ b/InvenTree/part/templates/part/part_base.html @@ -237,6 +237,16 @@ }); {% endif %} + function reloadImage(data) { + // If image / thumbnail data present, live update + if (data.image) { + $('#part-image').attr('src', data.image); + } else { + // Otherwise, reload the page + location.reload(); + } + } + enableDragAndDrop( '#part-thumb', "{% url 'api-part-detail' part.id %}", @@ -244,14 +254,7 @@ label: 'image', method: 'PATCH', success: function(data, status, xhr) { - - // If image / thumbnail data present, live update - if (data.image) { - $('#part-image').attr('src', data.image); - } else { - // Otherwise, reload the page - location.reload(); - } + reloadImage(data); } } ); @@ -293,11 +296,20 @@ }); $("#part-image-upload").click(function() { - launchModalForm("{% url 'part-image-upload' part.id %}", + + constructForm( + '{% url "api-part-detail" part.pk %}', { - reload: true + method: 'PATCH', + fields: { + image: {}, + }, + title: '{% trans "Upload Image" %}', + onSuccess: function(data) { + reloadImage(data); + } } - ); + ) }); @@ -357,6 +369,75 @@ }); $("#part-edit").click(function() { + + constructForm('{% url "api-part-detail" part.id %}', { + focus: 'name', + fields: { + category: { + secondary: { + label: '{% trans "New Category" %}', + title: '{% trans "Create New Part Category" %}', + api_url: '{% url "api-part-category-list" %}', + method: 'POST', + fields: { + name: {}, + description: {}, + parent: { + secondary: { + title: '{% trans "New Parent" %}', + api_url: '{% url "api-part-category-list" %}', + method: 'POST', + fields: { + name: {}, + description: {}, + parent: {}, + } + } + }, + } + }, + }, + name: { + placeholder: 'part name', + }, + IPN: {}, + description: {}, + revision: {}, + keywords: { + icon: 'fa-key', + }, + variant_of: {}, + link: { + icon: 'fa-link', + }, + default_location: { + secondary: { + label: '{% trans "New Location" %}', + title: '{% trans "Create new stock location" %}', + + }, + }, + default_supplier: { + filters: { + part: {{ part.pk }}, + part_detail: true, + manufacturer_detail: true, + supplier_detail: true, + }, + secondary: { + label: '{% trans "New Supplier Part" %}', + title: '{% trans "Create new supplier part" %}', + } + }, + units: {}, + minimum_stock: {}, + }, + title: '{% trans "Edit Part" %}', + reload: true, + }); + + return; + launchModalForm( "{% url 'part-edit' part.id %}", { diff --git a/InvenTree/part/templates/part/part_tests.html b/InvenTree/part/templates/part/part_tests.html index dbd439afdb..3c131aa1d4 100644 --- a/InvenTree/part/templates/part/part_tests.html +++ b/InvenTree/part/templates/part/part_tests.html @@ -44,34 +44,52 @@ function reloadTable() { } $("#add-test-template").click(function() { - launchModalForm( - "{% url 'part-test-template-create' %}", - { - data: { - part: {{ part.id }}, - }, - success: reloadTable, - } - ); + + constructForm('{% url "api-part-test-template-list" %}', { + method: 'POST', + fields: { + test_name: {}, + description: {}, + required: {}, + requires_value: {}, + requires_attachment: {}, + part: { + value: {{ part.pk }}, + hidden: true, + } + }, + title: '{% trans "Add Test Result Template" %}', + onSuccess: reloadTable + }); }); $("#test-template-table").on('click', '.button-test-edit', function() { - var button = $(this); + var pk = $(this).attr('pk'); - var url = `/part/test-template/${button.attr('pk')}/edit/`; + var url = `/api/part/test-template/${pk}/`; - launchModalForm(url, { - success: reloadTable, + constructForm(url, { + fields: { + test_name: {}, + description: {}, + required: {}, + requires_value: {}, + requires_attachment: {}, + }, + title: '{% trans "Edit Test Result Template" %}', + onSuccess: reloadTable, }); }); $("#test-template-table").on('click', '.button-test-delete', function() { - var button = $(this); + var pk = $(this).attr('pk'); - var url = `/part/test-template/${button.attr('pk')}/delete/`; + var url = `/api/part/test-template/${pk}/`; - launchModalForm(url, { - success: reloadTable, + constructForm(url, { + method: 'DELETE', + title: '{% trans "Delete Test Result Template" %}', + onSuccess: reloadTable, }); }); diff --git a/InvenTree/part/templates/part/prices.html b/InvenTree/part/templates/part/prices.html new file mode 100644 index 0000000000..6e234d3dba --- /dev/null +++ b/InvenTree/part/templates/part/prices.html @@ -0,0 +1,488 @@ +{% extends "part/part_base.html" %} +{% load static %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load inventree_extras %} + +{% block menubar %} +{% include 'part/navbar.html' with tab='prices' %} +{% endblock %} + +{% block heading %} +{% trans "General Price Information" %} +{% endblock %} + + +{% block details %} +{% default_currency as currency %} + +
                + +
                +

                {% trans "Pricing ranges" %}

                + + {% if part.supplier_count > 0 %} + {% if min_total_buy_price %} + + + + + + + {% if quantity > 1 %} + + + + + + + {% endif %} + {% else %} + + + + {% endif %} + {% endif %} + + {% if part.bom_count > 0 %} + {% if min_total_bom_price %} + + + + + + + {% if quantity > 1 %} + + + + + + + {% endif %} + {% if part.has_complete_bom_pricing == False %} + + + + {% endif %} + {% else %} + + + + {% endif %} + {% endif %} + + {% if show_internal_price and roles.sales_order.view %} + {% if total_internal_part_price %} + + + + + + + + + + + {% endif %} + {% endif %} + + {% if total_part_price %} + + + + + + + + + + + {% endif %} +
                {% trans 'Supplier Pricing' %} + + + {% trans 'Unit Cost' %}Min: {% include "price.html" with price=min_unit_buy_price %}Max: {% include "price.html" with price=max_unit_buy_price %}
                {% trans 'Total Cost' %}Min: {% include "price.html" with price=min_total_buy_price %}Max: {% include "price.html" with price=max_total_buy_price %}
                + {% trans 'No supplier pricing available' %} +
                {% trans 'BOM Pricing' %} + + {% trans 'Unit Cost' %}Min: {% include "price.html" with price=min_unit_bom_price %}Max: {% include "price.html" with price=max_unit_bom_price %}
                {% trans 'Total Cost' %}Min: {% include "price.html" with price=min_total_bom_price %}Max: {% include "price.html" with price=max_total_bom_price %}
                + {% trans 'Note: BOM pricing is incomplete for this part' %} +
                + {% trans 'No BOM pricing available' %} +
                {% trans 'Internal Price' %}{% trans 'Unit Cost' %}{% include "price.html" with price=unit_internal_part_price %}
                {% trans 'Total Cost' %}{% include "price.html" with price=total_internal_part_price %}
                {% trans 'Sale Price' %} + + + {% trans 'Unit Cost' %}{% include "price.html" with price=unit_part_price %}
                {% trans 'Total Cost' %}{% include "price.html" with price=total_part_price %}
                + + {% if min_unit_buy_price or min_unit_bom_price %} + {% else %} +
                + {% trans 'No pricing information is available for this part.' %} +
                + {% endif %} +
                + +
                +

                {% trans "Calculation parameters" %}

                +
                + {% csrf_token %} + {{ form|crispy }} + +
                +
                +
                +{% endblock %} + +{% block post_content_panel %} +{% default_currency as currency %} +{% settings_value "PART_INTERNAL_PRICE" as show_internal_price %} + + +{% if part.purchaseable and roles.purchase_order.view %} +
                + +
                +

                {% trans "Supplier Cost" %} + +

                +
                + +
                +
                +

                {% trans "Suppliers" %}

                +
                +
                +
                +

                {% trans "Manufacturers" %}

                +
                +
                +
                +
                + +
                + +
                +

                {% trans "Purchase Price" %} + +

                +
                + + {% if price_history %} +

                {% trans 'Stock Pricing' %}

                + {% if price_history|length > 0 %} +
                + +
                + {% else %} +
                + {% trans 'No stock pricing history is available for this part.' %} +
                + {% endif %} + {% endif %} +
                +{% endif %} + + +{% if show_internal_price and roles.sales_order.view %} +
                + +
                +

                {% trans "Internal Cost" %} + +

                +
                + +
                +
                +
                + +
                +
                +
                +
                + +
                + + +
                +
                +
                +
                +{% endif %} + + +{% if part.has_bom and roles.sales_order.view %} +
                + +
                +

                {% trans "BOM Cost" %} + +

                +
                + +
                +
                +
                +
                + + {% if part.bom_count > 0 %} +
                +

                {% trans 'BOM Pricing' %}

                +
                + +
                +
                + {% endif %} +
                +
                +{% endif %} + + +{% if part.salable and roles.sales_order.view %} +
                + +
                +

                {% trans "Sale Cost" %} + +

                +
                + +
                +
                +
                + +
                +
                +
                +
                + +
                + + +
                +
                +
                +
                + +
                + +
                +

                {% trans "Sale Price" %} + +

                +
                + +
                + {% if sale_history|length > 0 %} +
                + +
                + {% else %} +
                + {% trans 'No sale pice history available for this part.' %} +
                + {% endif %} +
                +
                +{% endif %} + +{% endblock %} + + + +{% block js_ready %} + {{ block.super }} + + {% default_currency as currency %} + + + loadSupplierPartTable( + "#supplier-table", + "{% url 'api-supplier-part-list' %}", + { + params: { + part: {{ part.id }}, + part_detail: false, + supplier_detail: true, + manufacturer_detail: true, + }, + } + ); + + loadManufacturerPartTable( + "#manufacturer-table", + "{% url 'api-manufacturer-part-list' %}", + { + params: { + part: {{ part.id }}, + part_detail: false, + manufacturer_detail: true, + }, + } + ); + + + // history graphs + {% if price_history %} + var purchasepricedata = { + labels: [ + {% for line in price_history %}'{{ line.date }}',{% endfor %} + ], + datasets: [{ + label: '{% blocktrans %}Single Price - {{currency}}{% endblocktrans %}', + backgroundColor: 'rgba(255, 99, 132, 0.2)', + borderColor: 'rgb(255, 99, 132)', + yAxisID: 'y', + data: [ + {% for line in price_history %}{{ line.price|stringformat:".2f" }},{% endfor %} + ], + borderWidth: 1, + type: 'line' + }, + {% if 'price_diff' in price_history.0 %} + { + label: '{% blocktrans %}Single Price Difference - {{currency}}{% endblocktrans %}', + backgroundColor: 'rgba(68, 157, 68, 0.2)', + borderColor: 'rgb(68, 157, 68)', + yAxisID: 'y2', + data: [ + {% for line in price_history %}{{ line.price_diff|stringformat:".2f" }},{% endfor %} + ], + borderWidth: 1, + type: 'line', + hidden: true, + }, + { + label: '{% blocktrans %}Part Single Price - {{currency}}{% endblocktrans %}', + backgroundColor: 'rgba(70, 127, 155, 0.2)', + borderColor: 'rgb(70, 127, 155)', + yAxisID: 'y', + data: [ + {% for line in price_history %}{{ line.price_part|stringformat:".2f" }},{% endfor %} + ], + borderWidth: 1, + type: 'line', + hidden: true, + }, + {% endif %} + { + label: '{% trans "Quantity" %}', + backgroundColor: 'rgba(255, 206, 86, 0.2)', + borderColor: 'rgb(255, 206, 86)', + yAxisID: 'y1', + data: [ + {% for line in price_history %}{{ line.qty|stringformat:"f" }},{% endfor %} + ], + borderWidth: 1 + }] + } + var StockPriceChart = loadStockPricingChart($('#StockPriceChart'), purchasepricedata) + {% endif %} + + {% if bom_parts %} + var bom_colors = randomColor({hue: 'green', count: {{ bom_parts|length }} }) + var bomdata = { + labels: [{% for line in bom_parts %}'{{ line.name }}',{% endfor %}], + datasets: [ + { + label: 'Price', + data: [{% for line in bom_parts %}{{ line.min_price }},{% endfor %}], + backgroundColor: bom_colors, + }, + {% if bom_pie_max %} + { + label: 'Max Price', + data: [{% for line in bom_parts %}{{ line.max_price }},{% endfor %}], + backgroundColor: bom_colors, + }, + {% endif %} + ] + }; + var BomChart = loadBomChart(document.getElementById('BomChart'), bomdata) + {% endif %} + + + // Internal pricebreaks + {% settings_value "PART_INTERNAL_PRICE" as show_internal_price %} + {% if show_internal_price and roles.sales_order.view %} + initPriceBreakSet( + $('#internal-price-break-table'), + { + part_id: {{part.id}}, + pb_human_name: 'internal price break', + pb_url_slug: 'internal-price', + pb_url: '{% url 'api-part-internal-price-list' %}', + pb_new_btn: $('#new-internal-price-break'), + pb_new_url: '{% url 'internal-price-break-create' %}', + linkedGraph: $('#InternalPriceBreakChart'), + }, + ); + {% endif %} + + + // Load the BOM table data + loadBomTable($("#bom-table"), { + editable: {{ editing_enabled }}, + bom_url: "{% url 'api-bom-list' %}", + part_url: "{% url 'api-part-list' %}", + parent_id: {{ part.id }} , + sub_part_detail: true, + }); + + + // Sales pricebreaks + {% if part.salable and roles.sales_order.view %} + initPriceBreakSet( + $('#price-break-table'), + { + part_id: {{part.id}}, + pb_human_name: 'sale price break', + pb_url_slug: 'sale-price', + pb_url: "{% url 'api-part-sale-price-list' %}", + pb_new_btn: $('#new-price-break'), + pb_new_url: '{% url 'sale-price-break-create' %}', + linkedGraph: $('#SalePriceBreakChart'), + }, + ); + {% endif %} + + // Sale price history + {% if sale_history %} + var salepricedata = { + labels: [ + {% for line in sale_history %}'{{ line.date }}',{% endfor %} + ], + datasets: [{ + label: '{% blocktrans %}Unit Price - {{currency}}{% endblocktrans %}', + backgroundColor: 'rgba(255, 99, 132, 0.2)', + borderColor: 'rgb(255, 99, 132)', + yAxisID: 'y', + data: [ + {% for line in sale_history %}{{ line.price|stringformat:".2f" }},{% endfor %} + ], + borderWidth: 1, + }, + { + label: '{% trans "Quantity" %}', + backgroundColor: 'rgba(255, 206, 86, 0.2)', + borderColor: 'rgb(255, 206, 86)', + yAxisID: 'y1', + data: [ + {% for line in sale_history %}{{ line.qty|stringformat:"f" }},{% endfor %} + ], + borderWidth: 1, + type: 'bar', + }] + } + var SalePriceChart = loadSellPricingChart($('#SalePriceChart'), salepricedata) + {% endif %} + +{% endblock %} diff --git a/InvenTree/part/templates/part/sale_prices.html b/InvenTree/part/templates/part/sale_prices.html deleted file mode 100644 index 4ec826e2a6..0000000000 --- a/InvenTree/part/templates/part/sale_prices.html +++ /dev/null @@ -1,108 +0,0 @@ -{% extends "part/part_base.html" %} -{% load static %} -{% load i18n %} - -{% block menubar %} -{% include 'part/navbar.html' with tab='sales-prices' %} -{% endblock %} - -{% block heading %} -{% trans "Sell Price Information" %} -{% endblock %} - -{% block details %} - -
                - -
                - - -
                - -{% endblock %} - -{% block js_ready %} -{{ block.super }} - -function reloadPriceBreaks() { - $("#price-break-table").bootstrapTable("refresh"); -} - -$('#new-price-break').click(function() { - launchModalForm("{% url 'sale-price-break-create' %}", - { - success: reloadPriceBreaks, - data: { - part: {{ part.id }}, - } - } - ); -}); - -$('#price-break-table').inventreeTable({ - name: 'saleprice', - formatNoMatches: function() { return "{% trans 'No price break information found' %}"; }, - queryParams: { - part: {{ part.id }}, - }, - url: "{% url 'api-part-sale-price-list' %}", - onPostBody: function() { - var table = $('#price-break-table'); - - table.find('.button-price-break-delete').click(function() { - var pk = $(this).attr('pk'); - - launchModalForm( - `/part/sale-price/${pk}/delete/`, - { - success: reloadPriceBreaks - } - ); - }); - - table.find('.button-price-break-edit').click(function() { - var pk = $(this).attr('pk'); - - launchModalForm( - `/part/sale-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-price-break-edit', row.pk, '{% trans "Edit price break" %}'); - html += makeIconButton('fa-trash-alt icon-red', 'button-price-break-delete', row.pk, '{% trans "Delete price break" %}'); - - html += `
                `; - - return html; - } - }, - ] -}) - -{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/stock.html b/InvenTree/part/templates/part/stock.html index 067eda66a8..ea745708dd 100644 --- a/InvenTree/part/templates/part/stock.html +++ b/InvenTree/part/templates/part/stock.html @@ -40,7 +40,8 @@ params: { part: {{ part.id }}, location_detail: true, - part_detail: false, + part_detail: true, + supplier_part_detail: true, }, groupByField: 'location', buttons: [ diff --git a/InvenTree/part/templates/part/supplier.html b/InvenTree/part/templates/part/supplier.html index 45d2d1d55c..c0486cc42a 100644 --- a/InvenTree/part/templates/part/supplier.html +++ b/InvenTree/part/templates/part/supplier.html @@ -49,13 +49,11 @@ field: 'supplier', label: '{% trans "New Supplier" %}', title: '{% trans "Create new supplier" %}', - url: "{% url 'supplier-create' %}" }, { field: 'manufacturer', label: '{% trans "New Manufacturer" %}', title: '{% trans "Create new manufacturer" %}', - url: "{% url 'manufacturer-create' %}", } ] }); diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index 4922ed4e04..0c1f083383 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -16,6 +16,106 @@ from company.models import Company from common.models import InvenTreeSetting +class PartOptionsAPITest(InvenTreeAPITestCase): + """ + Tests for the various OPTIONS endpoints in the /part/ API + + Ensure that the required field details are provided! + """ + + roles = [ + 'part.add', + ] + + def setUp(self): + + super().setUp() + + def test_part(self): + """ + Test the Part API OPTIONS + """ + + actions = self.getActions(reverse('api-part-list'))['POST'] + + # Check that a bunch o' fields are contained + for f in ['assembly', 'component', 'description', 'image', 'IPN']: + self.assertTrue(f in actions.keys()) + + # Active is a 'boolean' field + active = actions['active'] + + self.assertTrue(active['default']) + self.assertEqual(active['help_text'], 'Is this part active?') + self.assertEqual(active['type'], 'boolean') + self.assertEqual(active['read_only'], False) + + # String field + ipn = actions['IPN'] + self.assertEqual(ipn['type'], 'string') + self.assertFalse(ipn['required']) + self.assertEqual(ipn['max_length'], 100) + self.assertEqual(ipn['help_text'], 'Internal Part Number') + + # Related field + category = actions['category'] + + self.assertEqual(category['type'], 'related field') + self.assertTrue(category['required']) + self.assertFalse(category['read_only']) + self.assertEqual(category['label'], 'Category') + self.assertEqual(category['model'], 'partcategory') + self.assertEqual(category['api_url'], reverse('api-part-category-list')) + self.assertEqual(category['help_text'], 'Part category') + + def test_category(self): + """ + Test the PartCategory API OPTIONS endpoint + """ + + actions = self.getActions(reverse('api-part-category-list')) + + # actions should *not* contain 'POST' as we do not have the correct role + self.assertFalse('POST' in actions) + + self.assignRole('part_category.add') + + actions = self.getActions(reverse('api-part-category-list'))['POST'] + + name = actions['name'] + + self.assertTrue(name['required']) + self.assertEqual(name['label'], 'Name') + + loc = actions['default_location'] + self.assertEqual(loc['api_url'], reverse('api-location-list')) + + def test_bom_item(self): + """ + Test the BomItem API OPTIONS endpoint + """ + + actions = self.getActions(reverse('api-bom-list'))['POST'] + + inherited = actions['inherited'] + + self.assertEqual(inherited['type'], 'boolean') + + # 'part' reference + part = actions['part'] + + self.assertTrue(part['required']) + self.assertFalse(part['read_only']) + self.assertTrue(part['filters']['assembly']) + + # 'sub_part' reference + sub_part = actions['sub_part'] + + self.assertTrue(sub_part['required']) + self.assertEqual(sub_part['type'], 'related field') + self.assertTrue(sub_part['filters']['component']) + + class PartAPITest(InvenTreeAPITestCase): """ Series of tests for the Part DRF API diff --git a/InvenTree/part/test_views.py b/InvenTree/part/test_views.py index c32753cbbb..3b6b245231 100644 --- a/InvenTree/part/test_views.py +++ b/InvenTree/part/test_views.py @@ -232,29 +232,6 @@ class PartRelatedTests(PartViewTestCase): self.assertEqual(n, 1) -class PartAttachmentTests(PartViewTestCase): - - def test_valid_create(self): - """ test creation of an attachment for a valid part """ - - response = self.client.get(reverse('part-attachment-create'), {'part': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - - # TODO - Create a new attachment using this view - - def test_invalid_create(self): - """ test creation of an attachment for an invalid part """ - - # TODO - pass - - def test_edit(self): - """ test editing an attachment """ - - # TODO - pass - - class PartQRTest(PartViewTestCase): """ Tests for the Part QR Code AJAX view """ @@ -294,11 +271,6 @@ class CategoryTest(PartViewTestCase): # Form should still return OK self.assertEqual(response.status_code, 200) - def test_edit(self): - """ Retrieve the part category editing form """ - response = self.client.get(reverse('category-edit', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') - self.assertEqual(response.status_code, 200) - def test_set_category(self): """ Test that the "SetCategory" view works """ diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index c35786e5d3..96560a7ad7 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -17,12 +17,6 @@ part_related_urls = [ url(r'^(?P\d+)/delete/?', views.PartRelatedDelete.as_view(), name='part-related-delete'), ] -part_attachment_urls = [ - url(r'^new/?', views.PartAttachmentCreate.as_view(), name='part-attachment-create'), - url(r'^(?P\d+)/edit/?', views.PartAttachmentEdit.as_view(), name='part-attachment-edit'), - url(r'^(?P\d+)/delete/?', views.PartAttachmentDelete.as_view(), name='part-attachment-delete'), -] - sale_price_break_urls = [ url(r'^new/', views.PartSalePriceBreakCreate.as_view(), name='sale-price-break-create'), url(r'^(?P\d+)/edit/', views.PartSalePriceBreakEdit.as_view(), name='sale-price-break-edit'), @@ -65,13 +59,11 @@ part_detail_urls = [ url(r'^bom/?', views.PartDetail.as_view(template_name='part/bom.html'), name='part-bom'), url(r'^build/?', views.PartDetail.as_view(template_name='part/build.html'), name='part-build'), url(r'^used/?', views.PartDetail.as_view(template_name='part/used_in.html'), name='part-used-in'), - url(r'^order-prices/', views.PartPricingView.as_view(template_name='part/order_prices.html'), name='part-order-prices'), + url(r'^prices/', views.PartPricingView.as_view(template_name='part/prices.html'), name='part-prices'), url(r'^manufacturers/?', views.PartDetail.as_view(template_name='part/manufacturer.html'), name='part-manufacturers'), url(r'^suppliers/?', views.PartDetail.as_view(template_name='part/supplier.html'), name='part-suppliers'), url(r'^orders/?', views.PartDetail.as_view(template_name='part/orders.html'), name='part-orders'), url(r'^sales-orders/', views.PartDetail.as_view(template_name='part/sales_orders.html'), name='part-sales-orders'), - url(r'^sale-prices/', views.PartDetail.as_view(template_name='part/sale_prices.html'), name='part-sale-prices'), - url(r'^internal-prices/', views.PartDetail.as_view(template_name='part/internal_prices.html'), name='part-internal-prices'), url(r'^tests/', views.PartDetail.as_view(template_name='part/part_tests.html'), name='part-test-templates'), url(r'^track/?', views.PartDetail.as_view(template_name='part/track.html'), name='part-track'), url(r'^related-parts/?', views.PartDetail.as_view(template_name='part/related.html'), name='part-related'), @@ -81,7 +73,6 @@ part_detail_urls = [ url(r'^qr_code/?', views.PartQRCode.as_view(), name='part-qr'), # Normal thumbnail with form - url(r'^thumbnail/?', views.PartImageUpload.as_view(), name='part-image-upload'), url(r'^thumb-select/?', views.PartImageSelect.as_view(), name='part-image-select'), url(r'^thumb-download/', views.PartImageDownloadFromURL.as_view(), name='part-image-download'), @@ -105,7 +96,6 @@ category_urls = [ # Category detail views url(r'(?P\d+)/', include([ - url(r'^edit/', views.CategoryEdit.as_view(), name='category-edit'), url(r'^delete/', views.CategoryDelete.as_view(), name='category-delete'), url(r'^parameters/', include(category_parameter_urls)), @@ -119,7 +109,6 @@ category_urls = [ part_bom_urls = [ url(r'^edit/?', views.BomItemEdit.as_view(), name='bom-item-edit'), - url('^delete/?', views.BomItemDelete.as_view(), name='bom-item-delete'), ] # URL list for part web interface @@ -150,22 +139,12 @@ part_urls = [ # Part related url(r'^related-parts/', include(part_related_urls)), - # Part attachments - url(r'^attachment/', include(part_attachment_urls)), - # Part price breaks url(r'^sale-price/', include(sale_price_break_urls)), # Part internal price breaks url(r'^internal-price/', include(internal_price_break_urls)), - # Part test templates - url(r'^test-template/', include([ - url(r'^new/', views.PartTestTemplateCreate.as_view(), name='part-test-template-create'), - url(r'^(?P\d+)/edit/', views.PartTestTemplateEdit.as_view(), name='part-test-template-edit'), - url(r'^(?P\d+)/delete/', views.PartTestTemplateDelete.as_view(), name='part-test-template-delete'), - ])), - # Part parameters url(r'^parameter/', include(part_parameter_urls)), diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index 294f89223e..d9f79262d1 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -31,12 +31,11 @@ import io from rapidfuzz import fuzz from decimal import Decimal, InvalidOperation -from .models import PartCategory, Part, PartAttachment, PartRelated +from .models import PartCategory, Part, PartRelated from .models import PartParameterTemplate, PartParameter from .models import PartCategoryParameterTemplate from .models import BomItem from .models import match_part_names -from .models import PartTestTemplate from .models import PartSellPriceBreak, PartInternalPriceBreak from common.models import InvenTreeSetting @@ -50,6 +49,7 @@ import common.settings as inventree_settings from . import forms as part_forms from .bom import MakeBomTemplate, BomUploadManager, ExportBom, IsValidBOMFormat +from order.models import PurchaseOrderLineItem from .admin import PartResource @@ -154,146 +154,6 @@ class PartRelatedDelete(AjaxDeleteView): role_required = 'part.change' -class PartAttachmentCreate(AjaxCreateView): - """ View for creating a new PartAttachment object - - - The view only makes sense if a Part object is passed to it - """ - model = PartAttachment - form_class = part_forms.EditPartAttachmentForm - ajax_form_title = _("Add part attachment") - ajax_template_name = "modal_form.html" - - def save(self, form, **kwargs): - """ - Record the user that uploaded this attachment - """ - - attachment = form.save(commit=False) - attachment.user = self.request.user - attachment.save() - - def get_data(self): - return { - 'success': _('Added attachment') - } - - def get_initial(self): - """ Get initial data for new PartAttachment object. - - - Client should have requested this form with a parent part in mind - - e.g. ?part= - """ - - initials = super(AjaxCreateView, self).get_initial() - - # TODO - If the proper part was not sent, return an error message - try: - initials['part'] = Part.objects.get(id=self.request.GET.get('part', None)) - except (ValueError, Part.DoesNotExist): - pass - - return initials - - def get_form(self): - """ Create a form to upload a new PartAttachment - - - Hide the 'part' field - """ - - form = super(AjaxCreateView, self).get_form() - - form.fields['part'].widget = HiddenInput() - - return form - - -class PartAttachmentEdit(AjaxUpdateView): - """ View for editing a PartAttachment object """ - - model = PartAttachment - form_class = part_forms.EditPartAttachmentForm - ajax_template_name = 'modal_form.html' - ajax_form_title = _('Edit attachment') - - def get_data(self): - return { - 'success': _('Part attachment updated') - } - - def get_form(self): - form = super(AjaxUpdateView, self).get_form() - - form.fields['part'].widget = HiddenInput() - - return form - - -class PartAttachmentDelete(AjaxDeleteView): - """ View for deleting a PartAttachment """ - - model = PartAttachment - ajax_form_title = _("Delete Part Attachment") - ajax_template_name = "attachment_delete.html" - context_object_name = "attachment" - - role_required = 'part.change' - - def get_data(self): - return { - 'danger': _('Deleted part attachment') - } - - -class PartTestTemplateCreate(AjaxCreateView): - """ View for creating a PartTestTemplate """ - - model = PartTestTemplate - form_class = part_forms.EditPartTestTemplateForm - ajax_form_title = _("Create Test Template") - - def get_initial(self): - - initials = super().get_initial() - - try: - part_id = self.request.GET.get('part', None) - initials['part'] = Part.objects.get(pk=part_id) - except (ValueError, Part.DoesNotExist): - pass - - return initials - - def get_form(self): - - form = super().get_form() - form.fields['part'].widget = HiddenInput() - - return form - - -class PartTestTemplateEdit(AjaxUpdateView): - """ View for editing a PartTestTemplate """ - - model = PartTestTemplate - form_class = part_forms.EditPartTestTemplateForm - ajax_form_title = _("Edit Test Template") - - def get_form(self): - - form = super().get_form() - form.fields['part'].widget = HiddenInput() - - return form - - -class PartTestTemplateDelete(AjaxDeleteView): - """ View for deleting a PartTestTemplate """ - - model = PartTestTemplate - ajax_form_title = _("Delete Test Template") - - class PartSetCategory(AjaxUpdateView): """ View for settings the part category for multiple parts at once """ @@ -979,18 +839,20 @@ class PartPricingView(PartDetail): """ returns context with pricing information """ ctx = PartPricing.get_pricing(self, quantity, currency) part = self.get_part() + default_currency = inventree_settings.currency_code_default() + # Stock history if part.total_stock > 1: price_history = [] - stock = part.stock_entries(include_variants=False, in_stock=True) # .order_by('purchase_order__date') - stock = stock.prefetch_related('purchase_order', 'supplier_part') + stock = part.stock_entries(include_variants=False, in_stock=True).\ + order_by('purchase_order__issue_date').prefetch_related('purchase_order', 'supplier_part') for stock_item in stock: if None in [stock_item.purchase_price, stock_item.quantity]: continue # convert purchase price to current currency - only one currency in the graph - price = convert_money(stock_item.purchase_price, inventree_settings.currency_code_default()) + price = convert_money(stock_item.purchase_price, default_currency) line = { 'price': price.amount, 'qty': stock_item.quantity @@ -1036,6 +898,36 @@ class PartPricingView(PartDetail): # add to global context ctx['bom_parts'] = ctx_bom_parts + # Sale price history + sale_items = PurchaseOrderLineItem.objects.filter(part__part=part).order_by('order__issue_date').\ + prefetch_related('order', ).all() + + if sale_items: + sale_history = [] + + for sale_item in sale_items: + # check for not fully defined elements + if None in [sale_item.purchase_price, sale_item.quantity]: + continue + + price = convert_money(sale_item.purchase_price, default_currency) + line = { + 'price': price.amount if price else 0, + 'qty': sale_item.quantity, + } + + # set date for graph labels + if sale_item.order.issue_date: + line['date'] = sale_item.order.issue_date.strftime('%d.%m.%Y') + elif sale_item.order.creation_date: + line['date'] = sale_item.order.creation_date.strftime('%d.%m.%Y') + else: + line['date'] = _('None') + + sale_history.append(line) + + ctx['sale_history'] = sale_history + return ctx def get_initials(self): @@ -1186,21 +1078,6 @@ class PartImageDownloadFromURL(AjaxUpdateView): ) -class PartImageUpload(AjaxUpdateView): - """ View for uploading a new Part image """ - - model = Part - ajax_template_name = 'modal_form.html' - ajax_form_title = _('Upload Part Image') - - form_class = part_forms.PartImageForm - - def get_data(self): - return { - 'success': _('Updated part image'), - } - - class PartImageSelect(AjaxUpdateView): """ View for selecting Part image from existing images. """ @@ -2901,17 +2778,10 @@ class BomItemEdit(AjaxUpdateView): return form -class BomItemDelete(AjaxDeleteView): - """ Delete view for removing BomItem """ - - model = BomItem - ajax_template_name = 'part/bom-delete.html' - context_object_name = 'item' - ajax_form_title = _('Confim BOM item deletion') - - class PartSalePriceBreakCreate(AjaxCreateView): - """ View for creating a sale price break for a part """ + """ + View for creating a sale price break for a part + """ model = PartSellPriceBreak form_class = part_forms.EditPartSalePriceBreakForm diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py index ecb4d91492..c33347f643 100644 --- a/InvenTree/report/models.py +++ b/InvenTree/report/models.py @@ -11,6 +11,7 @@ import logging import datetime +from django.urls import reverse from django.db import models from django.conf import settings from django.core.exceptions import ValidationError, FieldError @@ -307,6 +308,10 @@ class TestReport(ReportTemplateBase): Render a TestReport against a StockItem object. """ + @staticmethod + def get_api_url(): + return reverse('api-stockitem-testreport-list') + @classmethod def getSubdir(cls): return 'test' @@ -361,6 +366,10 @@ class BuildReport(ReportTemplateBase): Build order / work order report """ + @staticmethod + def get_api_url(): + return reverse('api-build-report-list') + @classmethod def getSubdir(cls): return 'build' @@ -400,6 +409,10 @@ class BillOfMaterialsReport(ReportTemplateBase): Render a Bill of Materials against a Part object """ + @staticmethod + def get_api_url(): + return reverse('api-bom-report-list') + @classmethod def getSubdir(cls): return 'bom' @@ -430,6 +443,10 @@ class PurchaseOrderReport(ReportTemplateBase): Render a report against a PurchaseOrder object """ + @staticmethod + def get_api_url(): + return reverse('api-po-report-list') + @classmethod def getSubdir(cls): return 'purchaseorder' @@ -464,6 +481,10 @@ class SalesOrderReport(ReportTemplateBase): Render a report against a SalesOrder object """ + @staticmethod + def get_api_url(): + return reverse('api-so-report-list') + @classmethod def getSubdir(cls): return 'salesorder' diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 3fc440cae4..cf13811c8c 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -2,17 +2,21 @@ JSON API for the Stock app """ -from django_filters.rest_framework import FilterSet, DjangoFilterBackend -from django_filters import NumberFilter - -from rest_framework import status - from django.conf.urls import url, include from django.urls import reverse from django.http import JsonResponse from django.db.models import Q from django.utils.translation import ugettext_lazy as _ +from rest_framework import status +from rest_framework.serializers import ValidationError +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import generics, filters, permissions + +from django_filters.rest_framework import FilterSet, DjangoFilterBackend +from django_filters import NumberFilter + from .models import StockLocation, StockItem from .models import StockItemTracking from .models import StockItemAttachment @@ -44,11 +48,6 @@ from decimal import Decimal, InvalidOperation from datetime import datetime, timedelta -from rest_framework.serializers import ValidationError -from rest_framework.views import APIView -from rest_framework.response import Response -from rest_framework import generics, filters, permissions - class StockCategoryTree(TreeSerializer): title = _('Stock') @@ -858,6 +857,17 @@ class StockList(generics.ListCreateAPIView): print("After error:", str(updated_after)) pass + # Filter stock items which have a purchase price set + has_purchase_price = params.get('has_purchase_price', None) + + if has_purchase_price is not None: + has_purchase_price = str2bool(has_purchase_price) + + if has_purchase_price: + queryset = queryset.exclude(purchase_price=None) + else: + queryset = queryset.filter(purchase_price=None) + # Optionally, limit the maximum number of returned results max_results = params.get('max_results', None) @@ -931,6 +941,24 @@ class StockAttachmentList(generics.ListCreateAPIView, AttachmentMixin): ] +class StockAttachmentDetail(generics.RetrieveUpdateDestroyAPIView, AttachmentMixin): + """ + Detail endpoint for StockItemAttachment + """ + + queryset = StockItemAttachment.objects.all() + serializer_class = StockItemAttachmentSerializer + + +class StockItemTestResultDetail(generics.RetrieveUpdateDestroyAPIView): + """ + Detail endpoint for StockItemTestResult + """ + + queryset = StockItemTestResult.objects.all() + serializer_class = StockItemTestResultSerializer + + class StockItemTestResultList(generics.ListCreateAPIView): """ API endpoint for listing (and creating) a StockItemTestResult object. @@ -979,6 +1007,15 @@ class StockItemTestResultList(generics.ListCreateAPIView): test_result.save() +class StockTrackingDetail(generics.RetrieveAPIView): + """ + Detail API endpoint for StockItemTracking model + """ + + queryset = StockItemTracking.objects.all() + serializer_class = StockTrackingSerializer + + class StockTrackingList(generics.ListAPIView): """ API endpoint for list view of StockItemTracking objects. @@ -1133,6 +1170,7 @@ stock_api_urls = [ url(r'location/', include(location_endpoints)), # These JSON endpoints have been replaced (for now) with server-side form rendering - 02/06/2019 + # TODO: Remove server-side forms for stock adjustment!!! url(r'count/?', StockCount.as_view(), name='api-stock-count'), url(r'add/?', StockAdd.as_view(), name='api-stock-add'), url(r'remove/?', StockRemove.as_view(), name='api-stock-remove'), @@ -1140,15 +1178,20 @@ stock_api_urls = [ # Base URL for StockItemAttachment API endpoints url(r'^attachment/', include([ + url(r'^(?P\d+)/', StockAttachmentDetail.as_view(), name='api-stock-attachment-detail'), url(r'^$', StockAttachmentList.as_view(), name='api-stock-attachment-list'), ])), # Base URL for StockItemTestResult API endpoints url(r'^test/', include([ - url(r'^$', StockItemTestResultList.as_view(), name='api-stock-test-result-list'), + url(r'^(?P\d+)/', StockItemTestResultDetail.as_view(), name='api-stock-test-result-detail'), + url(r'^.*$', StockItemTestResultList.as_view(), name='api-stock-test-result-list'), ])), - url(r'track/?', StockTrackingList.as_view(), name='api-stock-track'), + url(r'^track/', include([ + url(r'^(?P\d+)/', StockTrackingDetail.as_view(), name='api-stock-tracking-detail'), + url(r'^.*$', StockTrackingList.as_view(), name='api-stock-tracking-list'), + ])), url(r'^tree/?', StockCategoryTree.as_view(), name='api-stock-tree'), diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py index 92089623f9..ec3eee09d5 100644 --- a/InvenTree/stock/forms.py +++ b/InvenTree/stock/forms.py @@ -23,22 +23,6 @@ from report.models import TestReport from part.models import Part from .models import StockLocation, StockItem, StockItemTracking -from .models import StockItemAttachment -from .models import StockItemTestResult - - -class EditStockItemAttachmentForm(HelperForm): - """ - Form for creating / editing a StockItemAttachment object - """ - - class Meta: - model = StockItemAttachment - fields = [ - 'stock_item', - 'attachment', - 'comment' - ] class AssignStockItemToCustomerForm(HelperForm): @@ -65,23 +49,6 @@ class ReturnStockItemForm(HelperForm): ] -class EditStockItemTestResultForm(HelperForm): - """ - Form for creating / editing a StockItemTestResult object. - """ - - class Meta: - model = StockItemTestResult - fields = [ - 'stock_item', - 'test', - 'result', - 'value', - 'attachment', - 'notes', - ] - - class EditStockLocationForm(HelperForm): """ Form for editing a StockLocation """ diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 446dce5c75..ee10bd3ed7 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -48,6 +48,10 @@ class StockLocation(InvenTreeTree): Stock locations can be heirarchical as required """ + @staticmethod + def get_api_url(): + return reverse('api-location-list') + owner = models.ForeignKey(Owner, on_delete=models.SET_NULL, blank=True, null=True, verbose_name=_('Owner'), help_text=_('Select Owner'), @@ -157,6 +161,10 @@ class StockItem(MPTTModel): packaging: Description of how the StockItem is packaged (e.g. "reel", "loose", "tape" etc) """ + @staticmethod + def get_api_url(): + return reverse('api-stock-list') + # A Query filter which will be re-used in multiple places to determine if a StockItem is actually "in stock" IN_STOCK_FILTER = Q( quantity__gt=0, @@ -1203,7 +1211,7 @@ class StockItem(MPTTModel): # We need to split the stock! # Split the existing StockItem in two - self.splitStock(quantity, location, user) + self.splitStock(quantity, location, user, **{'notes': notes}) return True @@ -1603,6 +1611,10 @@ class StockItemAttachment(InvenTreeAttachment): Model for storing file attachments against a StockItem object. """ + @staticmethod + def get_api_url(): + return reverse('api-stock-attachment-list') + def getSubdir(self): return os.path.join("stock_files", str(self.stock_item.id)) @@ -1634,6 +1646,10 @@ class StockItemTracking(models.Model): deltas: The changes associated with this history item """ + @staticmethod + def get_api_url(): + return reverse('api-stock-tracking-list') + def get_absolute_url(self): return '/stock/track/{pk}'.format(pk=self.id) @@ -1692,6 +1708,10 @@ class StockItemTestResult(models.Model): date: Date the test result was recorded """ + @staticmethod + def get_api_url(): + return reverse('api-stock-test-result-list') + def save(self, *args, **kwargs): super().clean() diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index a0b7e3403a..38301bdd1f 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -288,6 +288,8 @@ class StockItemAttachmentSerializer(InvenTreeModelSerializer): attachment = InvenTreeAttachmentSerializerField(required=True) + # TODO: Record the uploading user when creating or updating an attachment! + class Meta: model = StockItemAttachment diff --git a/InvenTree/stock/templates/stock/item.html b/InvenTree/stock/templates/stock/item.html index 5d551c29fb..7564e7864e 100644 --- a/InvenTree/stock/templates/stock/item.html +++ b/InvenTree/stock/templates/stock/item.html @@ -57,7 +57,7 @@ item: {{ item.pk }}, user_detail: true, }, - url: "{% url 'api-stock-track' %}", + url: "{% url 'api-stock-tracking-list' %}", }); {% endblock %} \ No newline at end of file diff --git a/InvenTree/stock/templates/stock/item_attachments.html b/InvenTree/stock/templates/stock/item_attachments.html index a022403d02..5f9cfdee19 100644 --- a/InvenTree/stock/templates/stock/item_attachments.html +++ b/InvenTree/stock/templates/stock/item_attachments.html @@ -21,49 +21,66 @@ enableDragAndDrop( '#attachment-dropzone', - "{% url 'stock-item-attachment-create' %}", + "{% url 'api-stock-attachment-list' %}", { data: { stock_item: {{ item.id }}, }, label: 'attachment', success: function(data, status, xhr) { - location.reload(); + reloadAttachmentTable(); } } ); -$("#new-attachment").click(function() { - launchModalForm("{% url 'stock-item-attachment-create' %}?item={{ item.id }}", - { - reload: true, - }); -}); +loadAttachmentTable( + '{% url "api-stock-attachment-list" %}', + { + filters: { + stock_item: {{ item.pk }}, + }, + onEdit: function(pk) { + var url = `/api/stock/attachment/${pk}/`; -$("#attachment-table").on('click', '.attachment-edit-button', function() { - var button = $(this); + constructForm(url, { + fields: { + comment: {}, + }, + title: '{% trans "Edit Attachment" %}', + onSuccess: reloadAttachmentTable + }); + }, + onDelete: function(pk) { + var url = `/api/stock/attachment/${pk}/`; - var url = `/stock/item/attachment/${button.attr('pk')}/edit/`; - - launchModalForm(url, - { - reload: true, - }); -}); - -$("#attachment-table").on('click', '.attachment-delete-button', function() { - var button = $(this); - - var url = `/stock/item/attachment/${button.attr('pk')}/delete/`; - - launchModalForm(url, { - success: function() { - location.reload(); + constructForm(url, { + method: 'DELETE', + confirmMessage: '{% trans "Confirm Delete Operation" %}', + title: '{% trans "Delete Attachment" %}', + onSuccess: reloadAttachmentTable, + }); } - }); -}); + } +); -$("#attachment-table").inventreeTable({ +$("#new-attachment").click(function() { + + constructForm( + '{% url "api-stock-attachment-list" %}', + { + method: 'POST', + fields: { + attachment: {}, + comment: {}, + stock_item: { + value: {{ item.pk }}, + hidden: true, + }, + }, + reload: true, + title: '{% trans "Add Attachment" %}', + } + ); }); {% endblock %} \ No newline at end of file diff --git a/InvenTree/stock/templates/stock/item_base.html b/InvenTree/stock/templates/stock/item_base.html index bf9d10590f..2eb7695498 100644 --- a/InvenTree/stock/templates/stock/item_base.html +++ b/InvenTree/stock/templates/stock/item_base.html @@ -247,7 +247,19 @@ {% trans "Serial Number" %} - {{ item.serial }} + + {% if previous %} + + {{ previous.serial }} ‹ + + {% endif %} + {{ item.serial }} + {% if next %} + + › {{ next.serial }} + + {% endif %} + {% else %} @@ -490,13 +502,14 @@ $("#stock-edit").click(function () { }); $('#stock-edit-status').click(function () { - launchModalForm( - "{% url 'stock-item-edit-status' item.id %}", - { - reload: true, - submit_text: '{% trans "Save" %}', - } - ); + + constructForm('{% url "api-stock-detail" item.pk %}', { + fields: { + status: {}, + }, + reload: true, + title: '{% trans "Edit Stock Status" %}', + }); }); {% endif %} diff --git a/InvenTree/stock/templates/stock/item_tests.html b/InvenTree/stock/templates/stock/item_tests.html index 4b3d9dd028..d7d26fcbba 100644 --- a/InvenTree/stock/templates/stock/item_tests.html +++ b/InvenTree/stock/templates/stock/item_tests.html @@ -48,8 +48,7 @@ loadStockTestResultsTable( ); function reloadTable() { - location.reload(); - //$("#test-result-table").bootstrapTable("refresh"); + $("#test-result-table").bootstrapTable("refresh"); } {% if item.has_test_reports %} @@ -70,15 +69,23 @@ $("#delete-test-results").click(function() { {% endif %} $("#add-test-result").click(function() { - launchModalForm( - "{% url 'stock-item-test-create' %}", { - data: { - stock_item: {{ item.id }}, - }, - success: reloadTable, - focus: 'test', - } - ); + + constructForm('{% url "api-stock-test-result-list" %}', { + method: 'POST', + fields: { + test: {}, + result: {}, + value: {}, + attachment: {}, + notes: {}, + stock_item: { + value: {{ item.pk }}, + hidden: true, + } + }, + title: '{% trans "Add Test Result" %}', + onSuccess: reloadTable, + }); }); $("#test-result-table").on('click', '.button-test-add', function() { @@ -86,35 +93,57 @@ $("#test-result-table").on('click', '.button-test-add', function() { var test_name = button.attr('pk'); - launchModalForm( - "{% url 'stock-item-test-create' %}", { - data: { - stock_item: {{ item.id }}, - test: test_name + constructForm('{% url "api-stock-test-result-list" %}', { + method: 'POST', + fields: { + test: { + value: test_name, }, - success: reloadTable, - focus: 'value', - } - ); + result: {}, + value: {}, + attachment: {}, + notes: {}, + stock_item: { + value: {{ item.pk }}, + hidden: true, + } + }, + title: '{% trans "Add Test Result" %}', + onSuccess: reloadTable, + }); }); $("#test-result-table").on('click', '.button-test-edit', function() { var button = $(this); - var url = `/stock/item/test/${button.attr('pk')}/edit/`; + var pk = button.attr('pk'); - launchModalForm(url, { - success: reloadTable, + var url = `/api/stock/test/${pk}/`; + + constructForm(url, { + fields: { + test: {}, + result: {}, + value: {}, + attachment: {}, + notes: {}, + }, + title: '{% trans "Edit Test Result" %}', + onSuccess: reloadTable, }); }); $("#test-result-table").on('click', '.button-test-delete', function() { var button = $(this); - var url = `/stock/item/test/${button.attr('pk')}/delete/`; + var pk = button.attr('pk'); - launchModalForm(url, { - success: reloadTable, + var url = `/api/stock/test/${pk}/`; + + constructForm(url, { + method: 'DELETE', + title: '{% trans "Delete Test Result" %}', + onSuccess: reloadTable, }); }); diff --git a/InvenTree/stock/templates/stock/location.html b/InvenTree/stock/templates/stock/location.html index 499aaa6948..6a69be260e 100644 --- a/InvenTree/stock/templates/stock/location.html +++ b/InvenTree/stock/templates/stock/location.html @@ -265,6 +265,7 @@ {% endif %} part_detail: true, location_detail: true, + supplier_part_detail: true, }, url: "{% url 'api-stock-list' %}", }); diff --git a/InvenTree/stock/urls.py b/InvenTree/stock/urls.py index dbdbdda317..ac9474f805 100644 --- a/InvenTree/stock/urls.py +++ b/InvenTree/stock/urls.py @@ -24,7 +24,6 @@ location_urls = [ ] stock_item_detail_urls = [ - url(r'^edit_status/', views.StockItemEditStatus.as_view(), name='stock-item-edit-status'), url(r'^edit/', views.StockItemEdit.as_view(), name='stock-item-edit'), url(r'^convert/', views.StockItemConvert.as_view(), name='stock-item-convert'), url(r'^serialize/', views.StockItemSerialize.as_view(), name='stock-item-serialize'), @@ -63,20 +62,6 @@ stock_urls = [ url(r'^item/uninstall/', views.StockItemUninstall.as_view(), name='stock-item-uninstall'), - # URLs for StockItem attachments - url(r'^item/attachment/', include([ - url(r'^new/', views.StockItemAttachmentCreate.as_view(), name='stock-item-attachment-create'), - url(r'^(?P\d+)/edit/', views.StockItemAttachmentEdit.as_view(), name='stock-item-attachment-edit'), - url(r'^(?P\d+)/delete/', views.StockItemAttachmentDelete.as_view(), name='stock-item-attachment-delete'), - ])), - - # URLs for StockItem tests - url(r'^item/test/', include([ - url(r'^new/', views.StockItemTestResultCreate.as_view(), name='stock-item-test-create'), - url(r'^(?P\d+)/edit/', views.StockItemTestResultEdit.as_view(), name='stock-item-test-edit'), - url(r'^(?P\d+)/delete/', views.StockItemTestResultDelete.as_view(), name='stock-item-test-delete'), - ])), - url(r'^track/', include(stock_tracking_urls)), url(r'^adjust/?', views.StockAdjust.as_view(), name='stock-adjust'), diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 9a47576442..c74b0bb2fc 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -32,7 +32,7 @@ from datetime import datetime, timedelta from company.models import Company, SupplierPart from part.models import Part -from .models import StockItem, StockLocation, StockItemTracking, StockItemAttachment, StockItemTestResult +from .models import StockItem, StockLocation, StockItemTracking import common.settings from common.models import InvenTreeSetting @@ -86,6 +86,29 @@ class StockItemDetail(InvenTreeRoleMixin, DetailView): queryset = StockItem.objects.all() model = StockItem + def get_context_data(self, **kwargs): + """ add previous and next item """ + data = super().get_context_data(**kwargs) + + if self.object.serialized: + serial_elem = {a.serial: a for a in self.object.part.stock_items.all() if a.serialized} + serials = [int(a) for a in serial_elem.keys()] + current = int(self.object.serial) + + # previous + for nbr in range(current - 1, -1, -1): + if nbr in serials: + data['previous'] = serial_elem.get(str(nbr), None) + break + + # next + for nbr in range(current + 1, max(serials) + 1): + if nbr in serials: + data['next'] = serial_elem.get(str(nbr), None) + break + + return data + class StockItemNotes(InvenTreeRoleMixin, UpdateView): """ View for editing the 'notes' field of a StockItem object """ @@ -255,85 +278,6 @@ class StockLocationQRCode(QRCodeView): return None -class StockItemAttachmentCreate(AjaxCreateView): - """ - View for adding a new attachment for a StockItem - """ - - model = StockItemAttachment - form_class = StockForms.EditStockItemAttachmentForm - ajax_form_title = _("Add Stock Item Attachment") - ajax_template_name = "modal_form.html" - - def save(self, form, **kwargs): - """ Record the user that uploaded the attachment """ - - attachment = form.save(commit=False) - attachment.user = self.request.user - attachment.save() - - def get_data(self): - return { - 'success': _("Added attachment") - } - - def get_initial(self): - """ - Get initial data for the new StockItem attachment object. - - - Client must provide a valid StockItem ID - """ - - initials = super().get_initial() - - try: - initials['stock_item'] = StockItem.objects.get(id=self.request.GET.get('item', None)) - except (ValueError, StockItem.DoesNotExist): - pass - - return initials - - def get_form(self): - - form = super().get_form() - form.fields['stock_item'].widget = HiddenInput() - - return form - - -class StockItemAttachmentEdit(AjaxUpdateView): - """ - View for editing a StockItemAttachment object. - """ - - model = StockItemAttachment - form_class = StockForms.EditStockItemAttachmentForm - ajax_form_title = _("Edit Stock Item Attachment") - - def get_form(self): - - form = super().get_form() - form.fields['stock_item'].widget = HiddenInput() - - return form - - -class StockItemAttachmentDelete(AjaxDeleteView): - """ - View for deleting a StockItemAttachment object. - """ - - model = StockItemAttachment - ajax_form_title = _("Delete Stock Item Attachment") - ajax_template_name = "attachment_delete.html" - context_object_name = "attachment" - - def get_data(self): - return { - 'danger': _("Deleted attachment"), - } - - class StockItemAssignToCustomer(AjaxUpdateView): """ View for manually assigning a StockItem to a Customer @@ -434,74 +378,6 @@ class StockItemDeleteTestData(AjaxUpdateView): return self.renderJsonResponse(request, form, data) -class StockItemTestResultCreate(AjaxCreateView): - """ - View for adding a new StockItemTestResult - """ - - model = StockItemTestResult - form_class = StockForms.EditStockItemTestResultForm - ajax_form_title = _("Add Test Result") - - def save(self, form, **kwargs): - """ - Record the user that uploaded the test result - """ - - result = form.save(commit=False) - result.user = self.request.user - result.save() - - def get_initial(self): - - initials = super().get_initial() - - try: - stock_id = self.request.GET.get('stock_item', None) - initials['stock_item'] = StockItem.objects.get(pk=stock_id) - except (ValueError, StockItem.DoesNotExist): - pass - - initials['test'] = self.request.GET.get('test', '') - - return initials - - def get_form(self): - - form = super().get_form() - form.fields['stock_item'].widget = HiddenInput() - - return form - - -class StockItemTestResultEdit(AjaxUpdateView): - """ - View for editing a StockItemTestResult - """ - - model = StockItemTestResult - form_class = StockForms.EditStockItemTestResultForm - ajax_form_title = _("Edit Test Result") - - def get_form(self): - - form = super().get_form() - - form.fields['stock_item'].widget = HiddenInput() - - return form - - -class StockItemTestResultDelete(AjaxDeleteView): - """ - View for deleting a StockItemTestResult - """ - - model = StockItemTestResult - ajax_form_title = _("Delete Test Result") - context_object_name = "result" - - class StockExportOptions(AjaxView): """ Form for selecting StockExport options """ @@ -957,6 +833,20 @@ class StockAdjust(AjaxView, FormMixin): return items + def get_stock_action_titles(self): + + # Choose form title and action column based on the action + titles = { + 'move': [_('Move Stock Items'), _('Move')], + 'count': [_('Count Stock Items'), _('Count')], + 'take': [_('Remove From Stock'), _('Take')], + 'add': [_('Add Stock Items'), _('Add')], + 'delete': [_('Delete Stock Items'), _('Delete')], + } + + self.ajax_form_title = titles[self.stock_action][0] + self.stock_action_title = titles[self.stock_action][1] + def get_context_data(self): context = super().get_context_data() @@ -965,6 +855,7 @@ class StockAdjust(AjaxView, FormMixin): context['stock_action'] = self.stock_action.strip().lower() + self.get_stock_action_titles() context['stock_action_title'] = self.stock_action_title # Quantity column will be read-only in some circumstances @@ -993,18 +884,6 @@ class StockAdjust(AjaxView, FormMixin): if self.stock_action not in ['move', 'count', 'take', 'add', 'delete']: self.stock_action = 'count' - # Choose form title and action column based on the action - titles = { - 'move': [_('Move Stock Items'), _('Move')], - 'count': [_('Count Stock Items'), _('Count')], - 'take': [_('Remove From Stock'), _('Take')], - 'add': [_('Add Stock Items'), _('Add')], - 'delete': [_('Delete Stock Items'), _('Delete')], - } - - self.ajax_form_title = titles[self.stock_action][0] - self.stock_action_title = titles[self.stock_action][1] - # Save list of items! self.stock_items = self.get_GET_items() @@ -1055,7 +934,7 @@ class StockAdjust(AjaxView, FormMixin): } if valid: - result = self.do_action() + result = self.do_action(note=form.cleaned_data['note']) data['success'] = result @@ -1072,9 +951,9 @@ class StockAdjust(AjaxView, FormMixin): # Instruct the form to redirect data['url'] = reverse('stock-index') - return self.renderJsonResponse(request, form, data=data) + return self.renderJsonResponse(request, form, data=data, context=self.get_context_data()) - def do_action(self): + def do_action(self, note=None): """ Perform stock adjustment action """ if self.stock_action == 'move': @@ -1089,27 +968,26 @@ class StockAdjust(AjaxView, FormMixin): except ValueError: pass - return self.do_move(destination, set_default_loc) + return self.do_move(destination, set_default_loc, note=note) elif self.stock_action == 'add': - return self.do_add() + return self.do_add(note=note) elif self.stock_action == 'take': - return self.do_take() + return self.do_take(note=note) elif self.stock_action == 'count': - return self.do_count() + return self.do_count(note=note) elif self.stock_action == 'delete': - return self.do_delete() + return self.do_delete(note=note) else: return _('No action performed') - def do_add(self): + def do_add(self, note=None): count = 0 - note = self.request.POST['note'] for item in self.stock_items: if item.new_quantity <= 0: @@ -1121,10 +999,9 @@ class StockAdjust(AjaxView, FormMixin): return _('Added stock to {n} items').format(n=count) - def do_take(self): + def do_take(self, note=None): count = 0 - note = self.request.POST['note'] for item in self.stock_items: if item.new_quantity <= 0: @@ -1136,10 +1013,9 @@ class StockAdjust(AjaxView, FormMixin): return _('Removed stock from {n} items').format(n=count) - def do_count(self): + def do_count(self, note=None): count = 0 - note = self.request.POST['note'] for item in self.stock_items: @@ -1149,13 +1025,11 @@ class StockAdjust(AjaxView, FormMixin): return _("Counted stock for {n} items".format(n=count)) - def do_move(self, destination, set_loc=None): + def do_move(self, destination, set_loc=None, note=None): """ Perform actual stock movement """ count = 0 - note = self.request.POST['note'] - for item in self.stock_items: # Avoid moving zero quantity if item.new_quantity <= 0: @@ -1169,7 +1043,7 @@ class StockAdjust(AjaxView, FormMixin): # Do not move to the same location (unless the quantity is different) if destination == item.location and item.new_quantity == item.quantity: continue - + item.move(destination, note, self.request.user, quantity=item.new_quantity) count += 1 @@ -1212,27 +1086,6 @@ class StockAdjust(AjaxView, FormMixin): return _("Deleted {n} stock items").format(n=count) -class StockItemEditStatus(AjaxUpdateView): - """ - View for editing stock item status field - """ - - model = StockItem - form_class = StockForms.EditStockItemStatusForm - ajax_form_title = _('Edit Stock Item Status') - - def save(self, object, form, **kwargs): - """ - Override the save method, to track the user who updated the model - """ - - item = form.save(commit=False) - - item.save(user=self.request.user) - - return item - - class StockItemEdit(AjaxUpdateView): """ View for editing details of a single StockItem diff --git a/InvenTree/templates/InvenTree/index.html b/InvenTree/templates/InvenTree/index.html index 434d652728..a3d793dd26 100644 --- a/InvenTree/templates/InvenTree/index.html +++ b/InvenTree/templates/InvenTree/index.html @@ -128,6 +128,7 @@ loadSimplePartTable("#table-bom-validation", "{% url 'api-part-list' %}", { addHeaderTitle('{% trans "Stock" %}'); addHeaderAction('recently-updated-stock', '{% trans "Recently Updated" %}', 'fa-clock'); addHeaderAction('low-stock', '{% trans "Low Stock" %}', 'fa-shopping-cart'); +addHeaderAction('depleted-stock', '{% trans "Depleted Stock" %}', 'fa-times'); addHeaderAction('stock-to-build', '{% trans "Required for Build Orders" %}', 'fa-bullhorn'); loadStockTable($('#table-recently-updated-stock'), { @@ -170,6 +171,13 @@ loadSimplePartTable("#table-low-stock", "{% url 'api-part-list' %}", { name: "low_stock_parts", }); +loadSimplePartTable("#table-depleted-stock", "{% url 'api-part-list' %}", { + params: { + depleted_stock: true, + }, + name: "depleted_stock_parts", +}); + loadSimplePartTable("#table-stock-to-build", "{% url 'api-part-list' %}", { params: { stock_to_build: true, diff --git a/InvenTree/templates/attachment_table.html b/InvenTree/templates/attachment_table.html index 35b114cc05..18a4da9acc 100644 --- a/InvenTree/templates/attachment_table.html +++ b/InvenTree/templates/attachment_table.html @@ -10,35 +10,6 @@
                - - - - - - - - - - {% for attachment in attachments %} - - - - - - - {% endfor %} - +
                {% trans "File" %}{% trans "Comment" %}{% trans "Uploaded" %}
                {{ attachment.basename }}{{ attachment.comment }} - {% if attachment.upload_date %}{{ attachment.upload_date }}{% endif %} - {% if attachment.user %}{{ attachment.user.username }}{% endif %} - -
                - - -
                -
                \ No newline at end of file diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html index 65712b7394..76104d8fe2 100644 --- a/InvenTree/templates/base.html +++ b/InvenTree/templates/base.html @@ -40,8 +40,8 @@ - - + + @@ -136,7 +136,7 @@ - + @@ -144,11 +144,14 @@ - + + + + diff --git a/InvenTree/InvenTree/static/script/inventree/api.js b/InvenTree/templates/js/api.js similarity index 89% rename from InvenTree/InvenTree/static/script/inventree/api.js rename to InvenTree/templates/js/api.js index b43bcc8419..5e8905a1dd 100644 --- a/InvenTree/InvenTree/static/script/inventree/api.js +++ b/InvenTree/templates/js/api.js @@ -18,7 +18,15 @@ function getCookie(name) { } function inventreeGet(url, filters={}, options={}) { + + // Middleware token required for data update + //var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val(); + var csrftoken = getCookie('csrftoken'); + return $.ajax({ + beforeSend: function(xhr, settings) { + xhr.setRequestHeader('X-CSRFToken', csrftoken); + }, url: url, type: 'GET', data: filters, @@ -103,10 +111,11 @@ function inventreePut(url, data={}, options={}) { } }, error: function(xhr, ajaxOptions, thrownError) { - console.error('Error on UPDATE to ' + url); - console.error(thrownError); if (options.error) { options.error(xhr, ajaxOptions, thrownError); + } else { + console.error(`Error on ${method} to '${url}' - STATUS ${xhr.status}`); + console.error(thrownError); } }, complete: function(xhr, status) { diff --git a/InvenTree/templates/js/attachment.js b/InvenTree/templates/js/attachment.js new file mode 100644 index 0000000000..4b9d522a59 --- /dev/null +++ b/InvenTree/templates/js/attachment.js @@ -0,0 +1,86 @@ +{% load i18n %} + +function reloadAttachmentTable() { + + $('#attachment-table').bootstrapTable("refresh"); +} + + +function loadAttachmentTable(url, options) { + + var table = options.table || '#attachment-table'; + + $(table).inventreeTable({ + url: url, + name: options.name || 'attachments', + formatNoMatches: function() { return '{% trans "No attachments found" %}'}, + sortable: true, + search: false, + queryParams: options.filters || {}, + onPostBody: function() { + // Add callback for 'edit' button + $(table).find('.button-attachment-edit').click(function() { + var pk = $(this).attr('pk'); + + if (options.onEdit) { + options.onEdit(pk); + } + }); + + // Add callback for 'delete' button + $(table).find('.button-attachment-delete').click(function() { + var pk = $(this).attr('pk'); + + if (options.onDelete) { + options.onDelete(pk); + } + }); + }, + columns: [ + { + field: 'attachment', + title: '{% trans "File" %}', + formatter: function(value, row) { + + var split = value.split('/'); + + return renderLink(split[split.length - 1], value); + } + }, + { + field: 'comment', + title: '{% trans "Comment" %}', + }, + { + field: 'upload_date', + title: '{% trans "Upload Date" %}', + }, + { + field: 'actions', + formatter: function(value, row) { + var html = ''; + + html = `
                `; + + html += makeIconButton( + 'fa-edit icon-blue', + 'button-attachment-edit', + row.pk, + '{% trans "Edit attachment" %}', + ); + + html += makeIconButton( + 'fa-trash-alt icon-red', + 'button-attachment-delete', + row.pk, + '{% trans "Delete attachment" %}', + ); + + html += `
                `; + + return html; + } + } + ] + }); +} \ No newline at end of file diff --git a/InvenTree/templates/js/bom.js b/InvenTree/templates/js/bom.js index 665379d8d5..980dd82ccc 100644 --- a/InvenTree/templates/js/bom.js +++ b/InvenTree/templates/js/bom.js @@ -514,14 +514,13 @@ function loadBomTable(table, options) { var pk = $(this).attr('pk'); var url = `/part/bom/${pk}/delete/`; - launchModalForm( - url, - { - success: function() { - reloadBomTable(table); - } + constructForm(`/api/bom/${pk}/`, { + method: 'DELETE', + title: '{% trans "Delete BOM Item" %}', + onSuccess: function() { + reloadBomTable(table); } - ); + }); }); table.on('click', '.bom-edit-button', function() { diff --git a/InvenTree/templates/js/build.js b/InvenTree/templates/js/build.js index 7b72149ec9..67961d1b73 100644 --- a/InvenTree/templates/js/build.js +++ b/InvenTree/templates/js/build.js @@ -876,6 +876,36 @@ function loadBuildTable(table, options) { title: '{% trans "Created" %}', sortable: true, }, + { + field: 'issued_by', + title: '{% trans "Issued by" %}', + sortable: true, + formatter: function(value, row, index, field) { + if (value) + { + return row.issued_by_detail.username; + } + else + { + return '{% trans "No user information" %}'; + } + } + }, + { + field: 'responsible', + title: '{% trans "Resposible" %}', + sortable: true, + formatter: function(value, row, index, field) { + if (value) + { + return row.responsible_detail.name; + } + else + { + return '{% trans "No information" %}'; + } + } + }, { field: 'target_date', title: '{% trans "Target Date" %}', diff --git a/InvenTree/templates/js/company.js b/InvenTree/templates/js/company.js index 078b40f4b9..d28bca5547 100644 --- a/InvenTree/templates/js/company.js +++ b/InvenTree/templates/js/company.js @@ -1,5 +1,74 @@ {% load i18n %} + +// Returns a default form-set for creating / editing a Company object +function companyFormFields(options={}) { + + return { + name: {}, + description: {}, + website: { + icon: 'fa-globe', + }, + address: { + icon: 'fa-envelope', + }, + currency: { + icon: 'fa-dollar-sign', + }, + phone: { + icon: 'fa-phone', + }, + email: { + icon: 'fa-at', + }, + contact: { + icon: 'fa-address-card', + }, + is_supplier: {}, + is_manufacturer: {}, + is_customer: {} + }; +} + + +function editCompany(pk, options={}) { + + var fields = options.fields || companyFormFields(); + + constructForm( + `/api/company/${pk}/`, + { + method: 'PATCH', + fields: fields, + reload: true, + title: '{% trans "Edit Company" %}', + } + ); +}; + +/* + * Launches a form to create a new company. + * As this can be called from many different contexts, + * we abstract it here! + */ +function createCompany(options={}) { + + // Default field set + var fields = options.fields || companyFormFields(); + + constructForm( + '{% url "api-company-list" %}', + { + method: 'POST', + fields: fields, + follow: true, + title: '{% trans "Add new Company" %}', + } + ); +} + + function loadCompanyTable(table, url, options={}) { /* * Load company listing data into specified table. @@ -101,6 +170,61 @@ function loadCompanyTable(table, url, options={}) { } +function deleteManufacturerParts(selections, options={}) { + + if (selections.length == 0) { + return; + } + + var parts = []; + + var text = ` +
                +

                {% trans "The following manufacturer parts will be deleted" %}:

                +
                  `; + + selections.forEach(function(item) { + parts.push(item.pk); + + text += ` +
                • +

                  ${item.MPN} - ${item.part_detail.full_name}

                  +
                • `; + }); + + text += ` +
                +
                `; + + showQuestionDialog( + '{% trans "Delete Manufacturer Parts" %}', + text, + { + accept_text: '{% trans "Delete" %}', + accept: function() { + + // Delete each manufacturer part + var requests = []; + + parts.forEach(function(pk) { + var url = `/api/company/part/manufacturer/${pk}`; + + requests.push(inventreeDelete(url)); + }); + + // Wait for all the requests to complete + $.when.apply($, requests).then(function() { + + if (options.onSuccess) { + options.onSuccess(); + } + }) + } + } + ); +} + + function loadManufacturerPartTable(table, url, options) { /* * Load manufacturer part table @@ -228,7 +352,7 @@ function loadManufacturerPartParameterTable(table, url, options) { { checkbox: true, switchable: false, - visible: false, + visible: true, }, { field: 'name', @@ -273,27 +397,28 @@ function loadManufacturerPartParameterTable(table, url, options) { $(table).find('.button-parameter-edit').click(function() { var pk = $(this).attr('pk'); - launchModalForm( - `/manufacturer-part/parameter/${pk}/edit/`, - { - success: function() { - $(table).bootstrapTable('refresh'); - } + constructForm(`/api/company/part/manufacturer/parameter/${pk}/`, { + fields: { + name: {}, + value: {}, + units: {}, + }, + title: '{% trans "Edit Parameter" %}', + onSuccess: function() { + $(table).bootstrapTable('refresh'); } - ); - + }); }); $(table).find('.button-parameter-delete').click(function() { var pk = $(this).attr('pk'); - launchModalForm( - `/manufacturer-part/parameter/${pk}/delete/`, - { - success: function() { - $(table).bootstrapTable('refresh'); - } + constructForm(`/api/company/part/manufacturer/parameter/${pk}/`, { + method: 'DELETE', + title: '{% trans "Delete Parameter" %}', + onSuccess: function() { + $(table).bootstrapTable('refresh'); } - ); + }); }); } }); diff --git a/InvenTree/templates/js/forms.js b/InvenTree/templates/js/forms.js new file mode 100644 index 0000000000..ac3bcefd04 --- /dev/null +++ b/InvenTree/templates/js/forms.js @@ -0,0 +1,1629 @@ +{% load i18n %} +{% load inventree_extras %} + +/** + * + * This file contains code for rendering (and managing) HTML forms + * which are served via the django-drf API. + * + * The django DRF library provides an OPTIONS method for each API endpoint, + * which allows us to introspect the available fields at any given endpoint. + * + * The OPTIONS method provides the following information for each available field: + * + * - Field name + * - Field label (translated) + * - Field help text (translated) + * - Field type + * - Read / write status + * - Field required status + * - min_value / max_value + * + */ + +/* + * Return true if the OPTIONS specify that the user + * can perform a GET method at the endpoint. + */ +function canView(OPTIONS) { + + if ('actions' in OPTIONS) { + return ('GET' in OPTIONS.actions); + } else { + return false; + } +} + + +/* + * Return true if the OPTIONS specify that the user + * can perform a POST method at the endpoint + */ +function canCreate(OPTIONS) { + + if ('actions' in OPTIONS) { + return ('POST' in OPTIONS.actions); + } else { + return false; + } +} + + +/* + * Return true if the OPTIONS specify that the user + * can perform a PUT or PATCH method at the endpoint + */ +function canChange(OPTIONS) { + + if ('actions' in OPTIONS) { + return ('PUT' in OPTIONS.actions || 'PATCH' in OPTIONS.actions); + } else { + return false; + } +} + + +/* + * Return true if the OPTIONS specify that the user + * can perform a DELETE method at the endpoint + */ +function canDelete(OPTIONS) { + + if ('actions' in OPTIONS) { + return ('DELETE' in OPTIONS.actions); + } else { + return false; + } +} + + +/* + * Get the API endpoint options at the provided URL, + * using a HTTP options request. + */ +function getApiEndpointOptions(url, callback, options) { + + // Return the ajax request object + $.ajax({ + url: url, + type: 'OPTIONS', + contentType: 'application/json', + dataType: 'json', + accepts: { + json: 'application/json', + }, + success: callback, + error: function(request, status, error) { + // TODO: Handle error + console.log(`ERROR in getApiEndpointOptions at '${url}'`); + } + }); +} + + +/* + * Construct a 'creation' (POST) form, to create a new model in the database. + * + * arguments: + * - fields: The 'actions' object provided by the OPTIONS endpoint + * + * options: + * - + */ +function constructCreateForm(fields, options) { + + // Check if default values were provided for any fields + for (const name in fields) { + + var field = fields[name]; + + var field_options = options.fields[name] || {}; + + // If a 'value' is not provided for the field, + if (field.value == null) { + + if ('value' in field_options) { + // Client has specified the default value for the field + field.value = field_options.value; + } else if (field.default != null) { + // OPTIONS endpoint provided default value for this field + field.value = field.default; + } + } + } + + // We should have enough information to create the form! + constructFormBody(fields, options); +} + + +/* + * Construct a 'change' (PATCH) form, to create a new model in the database. + * + * arguments: + * - fields: The 'actions' object provided by the OPTIONS endpoint + * + * options: + * - + */ +function constructChangeForm(fields, options) { + + // Request existing data from the API endpoint + $.ajax({ + url: options.url, + type: 'GET', + contentType: 'application/json', + dataType: 'json', + accepts: { + json: 'application/json', + }, + success: function(data) { + + // Push existing 'value' to each field + for (const field in data) { + + if (field in fields) { + fields[field].value = data[field]; + } + } + + // Store the entire data object + options.instance = data; + + constructFormBody(fields, options); + }, + error: function(request, status, error) { + // TODO: Handle error here + console.log(`ERROR in constructChangeForm at '${options.url}'`); + } + }); +} + + +/* + * Construct a 'delete' form, to remove a model instance from the database. + * + * arguments: + * - fields: The 'actions' object provided by the OPTIONS request + * - options: The 'options' object provided by the client + */ +function constructDeleteForm(fields, options) { + + // Force the "confirm" property if not set + if (!('confirm' in options)) { + options.confirm = true; + } + + // Request existing data from the API endpoint + // This data can be used to render some information on the form + $.ajax({ + url: options.url, + type: 'GET', + contentType: 'application/json', + dataType: 'json', + accepts: { + json: 'application/json', + }, + success: function(data) { + + // Store the instance data + options.instance = data; + + constructFormBody(fields, options); + }, + error: function(request, status, error) { + // TODO: Handle error here + console.log(`ERROR in constructDeleteForm at '${options.url}`); + } + }); +} + + +/* + * Request API OPTIONS data from the server, + * and construct a modal form based on the response. + * + * url: API URL which defines form data + * options: + * - method: The HTTP method e.g. 'PUT', 'POST', 'DELETE' (default='PATCH') + * - title: The form title + * - submitText: Text for the "submit" button + * - closeText: Text for the "close" button + * - fields: list of fields to display, with the following options + * - filters: API query filters + * - onEdit: callback when field is edited + * - secondary: Define a secondary modal form for this field + * - label: Specify custom label + * - help_text: Specify custom help_text + * - placeholder: Specify custom placeholder text + * - value: Specify initial value + * - hidden: Set to true to hide the field + * - icon: font-awesome icon to display before the field + * - prefix: Custom HTML prefix to display before the field + * - focus: Name of field to focus on when modal is displayed + * - preventClose: Set to true to prevent form from closing on success + * - onSuccess: callback function when form action is successful + * - follow: If a 'url' is provided by the API on success, redirect to it + * - redirect: A URL to redirect to after form success + * - reload: Set to true to reload the current page after form success + * - confirm: Set to true to require a "confirm" button + * - confirmText: Text for confirm button (default = "Confirm") + * + */ +function constructForm(url, options) { + + // Save the URL + options.url = url; + + // Default HTTP method + options.method = options.method || 'PATCH'; + + // Request OPTIONS endpoint from the API + getApiEndpointOptions(url, function(OPTIONS) { + + /* + * Determine what "type" of form we want to construct, + * based on the requested action. + * + * First we must determine if the user has the correct permissions! + */ + + switch (options.method) { + case 'POST': + if (canCreate(OPTIONS)) { + constructCreateForm(OPTIONS.actions.POST, options); + } else { + // User does not have permission to POST to the endpoint + showAlertDialog( + '{% trans "Action Prohibited" %}', + '{% trans "Create operation not allowed" %}' + ); + console.log(`'POST action unavailable at ${url}`); + } + break; + case 'PUT': + case 'PATCH': + if (canChange(OPTIONS)) { + constructChangeForm(OPTIONS.actions.PUT, options); + } else { + // User does not have permission to PUT/PATCH to the endpoint + showAlertDialog( + '{% trans "Action Prohibited" %}', + '{% trans "Update operation not allowed" %}' + ); + console.log(`${options.method} action unavailable at ${url}`); + } + break; + case 'DELETE': + if (canDelete(OPTIONS)) { + constructDeleteForm(OPTIONS.actions.DELETE, options); + } else { + // User does not have permission to DELETE to the endpoint + showAlertDialog( + '{% trans "Action Prohibited" %}', + '{% trans "Delete operation not allowed" %}' + ); + console.log(`DELETE action unavailable at ${url}`); + } + break; + case 'GET': + if (canView(OPTIONS)) { + // TODO? + } else { + // User does not have permission to GET to the endpoint + showAlertDialog( + '{% trans "Action Prohibited" %}', + '{% trans "View operation not allowed" %}' + ); + console.log(`GET action unavailable at ${url}`); + } + break; + default: + console.log(`constructForm() called with invalid method '${options.method}'`); + break; + } + }); +} + + +/* + * Construct a modal form based on the provided options + * + * arguments: + * - fields: The endpoint description returned from the OPTIONS request + * - options: form options object provided by the client. + */ +function constructFormBody(fields, options) { + + var html = ''; + + // Client must provide set of fields to be displayed, + // otherwise *all* fields will be displayed + var displayed_fields = options.fields || fields; + + // Provide each field object with its own name + for(field in fields) { + fields[field].name = field; + + var field_options = displayed_fields[field]; + + // Copy custom options across to the fields object + if (field_options) { + + // Override existing query filters (if provided!) + fields[field].filters = Object.assign(fields[field].filters || {}, field_options.filters); + + // Secondary modal options + fields[field].secondary = field_options.secondary; + + // Edit callback + fields[field].onEdit = field_options.onEdit; + + // Custom help_text + if (field_options.help_text) { + fields[field].help_text = field_options.help_text; + } + + // Custom label + if (field_options.label) { + fields[field].label = field_options.label; + } + + // Custom placeholder + if (field_options.placeholder) { + fields[field].placeholder = field_options.placeholder; + } + + // Field prefix + if (field_options.prefix) { + fields[field].prefix = field_options.prefix; + } else if (field_options.icon) { + // Specify icon like 'fa-user' + fields[field].prefix = ``; + } + + fields[field].hidden = field_options.hidden; + + if (field_options.read_only != null) { + fields[field].read_only = field_options.read_only; + } + } + } + + // Construct an ordered list of field names + var field_names = []; + + for (var name in displayed_fields) { + + // Only push names which are actually in the set of fields + if (name in fields) { + field_names.push(name); + } else { + console.log(`WARNING: '${name}' does not match a valid field name.`); + } + } + + // Push the ordered field names into the options, + // allowing successive functions to access them. + options.field_names = field_names; + + // Render selected fields + + for (var idx = 0; idx < field_names.length; idx++) { + + var name = field_names[idx]; + + var field = fields[name]; + + switch (field.type) { + // Skip field types which are simply not supported + case 'nested object': + continue; + default: + break; + } + + var f = constructField(name, field, options); + + html += f; + } + + // TODO: Dynamically create the modals, + // so that we can have an infinite number of stacks! + + // Create a new modal if one does not exists + if (!options.modal) { + options.modal = createNewModal(options); + } + + var modal = options.modal; + + modalEnable(modal, true); + + // Insert generated form content + $(modal).find('.modal-form-content').html(html); + + // Clear any existing buttons from the modal + $(modal).find('#modal-footer-buttons').html(''); + + // Insert "confirm" button (if required) + if (options.confirm) { + insertConfirmButton(options); + } + + // Display the modal + $(modal).modal('show'); + + updateFieldValues(fields, options); + + // Setup related fields + initializeRelatedFields(fields, options); + + // Attach edit callbacks (if required) + addFieldCallbacks(fields, options); + + // Attach clear callbacks (if required) + addClearCallbacks(fields, options); + + attachToggle(modal); + + $(modal + ' .select2-container').addClass('select-full-width'); + $(modal + ' .select2-container').css('width', '100%'); + + modalShowSubmitButton(modal, true); + + $(modal).on('click', '#modal-form-submit', function() { + + submitFormData(fields, options); + }); +} + + +// Add a "confirm" checkbox to the modal +// The "submit" button will be disabled unless "confirm" is checked +function insertConfirmButton(options) { + + var message = options.confirmMessage || '{% trans "Confirm" %}'; + + var confirm = ` + + ${message} + + `; + + $(options.modal).find('#modal-footer-buttons').append(confirm); + + // Disable the 'submit' button + $(options.modal).find('#modal-form-submit').prop('disabled', true); + + // Trigger event + $(options.modal).find('#modal-confirm').change(function() { + var enabled = this.checked; + + $(options.modal).find('#modal-form-submit').prop('disabled', !enabled); + }); +} + + +/* + * Submit form data to the server. + * + */ +function submitFormData(fields, options) { + + // Form data to be uploaded to the server + // Only used if file / image upload is required + var form_data = new FormData(); + + var data = {}; + + var has_files = false; + + // Extract values for each field + options.field_names.forEach(function(name) { + + var field = fields[name] || null; + + if (field) { + + var value = getFormFieldValue(name, field, options); + + // Handle file inputs + if (field.type == 'image upload' || field.type == 'file upload') { + + var field_el = $(options.modal).find(`#id_${name}`)[0]; + + var field_files = field_el.files; + + if (field_files.length > 0) { + // One file per field, please! + var file = field_files[0]; + + form_data.append(name, file); + + has_files = true; + } + } else { + + // Normal field (not a file or image) + form_data.append(name, value); + + data[name] = value; + } + } else { + console.log(`WARNING: Could not find field matching '${name}'`); + } + }); + + var upload_func = inventreePut; + + if (has_files) { + upload_func = inventreeFormDataUpload; + data = form_data; + } + + // Submit data + upload_func( + options.url, + data, + { + method: options.method, + success: function(response, status) { + handleFormSuccess(response, options); + }, + error: function(xhr, status, thrownError) { + + switch (xhr.status) { + case 400: // Bad request + handleFormErrors(xhr.responseJSON, fields, options); + break; + case 0: // No response + $(options.modal).modal('hide'); + showAlertDialog( + '{% trans "No Response" %}', + '{% trans "No response from the InvenTree server" %}', + ); + break; + case 401: // Not authenticated + $(options.modal).modal('hide'); + showAlertDialog( + '{% trans "Error 401: Not Authenticated" %}', + '{% trans "Authentication credentials not supplied" %}', + ); + break; + case 403: // Permission denied + $(options.modal).modal('hide'); + showAlertDialog( + '{% trans "Error 403: Permission Denied" %}', + '{% trans "You do not have the required permissions to access this function" %}', + ); + break; + case 404: // Resource not found + $(options.modal).modal('hide'); + showAlertDialog( + '{% trans "Error 404: Resource Not Found" %}', + '{% trans "The requested resource could not be located on the server" %}', + ); + break; + case 408: // Timeout + $(options.modal).modal('hide'); + showAlertDialog( + '{% trans "Error 408: Timeout" %}', + '{% trans "Connection timeout while requesting data from server" %}', + ); + break; + default: + $(options.modal).modal('hide'); + + showAlertDialog('{% trans "Error requesting form data" %}', renderErrorMessage(xhr)); + + console.log(`WARNING: Unhandled response code - ${xhr.status}`); + break; + } + } + } + ); +} + + +/* + * Update (set) the field values based on the specified data. + * + * Iterate through each of the displayed fields, + * and set the 'val' attribute of each one. + * + */ +function updateFieldValues(fields, options) { + + for (var idx = 0; idx < options.field_names.length; idx++) { + + var name = options.field_names[idx]; + + var field = fields[name] || null; + + if (field == null) { continue; } + + var value = field.value; + + if (value == null) { + value = field.default; + } + + if (value == null) { continue; } + + updateFieldValue(name, value, field, options); + } +} + + +function updateFieldValue(name, value, field, options) { + var el = $(options.modal).find(`#id_${name}`); + + switch (field.type) { + case 'boolean': + el.prop('checked', value); + break; + case 'related field': + // Clear? + if (value == null && !field.required) { + el.val(null).trigger('change'); + } + // TODO - Specify an actual value! + break; + case 'file upload': + case 'image upload': + break; + default: + el.val(value); + break; + } +} + + +/* + * Extract and field value before sending back to the server + * + * arguments: + * - name: The name of the field + * - field: The field specification provided from the OPTIONS request + * - options: The original options object provided by the client + */ +function getFormFieldValue(name, field, options) { + + // Find the HTML element + var el = $(options.modal).find(`#id_${name}`); + + var value = null; + + switch (field.type) { + case 'boolean': + value = el.is(":checked"); + break; + case 'date': + case 'datetime': + value = el.val(); + + // Ensure empty values are sent as nulls + if (!value || value.length == 0) { + value = null; + } + break; + default: + value = el.val(); + break; + } + + return value; +} + + +/* + * Handle successful form posting + * + * arguments: + * - response: The JSON response object from the server + * - options: The original options object provided by the client + */ +function handleFormSuccess(response, options) { + + // Close the modal + if (!options.preventClose) { + // TODO: Actually just *delete* the modal, + // rather than hiding it!! + $(options.modal).modal('hide'); + } + + if (options.onSuccess) { + // Callback function + options.onSuccess(response, options); + } + + if (options.follow && response.url) { + // Follow the returned URL + window.location.href = response.url; + } else if (options.reload) { + // Reload the current page + location.reload(); + } else if (options.redirect) { + // Redirect to a specified URL + window.location.href = options.redirect; + } +} + + + +/* + * Remove all error text items from the form + */ +function clearFormErrors(options) { + + // Remove the individual error messages + $(options.modal).find('.form-error-message').remove(); + + // Remove the "has error" class + $(options.modal).find('.has-error').removeClass('has-error'); + + // Hide the 'non field errors' + $(options.modal).find('#non-field-errors').html(''); +} + + +/* + * Display form error messages as returned from the server. + * + * arguments: + * - errors: The JSON error response from the server + * - fields: The form data object + * - options: Form options provided by the client + */ +function handleFormErrors(errors, fields, options) { + + // Remove any existing error messages from the form + clearFormErrors(options); + + var non_field_errors = $(options.modal).find('#non-field-errors'); + + non_field_errors.append( + `
                + {% trans "Form errors exist" %} +
                ` + ); + + // Non-field errors? + if ('non_field_errors' in errors) { + + var nfe = errors.non_field_errors; + + for (var idx = 0; idx < nfe.length; idx++) { + var err = nfe[idx]; + + var html = ` +
                + ${err} +
                `; + + non_field_errors.append(html); + } + } + + for (field_name in errors) { + if (field_name in fields) { + + // Add the 'has-error' class + $(options.modal).find(`#div_id_${field_name}`).addClass('has-error'); + + var field_dom = $(options.modal).find(`#errors-${field_name}`); // $(options.modal).find(`#id_${field_name}`); + + var field_errors = errors[field_name]; + + // Add an entry for each returned error message + for (var idx = field_errors.length-1; idx >= 0; idx--) { + + var error_text = field_errors[idx]; + + var html = ` + + ${error_text} + `; + + field_dom.append(html); + } + + } else { + console.log(`WARNING: handleFormErrors found no match for field '${field_name}'`); + } + } + +} + + +/* + * Attach callbacks to specified fields, + * triggered after the field value is edited. + * + * Callback function is called with arguments (name, field, options) + */ +function addFieldCallbacks(fields, options) { + + for (var idx = 0; idx < options.field_names.length; idx++) { + + var name = options.field_names[idx]; + + var field = fields[name]; + + if (!field || !field.onEdit) continue; + + addFieldCallback(name, field, options); + } +} + + +function addFieldCallback(name, field, options) { + + $(options.modal).find(`#id_${name}`).change(function() { + field.onEdit(name, field, options); + }); +} + + +function addClearCallbacks(fields, options) { + + for (var idx = 0; idx < options.field_names.length; idx++) { + + var name = options.field_names[idx]; + + var field = fields[name]; + + if (!field || field.required) continue; + + addClearCallback(name, field, options); + } +} + + +function addClearCallback(name, field, options) { + + $(options.modal).find(`#clear_${name}`).click(function() { + updateFieldValue(name, null, field, options); + }); +} + + +function initializeRelatedFields(fields, options) { + + var field_names = options.field_names; + + for (var idx = 0; idx < field_names.length; idx++) { + + var name = field_names[idx]; + + var field = fields[name] || null; + + if (!field || field.hidden) continue; + + switch (field.type) { + case 'related field': + initializeRelatedField(name, field, options); + break; + case 'choice': + initializeChoiceField(name, field, options); + break; + } + } +} + + +/* + * Add a button to launch a secondary modal, to create a new modal instance. + * + * arguments: + * - name: The name of the field + * - field: The field data object + * - options: The options object provided by the client + */ +function addSecondaryModal(name, field, options) { + + var secondary = field.secondary; + + var html = ` + +
                + ${secondary.label || secondary.title} +
                +
                `; + + $(options.modal).find(`label[for="id_${name}"]`).append(html); + + // TODO: Launch a callback + $(options.modal).find(`#btn-new-${name}`).click(function() { + + if (secondary.callback) { + // A "custom" callback can be specified for the button + secondary.callback(field, options); + } else if (secondary.api_url) { + // By default, a new modal form is created, with the parameters specified + // The parameters match the "normal" form creation parameters + + secondary.onSuccess = function(data, opts) { + setRelatedFieldData(name, data, options); + }; + + constructForm(secondary.api_url, secondary); + } + }); +} + + +/* + * Initializea single related-field + * + * argument: + * - modal: DOM identifier for the modal window + * - name: name of the field e.g. 'location' + * - field: Field definition from the OPTIONS request + * - options: Original options object provided by the client + */ +function initializeRelatedField(name, field, options) { + + if (!field.api_url) { + // TODO: Provide manual api_url option? + console.log(`Related field '${name}' missing 'api_url' parameter.`); + return; + } + + // Find the select element and attach a select2 to it + var select = $(options.modal).find(`#id_${name}`); + + // Add a button to launch a 'secondary' modal + if (field.secondary != null) { + addSecondaryModal(name, field, options); + } + + // TODO: Add 'placeholder' support for entry select2 fields + + // limit size for AJAX requests + var pageSize = options.pageSize || 25; + + select.select2({ + placeholder: '', + dropdownParent: $(options.modal), + dropdownAutoWidth: false, + ajax: { + url: field.api_url, + dataType: 'json', + delay: 250, + cache: true, + data: function(params) { + + if (!params.page) { + offset = 0; + } else { + offset = (params.page - 1) * pageSize; + } + + // Custom query filters can be specified against each field + var query = field.filters || {}; + + // Add search and pagination options + query.search = params.term; + query.offset = offset; + query.limit = pageSize; + + return query; + }, + processResults: function(response) { + // Convert the returned InvenTree data into select2-friendly format + + var data = []; + + var more = false; + + if ('count' in response && 'results' in response) { + // Response is paginated + data = response.results; + + // Any more data available? + if (response.next) { + more = true; + } + + } else { + // Non-paginated response + data = response; + } + + // Each 'row' must have the 'id' attribute + for (var idx = 0; idx < data.length; idx++) { + data[idx].id = data[idx].pk; + } + + // Ref: https://select2.org/data-sources/formats + var results = { + results: data, + pagination: { + more: more, + } + }; + + return results; + }, + }, + templateResult: function(item, container) { + + // Extract 'instance' data passed through from an initial value + // Or, use the raw 'item' data as a backup + var data = item; + + if (item.element && item.element.instance) { + data = item.element.instance; + } + + if (!data.pk) { + return $(searching()); + } + + // Custom formatting for the search results + if (field.model) { + // If the 'model' is specified, hand it off to the custom model render + var html = renderModelData(name, field.model, data, field, options); + return $(html); + } else { + // Return a simple renderering + console.log(`WARNING: templateResult() missing 'field.model' for '${name}'`); + return `${name} - ${item.id}`; + } + }, + templateSelection: function(item, container) { + + // Extract 'instance' data passed through from an initial value + // Or, use the raw 'item' data as a backup + var data = item; + + if (item.element && item.element.instance) { + data = item.element.instance; + } + + if (!data.pk) { + return field.placeholder || ''; + return $(searching()); + } + + // Custom formatting for selected item + if (field.model) { + // If the 'model' is specified, hand it off to the custom model render + var html = renderModelData(name, field.model, data, field, options); + return $(html); + } else { + // Return a simple renderering + console.log(`WARNING: templateSelection() missing 'field.model' for '${name}'`); + return `${name} - ${item.id}`; + } + } + }); + + // If a 'value' is already defined, grab the model info from the server + if (field.value) { + var pk = field.value; + var url = `${field.api_url}/${pk}/`.replace('//', '/'); + + inventreeGet(url, {}, { + success: function(data) { + setRelatedFieldData(name, data, options); + } + }); + } +} + + +/* + * Set the value of a select2 instace for a "related field", + * e.g. with data returned from a secondary modal + * + * arguments: + * - name: The name of the field + * - data: JSON data representing the model instance + * - options: The modal form specifications + */ +function setRelatedFieldData(name, data, options) { + + var select = $(options.modal).find(`#id_${name}`); + + var option = new Option(name, data.pk, true, true); + + // Assign the JSON data to the 'instance' attribute, + // so we can access and render it later + option.instance = data; + + select.append(option).trigger('change'); + + select.trigger({ + type: 'select2:select', + params: { + data: data + } + }); +} + + +function initializeChoiceField(name, field, options) { + + var select = $(options.modal).find(`#id_${name}`); + + select.select2({ + dropdownAutoWidth: false, + dropdownParent: $(options.modal), + }); +} + + +// Render a 'no results' element +function searching() { + return `{% trans "Searching" %}...`; +} + +/* + * Render a "foreign key" model reference in a select2 instance. + * Allows custom rendering with access to the entire serialized object. + * + * arguments: + * - name: The name of the field e.g. 'location' + * - model: The name of the InvenTree model e.g. 'stockitem' + * - data: The JSON data representation of the modal instance (GET request) + * - parameters: The field definition (OPTIONS) request + * - options: Other options provided at time of modal creation by the client + */ +function renderModelData(name, model, data, parameters, options) { + + if (!data) { + return parameters.placeholder || ''; + } + + // TODO: Implement this function for various models + + var html = null; + + var renderer = null; + + // Find a custom renderer + switch (model) { + case 'company': + renderer = renderCompany; + break; + case 'stockitem': + renderer = renderStockItem; + break; + case 'stocklocation': + renderer = renderStockLocation; + break; + case 'part': + renderer = renderPart; + break; + case 'partcategory': + renderer = renderPartCategory; + break; + case 'supplierpart': + renderer = renderSupplierPart; + break; + case 'owner': + renderer = renderOwner; + default: + break; + } + + if (renderer != null) { + html = renderer(name, data, parameters, options); + } + + if (html != null) { + return html; + } else { + console.log(`ERROR: Rendering not implemented for model '${model}'`); + // Simple text rendering + return `${model} - ID ${data.id}`; + } +} + + +/* + * Construct a single form 'field' for rendering in a form. + * + * arguments: + * - name: The 'name' of the field + * - parameters: The field parameters supplied by the DRF OPTIONS method + * + * options: + * - + * + * The function constructs a fieldset which mostly replicates django "crispy" forms: + * + * - Field name + * - Field (depends on specified field type) + * - Field description (help text) + * - Field errors + */ +function constructField(name, parameters, options) { + + var field_name = `id_${name}`; + + // Hidden inputs are rendered without label / help text / etc + if (parameters.hidden) { + return constructHiddenInput(name, parameters, options); + } + + var form_classes = 'form-group'; + + if (parameters.errors) { + form_classes += ' has-error'; + } + + var html = `
                `; + + // Add a label + html += constructLabel(name, parameters); + + html += `
                `; + + // Does this input deserve "extra" decorators? + var extra = parameters.prefix != null; + + // Some fields can have 'clear' inputs associated with them + if (!parameters.required && !parameters.read_only) { + switch (parameters.type) { + case 'string': + case 'url': + case 'email': + case 'integer': + case 'float': + case 'decimal': + case 'related field': + case 'date': + extra = true; + break; + default: + break; + } + } + + if (extra) { + html += `
                `; + + if (parameters.prefix) { + html += `${parameters.prefix}`; + } + } + + html += constructInput(name, parameters, options); + + if (extra) { + + if (!parameters.required) { + html += ` + + + `; + } + + html += `
                `; // input-group + } + + // Div for error messages + html += `
                `; + + if (parameters.help_text) { + html += constructHelpText(name, parameters, options); + } + + html += `
                `; // controls + html += `
                `; // form-group + + return html; +} + + +/* + * Construct a 'label' div + * + * arguments: + * - name: The name of the field + * - required: Is this a required field? + */ +function constructLabel(name, parameters) { + + var label_classes = 'control-label'; + + if (parameters.required) { + label_classes += ' requiredField'; + } + + var html = ``; + + return html; +} + + +/* + * Construct a form input based on the field parameters + * + * arguments: + * - name: The name of the field + * - parameters: Field parameters returned by the OPTIONS method + * + */ +function constructInput(name, parameters, options) { + + var html = ''; + + var func = null; + + switch (parameters.type) { + case 'boolean': + func = constructCheckboxInput; + break; + case 'string': + case 'url': + case 'email': + func = constructTextInput; + break; + case 'integer': + case 'float': + case 'decimal': + func = constructNumberInput; + break; + case 'choice': + func = constructChoiceInput; + break; + case 'related field': + func = constructRelatedFieldInput; + break; + case 'image upload': + case 'file upload': + func = constructFileUploadInput; + break; + case 'date': + func = constructDateInput; + break; + default: + // Unsupported field type! + break; + } + + if (func != null) { + html = func(name, parameters, options); + } else { + console.log(`WARNING: Unhandled form field type: '${parameters.type}'`); + } + + return html; +} + + +// Construct a set of default input options which apply to all input types +function constructInputOptions(name, classes, type, parameters) { + + var opts = []; + + opts.push(`id='id_${name}'`); + + opts.push(`class='${classes}'`); + + opts.push(`name='${name}'`); + + opts.push(`type='${type}'`); + + // Read only? + if (parameters.read_only) { + opts.push(`readonly=''`); + } + + if (parameters.value) { + // Existing value? + opts.push(`value='${parameters.value}'`); + } else if (parameters.default) { + // Otherwise, a defualt value? + opts.push(`value='${parameters.default}'`); + } + + // Maximum input length + if (parameters.max_length) { + opts.push(`maxlength='${parameters.max_length}'`); + } + + // Minimum input length + if (parameters.min_length) { + opts.push(`minlength='${parameters.min_length}'`); + } + + // Maximum value + if (parameters.max_value != null) { + opts.push(`max='${parameters.max_value}'`); + } + + // Minimum value + if (parameters.min_value != null) { + opts.push(`min='${parameters.min_value}'`); + } + + // Field is required? + if (parameters.required) { + opts.push(`required=''`); + } + + // Placeholder? + if (parameters.placeholder) { + opts.push(`placeholder='${parameters.placeholder}'`); + } + + return ``; +} + + +// Construct a "hidden" input +function constructHiddenInput(name, parameters, options) { + + return constructInputOptions( + name, + 'hiddeninput', + 'hidden', + parameters + ); +} + + +// Construct a "checkbox" input +function constructCheckboxInput(name, parameters, options) { + + return constructInputOptions( + name, + 'checkboxinput', + 'checkbox', + parameters + ); +} + + +// Construct a "text" input +function constructTextInput(name, parameters, options) { + + var classes = ''; + var type = ''; + + switch (parameters.type) { + default: + classes = 'textinput textInput form-control'; + type = 'text'; + break; + case 'url': + classes = 'urlinput form-control'; + type = 'url'; + break; + case 'email': + classes = 'emailinput form-control'; + type = 'email'; + break; + } + + return constructInputOptions( + name, + classes, + type, + parameters + ); +} + + +// Construct a "number" field +function constructNumberInput(name, parameters, options) { + + return constructInputOptions( + name, + 'numberinput form-control', + 'number', + parameters + ); +} + + +// Construct a "choice" input +function constructChoiceInput(name, parameters, options) { + + var html = ``; + + return html; +} + + +/* + * Construct a "related field" input. + * This will create a "select" input which will then, (after form is loaded), + * be converted into a select2 input. + * This will then be served custom data from the API (as required)... + */ +function constructRelatedFieldInput(name, parameters, options) { + + var html = ``; + + // Don't load any options - they will be filled via an AJAX request + + return html; +} + + +/* + * Construct a field for file upload + */ +function constructFileUploadInput(name, parameters, options) { + + var cls = 'clearablefileinput'; + + if (parameters.required) { + cls = 'fileinput'; + } + + return constructInputOptions( + name, + cls, + 'file', + parameters + ); +} + + +/* + * Construct a field for a date input + */ +function constructDateInput(name, parameters, options) { + + return constructInputOptions( + name, + 'dateinput form-control', + 'date', + parameters + ); +} + + +/* + * Construct a 'help text' div based on the field parameters + * + * arguments: + * - name: The name of the field + * - parameters: Field parameters returned by the OPTIONS method + * + */ +function constructHelpText(name, parameters, options) { + + var html = `
                ${parameters.help_text}
                `; + + return html; +} \ No newline at end of file diff --git a/InvenTree/templates/js/modals.js b/InvenTree/templates/js/modals.js index 03893a47b8..d0f9f742f8 100644 --- a/InvenTree/templates/js/modals.js +++ b/InvenTree/templates/js/modals.js @@ -1,5 +1,114 @@ {% load i18n %} + +/* + * Create and display a new modal dialog + * + * options: + * - title: Form title to render + * - submitText: Text to render on 'submit' button (default = "Submit") + * - closeText: Text to render on 'close' button (default = "Cancel") + * - focus: Name of field to focus on after launching + */ +function createNewModal(options={}) { + + + var id = 1; + + // Check out what modal forms are already being displayed + $('.inventree-modal').each(function() { + + var split = this.id.split('-'); + var modal_id = parseInt(split[2]); + + if (modal_id >= id) { + id = modal_id + 1; + } + }); + + var html = ` + + `; + + $('body').append(html); + + var modal_name = `#modal-form-${id}`; + + $(modal_name).on('shown.bs.modal', function() { + $(modal_name + ' .modal-form-content').scrollTop(0); + + if (options.focus) { + getFieldByName(modal_name, options.focus).focus(); + } + }); + + // Automatically remove the modal when it is deleted! + $(modal_name).on('hidden.bs.modal', function(e) { + $(modal_name).remove(); + }); + + // Capture "enter" key input + $(modal_name).on('keydown', 'input', function(event) { + + + if (event.keyCode == 13) { + event.preventDefault(); + // Simulate a click on the 'Submit' button + $(modal_name).find("#modal-form-submit").click(); + + return false; + } + }); + + $(modal_name).modal({ + backdrop: 'static', + keyboard: false, + }); + + // Set labels based on supplied options + modalSetTitle(modal_name, options.title || '{% trans "Form Title" %}'); + modalSetSubmitText(modal_name, options.submitText || '{% trans "Submit" %}'); + modalSetCloseText(modal_name, options.cancelText || '{% trans "Cancel" %}'); + + // Return the "name" of the modal + return modal_name; +} + + function makeOption(text, value, title) { /* Format an option for a select element */ @@ -991,8 +1100,6 @@ function hideModalImage() { function showModalImage(image_url) { // Display full-screen modal image - console.log('showing modal image: ' + image_url); - var modal = $('#modal-image-dialog'); // Set image content diff --git a/InvenTree/templates/js/model_renderers.js b/InvenTree/templates/js/model_renderers.js new file mode 100644 index 0000000000..5b838f184b --- /dev/null +++ b/InvenTree/templates/js/model_renderers.js @@ -0,0 +1,155 @@ +{% load i18n %} + +/* + * This file contains functions for rendering various InvenTree database models, + * in particular for displaying them in modal forms in a 'select2' context. + * + * Each renderer is provided with three arguments: + * + * - name: The 'name' of the model instance in the referring model + * - data: JSON data which represents the model instance. Returned via a GET request. + * - parameters: The field parameters provided via an OPTIONS request to the endpoint. + * - options: User options provided by the client + */ + + +// Renderer for "Company" model +function renderCompany(name, data, parameters, options) { + + var html = `${data.name} - ${data.description}`; + + html += `{% trans "Company ID" %}: ${data.pk}`; + + return html; +} + + +// Renderer for "StockItem" model +function renderStockItem(name, data, parameters, options) { + + var image = data.part_detail.thumbnail || data.part_detail.image; + + if (!image) { + image = `/static/img/blank_image.png`; + } + + var html = ``; + + html += ` ${data.part_detail.full_name || data.part_detail.name}`; + + if (data.serial && data.quantity == 1) { + html += ` - {% trans "Serial Number" %}: ${data.serial}`; + } else { + html += ` - {% trans "Quantity" %}: ${data.quantity}`; + } + + if (data.part_detail.description) { + html += `

                ${data.part_detail.description}

                `; + } + + return html; +} + + +// Renderer for "StockLocation" model +function renderStockLocation(name, data, parameters, options) { + + var html = `${data.name}`; + + if (data.description) { + html += ` - ${data.description}`; + } + + html += `{% trans "Location ID" %}: ${data.pk}`; + + if (data.pathstring) { + html += `

                ${data.pathstring}

                `; + } + + return html; +} + + +// Renderer for "Part" model +function renderPart(name, data, parameters, options) { + + var image = data.image; + + if (!image) { + image = `/static/img/blank_image.png`; + } + + var html = ``; + + html += ` ${data.full_name || data.name}`; + + if (data.description) { + html += ` - ${data.description}`; + } + + html += `{% trans "Part ID" %}: ${data.pk}`; + + return html; +} + + +// Renderer for "Owner" model +function renderOwner(name, data, parameters, options) { + + var html = `${data.name}`; + + + switch (data.label) { + case 'user': + html += ``; + break; + case 'group': + html += ``; + break; + default: + break; + } + + return html; +} + + +// Renderer for "PartCategory" model +function renderPartCategory(name, data, parameters, options) { + + var html = `${data.name}`; + + if (data.description) { + html += ` - ${data.description}`; + } + + html += `{% trans "Category ID" %}: ${data.pk}`; + + if (data.pathstring) { + html += `

                ${data.pathstring}

                `; + } + + return html; +} + + +// Rendered for "SupplierPart" model +function renderSupplierPart(name, data, parameters, options) { + + var image = data.supplier_detail.image; + + if (!image) { + image = `/static/img/blank_image.png`; + } + + var html = ``; + + html += ` ${data.supplier_detail.name} - ${data.SKU}`; + html += ` - ${data.part_detail.full_name}`; + + html += `{% trans "Supplier Part ID" %}: ${data.pk}`; + + + return html; + +} \ No newline at end of file diff --git a/InvenTree/templates/js/order.js b/InvenTree/templates/js/order.js index 0af54fa43c..5cb286e970 100644 --- a/InvenTree/templates/js/order.js +++ b/InvenTree/templates/js/order.js @@ -1,6 +1,68 @@ {% load i18n %} {% load inventree_extras %} + +// Create a new SalesOrder +function createSalesOrder(options={}) { + + constructForm('{% url "api-so-list" %}', { + method: 'POST', + fields: { + reference: { + prefix: '{% settings_value "SALESORDER_REFERENCE_PREFIX" %}', + }, + customer: { + value: options.customer, + }, + description: {}, + target_date: { + icon: 'fa-calendar-alt', + }, + link: { + icon: 'fa-link', + }, + responsible: { + icon: 'fa-user', + } + }, + onSuccess: function(data) { + location.href = `/order/sales-order/${data.pk}/`; + }, + title: '{% trans "Create Sales Order" %}', + }); +} + +// Create a new PurchaseOrder +function createPurchaseOrder(options={}) { + + constructForm('{% url "api-po-list" %}', { + method: 'POST', + fields: { + reference: { + prefix: "{% settings_value 'PURCHASEORDER_REFERENCE_PREFIX' %}", + }, + supplier: { + value: options.supplier, + }, + description: {}, + target_date: { + icon: 'fa-calendar-alt', + }, + link: { + icon: 'fa-link', + }, + responsible: { + icon: 'fa-user', + } + }, + onSuccess: function(data) { + location.href = `/order/purchase-order/${data.pk}/`; + }, + title: '{% trans "Create Purchase Order" %}', + }); +} + + function removeOrderRowFromOrderWizard(e) { /* Remove a part selection from an order form. */ @@ -266,6 +328,11 @@ function loadSalesOrderTable(table, options) { field: 'customer_detail', title: '{% trans "Customer" %}', formatter: function(value, row, index, field) { + + if (!row.customer_detail) { + return '{% trans "Invalid Customer" %}'; + } + return imageHoverIcon(row.customer_detail.image) + renderLink(row.customer_detail.name, `/company/${row.customer}/sales-orders/`); } }, diff --git a/InvenTree/templates/js/part.js b/InvenTree/templates/js/part.js index 66174e2f15..7fa63098e1 100644 --- a/InvenTree/templates/js/part.js +++ b/InvenTree/templates/js/part.js @@ -769,6 +769,159 @@ function loadPartTestTemplateTable(table, options) { } +function loadPriceBreakTable(table, options) { + /* + * Load PriceBreak table. + */ + + var name = options.name || 'pricebreak'; + var human_name = options.human_name || 'price break'; + var linkedGraph = options.linkedGraph || null; + var chart = null; + + table.inventreeTable({ + name: name, + method: 'get', + formatNoMatches: function() { + return `{% trans "No ${human_name} information found" %}`; + }, + url: options.url, + onLoadSuccess: function(tableData) { + if (linkedGraph) { + // sort array + tableData = tableData.sort((a,b)=>a.quantity-b.quantity); + + // split up for graph definition + var graphLabels = Array.from(tableData, x => x.quantity); + var graphData = Array.from(tableData, x => parseFloat(x.price)); + + // destroy chart if exists + if (chart){ + chart.destroy(); + } + chart = loadLineChart(linkedGraph, + { + labels: graphLabels, + datasets: [ + { + label: '{% trans "Unit Price" %}', + data: graphData, + backgroundColor: 'rgba(255, 206, 86, 0.2)', + borderColor: 'rgb(255, 206, 86)', + stepped: true, + fill: true, + },] + } + ); + } + }, + 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-${name}-edit`, row.pk, `{% trans "Edit ${human_name}" %}`); + html += makeIconButton('fa-trash-alt icon-red', `button-${name}-delete`, row.pk, `{% trans "Delete ${human_name}" %}`); + + html += `
                `; + + return html; + } + }, + ] + }); +} + +function loadLineChart(context, data) { + return new Chart(context, { + type: 'line', + data: data, + options: { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: {position: 'bottom'}, + } + } + }); +} + +function initPriceBreakSet(table, options) { + + var part_id = options.part_id; + var pb_human_name = options.pb_human_name; + var pb_url_slug = options.pb_url_slug; + var pb_url = options.pb_url; + var pb_new_btn = options.pb_new_btn; + var pb_new_url = options.pb_new_url; + + var linkedGraph = options.linkedGraph || null; + + loadPriceBreakTable( + table, + { + name: pb_url_slug, + human_name: pb_human_name, + url: pb_url, + linkedGraph: linkedGraph, + } + ); + + function reloadPriceBreakTable(){ + table.bootstrapTable("refresh"); + } + + pb_new_btn.click(function() { + launchModalForm(pb_new_url, + { + success: reloadPriceBreakTable, + data: { + part: part_id, + } + } + ); + }); + + table.on('click', `.button-${pb_url_slug}-delete`, function() { + var pk = $(this).attr('pk'); + + launchModalForm( + `/part/${pb_url_slug}/${pk}/delete/`, + { + success: reloadPriceBreakTable + } + ); + }); + + table.on('click', `.button-${pb_url_slug}-edit`, function() { + var pk = $(this).attr('pk'); + + launchModalForm( + `/part/${pb_url_slug}/${pk}/edit/`, + { + success: reloadPriceBreakTable + } + ); + }); +} + + function loadStockPricingChart(context, data) { return new Chart(context, { type: 'bar', @@ -824,3 +977,36 @@ function loadBomChart(context, data) { } }); } + +function loadSellPricingChart(context, data) { + return new Chart(context, { + type: 'line', + data: data, + options: { + responsive: true, + maintainAspectRatio: false, + plugins: {legend: {position: 'bottom'}}, + scales: { + y: { + type: 'linear', + position: 'left', + grid: {display: false}, + title: { + display: true, + text: '{% trans "Unit Price" %}' + } + }, + y1: { + type: 'linear', + position: 'right', + grid: {display: false}, + titel: { + display: true, + text: '{% trans "Quantity" %}', + position: 'right' + } + }, + }, + } + }); +} diff --git a/InvenTree/templates/js/stock.js b/InvenTree/templates/js/stock.js index b557f0c327..948c0ff768 100644 --- a/InvenTree/templates/js/stock.js +++ b/InvenTree/templates/js/stock.js @@ -685,6 +685,22 @@ function loadStockTable(table, options) { return renderLink(text, link); } }, + { + field: 'supplier_part', + title: '{% trans "Supplier Part" %}', + visible: params['supplier_part_detail'] || false, + switchable: params['supplier_part_detail'] || false, + formatter: function(value, row) { + if (!value) { + return '-'; + } + + var link = `/supplier-part/${row.supplier_part}/stock/`; + var text = `${row.supplier_part_detail.SKU}`; + + return renderLink(text, link); + } + }, { field: 'purchase_price', title: '{% trans "Purchase Price" %}', diff --git a/InvenTree/templates/js/table_filters.js b/InvenTree/templates/js/table_filters.js index d02fa50d80..3dfb424edf 100644 --- a/InvenTree/templates/js/table_filters.js +++ b/InvenTree/templates/js/table_filters.js @@ -205,7 +205,12 @@ function getAvailableTableFilters(tableKey) { batch: { title: '{% trans "Batch" %}', description: '{% trans "Batch code" %}', - } + }, + has_purchase_price: { + type: 'bool', + title: '{% trans "Has purchase price" %}', + description: '{% trans "Show stock items which have a purchase price set" %}', + }, }; } diff --git a/InvenTree/templates/modals.html b/InvenTree/templates/modals.html index e0cae3e580..e2bd44554c 100644 --- a/InvenTree/templates/modals.html +++ b/InvenTree/templates/modals.html @@ -7,7 +7,7 @@
              • -