38086-vm/accounting/views.py
2026-02-03 03:17:21 +00:00

154 lines
5.8 KiB
Python

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Account, JournalEntry, JournalItem
from django.db.models import Sum, Q
from django.utils import timezone
from datetime import datetime
@login_required
def accounting_dashboard(request):
total_assets = sum(acc.balance for acc in Account.objects.filter(account_type='asset'))
total_liabilities = sum(acc.balance for acc in Account.objects.filter(account_type='liability'))
total_equity = sum(acc.balance for acc in Account.objects.filter(account_type='equity'))
# Revenue and Expenses for current month
month_start = timezone.now().replace(day=1, hour=0, minute=0, second=0, microsecond=0)
revenue_items = JournalItem.objects.filter(
account__account_type='income',
entry__date__gte=month_start
)
monthly_revenue = (revenue_items.filter(type='credit').aggregate(total=Sum('amount'))['total'] or 0) - \
(revenue_items.filter(type='debit').aggregate(total=Sum('amount'))['total'] or 0)
expense_items = JournalItem.objects.filter(
account__account_type='expense',
entry__date__gte=month_start
)
monthly_expense = (expense_items.filter(type='debit').aggregate(total=Sum('amount'))['total'] or 0) - \
(expense_items.filter(type='credit').aggregate(total=Sum('amount'))['total'] or 0)
context = {
'total_assets': total_assets,
'total_liabilities': total_liabilities,
'total_equity': total_equity,
'monthly_revenue': monthly_revenue,
'monthly_expense': monthly_expense,
'net_profit': monthly_revenue - monthly_expense,
'recent_entries': JournalEntry.objects.order_by('-date', '-id')[:10]
}
return render(request, 'accounting/dashboard.html', context)
@login_required
def chart_of_accounts(request):
accounts = Account.objects.all().order_by('code')
return render(request, 'accounting/chart_of_accounts.html', {'accounts': accounts})
@login_required
def journal_entries(request):
entries = JournalEntry.objects.all().order_by('-date', '-id')
return render(request, 'accounting/journal_entries.html', {'entries': entries})
@login_required
def account_ledger(request, account_id):
account = get_object_or_404(Account, id=account_id)
items = JournalItem.objects.filter(account=account).order_by('entry__date', 'entry__id')
# Calculate running balance
running_balance = 0
ledger_items = []
for item in items:
if account.account_type in ['asset', 'expense']:
change = item.amount if item.type == 'debit' else -item.amount
else:
change = item.amount if item.type == 'credit' else -item.amount
running_balance += change
ledger_items.append({
'item': item,
'balance': running_balance
})
return render(request, 'accounting/account_ledger.html', {
'account': account,
'ledger_items': ledger_items,
'total_balance': running_balance
})
@login_required
def trial_balance(request):
accounts = Account.objects.all().order_by('code')
trial_data = []
total_debit = 0
total_credit = 0
for acc in accounts:
items = acc.journal_items.all()
debits = items.filter(type='debit').aggregate(total=Sum('amount'))['total'] or 0
credits = items.filter(type='credit').aggregate(total=Sum('amount'))['total'] or 0
if debits > 0 or credits > 0:
trial_data.append({
'account': acc,
'debit': debits,
'credit': credits
})
total_debit += debits
total_credit += credits
return render(request, 'accounting/trial_balance.html', {
'trial_data': trial_data,
'total_debit': total_debit,
'total_credit': total_credit
})
@login_required
def balance_sheet(request):
assets = Account.objects.filter(account_type='asset')
liabilities = Account.objects.filter(account_type='liability')
equity = Account.objects.filter(account_type='equity')
# Include Net Income in Equity
revenue = JournalItem.objects.filter(account__account_type='income').aggregate(
cr=Sum('amount', filter=Q(type='credit')),
dr=Sum('amount', filter=Q(type='debit'))
)
net_revenue = (revenue['cr'] or 0) - (revenue['dr'] or 0)
expenses = JournalItem.objects.filter(account__account_type='expense').aggregate(
dr=Sum('amount', filter=Q(type='debit')),
cr=Sum('amount', filter=Q(type='credit'))
)
net_expenses = (expenses['dr'] or 0) - (expenses['cr'] or 0)
net_income = net_revenue - net_expenses
asset_total = sum(acc.balance for acc in assets)
liability_total = sum(acc.balance for acc in liabilities)
equity_total = sum(acc.balance for acc in equity) + net_income
return render(request, 'accounting/balance_sheet.html', {
'assets': assets,
'liabilities': liabilities,
'equity': equity,
'net_income': net_income,
'asset_total': asset_total,
'liability_total': liability_total,
'equity_total': equity_total,
'date': timezone.now()
})
@login_required
def profit_loss(request):
revenue_accounts = Account.objects.filter(account_type='income')
expense_accounts = Account.objects.filter(account_type='expense')
revenue_total = sum(acc.balance for acc in revenue_accounts)
expense_total = sum(acc.balance for acc in expense_accounts)
return render(request, 'accounting/profit_loss.html', {
'revenue_accounts': revenue_accounts,
'expense_accounts': expense_accounts,
'revenue_total': revenue_total,
'expense_total': expense_total,
'net_profit': revenue_total - expense_total,
'date': timezone.now()
})