From bf05c9cfaedf44e332128feb6aa3610a5d88cdb1 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 7 Sep 2021 23:06:36 +1000 Subject: [PATCH] Adds "barcode" field to POLineItem receive serializer --- InvenTree/order/serializers.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index 80f4790d9f..f3ec114305 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -144,7 +144,6 @@ class POLineItemSerializer(InvenTreeModelSerializer): self.fields.pop('part_detail') self.fields.pop('supplier_part_detail') - # TODO: Once https://github.com/inventree/InvenTree/issues/1687 is fixed, remove default values quantity = serializers.FloatField(default=1) received = serializers.FloatField(default=0) @@ -231,8 +230,26 @@ class POLineItemReceiveSerializer(serializers.Serializer): label=_('Status'), ) + barcode = serializers.CharField( + label=_('Barcode Hash'), + help_text=_('Unique identifier field'), + ) + + def validate_barcode(self, barcode): + """ + Cannot check in a LineItem with a barcode that is already assigned + """ + + # Ignore empty barcode values + if not barcode or barcode.strip() == '': + return + + if stock.models.StockItem.objects.filter(uid=barcode).exists(): + raise ValidationError(_('Barcode is already in use')) + class Meta: fields = [ + 'barcode', 'line_item', 'location', 'quantity', @@ -266,6 +283,19 @@ class POReceiveSerializer(serializers.Serializer): if len(items) == 0: self._errors['items'] = _('Line items must be provided') + else: + # Ensure barcodes are unique + unique_barcodes = set() + + for item in items: + barcode = item.get('barcode', None) + + if barcode: + if barcode in unique_barcodes: + self._errors['items'] = _('Supplied barcode values must be unique') + break + else: + unique_barcodes.add(barcode) if self._errors and raise_exception: raise ValidationError(self.errors)