139 lines
4.4 KiB
Python
139 lines
4.4 KiB
Python
from django.shortcuts import render, get_object_or_404, redirect
|
||
from django.db.models import Sum, Count, Avg, Q
|
||
from .models import Firma, Fatura, FaturaKalemi
|
||
from .forms import FirmaForm, FaturaForm
|
||
|
||
def home(request):
|
||
"""Fatura Yönetimi Gösterge Paneli."""
|
||
toplam_firma = Firma.objects.count()
|
||
toplam_fatura = Fatura.objects.count()
|
||
toplam_harcama = Fatura.objects.aggregate(Sum('genel_toplam'))['genel_toplam__sum'] or 0
|
||
son_faturalar = Fatura.objects.select_related('firma').all().order_by('-olusturulma_tarihi')[:10]
|
||
|
||
context = {
|
||
"toplam_firma": toplam_firma,
|
||
"toplam_fatura": toplam_fatura,
|
||
"toplam_harcama": toplam_harcama,
|
||
"son_faturalar": son_faturalar,
|
||
"active_menu": "dashboard"
|
||
}
|
||
return render(request, "core/index.html", context)
|
||
|
||
def fatura_arsivi(request):
|
||
"""Firmalara göre gruplanmış fatura arşivi."""
|
||
firmalar = Firma.objects.annotate(
|
||
fatura_sayisi=Count('faturalar'),
|
||
toplam_tutar=Sum('faturalar__genel_toplam')
|
||
).order_by('ad')
|
||
|
||
context = {
|
||
"firmalar": firmalar,
|
||
"active_menu": "archive"
|
||
}
|
||
return render(request, "core/fatura_arsivi.html", context)
|
||
|
||
def firma_detay(request, pk):
|
||
"""Belirli bir firmanın fatura listesi."""
|
||
firma = get_object_or_404(Firma, pk=pk)
|
||
faturalar = firma.faturalar.all().order_by('-tarih')
|
||
|
||
context = {
|
||
"firma": firma,
|
||
"faturalar": faturalar,
|
||
"active_menu": "archive"
|
||
}
|
||
return render(request, "core/firma_detay.html", context)
|
||
|
||
def fatura_detay(request, pk):
|
||
"""Fatura detay önizleme ve kalemleri."""
|
||
fatura = get_object_or_404(Fatura.objects.select_related('firma'), pk=pk)
|
||
kalemler = fatura.kalemler.all()
|
||
|
||
context = {
|
||
"fatura": fatura,
|
||
"kalemler": kalemler,
|
||
"active_menu": "archive"
|
||
}
|
||
return render(request, "core/fatura_detay.html", context)
|
||
|
||
def raporlar(request):
|
||
"""İstatistik ve Raporlar."""
|
||
# Aylık harcama trendi
|
||
aylik_harcama = Fatura.objects.values('tarih__month').annotate(
|
||
toplam=Sum('genel_toplam'),
|
||
adet=Count('id')
|
||
).order_by('tarih__month')
|
||
|
||
# KDV dağılımı
|
||
kdv_ozet = Fatura.objects.aggregate(
|
||
toplam_kdv=Sum('kdv_toplam'),
|
||
ortalama_kdv=Avg('kdv_toplam')
|
||
)
|
||
|
||
context = {
|
||
"aylik_harcama": aylik_harcama,
|
||
"kdv_ozet": kdv_ozet,
|
||
"active_menu": "reports"
|
||
}
|
||
return render(request, "core/raporlar.html", context)
|
||
|
||
def firma_ekle(request):
|
||
if request.method == 'POST':
|
||
form = FirmaForm(request.POST)
|
||
if form.is_valid():
|
||
form.save()
|
||
return redirect('fatura_arsivi')
|
||
else:
|
||
form = FirmaForm()
|
||
return render(request, 'core/firma_form.html', {'form': form, 'title': 'Yeni Firma Ekle'})
|
||
|
||
def fatura_ekle(request):
|
||
firma_id = request.GET.get('firma')
|
||
initial = {}
|
||
if firma_id:
|
||
initial['firma'] = firma_id
|
||
|
||
if request.method == 'POST':
|
||
form = FaturaForm(request.POST, request.FILES)
|
||
if form.is_valid():
|
||
fatura = form.save()
|
||
return redirect('firma_detay', pk=fatura.firma.pk)
|
||
else:
|
||
form = FaturaForm(initial=initial)
|
||
return render(request, 'core/fatura_form.html', {'form': form, 'title': 'Yeni Fatura Yükle'})
|
||
|
||
def search(request):
|
||
query = request.GET.get('q', '')
|
||
faturalar = []
|
||
firmalar = []
|
||
if query:
|
||
faturalar = Fatura.objects.filter(
|
||
Q(fatura_no__icontains=query) |
|
||
Q(firma__ad__icontains=query)
|
||
).select_related('firma')
|
||
firmalar = Firma.objects.filter(
|
||
Q(ad__icontains=query) |
|
||
Q(vergi_no__icontains=query)
|
||
)
|
||
|
||
context = {
|
||
'query': query,
|
||
'faturalar': faturalar,
|
||
'firmalar': firmalar,
|
||
}
|
||
return render(request, 'core/search_results.html', context)
|
||
|
||
def firma_sil(request, pk):
|
||
firma = get_object_or_404(Firma, pk=pk)
|
||
if request.method == 'POST':
|
||
firma.delete()
|
||
return redirect('fatura_arsivi')
|
||
return render(request, 'core/confirm_delete.html', {'object': firma, 'type': 'Firma'})
|
||
|
||
def fatura_sil(request, pk):
|
||
fatura = get_object_or_404(Fatura, pk=pk)
|
||
firma_pk = fatura.firma.pk
|
||
if request.method == 'POST':
|
||
fatura.delete()
|
||
return redirect('firma_detay', pk=firma_pk)
|
||
return render(request, 'core/confirm_delete.html', {'object': fatura, 'type': 'Fatura'}) |