ComptaClub/eventCompta/views.py

204 lines
6.2 KiB
Python

# coding=utf-8
from django.db.models import Sum
from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required
from collections import OrderedDict
from django.views.decorators.http import require_http_methods
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
import decimal
from .models import (
# Transaction,
Event,
)
from .forms import EventForm
from comptabilite.models import Transaction
def append_to_dictionnary(transaction, dictionnary, previous_date=None):
"""
Ajoute au dictionnaire le montant de la transaction, soit en l'ajoutant à une clé déjà présente
soit en créant un nouvelle clé.
"""
date = transaction.registrationDate.date()
amount = transaction.amount
if date in dictionnary:
if transaction.transaction_type.transaction_type == 1:
dictionnary[date] += amount
else:
dictionnary[date] -= amount
else:
if previous_date is not None:
if transaction.transaction_type.transaction_type == 1:
dictionnary[date] = dictionnary[previous_date] + amount
else:
dictionnary[date] = dictionnary[previous_date] - amount
else:
if transaction.transaction_type.transaction_type == 1:
dictionnary[date] = amount
else:
dictionnary[date] = -amount
return date
def __compute_sum_amount(transaction_list, with_simulated=None):
"""
"""
if with_simulated is None:
total = sum(
[
transaction.totalAmount
for transaction in transaction_list
if not transaction.is_simulated
and transaction.transaction_type.transaction_type == 1
]
)
total -= sum(
[
transaction.totalAmount
for transaction in transaction_list
if not transaction.is_simulated
and transaction.transaction_type.transaction_type == 0
]
)
else:
total = sum(
[
transaction.totalAmount
for transaction in transaction_list
if transaction.transaction_type.transaction_type == 1
]
)
total -= sum(
[
transaction.totalAmount
for transaction in transaction_list
if transaction.transaction_type.transaction_type == 0
]
)
return total
@login_required
@require_http_methods(["GET"])
def event_details(request, event_id):
"""
Renvoie l'évènement, toutes les lignes de comptabilité associées et la somme de ces lignes.
"""
event = Event.objects.select_related().get(pk=event_id)
transaction_list = event.transactions.all().order_by("-registrationDate")
sum_recette = event.transactions.filter(
transaction_type__transaction_type=1
).aggregate(Sum("totalAmount"))["totalAmount__sum"]
sum_depense = event.transactions.filter(
transaction_type__transaction_type=0
).aggregate(Sum("totalAmount"))["totalAmount__sum"]
if not isinstance(sum_recette, decimal.Decimal):
sum_recette = 0
if not isinstance(sum_depense, decimal.Decimal):
sum_depense = 0
total_simulated_amount = sum_recette - sum_depense
nonsimulated_sum_recette = event.transactions.filter(
transaction_type__transaction_type=1, is_simulated=False
).aggregate(Sum("totalAmount"))["totalAmount__sum"]
nonsimulated_sum_depense = event.transactions.filter(
transaction_type__transaction_type=0, is_simulated=False
).aggregate(Sum("totalAmount"))["totalAmount__sum"]
if not isinstance(nonsimulated_sum_recette, decimal.Decimal):
nonsimulated_sum_recette = 0
if not isinstance(nonsimulated_sum_depense, decimal.Decimal):
nonsimulated_sum_depense = 0
total_amount = nonsimulated_sum_recette - nonsimulated_sum_depense
previous_date = None
date_sum = OrderedDict()
previous_date_with_simulated = None
date_sum_with_simulated = OrderedDict()
for transaction in transaction_list:
previous_date_with_simulated = append_to_dictionnary(
transaction, date_sum_with_simulated, previous_date_with_simulated
)
if not transaction.is_simulated:
previous_date = append_to_dictionnary(transaction, date_sum, previous_date)
if len(date_sum) == len(date_sum_with_simulated):
date_sum_with_simulated = None
# total_amount = total_simulated_amount
else:
# total_amount = __compute_sum_amount(transaction_list)
pass
context = {
"event": event,
"transaction_list": transaction_list,
"total_Amount": total_amount,
"total_simulated_Amount": total_simulated_amount,
"date_sum": date_sum,
"date_sum_simulated": date_sum_with_simulated,
"sum_recette": sum_recette,
"sum_depense": sum_depense,
"nonsimulated_sum_recette": nonsimulated_sum_recette,
"nonsimulated_sum_depense": nonsimulated_sum_depense,
}
return render(request, "event/details.html", context)
@login_required
@require_http_methods(["GET"])
def event_listing(request):
"""
Renvoie la liste de tous les évènements.
"""
event_list = Event.objects.all().order_by("-date_begin")
context = {"events": event_list}
return render(request, "event/listing.html", context)
@login_required
@require_http_methods(["GET", "POST"])
def event_create_or_update(request, event_id=None):
""" Création ou modificatin d'une event.
Args:
event_id (int): identifiant d'une event.
"""
if event_id:
event = get_object_or_404(Event, pk=event_id)
else:
event = None
if request.method == "POST":
form = EventForm(request.POST, instance=event)
if form.is_valid():
event = form.save()
return HttpResponseRedirect(reverse("event_details", args=(event.pk, )))
else:
form = EventForm(instance=event)
context = {"form": form, "event_id": event_id}
return render(request, "event/create.html", context)