224 lines
6.3 KiB
Python
224 lines
6.3 KiB
Python
from django.shortcuts import render, get_object_or_404
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
from django.db.models import Q, Sum
|
|
|
|
import os
|
|
from django.conf import settings
|
|
from django.urls import reverse
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.views.decorators.http import require_http_methods
|
|
from datetime import date, datetime, timedelta
|
|
|
|
import simplejson
|
|
|
|
from .models import (
|
|
Client,
|
|
Contract,
|
|
Prestation,
|
|
)
|
|
|
|
from .forms import (
|
|
ClientForm,
|
|
ContractForm,
|
|
PrestationForm,
|
|
)
|
|
|
|
from tools.pdf_generator import BillPaper
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def client_lookup(request):
|
|
""" Récupère la liste des clients à la volée suivant des caractères de recherches entrés.
|
|
"""
|
|
pattern = request.GET.get("pattern", 0)
|
|
|
|
if pattern is not None and len(pattern) >= 3:
|
|
results = Client.objects.filter(
|
|
Q(name__icontains=pattern) | Q(contact__icontains=pattern) | Q(city__icontains=pattern)
|
|
)
|
|
client_list = [{"ID": x.id, "name": str(x)} for x in results]
|
|
|
|
json = simplejson.dumps(client_list)
|
|
return HttpResponse(json, content_type="application/json")
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def client_listing(request):
|
|
""" Récupère la liste de tous les clients. """
|
|
client_list = Client.objects.all()
|
|
context = {"client_list": client_list}
|
|
return render(request, "billing/clients/listing.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def client_details(request, client_id=None):
|
|
""" Récupère les informations d'un client.
|
|
|
|
Args:
|
|
client_id (int): identifiant d'un client.
|
|
"""
|
|
client = get_object_or_404(Client, pk=client_id)
|
|
context = {"client": client}
|
|
return render(request, "billing/clients/details.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET", "POST"])
|
|
def client_create_or_update(request, client_id=None):
|
|
""" Création d'un client.
|
|
|
|
Args:
|
|
client_id (int): identifiant d'un client.
|
|
"""
|
|
|
|
if client_id:
|
|
client = get_object_or_404(Client, pk=client_id)
|
|
else:
|
|
client = None
|
|
|
|
if request.method == "POST":
|
|
form = ClientForm(request.POST, instance=client)
|
|
|
|
if form.is_valid():
|
|
client = form.save()
|
|
return HttpResponseRedirect(reverse("client_details", args=(client.pk, )))
|
|
|
|
else:
|
|
form = ClientForm(instance=client)
|
|
|
|
context = {"form": form, "client_id": client_id}
|
|
return render(request, "billing/clients/create.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def contract_listing(request):
|
|
""" Récupère la liste de tous les contrats. """
|
|
contract_list = Contract.objects.all()
|
|
context = {"contract_list": contract_list}
|
|
return render(request, "billing/contracts/listing.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def contract_detail(request, contract_id):
|
|
"""
|
|
Récupère toutes les informations relatives à un contrat et les prestations relatives à
|
|
celui-ci.
|
|
|
|
Args:
|
|
contract_id (int): identifiant d'un contract
|
|
"""
|
|
|
|
contract = Contract.objects.get(pk=contract_id)
|
|
prestation_list = contract.get_prestation.all()
|
|
prestation_count = prestation_list.count()
|
|
total = list(contract.get_prestation.all().aggregate(Sum("total_amount")).values())[
|
|
0
|
|
]
|
|
context = {
|
|
"contract": contract,
|
|
"prestation_list": prestation_list,
|
|
"prestation_count": prestation_count,
|
|
"total": total,
|
|
}
|
|
return render(request, "billing/contracts/details.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET", "POST"])
|
|
def contract_create_or_update(request, contract_id=None):
|
|
""" Création d'un contract.
|
|
|
|
Args:
|
|
contract_id (int): identifiant d'un contract.
|
|
"""
|
|
|
|
if contract_id:
|
|
contract = get_object_or_404(Contract, pk=contract_id)
|
|
else:
|
|
contract = None
|
|
|
|
if request.method == "POST":
|
|
form = ContractForm(request.POST, instance=contract)
|
|
|
|
if form.is_valid():
|
|
contract = form.save()
|
|
return HttpResponseRedirect(reverse("contract_details", args=(contract.pk, )))
|
|
|
|
else:
|
|
form = ContractForm(instance=contract)
|
|
|
|
context = {"form": form, "contract_id": contract_id}
|
|
return render(request, "billing/contracts/create.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def contract_export(request, contract_id):
|
|
""" Génere un fichier PDF pour fournir au client.
|
|
|
|
Args:
|
|
contract_id (int): identifiant d'un contract.
|
|
"""
|
|
|
|
contract = Contract.objects.get(pk=contract_id)
|
|
|
|
# Create the HttpResponse object with the appropriate PDF headers.
|
|
response = HttpResponse(content_type="application/pdf")
|
|
response["Content-Disposition"] = (
|
|
'attachment; filename="facture_' + str(contract.reference) + '.pdf"'
|
|
)
|
|
document = BillPaper(response)
|
|
document.generate(contract)
|
|
|
|
document.download()
|
|
return response
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET", "POST"])
|
|
def prestation_create_or_update(request, prestation_id=None):
|
|
""" Création d'un contract.
|
|
|
|
Args:
|
|
prestation_id (int): identifiant d'un prestation.
|
|
"""
|
|
|
|
if prestation_id:
|
|
prestation = get_object_or_404(Prestation, pk=prestation_id)
|
|
else:
|
|
prestation = None
|
|
|
|
if request.method == "POST":
|
|
form = PrestationForm(request.POST, instance=prestation)
|
|
|
|
if form.is_valid():
|
|
prestation = form.save()
|
|
return HttpResponseRedirect(reverse("contract_detail", args=(prestation.contract.id, )))
|
|
else:
|
|
print(form.errors)
|
|
|
|
else:
|
|
form = PrestationForm(instance=prestation)
|
|
|
|
context = {"form": form, "prestation_id": prestation_id}
|
|
return render(request, "billing/prestations/create.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def contract_lookup(request):
|
|
"""Récupère la liste des contrat à la volée suivant des caractères de recherches entrés."""
|
|
pattern = request.GET.get("pattern", 0)
|
|
|
|
if pattern is not None and len(pattern) >= 3:
|
|
results = Contract.objects.filter(Q(name__icontains=pattern))
|
|
contract_list = [{"ID": x.id, "name": str(x)} for x in results]
|
|
|
|
json = simplejson.dumps(contract_list)
|
|
return HttpResponse(json, content_type="application/json")
|