From 5dd6f18495e9899bb6646e7acff5c0c1d15c4762 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 26 May 2023 16:57:23 +1000 Subject: [PATCH] Part units (#4854) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add validation to part units field * Add "pack_units" field to the SupplierPart model * Migrate old units to new units, and remove old field * Table fix * Fixture fix * Update migration * Improve "hook" for loading custom unit database * Display part units column in part table - Also allow ordering by part units - Allow filtering to show parts which have defined units * Adds data migration for converting units to valid values * Add "pack_units_native" field to company.SupplierPart model * Clean pack units when saving a SupplierPart - Convert to native part units - Handle empty units value - Add unit tests * Add background function to rebuild supplier parts when a part is saved - Required to ensure that the "pack_size_native" is up to date * Template updates * Sort by native units first * Bump API version * Rename "pack_units" to "pack_quantity" * Update migration file - Allow reverse migration * Fix for currency migration - Handle case where no currencies are provided - Handle case where base currency is not in provided options * Adds unit test for data migration * Add unit test for part.units data migration - Check that units fields are updated correctly * Add some extra "default units" - each / piece - dozen / hundred / thousand - Add unit testing also * Update references to "pack_size" - Replace with "pack_quantity" or "pack_quantity_native" as appropriate * Improvements based on unit testing * catch error * Docs updates * Fixes for pricing tests * Update unit tests for part migrations ยท 1b6b6d9d * Bug fix for conversion code * javascript updates * JS formatting fix --- InvenTree/InvenTree/api_version.py | 7 +- InvenTree/InvenTree/apps.py | 4 + InvenTree/InvenTree/conversion.py | 32 +++-- InvenTree/InvenTree/tests.py | 23 +++ InvenTree/company/api.py | 3 +- InvenTree/company/fixtures/supplier_part.yaml | 3 +- .../0059_supplierpart_pack_units.py | 25 ++++ .../migrations/0060_auto_20230519_0344.py | 51 +++++++ .../0061_remove_supplierpart_pack_size.py | 17 +++ InvenTree/company/models.py | 104 ++++++++++---- InvenTree/company/serializers.py | 5 +- .../templates/company/supplier_part.html | 19 ++- InvenTree/company/test_migrations.py | 48 +++++++ InvenTree/company/test_supplier_parts.py | 114 +++++++++++++++ InvenTree/order/models.py | 12 +- InvenTree/order/serializers.py | 8 +- InvenTree/order/tests.py | 4 +- InvenTree/part/api.py | 93 ++++++------ InvenTree/part/filters.py | 6 +- .../migrations/0109_auto_20230517_1048.py | 10 +- .../part/migrations/0110_alter_part_units.py | 19 +++ .../migrations/0111_auto_20230521_1350.py | 93 ++++++++++++ InvenTree/part/models.py | 20 ++- InvenTree/part/serializers.py | 132 ++++++++---------- InvenTree/part/tasks.py | 32 ++++- InvenTree/part/test_api.py | 4 +- InvenTree/part/test_migrations.py | 37 ++++- InvenTree/part/test_pricing.py | 48 +++++-- InvenTree/stock/api.py | 7 +- .../migrations/0094_auto_20230220_0025.py | 8 +- InvenTree/stock/test_api.py | 1 + InvenTree/templates/js/translated/company.js | 19 ++- InvenTree/templates/js/translated/part.js | 20 +-- InvenTree/templates/js/translated/pricing.js | 13 +- .../templates/js/translated/purchase_order.js | 44 +++--- .../templates/js/translated/table_filters.js | 5 + docs/docs/assets/images/part/part_units.png | Bin 0 -> 175270 bytes .../assets/images/part/part_units_invalid.png | Bin 0 -> 27163 bytes docs/docs/part/part.md | 39 +++++- 39 files changed, 878 insertions(+), 251 deletions(-) create mode 100644 InvenTree/company/migrations/0059_supplierpart_pack_units.py create mode 100644 InvenTree/company/migrations/0060_auto_20230519_0344.py create mode 100644 InvenTree/company/migrations/0061_remove_supplierpart_pack_size.py create mode 100644 InvenTree/company/test_supplier_parts.py create mode 100644 InvenTree/part/migrations/0110_alter_part_units.py create mode 100644 InvenTree/part/migrations/0111_auto_20230521_1350.py create mode 100644 docs/docs/assets/images/part/part_units.png create mode 100644 docs/docs/assets/images/part/part_units_invalid.png diff --git a/InvenTree/InvenTree/api_version.py b/InvenTree/InvenTree/api_version.py index 9e22618957..b112c93fa9 100644 --- a/InvenTree/InvenTree/api_version.py +++ b/InvenTree/InvenTree/api_version.py @@ -2,11 +2,16 @@ # InvenTree API version -INVENTREE_API_VERSION = 116 +INVENTREE_API_VERSION = 117 """ Increment this API version number whenever there is a significant change to the API that any clients need to know about +v117 -> 2023-05-22 : https://github.com/inventree/InvenTree/pull/4854 + - Part.units model now supports physical units (e.g. "kg", "m", "mm", etc) + - Replaces SupplierPart "pack_size" field with "pack_quantity" + - New field supports physical units, and allows for conversion between compatible units + v116 -> 2023-05-18 : https://github.com/inventree/InvenTree/pull/4823 - Updates to part parameter implementation, to use physical units diff --git a/InvenTree/InvenTree/apps.py b/InvenTree/InvenTree/apps.py index c61ccba725..27f212f038 100644 --- a/InvenTree/InvenTree/apps.py +++ b/InvenTree/InvenTree/apps.py @@ -11,6 +11,7 @@ from django.core.exceptions import AppRegistryNotReady from django.db import transaction from django.db.utils import IntegrityError +import InvenTree.conversion import InvenTree.tasks from InvenTree.config import get_setting from InvenTree.ready import canAppAccessDatabase, isInTestMode @@ -46,6 +47,9 @@ class InvenTreeConfig(AppConfig): self.collect_notification_methods() + # Ensure the unit registry is loaded + InvenTree.conversion.reload_unit_registry() + if canAppAccessDatabase() or settings.TESTING_ENV: self.add_user_on_startup() diff --git a/InvenTree/InvenTree/conversion.py b/InvenTree/InvenTree/conversion.py index 29d9816950..e2d114c728 100644 --- a/InvenTree/InvenTree/conversion.py +++ b/InvenTree/InvenTree/conversion.py @@ -15,13 +15,31 @@ def get_unit_registry(): # Cache the unit registry for speedier access if _unit_registry is None: - _unit_registry = pint.UnitRegistry() - - # TODO: Allow for custom units to be defined in the database + reload_unit_registry() return _unit_registry +def reload_unit_registry(): + """Reload the unit registry from the database. + + This function is called at startup, and whenever the database is updated. + """ + + global _unit_registry + + _unit_registry = pint.UnitRegistry() + + # Define some "standard" additional units + _unit_registry.define('piece = 1') + _unit_registry.define('each = 1 = ea') + _unit_registry.define('dozen = 12 = dz') + _unit_registry.define('hundred = 100') + _unit_registry.define('thousand = 1000') + + # TODO: Allow for custom units to be defined in the database + + def convert_physical_value(value: str, unit: str = None): """Validate that the provided value is a valid physical quantity. @@ -30,7 +48,7 @@ def convert_physical_value(value: str, unit: str = None): unit: Optional unit to convert to, and validate against Raises: - ValidationError: If the value is invalid + ValidationError: If the value is invalid or cannot be converted to the specified unit Returns: The converted quantity, in the specified units @@ -62,11 +80,9 @@ def convert_physical_value(value: str, unit: str = None): # At this point we *should* have a valid pint value # To double check, look at the maginitude float(val.magnitude) - except ValueError: + except (TypeError, ValueError): error = _('Provided value is not a valid number') - except pint.errors.UndefinedUnitError: - error = _('Provided value has an invalid unit') - except pint.errors.DefinitionSyntaxError: + except (pint.errors.UndefinedUnitError, pint.errors.DefinitionSyntaxError): error = _('Provided value has an invalid unit') except pint.errors.DimensionalityError: error = _('Provided value could not be converted to the specified unit') diff --git a/InvenTree/InvenTree/tests.py b/InvenTree/InvenTree/tests.py index 83027fe4ef..a107bb934a 100644 --- a/InvenTree/InvenTree/tests.py +++ b/InvenTree/InvenTree/tests.py @@ -18,6 +18,7 @@ from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.models import Rate, convert_money from djmoney.money import Money +import InvenTree.conversion import InvenTree.format import InvenTree.helpers import InvenTree.tasks @@ -33,6 +34,28 @@ from .tasks import offload_task from .validators import validate_overage +class ConversionTest(TestCase): + """Tests for conversion of physical units""" + + def test_dimensionless_units(self): + """Tests for 'dimensonless' unit quantities""" + + # Test some dimensionless units + tests = { + 'ea': 1, + 'each': 1, + '3 piece': 3, + '5 dozen': 60, + '3 hundred': 300, + '2 thousand': 2000, + '12 pieces': 12, + } + + for val, expected in tests.items(): + q = InvenTree.conversion.convert_physical_value(val).to_base_units() + self.assertEqual(q.magnitude, expected) + + class ValidatorTest(TestCase): """Simple tests for custom field validators.""" diff --git a/InvenTree/company/api.py b/InvenTree/company/api.py index bd35fcc4ef..aee0d59ae8 100644 --- a/InvenTree/company/api.py +++ b/InvenTree/company/api.py @@ -390,7 +390,7 @@ class SupplierPartList(ListCreateDestroyAPIView): 'manufacturer', 'MPN', 'packaging', - 'pack_size', + 'pack_quantity', 'in_stock', 'updated', ] @@ -400,6 +400,7 @@ class SupplierPartList(ListCreateDestroyAPIView): 'supplier': 'supplier__name', 'manufacturer': 'manufacturer_part__manufacturer__name', 'MPN': 'manufacturer_part__MPN', + 'pack_quantity': ['pack_quantity_native', 'pack_quantity'], } search_fields = [ diff --git a/InvenTree/company/fixtures/supplier_part.yaml b/InvenTree/company/fixtures/supplier_part.yaml index 0ebc07d8d9..96d678a68f 100644 --- a/InvenTree/company/fixtures/supplier_part.yaml +++ b/InvenTree/company/fixtures/supplier_part.yaml @@ -66,4 +66,5 @@ part: 4 supplier: 2 SKU: 'R_4K7_0603.100PCK' - pack_size: 100 + pack_quantity: '100' + pack_quantity_native: 100 diff --git a/InvenTree/company/migrations/0059_supplierpart_pack_units.py b/InvenTree/company/migrations/0059_supplierpart_pack_units.py new file mode 100644 index 0000000000..864ebad772 --- /dev/null +++ b/InvenTree/company/migrations/0059_supplierpart_pack_units.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.19 on 2023-05-19 03:41 + +from django.db import migrations, models + +import InvenTree.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('company', '0058_auto_20230515_0004'), + ] + + operations = [ + migrations.AddField( + model_name='supplierpart', + name='pack_quantity', + field=models.CharField(blank=True, help_text='Total quantity supplied in a single pack. Leave empty for single items.', max_length=25, verbose_name='Pack Quantity'), + ), + migrations.AddField( + model_name='supplierpart', + name='pack_quantity_native', + field=InvenTree.fields.RoundingDecimalField(decimal_places=10, default=1, max_digits=20, null=True), + ), + ] diff --git a/InvenTree/company/migrations/0060_auto_20230519_0344.py b/InvenTree/company/migrations/0060_auto_20230519_0344.py new file mode 100644 index 0000000000..34e6d2fc69 --- /dev/null +++ b/InvenTree/company/migrations/0060_auto_20230519_0344.py @@ -0,0 +1,51 @@ +# Generated by Django 3.2.19 on 2023-05-19 03:44 + +from django.db import migrations + +from InvenTree.helpers import normalize + + +def update_supplier_part_units(apps, schema_editor): + """Migrate existing supplier part units to new field""" + + SupplierPart = apps.get_model('company', 'SupplierPart') + + supplier_parts = SupplierPart.objects.all() + + for sp in supplier_parts: + pack_size = normalize(sp.pack_size) + sp.pack_quantity = str(pack_size) + sp.pack_quantity_native = pack_size + sp.save() + + if supplier_parts.count() > 0: + print(f"Updated {supplier_parts.count()} supplier part units") + + +def reverse_pack_quantity(apps, schema_editor): + """Reverse the migrations""" + + SupplierPart = apps.get_model('company', 'SupplierPart') + + supplier_parts = SupplierPart.objects.all() + + for sp in supplier_parts: + sp.pack_size = sp.pack_quantity_native + sp.save() + + if supplier_parts.count() > 0: + print(f"Updated {supplier_parts.count()} supplier part units") + +class Migration(migrations.Migration): + + dependencies = [ + ('company', '0059_supplierpart_pack_units'), + ('part', '0111_auto_20230521_1350'), + ] + + operations = [ + migrations.RunPython( + code=update_supplier_part_units, + reverse_code=reverse_pack_quantity, + ) + ] diff --git a/InvenTree/company/migrations/0061_remove_supplierpart_pack_size.py b/InvenTree/company/migrations/0061_remove_supplierpart_pack_size.py new file mode 100644 index 0000000000..0ae404be05 --- /dev/null +++ b/InvenTree/company/migrations/0061_remove_supplierpart_pack_size.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.19 on 2023-05-19 04:03 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('company', '0060_auto_20230519_0344'), + ] + + operations = [ + migrations.RemoveField( + model_name='supplierpart', + name='pack_size', + ), + ] diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 7e03e7187a..3cd94c855d 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -2,6 +2,7 @@ import os from datetime import datetime +from decimal import Decimal from django.apps import apps from django.core.exceptions import ValidationError @@ -19,6 +20,7 @@ from taggit.managers import TaggableManager import common.models import common.settings +import InvenTree.conversion import InvenTree.fields import InvenTree.helpers import InvenTree.ready @@ -436,7 +438,8 @@ class SupplierPart(MetadataMixin, InvenTreeBarcodeMixin, common.models.MetaMixin multiple: Multiple that the part is provided in lead_time: Supplier lead time packaging: packaging that the part is supplied in, e.g. "Reel" - pack_size: Quantity of item supplied in a single pack (e.g. 30ml in a single tube) + pack_quantity: Quantity of item supplied in a single pack (e.g. 30ml in a single tube) + pack_quantity_native: Pack quantity, converted to "native" units of the referenced part updated: Date that the SupplierPart was last updated """ @@ -475,6 +478,40 @@ class SupplierPart(MetadataMixin, InvenTreeBarcodeMixin, common.models.MetaMixin """ super().clean() + self.pack_quantity = self.pack_quantity.strip() + + # An empty 'pack_quantity' value is equivalent to '1' + if self.pack_quantity == '': + self.pack_quantity = '1' + + # Validate that the UOM is compatible with the base part + if self.pack_quantity and self.part: + try: + # Attempt conversion to specified unit + native_value = InvenTree.conversion.convert_physical_value( + self.pack_quantity, self.part.units + ) + + # If part units are not provided, value must be dimensionless + if not self.part.units and native_value.units not in ['', 'dimensionless']: + raise ValidationError({ + 'pack_quantity': _("Pack units must be compatible with the base part units") + }) + + # Native value must be greater than zero + if float(native_value.magnitude) <= 0: + raise ValidationError({ + 'pack_quantity': _("Pack units must be greater than zero") + }) + + # Update native pack units value + self.pack_quantity_native = Decimal(native_value.magnitude) + + except ValidationError as e: + raise ValidationError({ + 'pack_quantity': e.messages + }) + # Ensure that the linked manufacturer_part points to the same part! if self.manufacturer_part and self.part: @@ -510,21 +547,23 @@ class SupplierPart(MetadataMixin, InvenTreeBarcodeMixin, common.models.MetaMixin super().save(*args, **kwargs) - part = models.ForeignKey('part.Part', on_delete=models.CASCADE, - related_name='supplier_parts', - verbose_name=_('Base Part'), - limit_choices_to={ - 'purchaseable': True, - }, - help_text=_('Select part'), - ) + part = models.ForeignKey( + 'part.Part', on_delete=models.CASCADE, + related_name='supplier_parts', + verbose_name=_('Base Part'), + limit_choices_to={ + 'purchaseable': True, + }, + help_text=_('Select part'), + ) - supplier = models.ForeignKey(Company, on_delete=models.CASCADE, - related_name='supplied_parts', - limit_choices_to={'is_supplier': True}, - verbose_name=_('Supplier'), - help_text=_('Select supplier'), - ) + supplier = models.ForeignKey( + Company, on_delete=models.CASCADE, + related_name='supplied_parts', + limit_choices_to={'is_supplier': True}, + verbose_name=_('Supplier'), + help_text=_('Select supplier'), + ) SKU = models.CharField( max_length=100, @@ -532,12 +571,13 @@ class SupplierPart(MetadataMixin, InvenTreeBarcodeMixin, common.models.MetaMixin help_text=_('Supplier stock keeping unit') ) - manufacturer_part = models.ForeignKey(ManufacturerPart, on_delete=models.CASCADE, - blank=True, null=True, - related_name='supplier_parts', - verbose_name=_('Manufacturer Part'), - help_text=_('Select manufacturer part'), - ) + manufacturer_part = models.ForeignKey( + ManufacturerPart, on_delete=models.CASCADE, + blank=True, null=True, + related_name='supplier_parts', + verbose_name=_('Manufacturer Part'), + help_text=_('Select manufacturer part'), + ) link = InvenTreeURLField( blank=True, null=True, @@ -561,14 +601,26 @@ class SupplierPart(MetadataMixin, InvenTreeBarcodeMixin, common.models.MetaMixin packaging = models.CharField(max_length=50, blank=True, null=True, verbose_name=_('Packaging'), help_text=_('Part packaging')) - pack_size = RoundingDecimalField( + pack_quantity = models.CharField( + max_length=25, verbose_name=_('Pack Quantity'), - help_text=_('Unit quantity supplied in a single pack'), - default=1, - max_digits=15, decimal_places=5, - validators=[MinValueValidator(0.001)], + help_text=_('Total quantity supplied in a single pack. Leave empty for single items.'), + blank=True, ) + pack_quantity_native = RoundingDecimalField( + max_digits=20, decimal_places=10, default=1, + null=True, + ) + + def base_quantity(self, quantity=1) -> Decimal: + """Calculate the base unit quantiy for a given quantity.""" + + q = Decimal(quantity) * Decimal(self.pack_quantity_native) + q = round(q, 10).normalize() + + return q + multiple = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1)], verbose_name=_('multiple'), help_text=_('Order multiple')) # TODO - Reimplement lead-time as a charfield with special validation (pattern matching). diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 3835371947..f0833d18b0 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -265,7 +265,8 @@ class SupplierPartSerializer(InvenTreeTagModelSerializer): 'pk', 'barcode_hash', 'packaging', - 'pack_size', + 'pack_quantity', + 'pack_quantity_native', 'part', 'part_detail', 'pretty_name', @@ -327,8 +328,6 @@ class SupplierPartSerializer(InvenTreeTagModelSerializer): pretty_name = serializers.CharField(read_only=True) - pack_size = serializers.FloatField(label=_('Pack Quantity')) - supplier = serializers.PrimaryKeyRelatedField(queryset=Company.objects.filter(is_supplier=True)) manufacturer = serializers.CharField(read_only=True) diff --git a/InvenTree/company/templates/company/supplier_part.html b/InvenTree/company/templates/company/supplier_part.html index 1e88babae3..4fc29abe38 100644 --- a/InvenTree/company/templates/company/supplier_part.html +++ b/InvenTree/company/templates/company/supplier_part.html @@ -162,11 +162,24 @@ src="{% static 'img/blank_image.png' %}" {{ part.packaging }}{% include "clip.html" %} {% endif %} - {% if part.pack_size != 1.0 %} + {% if part.pack_quantity %} - {% trans "Pack Quantity" %} - {% decimal part.pack_size %} {% include "part/part_units.html" with part=part.part %} + + {% trans "Units" %} + {% if part.part.units %} + + [ {% include "part/part_units.html" with part=part.part %}] + + {% endif %} + + + {{ part.pack_quantity }} + {% include "clip.html" %} + {% if part.part.units and part.pack_quantity_native %} + + {% endif %} + {% endif %} {% if part.note %} diff --git a/InvenTree/company/test_migrations.py b/InvenTree/company/test_migrations.py index f957d17da3..fb38e9e695 100644 --- a/InvenTree/company/test_migrations.py +++ b/InvenTree/company/test_migrations.py @@ -277,3 +277,51 @@ class TestCurrencyMigration(MigratorTestCase): for pb in PB.objects.all(): # Test that a price has been assigned self.assertIsNotNone(pb.price) + + +class TestSupplierPartQuantity(MigratorTestCase): + """Test that the supplier part quantity is correctly migrated.""" + + migrate_from = ('company', '0058_auto_20230515_0004') + migrate_to = ('company', unit_test.getNewestMigrationFile('company')) + + def prepare(self): + """Prepare a number of SupplierPart objects""" + + Part = self.old_state.apps.get_model('part', 'part') + Company = self.old_state.apps.get_model('company', 'company') + SupplierPart = self.old_state.apps.get_model('company', 'supplierpart') + + self.part = Part.objects.create( + name="PART", description="A purchaseable part", + purchaseable=True, + level=0, tree_id=0, lft=0, rght=0 + ) + + self.supplier = Company.objects.create(name='Supplier', description='A supplier', is_supplier=True) + + self.supplier_parts = [] + + for i in range(10): + self.supplier_parts.append( + SupplierPart.objects.create( + part=self.part, + supplier=self.supplier, + SKU=f'SKU-{i}', + pack_size=i + 1, + ) + ) + + def test_supplier_part_quantity(self): + """Test that the supplier part quantity is correctly migrated.""" + + SupplierPart = self.new_state.apps.get_model('company', 'supplierpart') + + for i, sp in enumerate(SupplierPart.objects.all()): + + self.assertEqual(sp.pack_quantity, str(i + 1)) + self.assertEqual(sp.pack_quantity_native, i + 1) + + # And the 'pack_size' attribute has been removed + with self.assertRaises(AttributeError): + sp.pack_size diff --git a/InvenTree/company/test_supplier_parts.py b/InvenTree/company/test_supplier_parts.py new file mode 100644 index 0000000000..60fef4c799 --- /dev/null +++ b/InvenTree/company/test_supplier_parts.py @@ -0,0 +1,114 @@ +"""Unit tests specific to the SupplierPart model""" + +from decimal import Decimal + +from django.core.exceptions import ValidationError + +from company.models import Company, SupplierPart +from InvenTree.unit_test import InvenTreeTestCase +from part.models import Part + + +class SupplierPartPackUnitsTests(InvenTreeTestCase): + """Unit tests for the SupplierPart pack_quantity field""" + + def test_pack_quantity_dimensionless(self): + """Test valid values for the 'pack_quantity' field""" + + # Create a part without units (dimensionless) + part = Part.objects.create(name='Test Part', description='Test part description', component=True) + + # Create a supplier (company) + company = Company.objects.create(name='Test Company', is_supplier=True) + + # Create a supplier part for this part + sp = SupplierPart.objects.create( + part=part, + supplier=company, + SKU='TEST-SKU' + ) + + # All these values are valid for a dimensionless part + pass_tests = { + '': 1, + '1': 1, + '1.01': 1.01, + '12.000001': 12.000001, + '99.99': 99.99, + } + + # All these values are invalid for a dimensionless part + fail_tests = [ + '1.2m', + '-1', + '0', + '0.0', + '100 feet', + '0 amps' + ] + + for test, expected in pass_tests.items(): + sp.pack_quantity = test + sp.full_clean() + self.assertEqual(sp.pack_quantity_native, expected) + + for test in fail_tests: + sp.pack_quantity = test + with self.assertRaises(ValidationError): + sp.full_clean() + + def test_pack_quantity(self): + """Test pack_quantity for a part with a specified dimension""" + + # Create a part with units 'm' + part = Part.objects.create(name='Test Part', description='Test part description', component=True, units='m') + + # Create a supplier (company) + company = Company.objects.create(name='Test Company', is_supplier=True) + + # Create a supplier part for this part + sp = SupplierPart.objects.create( + part=part, + supplier=company, + SKU='TEST-SKU' + ) + + # All these values are valid for a part with dimesion 'm' + pass_tests = { + '': 1, + '1': 1, + '1m': 1, + '1.01m': 1.01, + '1.01': 1.01, + '5 inches': 0.127, + '27 cm': 0.27, + '3km': 3000, + '14 feet': 4.2672, + '0.5 miles': 804.672, + } + + # All these values are invalid for a part with dimension 'm' + # Either the values are invalid, or the units are incomaptible + fail_tests = [ + '-1', + '-1m', + '0', + '0m', + '12 deg', + '57 amps', + '-12 oz', + '17 yaks', + ] + + for test, expected in pass_tests.items(): + sp.pack_quantity = test + sp.full_clean() + self.assertEqual( + round(Decimal(sp.pack_quantity_native), 10), + round(Decimal(str(expected)), 10) + ) + + for test in fail_tests: + sp.pack_quantity = test + with self.assertRaises(ValidationError): + sp.full_clean() diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py index 5fdd4d337d..f3dc54f16a 100644 --- a/InvenTree/order/models.py +++ b/InvenTree/order/models.py @@ -602,11 +602,13 @@ class PurchaseOrder(TotalPriceMixin, Order): # Create a new stock item if line.part and quantity > 0: - # Take the 'pack_size' of the SupplierPart into account - pack_quantity = Decimal(quantity) * Decimal(line.part.pack_size) + # Calculate received quantity in base units + stock_quantity = line.part.base_quantity(quantity) + # Calculate unit purchase price (in base units) if line.purchase_price: - unit_purchase_price = line.purchase_price / line.part.pack_size + unit_purchase_price = line.purchase_price + unit_purchase_price /= line.part.base_quantity(1) else: unit_purchase_price = None @@ -623,7 +625,7 @@ class PurchaseOrder(TotalPriceMixin, Order): part=line.part.part, supplier_part=line.part, location=location, - quantity=1 if serialize else pack_quantity, + quantity=1 if serialize else stock_quantity, purchase_order=self, status=status, batch=batch_code, @@ -656,7 +658,7 @@ class PurchaseOrder(TotalPriceMixin, Order): ) # Update the number of parts received against the particular line item - # Note that this quantity does *not* take the pack_size into account, it is "number of packs" + # Note that this quantity does *not* take the pack_quantity into account, it is "number of packs" line.received += quantity line.save() diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index e016219b1e..64ca1aaf32 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -558,14 +558,12 @@ class PurchaseOrderLineItemReceiveSerializer(serializers.Serializer): serial_numbers = data.get('serial_numbers', '').strip() base_part = line_item.part.part - pack_size = line_item.part.pack_size - - pack_quantity = pack_size * quantity + base_quantity = line_item.part.base_quantity(quantity) # Does the quantity need to be "integer" (for trackable parts?) if base_part.trackable: - if Decimal(pack_quantity) != int(pack_quantity): + if Decimal(base_quantity) != int(base_quantity): raise ValidationError({ 'quantity': _('An integer quantity must be provided for trackable parts'), }) @@ -576,7 +574,7 @@ class PurchaseOrderLineItemReceiveSerializer(serializers.Serializer): # Pass the serial numbers through to the parent serializer once validated data['serials'] = extract_serial_numbers( serial_numbers, - pack_quantity, + base_quantity, base_part.get_latest_serial_number() ) except DjangoValidationError as e: diff --git a/InvenTree/order/tests.py b/InvenTree/order/tests.py index b3870f1fb4..1f27ef0b9a 100644 --- a/InvenTree/order/tests.py +++ b/InvenTree/order/tests.py @@ -228,7 +228,7 @@ class OrderTest(TestCase): part=prt, supplier=sup, SKU='SKUx10', - pack_size=10, + pack_quantity='10', ) # Create a new supplier part with smaller pack size @@ -236,7 +236,7 @@ class OrderTest(TestCase): part=prt, supplier=sup, SKU='SKUx0.1', - pack_size=0.1, + pack_quantity='0.1', ) # Record values before we start diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index b9a390d9d5..b9a5b4575c 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -486,10 +486,10 @@ class PartScheduling(RetrieveAPI): target_date = line.target_date or line.order.target_date - quantity = max(line.quantity - line.received, 0) + line_quantity = max(line.quantity - line.received, 0) - # Multiply by the pack_size of the SupplierPart - quantity *= line.part.pack_size + # Multiply by the pack quantity of the SupplierPart + quantity = line.part.base_quantity(line_quantity) add_schedule_entry( target_date, @@ -804,19 +804,31 @@ class PartFilter(rest_filters.FilterSet): Uses the django_filters extension framework """ + class Meta: + """Metaclass options for this filter set""" + model = Part + fields = [] + + has_units = rest_filters.BooleanFilter(label='Has units', method='filter_has_units') + + def filter_has_units(self, queryset, name, value): + """Filter by whether the Part has units or not""" + + if str2bool(value): + return queryset.exclude(units='') + else: + return queryset.filter(units='') + # Filter by parts which have (or not) an IPN value has_ipn = rest_filters.BooleanFilter(label='Has IPN', method='filter_has_ipn') def filter_has_ipn(self, queryset, name, value): """Filter by whether the Part has an IPN (internal part number) or not""" - value = str2bool(value) - if value: - queryset = queryset.exclude(IPN='') + if str2bool(value): + return queryset.exclude(IPN='') else: - queryset = queryset.filter(IPN='') - - return queryset + return queryset.filter(IPN='') # Regex filter for name name_regex = rest_filters.CharFilter(label='Filter by name (regex)', field_name='name', lookup_expr='iregex') @@ -836,46 +848,36 @@ class PartFilter(rest_filters.FilterSet): def filter_low_stock(self, queryset, name, value): """Filter by "low stock" status.""" - value = str2bool(value) - if value: + if str2bool(value): # Ignore any parts which do not have a specified 'minimum_stock' level - queryset = queryset.exclude(minimum_stock=0) # Filter items which have an 'in_stock' level lower than 'minimum_stock' - queryset = queryset.filter(Q(in_stock__lt=F('minimum_stock'))) + return queryset.exclude(minimum_stock=0).filter(Q(in_stock__lt=F('minimum_stock'))) else: # Filter items which have an 'in_stock' level higher than 'minimum_stock' - queryset = queryset.filter(Q(in_stock__gte=F('minimum_stock'))) - - return queryset + return queryset.filter(Q(in_stock__gte=F('minimum_stock'))) # has_stock filter has_stock = rest_filters.BooleanFilter(label='Has stock', method='filter_has_stock') def filter_has_stock(self, queryset, name, value): """Filter by whether the Part has any stock""" - value = str2bool(value) - if value: - queryset = queryset.filter(Q(in_stock__gt=0)) + if str2bool(value): + return queryset.filter(Q(in_stock__gt=0)) else: - queryset = queryset.filter(Q(in_stock__lte=0)) - - return queryset + return queryset.filter(Q(in_stock__lte=0)) # unallocated_stock filter unallocated_stock = rest_filters.BooleanFilter(label='Unallocated stock', method='filter_unallocated_stock') def filter_unallocated_stock(self, queryset, name, value): """Filter by whether the Part has unallocated stock""" - value = str2bool(value) - if value: - queryset = queryset.filter(Q(unallocated_stock__gt=0)) + if str2bool(value): + return queryset.filter(Q(unallocated_stock__gt=0)) else: - queryset = queryset.filter(Q(unallocated_stock__lte=0)) - - return queryset + return queryset.filter(Q(unallocated_stock__lte=0)) convert_from = rest_filters.ModelChoiceFilter(label="Can convert from", queryset=Part.objects.all(), method='filter_convert_from') @@ -894,9 +896,7 @@ class PartFilter(rest_filters.FilterSet): children = part.get_descendants(include_self=True) - queryset = queryset.exclude(id__in=children) - - return queryset + return queryset.exclude(id__in=children) ancestor = rest_filters.ModelChoiceFilter(label='Ancestor', queryset=Part.objects.all(), method='filter_ancestor') @@ -904,17 +904,14 @@ class PartFilter(rest_filters.FilterSet): """Limit queryset to descendants of the specified ancestor part""" descendants = part.get_descendants(include_self=False) - queryset = queryset.filter(id__in=descendants) - - return queryset + return queryset.filter(id__in=descendants) variant_of = rest_filters.ModelChoiceFilter(label='Variant Of', queryset=Part.objects.all(), method='filter_variant_of') def filter_variant_of(self, queryset, name, part): """Limit queryset to direct children (variants) of the specified part""" - queryset = queryset.filter(id__in=part.get_children()) - return queryset + return queryset.filter(id__in=part.get_children()) in_bom_for = rest_filters.ModelChoiceFilter(label='In BOM Of', queryset=Part.objects.all(), method='filter_in_bom') @@ -922,39 +919,30 @@ class PartFilter(rest_filters.FilterSet): """Limit queryset to parts in the BOM for the specified part""" bom_parts = part.get_parts_in_bom() - queryset = queryset.filter(id__in=[p.pk for p in bom_parts]) - return queryset + return queryset.filter(id__in=[p.pk for p in bom_parts]) has_pricing = rest_filters.BooleanFilter(label="Has Pricing", method="filter_has_pricing") def filter_has_pricing(self, queryset, name, value): """Filter the queryset based on whether pricing information is available for the sub_part""" - value = str2bool(value) - q_a = Q(pricing_data=None) q_b = Q(pricing_data__overall_min=None, pricing_data__overall_max=None) - if value: - queryset = queryset.exclude(q_a | q_b) + if str2bool(value): + return queryset.exclude(q_a | q_b) else: - queryset = queryset.filter(q_a | q_b) - - return queryset + return queryset.filter(q_a | q_b) stocktake = rest_filters.BooleanFilter(label="Has stocktake", method='filter_has_stocktake') def filter_has_stocktake(self, queryset, name, value): """Filter the queryset based on whether stocktake data is available""" - value = str2bool(value) - - if (value): - queryset = queryset.exclude(last_stocktake=None) + if str2bool(value): + return queryset.exclude(last_stocktake=None) else: - queryset = queryset.filter(last_stocktake=None) - - return queryset + return queryset.filter(last_stocktake=None) is_template = rest_filters.BooleanFilter() @@ -1259,6 +1247,7 @@ class PartList(PartMixin, APIDownloadMixin, ListCreateAPI): 'unallocated_stock', 'category', 'last_stocktake', + 'units', ] # Default ordering diff --git a/InvenTree/part/filters.py b/InvenTree/part/filters.py index 8b690f56cd..7d12eed71f 100644 --- a/InvenTree/part/filters.py +++ b/InvenTree/part/filters.py @@ -40,7 +40,7 @@ def annotate_on_order_quantity(reference: str = ''): - Purchase order must be 'active' or 'pending' - Received quantity must be less than line item quantity - Note that in addition to the 'quantity' on order, we must also take into account 'pack_size'. + Note that in addition to the 'quantity' on order, we must also take into account 'pack_quantity'. """ # Filter only 'active' purhase orders @@ -53,7 +53,7 @@ def annotate_on_order_quantity(reference: str = ''): return Coalesce( SubquerySum( ExpressionWrapper( - F(f'{reference}supplier_parts__purchase_order_line_items__quantity') * F(f'{reference}supplier_parts__pack_size'), + F(f'{reference}supplier_parts__purchase_order_line_items__quantity') * F(f'{reference}supplier_parts__pack_quantity_native'), output_field=DecimalField(), ), filter=order_filter @@ -63,7 +63,7 @@ def annotate_on_order_quantity(reference: str = ''): ) - Coalesce( SubquerySum( ExpressionWrapper( - F(f'{reference}supplier_parts__purchase_order_line_items__received') * F(f'{reference}supplier_parts__pack_size'), + F(f'{reference}supplier_parts__purchase_order_line_items__received') * F(f'{reference}supplier_parts__pack_quantity_native'), output_field=DecimalField(), ), filter=order_filter diff --git a/InvenTree/part/migrations/0109_auto_20230517_1048.py b/InvenTree/part/migrations/0109_auto_20230517_1048.py index abb359119b..01e3ad0026 100644 --- a/InvenTree/part/migrations/0109_auto_20230517_1048.py +++ b/InvenTree/part/migrations/0109_auto_20230517_1048.py @@ -19,10 +19,14 @@ def update_template_units(apps, schema_editor): n_templates = PartParameterTemplate.objects.count() + if n_templates == 0: + # Escape early + return + ureg = InvenTree.conversion.get_unit_registry() n_converted = 0 - invalid_units = [] + invalid_units = set() for template in PartParameterTemplate.objects.all(): @@ -69,8 +73,8 @@ def update_template_units(apps, schema_editor): break if not found: - print(f"warningCould not find unit match for {template.units}") - invalid_units.append(template.units) + print(f"warning: Could not find unit match for {template.units}") + invalid_units.add(template.units) print(f"Updated units for {n_templates} parameter templates") diff --git a/InvenTree/part/migrations/0110_alter_part_units.py b/InvenTree/part/migrations/0110_alter_part_units.py new file mode 100644 index 0000000000..4ddad84858 --- /dev/null +++ b/InvenTree/part/migrations/0110_alter_part_units.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.19 on 2023-05-19 03:31 + +import InvenTree.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0109_auto_20230517_1048'), + ] + + operations = [ + migrations.AlterField( + model_name='part', + name='units', + field=models.CharField(blank=True, default='', help_text='Units of measure for this part', max_length=20, null=True, validators=[InvenTree.validators.validate_physical_units], verbose_name='Units'), + ), + ] diff --git a/InvenTree/part/migrations/0111_auto_20230521_1350.py b/InvenTree/part/migrations/0111_auto_20230521_1350.py new file mode 100644 index 0000000000..10b1a66f69 --- /dev/null +++ b/InvenTree/part/migrations/0111_auto_20230521_1350.py @@ -0,0 +1,93 @@ +# Generated by Django 3.2.19 on 2023-05-21 13:50 + +import pint + +from django.core.exceptions import ValidationError +from django.db import migrations + +import InvenTree.conversion + + +def migrate_part_units(apps, schema_editor): + """Update the units field for each Part object: + + - Check if the units are valid + - Attempt to convert to valid units (if possible) + """ + + Part = apps.get_model('part', 'Part') + + parts = Part.objects.exclude(units=None).exclude(units='') + n_parts = parts.count() + + if n_parts == 0: + # Escape early + return + + ureg = InvenTree.conversion.get_unit_registry() + + invalid_units = set() + n_converted = 0 + + for part in parts: + + # Override '%' units (which are invalid) + if part.units == '%': + part.units = 'percent' + part.save() + continue + + # Test if unit is 'valid' + try: + ureg.Unit(part.units) + continue + except pint.errors.UndefinedUnitError: + pass + + # Check a lower-case version + try: + ureg.Unit(part.units.lower()) + print(f"Found unit match: {part.units} -> {part.units.lower()}") + part.units = part.units.lower() + part.save() + n_converted += 1 + continue + except pint.errors.UndefinedUnitError: + pass + + found = False + + # Attempt to convert to a valid unit + for unit in ureg: + if unit.lower() == part.units.lower(): + print("Found unit match: {part.units} -> {unit}") + part.units = str(unit) + part.save() + n_converted += 1 + found = True + break + + if not found: + print(f"Warning: Invalid units for part '{part}': {part.units}") + invalid_units.add(part.units) + + print(f"Updated units for {n_parts} parts") + + if n_converted > 0: + print(f"Converted units for {n_converted} parts") + + if len(invalid_units) > 0: + print(f"Found {len(invalid_units)} invalid units:") + for unit in invalid_units: + print(f" - {unit}") + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0110_alter_part_units'), + ] + + operations = [ + migrations.RunPython(code=migrate_part_units, reverse_code=migrations.RunPython.noop) + ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 4e0accdfdf..8e8b7569ef 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -984,6 +984,9 @@ class Part(InvenTreeBarcodeMixin, InvenTreeNotesMixin, MetadataMixin, MPTTModel) blank=True, null=True, verbose_name=_('Units'), help_text=_('Units of measure for this part'), + validators=[ + validators.validate_physical_units, + ] ) assembly = models.BooleanField( @@ -2141,7 +2144,7 @@ class Part(InvenTreeBarcodeMixin, InvenTreeNotesMixin, MetadataMixin, MPTTModel) def on_order(self): """Return the total number of items on order for this part. - Note that some supplier parts may have a different pack_size attribute, + Note that some supplier parts may have a different pack_quantity attribute, and this needs to be taken into account! """ @@ -2160,7 +2163,7 @@ class Part(InvenTreeBarcodeMixin, InvenTreeNotesMixin, MetadataMixin, MPTTModel) remaining = line.quantity - line.received if remaining > 0: - quantity += remaining * sp.pack_size + quantity += sp.base_quantity(remaining) return quantity @@ -2291,6 +2294,13 @@ def after_save_part(sender, instance: Part, created, **kwargs): # Can sometimes occur if the referenced Part has issues pass + # Schedule a background task to rebuild any supplier parts + InvenTree.tasks.offload_task( + part_tasks.rebuild_supplier_parts, + instance.pk, + force_async=True + ) + class PartPricing(common.models.MetaMixin): """Model for caching min/max pricing information for a particular Part @@ -2560,7 +2570,7 @@ class PartPricing(common.models.MetaMixin): continue # Take supplier part pack size into account - purchase_cost = self.convert(line.purchase_price / line.part.pack_size) + purchase_cost = self.convert(line.purchase_price / line.part.pack_quantity_native) if purchase_cost is None: continue @@ -2651,7 +2661,7 @@ class PartPricing(common.models.MetaMixin): continue # Ensure we take supplier part pack size into account - cost = self.convert(pb.price / sp.pack_size) + cost = self.convert(pb.price / sp.pack_quantity_native) if cost is None: continue @@ -3359,8 +3369,8 @@ def post_save_part_parameter_template(sender, instance, created, **kwargs): if InvenTree.ready.canAppAccessDatabase() and not InvenTree.ready.isImportingData(): - # Schedule a background task to rebuild the parameters against this template if not created: + # Schedule a background task to rebuild the parameters against this template InvenTree.tasks.offload_task( part_tasks.rebuild_parameters, instance.pk, diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 9d7b76275e..98f97906c4 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -20,21 +20,11 @@ from taggit.serializers import TagListSerializerField import common.models import company.models import InvenTree.helpers +import InvenTree.serializers import InvenTree.status import part.filters import part.tasks import stock.models -from InvenTree.serializers import (DataFileExtractSerializer, - DataFileUploadSerializer, - InvenTreeAttachmentSerializer, - InvenTreeAttachmentSerializerField, - InvenTreeCurrencySerializer, - InvenTreeDecimalField, - InvenTreeImageSerializerField, - InvenTreeModelSerializer, - InvenTreeMoneySerializer, - InvenTreeTagModelSerializer, - RemoteImageMixin, UserSerializer) from InvenTree.status_codes import BuildStatus from InvenTree.tasks import offload_task @@ -48,7 +38,7 @@ from .models import (BomItem, BomItemSubstitute, Part, PartAttachment, logger = logging.getLogger("inventree") -class CategorySerializer(InvenTreeModelSerializer): +class CategorySerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for PartCategory.""" class Meta: @@ -94,7 +84,7 @@ class CategorySerializer(InvenTreeModelSerializer): starred = serializers.SerializerMethodField() -class CategoryTree(InvenTreeModelSerializer): +class CategoryTree(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for PartCategory tree.""" class Meta: @@ -108,19 +98,19 @@ class CategoryTree(InvenTreeModelSerializer): ] -class PartAttachmentSerializer(InvenTreeAttachmentSerializer): +class PartAttachmentSerializer(InvenTree.serializers.InvenTreeAttachmentSerializer): """Serializer for the PartAttachment class.""" class Meta: """Metaclass defining serializer fields""" model = PartAttachment - fields = InvenTreeAttachmentSerializer.attachment_fields([ + fields = InvenTree.serializers.InvenTreeAttachmentSerializer.attachment_fields([ 'part', ]) -class PartTestTemplateSerializer(InvenTreeModelSerializer): +class PartTestTemplateSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for the PartTestTemplate class.""" class Meta: @@ -141,7 +131,7 @@ class PartTestTemplateSerializer(InvenTreeModelSerializer): key = serializers.CharField(read_only=True) -class PartSalePriceSerializer(InvenTreeModelSerializer): +class PartSalePriceSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for sale prices for Part model.""" class Meta: @@ -155,14 +145,14 @@ class PartSalePriceSerializer(InvenTreeModelSerializer): 'price_currency', ] - quantity = InvenTreeDecimalField() + quantity = InvenTree.serializers.InvenTreeDecimalField() - price = InvenTreeMoneySerializer(allow_null=True) + price = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True) - price_currency = InvenTreeCurrencySerializer(help_text=_('Purchase currency of this stock item')) + price_currency = InvenTree.serializers.InvenTreeCurrencySerializer(help_text=_('Purchase currency of this stock item')) -class PartInternalPriceSerializer(InvenTreeModelSerializer): +class PartInternalPriceSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for internal prices for Part model.""" class Meta: @@ -176,13 +166,13 @@ class PartInternalPriceSerializer(InvenTreeModelSerializer): 'price_currency', ] - quantity = InvenTreeDecimalField() + quantity = InvenTree.serializers.InvenTreeDecimalField() - price = InvenTreeMoneySerializer( + price = InvenTree.serializers.InvenTreeMoneySerializer( allow_null=True ) - price_currency = InvenTreeCurrencySerializer(help_text=_('Purchase currency of this stock item')) + price_currency = InvenTree.serializers.InvenTreeCurrencySerializer(help_text=_('Purchase currency of this stock item')) class PartThumbSerializer(serializers.Serializer): @@ -195,7 +185,7 @@ class PartThumbSerializer(serializers.Serializer): count = serializers.IntegerField(read_only=True) -class PartThumbSerializerUpdate(InvenTreeModelSerializer): +class PartThumbSerializerUpdate(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for updating Part thumbnail.""" class Meta: @@ -212,10 +202,10 @@ class PartThumbSerializerUpdate(InvenTreeModelSerializer): raise serializers.ValidationError("File is not an image") return value - image = InvenTreeAttachmentSerializerField(required=True) + image = InvenTree.serializers.InvenTreeAttachmentSerializerField(required=True) -class PartParameterTemplateSerializer(InvenTreeModelSerializer): +class PartParameterTemplateSerializer(InvenTree.serializers.InvenTreeModelSerializer): """JSON serializer for the PartParameterTemplate model.""" class Meta: @@ -229,7 +219,7 @@ class PartParameterTemplateSerializer(InvenTreeModelSerializer): ] -class PartParameterSerializer(InvenTreeModelSerializer): +class PartParameterSerializer(InvenTree.serializers.InvenTreeModelSerializer): """JSON serializers for the PartParameter model.""" class Meta: @@ -260,7 +250,7 @@ class PartParameterSerializer(InvenTreeModelSerializer): template_detail = PartParameterTemplateSerializer(source='template', many=False, read_only=True) -class PartBriefSerializer(InvenTreeModelSerializer): +class PartBriefSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for Part (brief detail)""" class Meta: @@ -295,8 +285,8 @@ class PartBriefSerializer(InvenTreeModelSerializer): thumbnail = serializers.CharField(source='get_thumbnail_url', read_only=True) # Pricing fields - pricing_min = InvenTreeMoneySerializer(source='pricing_data.overall_min', allow_null=True, read_only=True) - pricing_max = InvenTreeMoneySerializer(source='pricing_data.overall_max', allow_null=True, read_only=True) + pricing_min = InvenTree.serializers.InvenTreeMoneySerializer(source='pricing_data.overall_min', allow_null=True, read_only=True) + pricing_max = InvenTree.serializers.InvenTreeMoneySerializer(source='pricing_data.overall_max', allow_null=True, read_only=True) class DuplicatePartSerializer(serializers.Serializer): @@ -406,7 +396,7 @@ class InitialSupplierSerializer(serializers.Serializer): return data -class PartSerializer(RemoteImageMixin, InvenTreeTagModelSerializer): +class PartSerializer(InvenTree.serializers.RemoteImageMixin, InvenTree.serializers.InvenTreeTagModelSerializer): """Serializer for complete detail information of a part. Used when displaying all details of a single component. @@ -607,7 +597,7 @@ class PartSerializer(RemoteImageMixin, InvenTreeTagModelSerializer): stock_item_count = serializers.IntegerField(read_only=True) suppliers = serializers.IntegerField(read_only=True) - image = InvenTreeImageSerializerField(required=False, allow_null=True) + image = InvenTree.serializers.InvenTreeImageSerializerField(required=False, allow_null=True) thumbnail = serializers.CharField(source='get_thumbnail_url', read_only=True) starred = serializers.SerializerMethodField() @@ -615,8 +605,8 @@ class PartSerializer(RemoteImageMixin, InvenTreeTagModelSerializer): category = serializers.PrimaryKeyRelatedField(queryset=PartCategory.objects.all()) # Pricing fields - pricing_min = InvenTreeMoneySerializer(source='pricing_data.overall_min', allow_null=True, read_only=True) - pricing_max = InvenTreeMoneySerializer(source='pricing_data.overall_max', allow_null=True, read_only=True) + pricing_min = InvenTree.serializers.InvenTreeMoneySerializer(source='pricing_data.overall_min', allow_null=True, read_only=True) + pricing_max = InvenTree.serializers.InvenTreeMoneySerializer(source='pricing_data.overall_max', allow_null=True, read_only=True) parameters = PartParameterSerializer( many=True, @@ -771,7 +761,7 @@ class PartSerializer(RemoteImageMixin, InvenTreeTagModelSerializer): return self.instance -class PartStocktakeSerializer(InvenTreeModelSerializer): +class PartStocktakeSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for the PartStocktake model""" class Meta: @@ -800,13 +790,13 @@ class PartStocktakeSerializer(InvenTreeModelSerializer): quantity = serializers.FloatField() - user_detail = UserSerializer(source='user', read_only=True, many=False) + user_detail = InvenTree.serializers.UserSerializer(source='user', read_only=True, many=False) - cost_min = InvenTreeMoneySerializer(allow_null=True) - cost_min_currency = InvenTreeCurrencySerializer() + cost_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True) + cost_min_currency = InvenTree.serializers.InvenTreeCurrencySerializer() - cost_max = InvenTreeMoneySerializer(allow_null=True) - cost_max_currency = InvenTreeCurrencySerializer() + cost_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True) + cost_max_currency = InvenTree.serializers.InvenTreeCurrencySerializer() def save(self): """Called when this serializer is saved""" @@ -820,7 +810,7 @@ class PartStocktakeSerializer(InvenTreeModelSerializer): super().save() -class PartStocktakeReportSerializer(InvenTreeModelSerializer): +class PartStocktakeReportSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for stocktake report class""" class Meta: @@ -836,9 +826,9 @@ class PartStocktakeReportSerializer(InvenTreeModelSerializer): 'user_detail', ] - user_detail = UserSerializer(source='user', read_only=True, many=False) + user_detail = InvenTree.serializers.UserSerializer(source='user', read_only=True, many=False) - report = InvenTreeAttachmentSerializerField(read_only=True) + report = InvenTree.serializers.InvenTreeAttachmentSerializerField(read_only=True) class PartStocktakeReportGenerateSerializer(serializers.Serializer): @@ -906,7 +896,7 @@ class PartStocktakeReportGenerateSerializer(serializers.Serializer): ) -class PartPricingSerializer(InvenTreeModelSerializer): +class PartPricingSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for Part pricing information""" class Meta: @@ -942,29 +932,29 @@ class PartPricingSerializer(InvenTreeModelSerializer): scheduled_for_update = serializers.BooleanField(read_only=True) # Custom serializers - bom_cost_min = InvenTreeMoneySerializer(allow_null=True, read_only=True) - bom_cost_max = InvenTreeMoneySerializer(allow_null=True, read_only=True) + bom_cost_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) + bom_cost_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) - purchase_cost_min = InvenTreeMoneySerializer(allow_null=True, read_only=True) - purchase_cost_max = InvenTreeMoneySerializer(allow_null=True, read_only=True) + purchase_cost_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) + purchase_cost_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) - internal_cost_min = InvenTreeMoneySerializer(allow_null=True, read_only=True) - internal_cost_max = InvenTreeMoneySerializer(allow_null=True, read_only=True) + internal_cost_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) + internal_cost_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) - supplier_price_min = InvenTreeMoneySerializer(allow_null=True, read_only=True) - supplier_price_max = InvenTreeMoneySerializer(allow_null=True, read_only=True) + supplier_price_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) + supplier_price_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) - variant_cost_min = InvenTreeMoneySerializer(allow_null=True, read_only=True) - variant_cost_max = InvenTreeMoneySerializer(allow_null=True, read_only=True) + variant_cost_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) + variant_cost_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) - overall_min = InvenTreeMoneySerializer(allow_null=True, read_only=True) - overall_max = InvenTreeMoneySerializer(allow_null=True, read_only=True) + overall_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) + overall_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) - sale_price_min = InvenTreeMoneySerializer(allow_null=True, read_only=True) - sale_price_max = InvenTreeMoneySerializer(allow_null=True, read_only=True) + sale_price_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) + sale_price_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) - sale_history_min = InvenTreeMoneySerializer(allow_null=True, read_only=True) - sale_history_max = InvenTreeMoneySerializer(allow_null=True, read_only=True) + sale_history_min = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) + sale_history_max = InvenTree.serializers.InvenTreeMoneySerializer(allow_null=True, read_only=True) update = serializers.BooleanField( write_only=True, @@ -984,7 +974,7 @@ class PartPricingSerializer(InvenTreeModelSerializer): pricing.update_pricing() -class PartRelationSerializer(InvenTreeModelSerializer): +class PartRelationSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for a PartRelated model.""" class Meta: @@ -1002,7 +992,7 @@ class PartRelationSerializer(InvenTreeModelSerializer): part_2_detail = PartSerializer(source='part_2', read_only=True, many=False) -class PartStarSerializer(InvenTreeModelSerializer): +class PartStarSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for a PartStar object.""" class Meta: @@ -1020,7 +1010,7 @@ class PartStarSerializer(InvenTreeModelSerializer): username = serializers.CharField(source='user.username', read_only=True) -class BomItemSubstituteSerializer(InvenTreeModelSerializer): +class BomItemSubstituteSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for the BomItemSubstitute class.""" class Meta: @@ -1036,7 +1026,7 @@ class BomItemSubstituteSerializer(InvenTreeModelSerializer): part_detail = PartBriefSerializer(source='part', read_only=True, many=False) -class BomItemSerializer(InvenTreeModelSerializer): +class BomItemSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for BomItem object.""" class Meta: @@ -1087,7 +1077,7 @@ class BomItemSerializer(InvenTreeModelSerializer): if sub_part_detail is not True: self.fields.pop('sub_part_detail') - quantity = InvenTreeDecimalField(required=True) + quantity = InvenTree.serializers.InvenTreeDecimalField(required=True) def validate_quantity(self, quantity): """Perform validation for the BomItem quantity field""" @@ -1109,8 +1099,8 @@ class BomItemSerializer(InvenTreeModelSerializer): on_order = serializers.FloatField(read_only=True) # Cached pricing fields - pricing_min = InvenTreeMoneySerializer(source='sub_part.pricing.overall_min', allow_null=True, read_only=True) - pricing_max = InvenTreeMoneySerializer(source='sub_part.pricing.overall_max', allow_null=True, read_only=True) + pricing_min = InvenTree.serializers.InvenTreeMoneySerializer(source='sub_part.pricing.overall_min', allow_null=True, read_only=True) + pricing_max = InvenTree.serializers.InvenTreeMoneySerializer(source='sub_part.pricing.overall_max', allow_null=True, read_only=True) # Annotated fields for available stock available_stock = serializers.FloatField(read_only=True) @@ -1212,7 +1202,7 @@ class BomItemSerializer(InvenTreeModelSerializer): return queryset -class CategoryParameterTemplateSerializer(InvenTreeModelSerializer): +class CategoryParameterTemplateSerializer(InvenTree.serializers.InvenTreeModelSerializer): """Serializer for the PartCategoryParameterTemplate model.""" class Meta: @@ -1297,7 +1287,7 @@ class PartCopyBOMSerializer(serializers.Serializer): ) -class BomImportUploadSerializer(DataFileUploadSerializer): +class BomImportUploadSerializer(InvenTree.serializers.DataFileUploadSerializer): """Serializer for uploading a file and extracting data from it.""" TARGET_MODEL = BomItem @@ -1333,7 +1323,7 @@ class BomImportUploadSerializer(DataFileUploadSerializer): part.bom_items.all().delete() -class BomImportExtractSerializer(DataFileExtractSerializer): +class BomImportExtractSerializer(InvenTree.serializers.DataFileExtractSerializer): """Serializer class for exatracting BOM data from an uploaded file. The parent class DataFileExtractSerializer does most of the heavy lifting here. diff --git a/InvenTree/part/tasks.py b/InvenTree/part/tasks.py index e089852906..69ec85485f 100644 --- a/InvenTree/part/tasks.py +++ b/InvenTree/part/tasks.py @@ -7,6 +7,7 @@ import time from datetime import datetime, timedelta from django.contrib.auth.models import User +from django.core.exceptions import ValidationError from django.core.files.base import ContentFile from django.utils.translation import gettext_lazy as _ @@ -18,6 +19,7 @@ from djmoney.money import Money import common.models import common.notifications import common.settings +import company.models import InvenTree.helpers import InvenTree.tasks import part.models @@ -433,7 +435,7 @@ def scheduled_stocktake_reports(): def rebuild_parameters(template_id): """Rebuild all parameters for a given template. - This method is called when a base template is changed, + This function is called when a base template is changed, which may cause the base unit to be adjusted. """ @@ -452,7 +454,35 @@ def rebuild_parameters(template_id): parameter.calculate_numeric_value() if value_old != parameter.data_numeric: + parameter.full_clean() parameter.save() n += 1 logger.info(f"Rebuilt {n} parameters for template '{template.name}'") + + +def rebuild_supplier_parts(part_id): + """Rebuild all SupplierPart objects for a given part. + + This function is called when a bart part is changed, + which may cause the native units of any supplier parts to be updated + """ + + try: + prt = part.models.Part.objects.get(pk=part_id) + except part.models.Part.DoesNotExist: + return + + supplier_parts = company.models.SupplierPart.objects.filter(part=prt) + + n = supplier_parts.count() + + for supplier_part in supplier_parts: + # Re-save the part, to ensure that the units have updated correctly + try: + supplier_part.full_clean() + supplier_part.save() + except ValidationError: + pass + + logger.info(f"Rebuilt {n} supplier parts for part '{prt.name}'") diff --git a/InvenTree/part/test_api.py b/InvenTree/part/test_api.py index e2bfbb99ec..3ee62f88ff 100644 --- a/InvenTree/part/test_api.py +++ b/InvenTree/part/test_api.py @@ -2144,7 +2144,7 @@ class PartAPIAggregationTest(InvenTreeAPITestCase): part=p, supplier=supplier, SKU=f"PNT-{color}-{pk_sz}L", - pack_size=pk_sz, + pack_quantity=str(pk_sz), ) self.assertEqual(p.supplier_parts.count(), 4) @@ -2206,7 +2206,7 @@ class PartAPIAggregationTest(InvenTreeAPITestCase): remaining = line_item.quantity - line_item.received if remaining > 0: - on_order += remaining * sp.pack_size + on_order += sp.base_quantity(remaining) # The annotated quantity must be equal to the hand-calculated quantity self.assertEqual(on_order, item['ordering']) diff --git a/InvenTree/part/test_migrations.py b/InvenTree/part/test_migrations.py index cf51d67bee..7f58c4f102 100644 --- a/InvenTree/part/test_migrations.py +++ b/InvenTree/part/test_migrations.py @@ -88,7 +88,7 @@ class TestParameterMigrations(MigratorTestCase): """Unit test for part parameter migrations""" migrate_from = ('part', '0106_part_tags') - migrate_to = ('part', '0109_auto_20230517_1048') + migrate_to = ('part', unit_test.getNewestMigrationFile('part')) def prepare(self): """Create some parts, and templates with parameters""" @@ -154,3 +154,38 @@ class TestParameterMigrations(MigratorTestCase): p4 = PartParameter.objects.get(part=b, template=t2) self.assertEqual(p4.data, 'abc') self.assertEqual(p4.data_numeric, None) + + +class PartUnitsMigrationTest(MigratorTestCase): + """Test for data migration of Part.units field""" + + migrate_from = ('part', '0109_auto_20230517_1048') + migrate_to = ('part', unit_test.getNewestMigrationFile('part')) + + def prepare(self): + """Prepare some parts with units""" + + Part = self.old_state.apps.get_model('part', 'part') + + units = ['mm', 'INCH', '', '%'] + + for idx, unit in enumerate(units): + Part.objects.create( + name=f'Part {idx + 1}', description=f'My part at index {idx}', units=unit, + level=0, lft=0, rght=0, tree_id=0, + ) + + def test_units_migration(self): + """Test that the units have migrated OK""" + + Part = self.new_state.apps.get_model('part', 'part') + + part_1 = Part.objects.get(name='Part 1') + part_2 = Part.objects.get(name='Part 2') + part_3 = Part.objects.get(name='Part 3') + part_4 = Part.objects.get(name='Part 4') + + self.assertEqual(part_1.units, 'mm') + self.assertEqual(part_2.units, 'inch') + self.assertEqual(part_3.units, '') + self.assertEqual(part_4.units, 'percent') diff --git a/InvenTree/part/test_pricing.py b/InvenTree/part/test_pricing.py index 8859acca47..9c62cba977 100644 --- a/InvenTree/part/test_pricing.py +++ b/InvenTree/part/test_pricing.py @@ -2,6 +2,7 @@ from django.core.exceptions import ObjectDoesNotExist +from djmoney.contrib.exchange.models import convert_money from djmoney.money import Money import common.models @@ -25,10 +26,13 @@ class PartPricingTests(InvenTreeTestCase): self.generate_exchange_rates() # Create a new part for performing pricing calculations + # We will use 'metres' for the UOM here + # Some SupplierPart instances will have different units! self.part = part.models.Part.objects.create( name='PP', - description='A part with pricing', - assembly=True + description='A part with pricing, measured in metres', + assembly=True, + units='m' ) def create_price_breaks(self): @@ -44,8 +48,12 @@ class PartPricingTests(InvenTreeTestCase): supplier=self.supplier_1, part=self.part, SKU='SUP_1', + pack_quantity='200 cm', ) + # Native pack quantity should be 2m + self.assertEqual(self.sp_1.pack_quantity_native, 2) + company.models.SupplierPriceBreak.objects.create( part=self.sp_1, quantity=1, @@ -63,16 +71,22 @@ class PartPricingTests(InvenTreeTestCase): supplier=self.supplier_2, part=self.part, SKU='SUP_2', - pack_size=2.5, + pack_quantity='2.5', ) + # Native pack quantity should be 2.5m + self.assertEqual(self.sp_2.pack_quantity_native, 2.5) + self.sp_3 = company.models.SupplierPart.objects.create( supplier=self.supplier_2, part=self.part, SKU='SUP_3', - pack_size=10 + pack_quantity='10 inches', ) + # Native pack quantity should be 0.254m + self.assertEqual(self.sp_3.pack_quantity_native, 0.254) + company.models.SupplierPriceBreak.objects.create( part=self.sp_2, quantity=5, @@ -162,8 +176,8 @@ class PartPricingTests(InvenTreeTestCase): pricing.update_pricing() - self.assertEqual(pricing.overall_min, Money('2.014667', 'USD')) - self.assertEqual(pricing.overall_max, Money('6.117647', 'USD')) + self.assertAlmostEqual(float(pricing.overall_min.amount), 2.015, places=2) + self.assertAlmostEqual(float(pricing.overall_max.amount), 3.06, places=2) # Delete all supplier parts and re-calculate self.part.supplier_parts.all().delete() @@ -319,11 +333,11 @@ class PartPricingTests(InvenTreeTestCase): # Add some line items to the order - # $5 AUD each + # $5 AUD each @ 2.5m per unit = $2 AUD per metre line_1 = po.add_line_item(self.sp_2, quantity=10, purchase_price=Money(5, 'AUD')) - # $30 CAD each (but pack_size is 10, so really $3 CAD each) - line_2 = po.add_line_item(self.sp_3, quantity=5, purchase_price=Money(30, 'CAD')) + # $3 CAD each @ 10 inches per unit = $0.3 CAD per inch = $11.81 CAD per metre + line_2 = po.add_line_item(self.sp_3, quantity=5, purchase_price=Money(3, 'CAD')) pricing.update_purchase_cost() @@ -349,8 +363,20 @@ class PartPricingTests(InvenTreeTestCase): pricing.update_purchase_cost() - self.assertEqual(pricing.purchase_cost_min, Money('1.333333', 'USD')) - self.assertEqual(pricing.purchase_cost_max, Money('1.764706', 'USD')) + min_cost_aud = convert_money(pricing.purchase_cost_min, 'AUD') + max_cost_cad = convert_money(pricing.purchase_cost_max, 'CAD') + + # Min cost in AUD = $2 AUD per metre + self.assertAlmostEqual(float(min_cost_aud.amount), 2, places=2) + + # Min cost in USD + self.assertAlmostEqual(float(pricing.purchase_cost_min.amount), 1.3333, places=2) + + # Max cost in CAD = $11.81 CAD per metre + self.assertAlmostEqual(float(max_cost_cad.amount), 11.81, places=2) + + # Max cost in USD + self.assertAlmostEqual(float(pricing.purchase_cost_max.amount), 6.95, places=2) def test_delete_with_pricing(self): """Test for deleting a part which has pricing information""" diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 803ccb979f..c5a8cb838c 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -613,7 +613,7 @@ class StockList(APIDownloadMixin, ListCreateDestroyAPIView): 'supplier_part': _('The given supplier part does not exist'), }) - if supplier_part.pack_size != 1: + if supplier_part.base_quantity() != 1: # Skip this check if pack size is 1 - makes no difference # use_pack_size = True -> Multiply quantity by pack size # use_pack_size = False -> Use quantity as is @@ -623,10 +623,9 @@ class StockList(APIDownloadMixin, ListCreateDestroyAPIView): }) else: if bool(data.get('use_pack_size')): - data['quantity'] = int(quantity) * float(supplier_part.pack_size) - quantity = data.get('quantity', None) + quantity = data['quantity'] = supplier_part.base_quantity(quantity) # Divide purchase price by pack size, to save correct price per stock item - data['purchase_price'] = float(data['purchase_price']) / float(supplier_part.pack_size) + data['purchase_price'] = float(data['purchase_price']) / float(supplier_part.pack_quantity_native) # Now remove the flag from data, so that it doesn't interfere with saving # Do this regardless of results above diff --git a/InvenTree/stock/migrations/0094_auto_20230220_0025.py b/InvenTree/stock/migrations/0094_auto_20230220_0025.py index 9d4de5a438..79c08f0953 100644 --- a/InvenTree/stock/migrations/0094_auto_20230220_0025.py +++ b/InvenTree/stock/migrations/0094_auto_20230220_0025.py @@ -2,6 +2,7 @@ import logging +from django.core.exceptions import FieldError from django.db import migrations logger = logging.getLogger('inventree') @@ -38,10 +39,13 @@ def fix_purchase_price(apps, schema_editor): supplier_part=None ).exclude( purchase_price=None - ).exclude( - supplier_part__pack_size=1 ) + try: + items = items.exclude(supplier_part__pack_size=1) + except FieldError: + pass + n_updated = 0 for item in items: diff --git a/InvenTree/stock/test_api.py b/InvenTree/stock/test_api.py index 38fb8f912b..886678d5be 100644 --- a/InvenTree/stock/test_api.py +++ b/InvenTree/stock/test_api.py @@ -698,6 +698,7 @@ class StockItemTest(StockAPITestCase): }, expected_code=201 ) + # Reload part, count stock again part_4 = part.models.Part.objects.get(pk=4) self.assertEqual(part_4.available_stock, current_count + 3) diff --git a/InvenTree/templates/js/translated/company.js b/InvenTree/templates/js/translated/company.js index 53180d26c7..d187d582e4 100644 --- a/InvenTree/templates/js/translated/company.js +++ b/InvenTree/templates/js/translated/company.js @@ -138,7 +138,7 @@ function supplierPartFields(options={}) { packaging: { icon: 'fa-box', }, - pack_size: {}, + pack_quantity: {}, }; if (options.part) { @@ -1242,17 +1242,24 @@ function loadSupplierPartTable(table, url, options) { sortable: true, }, { - field: 'pack_size', + field: 'pack_quantity', title: '{% trans "Pack Quantity" %}', sortable: true, formatter: function(value, row) { - var output = `${value}`; - if (row.part_detail && row.part_detail.units) { - output += ` ${row.part_detail.units}`; + let html = ''; + + if (value) { + html = value; + } else { + html = '-'; } - return output; + if (row.part_detail && row.part_detail.units) { + html += ``; + } + + return html; } }, { diff --git a/InvenTree/templates/js/translated/part.js b/InvenTree/templates/js/translated/part.js index 9c629caf62..ca828f70bc 100644 --- a/InvenTree/templates/js/translated/part.js +++ b/InvenTree/templates/js/translated/part.js @@ -1588,13 +1588,12 @@ function loadPartPurchaseOrderTable(table, part_id, options={}) { formatter: function(value, row) { let data = value; - if (row.supplier_part_detail.pack_size != 1.0) { - let pack_size = row.supplier_part_detail.pack_size; - let total = value * pack_size; + if (row.supplier_part_detail.pack_quantity_native != 1.0) { + let total = value * row.supplier_part_detail.pack_quantity_native; data += makeIconBadge( 'fa-info-circle icon-blue', - `{% trans "Pack Quantity" %}: ${pack_size} - {% trans "Total Quantity" %}: ${total}` + `{% trans "Pack Quantity" %}: ${formatDecimal(row.pack_quantity)} - {% trans "Total Quantity" %}: ${total}` ); } @@ -1647,10 +1646,9 @@ function loadPartPurchaseOrderTable(table, part_id, options={}) { formatter: function(value, row) { var data = value; - if (value > 0 && row.supplier_part_detail.pack_size != 1.0) { - var pack_size = row.supplier_part_detail.pack_size; - var total = value * pack_size; - data += ``; + if (value > 0 && row.supplier_part_detail.pack_quantity_native != 1.0) { + let total = value * row.supplier_part_detail.pack_quantity_native; + data += ``; } return data; @@ -2038,6 +2036,12 @@ function loadPartTable(table, url, options={}) { } }); + columns.push({ + field: 'units', + title: '{% trans "Units" %}', + sortable: true, + }); + columns.push({ sortName: 'category', field: 'category_detail', diff --git a/InvenTree/templates/js/translated/pricing.js b/InvenTree/templates/js/translated/pricing.js index 61be8796e2..37bec92137 100644 --- a/InvenTree/templates/js/translated/pricing.js +++ b/InvenTree/templates/js/translated/pricing.js @@ -458,7 +458,7 @@ function loadPartSupplierPricingTable(options={}) { data = data.sort((a, b) => (a.quantity - b.quantity)); var graphLabels = Array.from(data, (x) => (`${x.part_detail.SKU} - {% trans "Quantity" %} ${x.quantity}`)); - var graphValues = Array.from(data, (x) => (x.price / x.part_detail.pack_size)); + var graphValues = Array.from(data, (x) => (x.price / x.part_detail.pack_quantity_native)); if (chart) { chart.destroy(); @@ -518,7 +518,7 @@ function loadPartSupplierPricingTable(options={}) { } // Convert to unit pricing - var unit_price = row.price / row.part_detail.pack_size; + var unit_price = row.price / row.part_detail.pack_quantity_native; var html = formatCurrency(unit_price, { currency: row.price_currency @@ -811,9 +811,12 @@ function loadPurchasePriceHistoryTable(options={}) { return '-'; } - return formatCurrency(row.purchase_price / row.supplier_part_detail.pack_size, { - currency: row.purchase_price_currency - }); + return formatCurrency( + row.purchase_price / row.supplier_part_detail.pack_quantity_native, + { + currency: row.purchase_price_currency + } + ); } }, ] diff --git a/InvenTree/templates/js/translated/purchase_order.js b/InvenTree/templates/js/translated/purchase_order.js index 51967b32c2..868ed657cd 100644 --- a/InvenTree/templates/js/translated/purchase_order.js +++ b/InvenTree/templates/js/translated/purchase_order.js @@ -229,8 +229,8 @@ function poLineItemFields(options={}) { supplier: options.supplier, }, onEdit: function(value, name, field, opts) { - // If the pack_size != 1, add a note to the field - var pack_size = 1; + // If the pack_quantity != 1, add a note to the field + var pack_quantity = 1; var units = ''; var supplier_part_id = value; var quantity = getFormFieldValue('quantity', {}, opts); @@ -250,14 +250,14 @@ function poLineItemFields(options={}) { { success: function(response) { // Extract information from the returned query - pack_size = response.pack_size || 1; + pack_quantity = response.pack_quantity_native || 1; units = response.part_detail.units || ''; }, } ).then(function() { // Update pack size information - if (pack_size != 1) { - var txt = ` {% trans "Pack Quantity" %}: ${pack_size} ${units}`; + if (pack_quantity != 1) { + var txt = ` {% trans "Pack Quantity" %}: ${formatDecimal(pack_quantity)} ${units}`; $(opts.modal).find('#hint_id_quantity').after(`
${txt}
`); } }).then(function() { @@ -766,7 +766,7 @@ function orderParts(parts_list, options) { // Callback function when supplier part is changed // This is used to update the "pack size" attribute var onSupplierPartChanged = function(value, name, field, opts) { - var pack_size = 1; + var pack_quantity = 1; var units = ''; $(opts.modal).find(`#info-pack-size-${pk}`).remove(); @@ -779,13 +779,13 @@ function orderParts(parts_list, options) { }, { success: function(response) { - pack_size = response.pack_size || 1; + pack_quantity = response.pack_quantity_native || 1; units = response.part_detail.units || ''; } } ).then(function() { - if (pack_size != 1) { - var txt = ` {% trans "Pack Quantity" %}: ${pack_size} ${units}`; + if (pack_quantity != 1) { + var txt = ` {% trans "Pack Quantity" %}: ${pack_quantity} ${units}`; $(opts.modal).find(`#id_quantity_${pk}`).after(`
${txt}
`); } }); @@ -1021,15 +1021,17 @@ function receivePurchaseOrderItems(order_id, line_items, options={}) { } var units = line_item.part_detail.units || ''; - var pack_size = line_item.supplier_part_detail.pack_size || 1; - var pack_size_div = ''; + let pack_quantity = line_item.supplier_part_detail.pack_quantity; + let native_pack_quantity = line_item.supplier_part_detail.pack_quantity_native || 1; - var received = quantity * pack_size; + let pack_size_div = ''; - if (pack_size != 1) { + var received = quantity * native_pack_quantity; + + if (native_pack_quantity != 1) { pack_size_div = `
- {% trans "Pack Quantity" %}: ${pack_size} ${units}
+ {% trans "Pack Quantity" %}: ${formatDecimal(pack_quantity)}
{% trans "Received Quantity" %}: ${received} ${units}
`; } @@ -1304,13 +1306,13 @@ function receivePurchaseOrderItems(order_id, line_items, options={}) { ); // Add change callback for quantity field - if (item.supplier_part_detail.pack_size != 1) { + if (item.supplier_part_detail.pack_quantity_native != 1) { $(opts.modal).find(`#id_items_quantity_${pk}`).change(function() { var value = $(opts.modal).find(`#id_items_quantity_${pk}`).val(); var el = $(opts.modal).find(`#quantity_${pk}`).find('.pack_received_quantity'); - var actual = value * item.supplier_part_detail.pack_size; + var actual = value * item.supplier_part_detail.pack_quantity_native; actual = formatDecimal(actual); el.text(actual); }); @@ -2005,10 +2007,10 @@ function loadPurchaseOrderLineItemTable(table, options={}) { let data = value; - if (row.supplier_part_detail && row.supplier_part_detail.pack_size != 1.0) { - var pack_size = row.supplier_part_detail.pack_size; - var total = value * pack_size; - data += ``; + if (row.supplier_part_detail && row.supplier_part_detail.pack_quantity_native != 1.0) { + let pack_quantity = row.supplier_part_detail.pack_quantity; + let total = value * row.supplier_part_detail.pack_quantity_native; + data += ``; } return data; @@ -2024,7 +2026,7 @@ function loadPurchaseOrderLineItemTable(table, options={}) { { sortable: false, switchable: true, - field: 'supplier_part_detail.pack_size', + field: 'supplier_part_detail.pack_quantity', title: '{% trans "Pack Quantity" %}', formatter: function(value, row) { var units = row.part_detail.units; diff --git a/InvenTree/templates/js/translated/table_filters.js b/InvenTree/templates/js/translated/table_filters.js index f9b925bd0f..b2567743c9 100644 --- a/InvenTree/templates/js/translated/table_filters.js +++ b/InvenTree/templates/js/translated/table_filters.js @@ -626,6 +626,11 @@ function getPartTableFilters() { type: 'bool', title: '{% trans "Component" %}', }, + has_units: { + type: 'bool', + title: '{% trans "Has Units" %}', + description: '{% trans "Part has defined units" %}', + }, has_ipn: { type: 'bool', title: '{% trans "Has IPN" %}', diff --git a/docs/docs/assets/images/part/part_units.png b/docs/docs/assets/images/part/part_units.png new file mode 100644 index 0000000000000000000000000000000000000000..4e952e800449905aaaaf3ea45d86fb0d46ce4fba GIT binary patch literal 175270 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�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

gmfOwBW$E$F<_GgA57G^Eq%h*%xvwj5(W|w5 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 J{e1ejzX7~k)Xo3^ literal 0 HcmV?d00001 diff --git a/docs/docs/part/part.md b/docs/docs/part/part.md index d8a4a2f982..2ef5a80fd0 100644 --- a/docs/docs/part/part.md +++ b/docs/docs/part/part.md @@ -55,7 +55,19 @@ Trackable parts can be assigned batch numbers or serial numbers which uniquely i ### Purchaseable -If a part is designated as *Purchaseable* it can be purchased from external suppliers. Setting this flag allows parts to be added to [purchase orders](../order/purchase_order.md). +If a part is designated as *Purchaseable* it can be purchased from external suppliers. Setting this flag allows parts be linked to supplier parts and procured via purchase orders. + +#### Suppliers + +A [Supplier](../order/company.md#suppliers) is an external vendor who provides goods or services. + +#### Supplier Parts + +Purchaseable parts can be linked to [Supplier Parts](../order/company.md#supplier-parts). A supplier part represents an individual piece or unit that is procured from an external vendor. + +#### Purchase Orders + +A [Purchase Order](../order/purchase_order.md) allows parts to be ordered from an external supplier. ### Salable @@ -65,6 +77,31 @@ If a part is designated as *Salable* it can be sold to external customers. Setti By default, all parts are *Active*. Marking a part as inactive means it is not available for many actions, but the part remains in the database. If a part becomes obsolete, it is recommended that it is marked as inactive, rather than deleting it from the database. +## Units of Measure + +Each type of part can define a custom "unit of measure" which is a standardized unit which is used to track quantities for a particular part. By default, the "unit of measure" for each part is blank, which means that each part is tracked in dimensionless quantities of "pieces". + +### Physical Units + +It is possible to track parts using physical quantity values, such as *metres* or *litres*. For example, it would make sense to track a "wire" in units of "metres": + +{% with id="part_units", url="part/part_units.png", description="Parts units" %} +{% include 'img.html' %} +{% endwith %} + +### Supplier Part Units + +By default, units of measure for [supplier parts](../order/company.md#supplier-parts) are specified in the same unit as their base part. However, supplier part units can be changed to any unit *which is compatible with the base unit*. + +!!! info "Example: Supplier Part Units" + If the base part has a unit of `metres` then valid units for any supplier parts would include `feet`, `cm`, `inches` (etc) + +If an incompatible unit type is specified, an error will be displayed: + +{% with id="part_units_invalid", url="part/part_units_invalid.png", description="Invalid supplier part units" %} +{% include 'img.html' %} +{% endwith %} + ## Part Images Each part can have an associated image, which is used for display purposes throughout the InvenTree interface. A prominent example is on the part detail page itself: