91 lines
4.1 KiB
Python
91 lines
4.1 KiB
Python
from rest_framework import status
|
|
from rest_framework.decorators import api_view
|
|
from rest_framework.response import Response
|
|
from app.models import *
|
|
from django.db.models import F, Q, Count, Sum, FloatField
|
|
from datetime import datetime, timedelta
|
|
from django.db import close_old_connections
|
|
|
|
#==========================================================================================
|
|
def account_book(system_date):
|
|
for row in Internal_Account.objects.all():
|
|
filter1 = {'date': system_date, 'account': row.id, 'type': 1}
|
|
filter2 = {'date': system_date, 'account': row.id, 'type': 2}
|
|
arr = Internal_Entry.objects.all().values('account').annotate(
|
|
credit = Sum(F('amount'), filter=Q(**filter1), output=FloatField()),
|
|
debit = Sum(F('amount'), filter=Q(**filter2), output=FloatField()),
|
|
number_credit = Count(F('id'), filter=Q(**filter1), output=FloatField()),
|
|
number_debit = Count(F('id'), filter=Q(**filter2), output=FloatField())
|
|
)
|
|
entry = next(iter(arr), None)
|
|
book = Account_Book.objects.filter(system_date=system_date, account=row.id).first()
|
|
if book:
|
|
book.end_balance = row.balance
|
|
book.update_time = datetime.now()
|
|
if entry:
|
|
book.credit = entry['credit']
|
|
book.debit = entry['debit']
|
|
book.number_credit = entry['number_credit']
|
|
book.number_debit = entry['number_debit']
|
|
book.save()
|
|
else:
|
|
previous_date = system_date - timedelta(days=1)
|
|
previous = Account_Book.objects.filter(system_date=previous_date, account=row.id).first()
|
|
start_balance = previous.end_balance if previous else 0
|
|
book = Account_Book(system_date=system_date, account=row, current_date=datetime.now().date(), start_balance=start_balance,
|
|
end_balance=row.balance, create_time=datetime.now(), update_time=datetime.now())
|
|
if entry:
|
|
book.credit = entry['credit']
|
|
book.debit = entry['debit']
|
|
book.number_credit = entry['number_credit']
|
|
book.number_debit = entry['number_debit']
|
|
book.save()
|
|
|
|
#==========================================================================================
|
|
def run_cob():
|
|
# close old connections
|
|
close_old_connections()
|
|
try:
|
|
print(f'===START COB===: {str(datetime.now())}')
|
|
mode = System_Setting.objects.filter(category='system', classify='mode', code='status').first()
|
|
#set batch mode
|
|
mode.detail = 'cob'
|
|
mode.save()
|
|
row = System_Setting.objects.filter(category='system', classify='current', code='date').first()
|
|
system_date = row.detail
|
|
sys_date = datetime.strptime(system_date, "%Y-%m-%d").date()
|
|
current_date = datetime.now().date()
|
|
#change next date
|
|
if datetime.now().hour >= 23:
|
|
current_date = current_date + timedelta(days=1)
|
|
#diff days
|
|
days = (sys_date - current_date).days
|
|
while days <= 0:
|
|
#batch log
|
|
log = Batch_Log(system_date=sys_date, start_time=datetime.now(), status=Task_Status.objects.filter(code='running').first())
|
|
log.save()
|
|
# write account book
|
|
account_book(sys_date)
|
|
row.detail = str(sys_date)
|
|
row.save()
|
|
log.status = Task_Status.objects.filter(code='success').first()
|
|
log.save()
|
|
sys_date = sys_date + timedelta(days=1)
|
|
days = (sys_date - current_date).days
|
|
#return active mode
|
|
mode.detail = 'active'
|
|
mode.save()
|
|
log.end_time = datetime.now()
|
|
log.duration = int((log.end_time - log.start_time).total_seconds())
|
|
log.task = Task_Status.objects.filter(code='success').first()
|
|
log.save()
|
|
print(f'===END COB===: {str(datetime.now())}')
|
|
|
|
except Exception as e:
|
|
print(f"Error RUN-COB: {e}")
|
|
|
|
#==========================================================================================
|
|
@api_view(['GET', 'POST'])
|
|
def close_of_business(request):
|
|
run_cob()
|
|
return Response(status = status.HTTP_200_OK) |