128 lines
4.8 KiB
Python
128 lines
4.8 KiB
Python
from app.models import *
|
|
from rest_framework.decorators import api_view
|
|
from rest_framework.response import Response
|
|
from django.db import transaction
|
|
from datetime import datetime
|
|
|
|
|
|
decimal = 0
|
|
#==========================================================================================
|
|
def getcode(code, Model):
|
|
try:
|
|
obj = Model.objects.latest('id')
|
|
val = 1 if obj == None else obj.id + 1
|
|
except Exception as e:
|
|
val = 1
|
|
length = len(str(val))
|
|
text = ''
|
|
for i in range(0, 6-length):
|
|
text += '0'
|
|
return '{}{}{}'.format(code, text, val)
|
|
|
|
|
|
#==========================================================================================
|
|
def account_entry_api(code, amount, content, type, category, userid, ref=None, product=None, customer=None, date=None):
|
|
try:
|
|
user = User.objects.get(id=userid)
|
|
entry_type = Entry_Type.objects.get(code=type)
|
|
entry_category = Entry_Category.objects.get(id=category)
|
|
system_date = date if date else datetime.now().strftime("%Y-%m-%d")
|
|
|
|
with transaction.atomic():
|
|
account = Internal_Account.objects.select_for_update().get(code=code)
|
|
start_balance = account.balance or 0
|
|
|
|
if entry_type.code == 'DR' and start_balance < amount:
|
|
return {'error': 'Số dư không đủ để thực hiện giao dịch.'}
|
|
|
|
if entry_type.code == 'CR':
|
|
# account.balance = F('balance') + amount
|
|
account.balance += amount
|
|
else:
|
|
account.balance -= amount
|
|
|
|
account.save()
|
|
account.refresh_from_db()
|
|
new_balance = account.balance
|
|
|
|
entry = Internal_Entry.objects.create(
|
|
category=entry_category,
|
|
content=content,
|
|
amount=amount,
|
|
inputer=user,
|
|
approver=user,
|
|
type=entry_type,
|
|
balance_before=start_balance,
|
|
balance_after=new_balance,
|
|
account=account,
|
|
date=system_date,
|
|
ref=ref,
|
|
product=None if product==None else Product.objects.get(id=product),
|
|
customer=None if customer==None else Customer.objects.get(id=customer)
|
|
)
|
|
|
|
text = 'id,account__currency__code,ref,balance_before,balance_after,code,account,account__code,account__branch__name,account__type__name,date,amount,content,inputer,inputer__fullname,approver,approver__fullname,create_time,update_time,type,type__code,type__name'
|
|
fields = text.split(',')
|
|
return Internal_Entry.objects.filter(id=entry.id).values(*fields).first()
|
|
|
|
except User.DoesNotExist:
|
|
return {'error': f"Người dùng với ID {userid} không tồn tại."}
|
|
except Internal_Account.DoesNotExist:
|
|
return {'error': f"Tài khoản nội bộ với mã '{code}' không tồn tại."}
|
|
except Entry_Type.DoesNotExist:
|
|
return {'error': f"Loại bút toán với mã '{type}' không tồn tại."}
|
|
except Entry_Category.DoesNotExist:
|
|
return {'error': f"Danh mục bút toán với ID '{category}' không tồn tại."}
|
|
except Exception as e:
|
|
return {'error': f"Đã xảy ra lỗi không mong muốn: {str(e)}"}
|
|
|
|
#==========================================================================================
|
|
@api_view(['POST'])
|
|
def account_entry(request):
|
|
print(request.data.get('date'))
|
|
ref = request.data.get('ref')
|
|
data = account_entry_api(
|
|
code=request.data['code'],
|
|
amount=request.data['amount'],
|
|
content=request.data['content'],
|
|
type=request.data['type'],
|
|
category=request.data['category'],
|
|
userid=request.data['user'],
|
|
ref=ref,
|
|
product=request.data['product'],
|
|
customer=request.data['customer'],
|
|
date=request.data.get('date')
|
|
)
|
|
|
|
if 'error' in data:
|
|
return Response(data, status=400)
|
|
|
|
return Response(data)
|
|
|
|
|
|
#==========================================================================================
|
|
@api_view(['POST'])
|
|
def account_multi_entry(request):
|
|
try:
|
|
result = []
|
|
data = request.data.get('data')
|
|
for obj in data:
|
|
row = account_entry_api(
|
|
code=obj['Tài khoản'],
|
|
amount=obj['amount'],
|
|
content=obj['content'],
|
|
type='CR',
|
|
category=obj['category'],
|
|
userid=request.data.get('user'),
|
|
ref=obj['ref'],
|
|
product=obj['product'],
|
|
customer=obj['customer'],
|
|
date=obj['date']
|
|
)
|
|
result.append(row)
|
|
|
|
return Response(result)
|
|
|
|
except Exception as e:
|
|
print({'error': f"Đã xảy ra lỗi không mong muốn: {str(e)}"})
|
|
return Response(data, status=400) |