mirror of
https://github.com/himool/HimoolERP.git
synced 2026-01-12 04:14:28 +08:00
122 lines
4.5 KiB
Python
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')
|