Files
api/app/cob.py
2025-12-30 11:27:14 +07:00

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)