mirror of
https://github.com/himool/HimoolERP.git
synced 2024-09-20 14:56:00 +08:00
fix: 调拨, 付款, 收款
This commit is contained in:
parent
f04b19598d
commit
bac5f008b5
|
@ -24,7 +24,7 @@ class WarehouseSerializer(BaseSerializer):
|
|||
|
||||
def validate_manager(self, instance):
|
||||
instance = self.validate_foreign_key(User, instance, message='管理员不存在')
|
||||
if not instance.is_active:
|
||||
if instance and not instance.is_active:
|
||||
raise ValidationError(f'管理员[{instance.name}]未激活')
|
||||
return instance
|
||||
|
||||
|
|
|
@ -110,6 +110,8 @@ class PaymentOrderSerializer(BaseSerializer):
|
|||
payment_order.total_amount = total_payment_amount
|
||||
payment_order.save(update_fields=['total_amount'])
|
||||
|
||||
return payment_order
|
||||
|
||||
|
||||
class CollectionOrderSerializer(BaseSerializer):
|
||||
"""收款单据"""
|
||||
|
@ -191,6 +193,8 @@ class CollectionOrderSerializer(BaseSerializer):
|
|||
collection_order.total_amount = total_collection_amount
|
||||
collection_order.save(update_fields=['total_amount'])
|
||||
|
||||
return collection_order
|
||||
|
||||
|
||||
class ChargeOrderSerializer(BaseSerializer):
|
||||
"""收支单据"""
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
from extensions.permissions import ModelPermission
|
||||
|
||||
|
||||
class InventoryMessagePermission(ModelPermission):
|
||||
code = 'inventory_message'
|
||||
class InventoryWarningPermission(ModelPermission):
|
||||
code = 'inventory_warning'
|
||||
|
||||
|
||||
__all__ = [
|
||||
'InventoryMessagePermission',
|
||||
'InventoryWarningPermission',
|
||||
]
|
||||
|
|
|
@ -2,9 +2,10 @@ from extensions.common.base import *
|
|||
from extensions.serializers import *
|
||||
from extensions.exceptions import *
|
||||
from apps.goods.models import *
|
||||
from apps.sales.models import *
|
||||
|
||||
|
||||
class InventoryMessageSerializer(BaseSerializer):
|
||||
class InventoryWarningSerializer(BaseSerializer):
|
||||
"""库存预警"""
|
||||
|
||||
goods_number = CharField(source='goods.number', read_only=True, label='商品编号')
|
||||
|
@ -20,6 +21,25 @@ class InventoryMessageSerializer(BaseSerializer):
|
|||
'unit_name', 'inventory_upper', 'inventory_lower']
|
||||
|
||||
|
||||
class SalesTaskReminderSerializer(BaseSerializer):
|
||||
"""销售任务提醒"""
|
||||
|
||||
warehouse_number = CharField(source='warehouse.number', read_only=True, label='仓库编号')
|
||||
warehouse_name = CharField(source='warehouse.name', read_only=True, label='仓库名称')
|
||||
goods_number = CharField(source='goods.number', read_only=True, label='商品编号')
|
||||
goods_name = CharField(source='goods.name', read_only=True, label='商品名称')
|
||||
goods_barcode = CharField(source='goods.barcode', read_only=True, label='商品条码')
|
||||
unit_name = CharField(source='goods.unit.name', read_only=True, label='单位名称')
|
||||
|
||||
class Meta:
|
||||
model = SalesTask
|
||||
read_only_fields = ['id', 'warehouse_number', 'warehouse_name', 'goods_number', 'goods_name',
|
||||
'goods_barcode', 'unit_name', 'salesperson_name', 'sales_quantity',
|
||||
'is_completed', 'create_time']
|
||||
fields = ['warehouse', 'goods', 'salesperson', 'total_quantity', 'start_time', 'end_time',
|
||||
*read_only_fields]
|
||||
|
||||
|
||||
__all__ = [
|
||||
'InventoryMessageSerializer',
|
||||
'InventoryWarningSerializer',
|
||||
]
|
||||
|
|
|
@ -3,5 +3,5 @@ from apps.message.views import *
|
|||
|
||||
|
||||
router = BaseRouter()
|
||||
router.register('inventory_messages', InventoryMessageViewSet, 'inventory_message')
|
||||
router.register('inventory_warnings', InventoryWarningViewSet, 'inventory_warning')
|
||||
urlpatterns = router.urls
|
||||
|
|
|
@ -12,23 +12,28 @@ from apps.message.models import *
|
|||
from apps.goods.models import *
|
||||
|
||||
|
||||
class InventoryMessageViewSet(BaseViewSet, ListModelMixin):
|
||||
class InventoryWarningViewSet(BaseViewSet, ListModelMixin):
|
||||
"""库存预警"""
|
||||
|
||||
serializer_class = InventoryMessageSerializer
|
||||
permission_classes = [IsAuthenticated, InventoryMessagePermission]
|
||||
serializer_class = InventoryWarningSerializer
|
||||
permission_classes = [IsAuthenticated, InventoryWarningPermission]
|
||||
select_related_fields = ['goods', 'goods__unit']
|
||||
queryset = Inventory.objects.all()
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = super().get_queryset().filter(goods__enable_inventory_warning=True)
|
||||
queryset = queryset.values('goods').annotate(total_inventory_quantity=Sum('total_quantity'))
|
||||
print(queryset)
|
||||
|
||||
queryset = queryset.filter(
|
||||
Q(goods__inventory_upper__isnull=False) & Q(total_quantity__gt=F('goods__inventory_upper')) |
|
||||
Q(goods__inventory_lower__isnull=False) & Q(total_quantity__lte=F('goods__inventory_lower'))
|
||||
)
|
||||
return queryset
|
||||
print(queryset)
|
||||
|
||||
return Inventory.objects.all()
|
||||
|
||||
|
||||
__all__ = [
|
||||
'InventoryMessageViewSet',
|
||||
'InventoryWarningViewSet',
|
||||
]
|
||||
|
|
|
@ -111,11 +111,13 @@ class InventoryOptionSerializer(ModelSerializer):
|
|||
goods_barcode = CharField(source='goods.barcode', read_only=True, label='商品条码')
|
||||
goods_spec = CharField(source='goods.spec', read_only=True, label='商品规格')
|
||||
unit_name = CharField(source='goods.unit.name', read_only=True, label='单位名称')
|
||||
enable_batch_control = BooleanField(source='goods.enable_batch_control',
|
||||
read_only=True, label='启用批次控制')
|
||||
|
||||
class Meta:
|
||||
model = Inventory
|
||||
fields = ['id', 'goods', 'goods_number', 'goods_name', 'goods_barcode', 'goods_spec',
|
||||
'total_quantity', 'unit_name']
|
||||
'total_quantity', 'unit_name', 'enable_batch_control']
|
||||
|
||||
|
||||
# Purchase
|
||||
|
@ -221,7 +223,6 @@ class SupplierArrearsOptionSerializer(BaseSerializer):
|
|||
'address', 'remark', 'is_active', 'arrears_amount', 'has_arrears']
|
||||
|
||||
|
||||
|
||||
__all__ = [
|
||||
'RoleOptionSerializer', 'UserOptionSerializer',
|
||||
'WarehouseOptionSerializer',
|
||||
|
|
|
@ -92,7 +92,7 @@ class PurchaseOrderSerializer(BaseSerializer):
|
|||
if not instance.is_active:
|
||||
raise ValidationError(f'仓库[{instance.name}]未激活')
|
||||
|
||||
if not instance.is_locked:
|
||||
if instance.is_locked:
|
||||
raise ValidationError(f'仓库[{instance.name}]已锁定')
|
||||
return instance
|
||||
|
||||
|
@ -265,7 +265,7 @@ class PurchaseReturnOrderSerializer(BaseSerializer):
|
|||
if not instance.is_active:
|
||||
raise ValidationError(f'仓库[{instance.name}]未激活')
|
||||
|
||||
if not instance.is_locked:
|
||||
if instance.is_locked:
|
||||
raise ValidationError(f'仓库[{instance.name}]已锁定')
|
||||
return instance
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ class SalesOrderSerializer(BaseSerializer):
|
|||
if not instance.is_active:
|
||||
raise ValidationError(f'仓库[{instance.name}]未激活')
|
||||
|
||||
if not instance.is_locked:
|
||||
if instance.is_locked:
|
||||
raise ValidationError(f'仓库[{instance.name}]已锁定')
|
||||
return instance
|
||||
|
||||
|
@ -269,7 +269,7 @@ class SalesReturnOrderSerializer(BaseSerializer):
|
|||
if not instance.is_active:
|
||||
raise ValidationError(f'仓库[{instance.name}]未激活')
|
||||
|
||||
if not instance.is_locked:
|
||||
if instance.is_locked:
|
||||
raise ValidationError(f'仓库[{instance.name}]已锁定')
|
||||
return instance
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ from extensions.common.base import *
|
|||
from extensions.serializers import *
|
||||
from extensions.exceptions import *
|
||||
from apps.purchase.models import *
|
||||
from apps.sales.models import *
|
||||
|
||||
|
||||
class PurchaseReportDetialSerializer(BaseSerializer):
|
||||
|
@ -47,7 +48,7 @@ class SalesReportDetialSerializer(BaseSerializer):
|
|||
create_time = DateTimeField(source='sales_order.create_time', read_only=True, label='创建时间')
|
||||
|
||||
class Meta:
|
||||
model = PurchaseGoods
|
||||
model = SalesGoods
|
||||
fields = ['id', 'goods', 'goods_number', 'goods_name', 'goods_barcode', 'goods_spec',
|
||||
'sales_quantity', 'category_name', 'unit_name', 'sales_price', 'total_amount',
|
||||
'sales_order', 'sales_order_number', 'warehouse_number', 'warehouse_name',
|
||||
|
|
|
@ -101,7 +101,7 @@ class StockCheckOrderSerializer(BaseSerializer):
|
|||
if not instance.is_active:
|
||||
raise ValidationError(f'仓库[{instance.name}]未激活')
|
||||
|
||||
if not instance.is_locked:
|
||||
if instance.is_locked:
|
||||
raise ValidationError(f'仓库[{instance.name}]已锁定')
|
||||
return instance
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ class StockTransferOrderSerializer(BaseSerializer):
|
|||
if not instance.is_active:
|
||||
raise ValidationError(f'仓库[{instance.name}]未激活')
|
||||
|
||||
if not instance.is_locked:
|
||||
if instance.is_locked:
|
||||
raise ValidationError(f'仓库[{instance.name}]已锁定')
|
||||
return instance
|
||||
|
||||
|
@ -70,7 +70,7 @@ class StockTransferOrderSerializer(BaseSerializer):
|
|||
if not instance.is_active:
|
||||
raise ValidationError(f'仓库[{instance.name}]未激活')
|
||||
|
||||
if not instance.is_locked:
|
||||
if instance.is_locked:
|
||||
raise ValidationError(f'仓库[{instance.name}]已锁定')
|
||||
return instance
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ class StockTransferOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin,
|
|||
else:
|
||||
# 创建出库商品
|
||||
stock_out_goods_set.append(StockOutGoods(
|
||||
stock_out_order=stock_out_order, goods=stock_transfer_order.goods,
|
||||
stock_out_order=stock_out_order, goods=stock_transfer_goods.goods,
|
||||
stock_out_quantity=stock_transfer_goods.stock_transfer_quantity,
|
||||
remain_quantity=stock_transfer_goods.stock_transfer_quantity, team=self.team
|
||||
))
|
||||
|
@ -105,7 +105,7 @@ class StockTransferOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin,
|
|||
else:
|
||||
# 创建入库商品
|
||||
stock_in_goods_set.append(StockInGoods(
|
||||
stock_in_order=stock_in_order, goods=stock_transfer_order.goods,
|
||||
stock_in_order=stock_in_order, goods=stock_transfer_goods.goods,
|
||||
stock_in_quantity=stock_transfer_goods.stock_transfer_quantity,
|
||||
remain_quantity=stock_transfer_goods.stock_transfer_quantity, team=self.team
|
||||
))
|
||||
|
|
|
@ -3,5 +3,11 @@
|
|||
|
||||
## 功能
|
||||
|
||||
- 库存预警
|
||||
[/api/inventory_warnings/]
|
||||
|
||||
- 销售任务提醒
|
||||
[/api/sales_task_reminders/]
|
||||
|
||||
|
||||
## 其他接口
|
||||
|
|
|
@ -43,6 +43,6 @@ urlpatterns = [
|
|||
path('api/', include('apps.flow.urls')),
|
||||
path('api/', include('apps.finance.urls')),
|
||||
path('api/', include('apps.statistic.urls')),
|
||||
path('api/', include('apps.message.urls')),
|
||||
# path('api/', include('apps.message.urls')),
|
||||
path('api/', include('apps.option.urls')),
|
||||
]
|
||||
|
|
Loading…
Reference in a new issue