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)