HimoolERP/apps/warehouse/serializers.py
2021-07-17 16:33:17 +08:00

122 lines
4.5 KiB
Python

from .models import Warehouse, Inventory, Flow, CountingList, Requisition
from goods.serializers import GoodsSerializer
from rest_framework import serializers
from django.db.models import Sum, F
from goods.models import Goods
class WarehouseSerializer(serializers.ModelSerializer):
goods_total = serializers.SerializerMethodField('get_goods_total')
class Meta:
model = Warehouse
fields = ['id', 'name', 'remark', 'create_date', 'update_date', 'address',
'order', 'status', 'manager', 'goods_total']
read_only_fields = ['create_date', 'update_date', 'goods_total']
def validate(self, data):
if not data.get('name'):
raise serializers.ValidationError
teams = self.context['request'].user.teams
if data['manager'] and not teams.users.filter(username=data['manager'].username, is_delete=False).exists():
raise serializers.ValidationError
return data
def get_goods_total(self, obj):
return obj.inventory_set.filter(goods__is_delete=False, goods__status=True).aggregate(
goods_total=Sum('quantity')).get('goods_total')
class InventorySerializer(serializers.ModelSerializer):
goods = serializers.SerializerMethodField('get_goods')
warehouse_name = serializers.SerializerMethodField('get_warehouse_name')
total = serializers.SerializerMethodField('get_total')
class Meta:
model = Inventory
fields = ['goods', 'quantity', 'warehouse_name', 'total']
read_only_fields = fields
def get_goods(self, obj):
return {
'code': obj.goods.code,
'name': obj.goods.name,
'brand': obj.goods.brand,
'specification': obj.goods.specification,
'unit': obj.goods.unit,
'category_name': obj.goods.category.name if obj.goods.category else '',
'purchase_price': obj.goods.purchase_price,
}
def get_warehouse_name(self, obj):
return obj.warehouse.name
def get_total(self, obj):
return self.context['request'].user.teams.inventory_set.all().aggregate(
quantity=Sum('quantity'), amount=Sum(F('quantity') * F('goods__purchase_price')))
class FlowSerializer(serializers.ModelSerializer):
class Meta:
model = Flow
fields = ['create_datetime', 'goods_code', 'goods_name', 'specification', 'unit',
'warehouse_name', 'type', 'change_quantity', 'remain_quantity', 'operator',
'requisition', 'counting_list', 'purchase_order', 'sales_order']
read_only_fields = fields
class CountingListSerializer(serializers.ModelSerializer):
goods_set = serializers.SerializerMethodField('get_goods_set')
class Meta:
model = CountingList
read_only_fields = ['id', 'warehouse_name', 'goods_set', 'date']
fields = ['warehouse', 'remark', *read_only_fields]
def validate(self, data):
if not data.get('warehouse'):
raise serializers.ValidationError
# goods_set
goods_set = self.context['request'].data.get('goods_set', [])
if not goods_set:
raise serializers.ValidationError
for item in goods_set:
if item.get('id') is None or not item.get('quantity') or item['quantity'] <= 0:
raise serializers.ValidationError
return data
def get_goods_set(self, obj):
return obj.goods_set.all().values('id', 'code', 'name', 'specification', 'unit', 'quantity',
'before_counting', 'purchase_price')
class RequisitionSerializer(serializers.ModelSerializer):
goods_set = serializers.SerializerMethodField('get_goods_set')
class Meta:
model = Requisition
read_only_fields = ['id', 'out_warehouse_name', 'into_warehouse_name', 'goods_set']
fields = ['out_warehouse', 'into_warehouse', 'date', 'remark', *read_only_fields]
def validate(self, data):
if not data.get('out_warehouse') or not data.get('into_warehouse') or not data.get('date'):
raise serializers.ValidationError
# goods_set
goods_set = self.context['request'].data.get('goods_set', [])
if not goods_set:
raise serializers.ValidationError
for item in goods_set:
if item.get('id') is None or not item.get('quantity') or item['quantity'] <= 0:
raise serializers.ValidationError
return data
def get_goods_set(self, obj):
return obj.goods_set.all().values('id', 'code', 'name', 'specification', 'unit', 'quantity')