Files
ProjectApp/invoices/views_info.py
T
Felix Baumann 148efd919d v1.0
2026-06-28 10:20:36 +00:00

81 lines
2.6 KiB
Python

from django.contrib.auth.decorators import login_required, permission_required
from django.db.models import Count, Q, Sum
from django.http import JsonResponse
from django.utils import timezone
from datetime import timedelta
from .models import Invoice, Offer, Reminder, Customer
@login_required
@permission_required("invoices_invoices_info")
def ajax_invoice_info(request):
now = timezone.now()
data = (
Invoice.objects
.filter(issue_date__year=now.year, issue_date__month=now.month)
.values("status")
.annotate(count=Count("id"))
)
return JsonResponse({item["status"]: item["count"] for item in data})
@login_required
@permission_required("invoices_offers_info")
def ajax_offer_info(request):
now = timezone.now()
data = (
Offer.objects
.filter(issue_date__year=now.year, issue_date__month=now.month)
.values("status")
.annotate(count=Count("id"))
)
return JsonResponse({item["status"]: item["count"] for item in data})
@login_required
@permission_required("invoices_reminders_info")
def ajax_reminder_info(request):
now = timezone.now()
data = (
Reminder.objects
.filter(issue_date__year=now.year, issue_date__month=now.month)
.values("status")
.annotate(count=Count("id"))
)
return JsonResponse({item["status"]: item["count"] for item in data})
@login_required
@permission_required("invoices_info")
def ajax_kpi_info(request):
today = timezone.now().date()
overdue_invoices = Invoice.objects.filter(status="overdue").count()
open_invoices = Invoice.objects.filter(status="sent").count()
open_offers = Offer.objects.filter(status="sent").count()
open_reminders = Reminder.objects.filter(status="sent").count()
overdue_amount = (
Invoice.objects
.filter(status="overdue")
.aggregate(total=Sum("items__unit_price_net"))["total"] or 0
)
return JsonResponse({
"overdue_invoices": overdue_invoices,
"open_invoices": open_invoices,
"open_offers": open_offers,
"open_reminders": open_reminders,
})
@login_required
@permission_required("invoices_customers_info")
def ajax_customer_info(request):
start_of_week = timezone.now().date() - timedelta(days=timezone.now().weekday())
return JsonResponse({
"total": Customer.objects.count(),
"new_this_week": Customer.objects.filter(created_at__date__gte=start_of_week).count(),
"companies": Customer.objects.filter(customer_type="company").count(),
"private": Customer.objects.filter(customer_type="private").count(),
})