from extensions.common.schema import *
from extensions.common.base import *
from extensions.permissions import *
from extensions.exceptions import *
from extensions.viewsets import *
from apps.finance.serializers import *
from apps.finance.permissions import *
from apps.finance.filters import *
from apps.finance.schemas import *
from apps.finance.models import *
from apps.flow.models import *
from apps.data.models import *
class ClientArrearsViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin):
"""应收欠款"""
serializer_class = ClientArrearsSerializer
permission_classes = [IsAuthenticated, ClientArrearsPermission]
filterset_fields = ['level', 'is_active', 'has_arrears']
search_fields = ['number', 'name', 'contact', 'remark']
ordering_fields = ['id', 'number', 'name', 'initial_arrears_amount', 'arrears_amount']
ordering = ['id']
queryset = Client.objects.all()
class SupplierArrearsViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin):
"""应付欠款"""
serializer_class = SupplierArrearsSerializer
permission_classes = [IsAuthenticated, SupplierArrearsPermission]
filterset_fields = ['is_active', 'has_arrears']
search_fields = ['number', 'name', 'contact', 'remark']
ordering_fields = ['id', 'number', 'name', 'initial_arrears_amount', 'arrears_amount']
ordering = ['id']
queryset = Supplier.objects.all()
class PaymentOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, CreateModelMixin):
"""付款单据"""
serializer_class = PaymentOrderSerializer
permission_classes = [IsAuthenticated, PaymentOrderPermission]
filterset_class = PaymentOrderFilter
search_fields = ['number', 'supplier__number', 'supplier__name', 'remark']
ordering_fields = ['id', 'number', 'total_amount', 'create_time']
select_related_fields = ['supplier', 'handler', 'creator']
prefetch_related_fields = ['payment_accounts', 'payment_accounts__account']
queryset = PaymentOrder.objects.all()
@transaction.atomic
def perform_create(self, serializer):
payment_order = serializer.save()
# 同步欠款
supplier = payment_order.supplier
supplier.arrears_amount = NP.minus(supplier.arrears_amount, payment_order.total_amount)
supplier.has_arrears = supplier.arrears_amount > 0
supplier.save(update_fields=['arrears_amount', 'has_arrears'])
# 同步余额, 流水
finance_flows = []
for payment_account in payment_order.payment_accounts.all():
account = payment_account.account
amount_before = account.balance_amount
amount_change = payment_account.payment_amount
amount_after = NP.minus(amount_before, amount_change)
finance_flows.append(FinanceFlow(
account=account, type=FinanceFlow.Type.PAYMENT, amount_before=amount_before,
amount_change=amount_change, amount_after=amount_after, payment_order=payment_order,
creator=self.user, team=self.team
))
account.balance_amount = amount_after
if account.balance_amount < 0:
raise ValidationError(f'结算账户[{account.name}]余额不足')
account.has_balance = account.balance_amount > 0
account.save(update_fields=['balance_amount', 'has_balance'])
else:
FinanceFlow.objects.bulk_create(finance_flows)
@extend_schema(responses={200: NumberResponse})
@action(detail=False, methods=['get'])
def number(self, request, *args, **kwargs):
"""获取编号"""
number = PaymentOrder.get_number(self.team)
return Response(data={'number': number}, status=status.HTTP_200_OK)
@transaction.atomic
@extend_schema(request=None, responses={200: PaymentOrderSerializer})
@action(detail=True, methods=['post'])
def void(self, request, *args, **kwargs):
"""作废"""
payment_order = self.get_object()
payment_order.is_void = True
payment_order.save(update_fields=['is_void'])
# 同步欠款
supplier = payment_order.supplier
supplier.arrears_amount = NP.plus(supplier.arrears_amount, payment_order.total_amount)
supplier.has_arrears = supplier.arrears_amount > 0
supplier.save(update_fields=['arrears_amount', 'has_arrears'])
# 同步余额, 流水
finance_flows = []
for payment_account in payment_order.payment_accounts.all():
account = payment_account.account
amount_before = account.balance_amount
amount_change = payment_account.payment_amount
amount_after = NP.plus(amount_before, amount_change)
finance_flows.append(FinanceFlow(
account=account, type=FinanceFlow.Type.VOID_PAYMENT, amount_before=amount_before,
amount_change=amount_change, amount_after=amount_after, void_payment_order=payment_order,
creator=self.user, team=self.team
))
account.balance_amount = amount_after
if account.balance_amount < 0:
raise ValidationError(f'结算账户[{account.name}]余额不足')
account.has_balance = account.balance_amount > 0
account.save(update_fields=['balance_amount', 'has_balance'])
else:
FinanceFlow.objects.bulk_create(finance_flows)
serializer = PaymentOrderSerializer(instance=payment_order)
return Response(data=serializer.data, status=status.HTTP_200_OK)
class CollectionOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, CreateModelMixin):
"""付款单据"""
serializer_class = CollectionOrderSerializer
permission_classes = [IsAuthenticated, CollectionOrderPermission]
filterset_class = CollectionOrderFilter
search_fields = ['number', 'client__number', 'client__name', 'remark']
ordering_fields = ['id', 'number', 'total_amount', 'create_time']
select_related_fields = ['client', 'handler', 'creator']
prefetch_related_fields = ['collection_accounts', 'collection_accounts__account']
queryset = CollectionOrder.objects.all()
@transaction.atomic
def perform_create(self, serializer):
collection_order = serializer.save()
# 同步欠款
client = collection_order.client
client.arrears_amount = NP.minus(client.arrears_amount, collection_order.total_amount)
client.has_arrears = client.arrears_amount > 0
client.save(update_fields=['arrears_amount', 'has_arrears'])
# 同步余额, 流水
finance_flows = []
for collection_account in collection_order.collection_accounts.all():
account = collection_account.account
amount_before = account.balance_amount
amount_change = collection_account.collection_amount
amount_after = NP.plus(amount_before, amount_change)
finance_flows.append(FinanceFlow(
account=account, type=FinanceFlow.Type.COLLECTION, amount_before=amount_before,
amount_change=amount_change, amount_after=amount_after, collection_order=collection_order,
creator=self.user, team=self.team
))
account.balance_amount = amount_after
if account.balance_amount < 0:
raise ValidationError(f'结算账户[{account.name}]余额不足')
account.has_balance = account.balance_amount > 0
account.save(update_fields=['balance_amount', 'has_balance'])
else:
FinanceFlow.objects.bulk_create(finance_flows)
@extend_schema(responses={200: NumberResponse})
@action(detail=False, methods=['get'])
def number(self, request, *args, **kwargs):
"""获取编号"""
number = PaymentOrder.get_number(self.team)
return Response(data={'number': number}, status=status.HTTP_200_OK)
@transaction.atomic
@extend_
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
开源ERP管理系统,该系统前后端分离,包含PDA移动端扫码操作,api使用restful协议,方便二次开发,后端使用Python,Django,DRF等技术,前端代码使用AntD进行构建,包含采购管理,销售管理,库存管理等业务管理流程。移动端使用Uniapp,包含产品标签打印,出入库扫码等功能。
资源推荐
资源详情
资源评论
收起资源包目录
开源ERP管理系统,该系统前后端分离,包含PDA移动端扫码操作,api使用restful协议,方便二次开发 (1108个子文件)
lcprintsdk-release.aar 536KB
unilcprinterplugin_module-release.aar 53KB
nginx.conf 436B
.gitignore 1KB
.gitignore 259B
.gitignore 231B
.gitignore 231B
index.html 672B
index.html 368B
index.html 330B
favicon.ico 4KB
favicon.ico 4KB
async-validator.js 39KB
parser.js 36KB
noNetwork.js 28KB
calendar.js 27KB
index.js 21KB
clipboard.min.js 13KB
nvue - backup.js 12KB
dayjs.js 11KB
clone.js 8KB
icons.js 7KB
warehouse.js 7KB
warehouse.js 7KB
nvue.js 7KB
mixin.js 7KB
style.js 7KB
LodopFuncs.js 6KB
LodopFuncs.js 6KB
transition.js 6KB
test.js 6KB
Request.js 6KB
import.js 6KB
import.js 6KB
props.js 6KB
props.js 5KB
nvue - 副本.js 5KB
nvue.js 5KB
props.js 5KB
props.js 5KB
colorGradient.js 4KB
route.js 4KB
props.js 4KB
data.js 4KB
data.js 4KB
utils.js 4KB
props.js 4KB
mpother.js 4KB
value.js 4KB
digit.js 4KB
props.js 4KB
props.js 4KB
utils.js 3KB
props.js 3KB
basicData.js 3KB
basicData.js 3KB
finance.js 3KB
finance.js 3KB
mergeConfig.js 3KB
props.js 3KB
option.js 3KB
option.js 3KB
props.js 3KB
props.js 3KB
menus.js 3KB
warehouse.js 3KB
warehouse.js 3KB
request.js 3KB
finance.js 3KB
finance.js 3KB
index.js 3KB
export.js 3KB
export.js 3KB
props.js 3KB
util.js 3KB
nvue.ani-map.js 3KB
props.js 3KB
props.js 3KB
props.js 3KB
props.js 3KB
index.js 3KB
permissions.js 3KB
permissions.js 3KB
props.js 3KB
props.js 2KB
props.js 2KB
request.js 2KB
request.js 2KB
props.js 2KB
props.js 2KB
props.js 2KB
props.js 2KB
props.js 2KB
props.js 2KB
manage.js 2KB
props.js 2KB
props.js 2KB
emitter.js 2KB
props.js 2KB
report.js 2KB
共 1108 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12
资源评论
- qq_355656162023-08-14资源不错,很实用,内容全面,介绍详细,很好用,谢谢分享。
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6732
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现本份代码能对图像进行gabor滤波处理,结合指纹方向图以及指纹沟壑频率特性,对指纹图像进行增强.rar
- 基于matlab实现RBM神经网络实现了手写数字体识别的GUI程序.rar
- 基于matlab实现蝙蝠算法优化相关向量机建模对数据进行建模和预测.rar
- 基于matlab实现编写的禁忌搜索算法,解决了TSP问题,对初学者有重要的参考价值.rar
- 基于matlab实现SOH关于IMU进行姿态求解的C代码,里面包含了两套代码,分别是重力约束法求解和梯度下降法求解.rar
- 1_简单电子邮件客户端.zip
- 基于matlab实现powell优化搜索算法,适合于多参数优化且目标函数中不包含参数的情况.rar
- 基于matlab实现PID神经网络前向和反向学习算法的matlab的原程序代码.rar
- 基于matlab实现nsga-2的多目标优化算法,有注解.rar
- AIR-AP1815-K9-ME-8-5-182-0.zipFor 1815 1830 1840 1850 2700 3700
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功