diff --git a/core/apps/wherehouse/migrations/0015_alter_stockmovmendproduct_inventory_and_more.py b/core/apps/wherehouse/migrations/0015_alter_stockmovmendproduct_inventory_and_more.py new file mode 100644 index 0000000..296180d --- /dev/null +++ b/core/apps/wherehouse/migrations/0015_alter_stockmovmendproduct_inventory_and_more.py @@ -0,0 +1,24 @@ +# Generated by Django 5.2.4 on 2025-08-30 11:22 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wherehouse', '0014_remove_stockmovemend_file'), + ] + + operations = [ + migrations.AlterField( + model_name='stockmovmendproduct', + name='inventory', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='movemend_products', to='wherehouse.inventory'), + ), + migrations.AlterField( + model_name='stockmovmendproduct', + name='stock_movemend', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movemend_products', to='wherehouse.stockmovemend'), + ), + ] diff --git a/core/apps/wherehouse/models/stock_movemend.py b/core/apps/wherehouse/models/stock_movemend.py index f66c8dd..790986b 100644 --- a/core/apps/wherehouse/models/stock_movemend.py +++ b/core/apps/wherehouse/models/stock_movemend.py @@ -47,12 +47,12 @@ class StockMovemend(BaseModel): class StockMovmendProduct(BaseModel): inventory = models.ForeignKey( - Inventory, on_delete=models.CASCADE, related_name='movmend_products', + Inventory, on_delete=models.CASCADE, related_name='movemend_products', null=True ) quantity = models.PositiveIntegerField() stock_movemend = models.ForeignKey( - StockMovemend, on_delete=models.CASCADE, related_name='movmend_products' + StockMovemend, on_delete=models.CASCADE, related_name='movemend_products' ) def __str__(self): diff --git a/core/apps/wherehouse/serializers/stock_movmend.py b/core/apps/wherehouse/serializers/stock_movmend.py index 673c860..1d55c9d 100644 --- a/core/apps/wherehouse/serializers/stock_movmend.py +++ b/core/apps/wherehouse/serializers/stock_movmend.py @@ -97,7 +97,7 @@ class StockMovemendProductListSerializer(serializers.ModelSerializer): class StockMovemendListSerializer(serializers.ModelSerializer): - movmend_products = StockMovemendProductListSerializer(many=True) + movemend_products = StockMovemendProductListSerializer(many=True) wherehouse_to = serializers.SerializerMethodField(method_name='get_wherehouse_to') wherehouse_from = serializers.SerializerMethodField(method_name='get_wherehouse_from') recipient = serializers.SerializerMethodField(method_name='get_recipient') @@ -108,7 +108,7 @@ class StockMovemendListSerializer(serializers.ModelSerializer): model = StockMovemend fields = [ 'id', 'number', 'wherehouse_to', 'wherehouse_from', 'recipient', 'project_folder', - 'project', 'movemend_type', 'date', 'comment', 'movmend_products' + 'project', 'movemend_type', 'date', 'comment', 'movemend_products' ] def get_wherehouse_to(self, obj): @@ -152,17 +152,39 @@ class StockMovemendProductUpdateSerializer(serializers.Serializer): raise serializers.ValidationError("Stock Movemend Product not found") if movemend_product.inventory.quantity < data['quantity']: raise serializers.ValidationError("invalid quantity, quantity must les than product quantity") - data['movmend_products'] = movemend_product + data['movemend_product'] = movemend_product return data class StockMovemendUpdateSerializer(serializers.ModelSerializer): - movmend_products = StockMovemendProductUpdateSerializer(many=True, required=False) + movemend_products = StockMovemendProductUpdateSerializer(many=True, required=False) class Meta: model = StockMovemend fields = [ 'wherehouse_to', 'project_folder', 'project', 'date', - 'comment', 'movmend_products' + 'comment', 'movemend_products' ] - extra_kwargs = {'wherehouse_to': {'required': False}} \ No newline at end of file + extra_kwargs = {'wherehouse_to': {'required': False}} + + def update(self, instance, validated_data): + with transaction.atomic(): + instance.wherehouse_to = validated_data.get('wherehouse_to', instance.wherehouse_to) + instance.project_folder = validated_data.get('project_folder', instance.project_folder) + instance.project = validated_data.get('project', instance.project) + instance.date = validated_data.get('date', instance.date) + instance.comment = validated_data.get('comment', instance.comment) + instance.save() + + movemend_products = validated_data.pop('movemend_products') + updated_products = [] + for product_data in movemend_products: + product = product_data['movemend_product'] + product.quantity = product_data['quantity'] + updated_products.append(product) + + StockMovmendProduct.objects.bulk_update( + updated_products, + fields=['quantity'] + ) + return instance \ No newline at end of file diff --git a/core/apps/wherehouse/views/stock_movemend.py b/core/apps/wherehouse/views/stock_movemend.py index 20127fd..4ea2f62 100644 --- a/core/apps/wherehouse/views/stock_movemend.py +++ b/core/apps/wherehouse/views/stock_movemend.py @@ -37,7 +37,7 @@ class StockMovemendListApiView(generics.GenericAPIView): serializer_class = serializers.StockMovemendListSerializer queryset = StockMovemend.objects.select_related( 'wherehouse_to', 'wherehouse_from', 'recipient', 'project_folder', 'project' - ).prefetch_related('movmend_products') + ).prefetch_related('movemend_products') permission_classes = [HasRolePermission] required_permissions = [] filter_backends = [DjangoFilterBackend, filters.SearchFilter]