326 lines
9.9 KiB
Python
326 lines
9.9 KiB
Python
"""Fichier views.py de gestion de la page dashboard de l'application SGL.
|
|
|
|
Principales fonctionnalités couvertes :
|
|
1- Gestion des stocks des produits (rupture, pré-rupture, normal).
|
|
2- Affichage des commandes en cours et validations des dites commandes
|
|
3- Affichage des demandes en cours et validations des dites demandes.
|
|
"""
|
|
|
|
import json
|
|
from django.shortcuts import render, redirect
|
|
from django.http import JsonResponse
|
|
from gestion_produit.models import Commander, Demander, Produit
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from gestion_produit.views import calcul_stock_produit
|
|
|
|
|
|
def dashboard_quantite_produit():
|
|
"""Calculez les quantités des produits en rupture, pré-rupture et normal.
|
|
|
|
Returns
|
|
-------
|
|
dict
|
|
Dictionnaire contenant les nombres et les listes des produits par
|
|
catégorie.
|
|
|
|
"""
|
|
tous_les_produits = Produit.objects.all()
|
|
|
|
produit_rupture = []
|
|
produit_pre_rupture = []
|
|
produit_normal = []
|
|
|
|
for produit in tous_les_produits:
|
|
stock_actuel = calcul_stock_produit(produit)
|
|
stock_actuel.pop("image")
|
|
if stock_actuel["stockActuel"] == 0:
|
|
produit_rupture.append(stock_actuel)
|
|
elif stock_actuel["stockActuel"] < produit.seuil_pre_rupture:
|
|
produit_pre_rupture.append(stock_actuel)
|
|
else:
|
|
produit_normal.append(stock_actuel)
|
|
|
|
return {
|
|
"nombre_rupture": len(produit_rupture),
|
|
"nombre_pre_rupture": len(produit_pre_rupture),
|
|
"nombre_normal": len(produit_normal),
|
|
"produit_rupture": produit_rupture,
|
|
"produit_pre_rupture": produit_pre_rupture,
|
|
"produit_normale": produit_normal,
|
|
}
|
|
|
|
|
|
@login_required
|
|
def index(request):
|
|
"""Retournez la page d'accueil du dashboard.
|
|
|
|
Parameters
|
|
----------
|
|
request : HttpRequest
|
|
La requête HTTP entrante.
|
|
|
|
Returns
|
|
-------
|
|
HttpResponse
|
|
La réponse HTTP contenant la page d'accueil du dashboard.
|
|
|
|
"""
|
|
if request.user.groups.filter(name="chauffeur").exists():
|
|
return redirect("gestion_vehicule:index")
|
|
|
|
if not request.user.groups.filter(name="direction").exists():
|
|
return redirect("gestion_produit:index")
|
|
|
|
commandes_en_cours = Commander.objects.filter(livrer=False)
|
|
demandes_en_cours = Demander.objects.filter(
|
|
valider_par_chef=True, valider_par_logisticien=None
|
|
)
|
|
|
|
gestion_quantite_produit = dashboard_quantite_produit()
|
|
|
|
nombre_rupture = gestion_quantite_produit["nombre_rupture"]
|
|
nombre_pre_rupture = gestion_quantite_produit["nombre_pre_rupture"]
|
|
nombre_normal = gestion_quantite_produit["nombre_normal"]
|
|
|
|
return render(
|
|
request,
|
|
"index.html",
|
|
{
|
|
"nb_commande": len(commandes_en_cours),
|
|
"nb_demande": len(demandes_en_cours),
|
|
"nombre_rupture": nombre_rupture,
|
|
"nombre_pre_rupture": nombre_pre_rupture,
|
|
"nombre_normal": nombre_normal,
|
|
},
|
|
)
|
|
|
|
@login_required
|
|
def produit_a_rendre(_request):
|
|
"""Retournez la liste des équipements à rendre.
|
|
|
|
Cette vue est appelée via une requête AJAX et renvoie une liste
|
|
d'équipements qui doivent être rendus.
|
|
|
|
Parameters
|
|
----------
|
|
request : HttpRequest
|
|
La requête HTTP entrante.
|
|
|
|
Returns
|
|
-------
|
|
JsonResponse
|
|
Une réponse JSON contenant la liste des équipements à rendre.
|
|
|
|
"""
|
|
equipement_a_rendre = Demander.objects.filter(a_rendre=True, rendu=False)
|
|
liste_equipement = [
|
|
{
|
|
"id_demande": equipement.id,
|
|
"produit": equipement.produit.libelle,
|
|
"quantite": equipement.quantite,
|
|
"detenteur": (
|
|
f"{equipement.user.user.first_name} "
|
|
f"{equipement.user.user.last_name}"
|
|
),
|
|
"action": equipement.rendu,
|
|
}
|
|
for equipement in equipement_a_rendre
|
|
]
|
|
|
|
return JsonResponse(liste_equipement, safe=False)
|
|
|
|
@login_required
|
|
def produit_a_rendre_update(request):
|
|
"""Mettez à jour le statut des équipements à rendre.
|
|
|
|
Lorsqu'une requête POST est reçue, cette vue met à jour le statut
|
|
des équipements à rendre en fonction des données fournies dans la
|
|
requête.
|
|
|
|
Parameters
|
|
----------
|
|
request : HttpRequest
|
|
request.id_demande : int
|
|
L'identifiant de la demande d'équipement à mettre à jour.
|
|
request.action : bool
|
|
Le nouveau statut de rendu de l'équipement.
|
|
|
|
Returns
|
|
-------
|
|
JsonResponse
|
|
Une réponse JSON indiquant le succès de l'opération.
|
|
|
|
"""
|
|
if request.method == "POST":
|
|
data = json.loads(request.body)
|
|
for d in data:
|
|
demande = Demander.objects.get(id=d["id_demande"])
|
|
demande.rendu = d["action"]
|
|
demande.save()
|
|
|
|
return JsonResponse(
|
|
{"status": "success", "message": "Produits mis à jour"}
|
|
)
|
|
|
|
@login_required
|
|
def liste_produit_rupture(request):
|
|
"""Vue pour obtenir la liste des produits en fonction de leur type.
|
|
|
|
Cette vue est appelée via une requête AJAX à chaque fois que l'on clique
|
|
sur un cadran (rupture, pré-rupture, en stock normal) et renvoie une liste
|
|
de produits en fonction du type spécifié dans les paramètres de la
|
|
requête.
|
|
|
|
Parameters
|
|
----------
|
|
request : HttpRequest
|
|
request.type : str
|
|
Le statut de produits à récupérer qui sont en "rupture",
|
|
"pre_rupture" ou "normal".
|
|
|
|
Returns
|
|
-------
|
|
JsonResponse
|
|
Une réponse JSON contenant la liste des produits correspondant
|
|
au type spécifié.
|
|
|
|
"""
|
|
type_encadrer = request.GET["type"]
|
|
dashboard_gestion = dashboard_quantite_produit()
|
|
|
|
donnees_charger = []
|
|
|
|
if type_encadrer == "rupture":
|
|
donnees_charger = dashboard_gestion["produit_rupture"]
|
|
elif type_encadrer == "pre_rupture":
|
|
donnees_charger = dashboard_gestion["produit_pre_rupture"]
|
|
elif type_encadrer == "normal":
|
|
donnees_charger = dashboard_gestion["produit_normale"]
|
|
|
|
return JsonResponse(donnees_charger, safe=False)
|
|
|
|
@login_required
|
|
def liste_produit_commander(request):
|
|
"""Listez des produits commandés non encore livrés.
|
|
|
|
Parameters
|
|
----------
|
|
request : HttpRequest
|
|
La requête HTTP entrante.
|
|
|
|
Returns
|
|
-------
|
|
JsonResponse
|
|
Une réponse JSON contenant la liste des produits commandés
|
|
non encore livrés.
|
|
|
|
"""
|
|
commandes_en_cours = Commander.objects.filter(livrer=False)
|
|
ma_liste_commandes = [
|
|
{
|
|
"id_commande": commande.id,
|
|
"produit": commande.produit.libelle,
|
|
"quantite": commande.quantite_commander,
|
|
"date_commande": commande.date_commande,
|
|
"date_livraison": commande.date_livraison,
|
|
"fournisseur": commande.fournisseur.nom_entreprise,
|
|
"is_logisticien": (
|
|
request.user.profile.departement.
|
|
nom_departement == "Logistique"
|
|
),
|
|
}
|
|
for commande in commandes_en_cours
|
|
]
|
|
|
|
return JsonResponse(ma_liste_commandes, safe=False)
|
|
|
|
|
|
@login_required
|
|
def enregistrer_livraison_produit(request):
|
|
"""Enregistrez la livraison d'un produit commandé.
|
|
|
|
Lorsqu'une requête POST est reçue, cette vue met à jour le statut
|
|
de livraison du produit commandé en fonction de l'identifiant de la
|
|
commande fourni dans la requête.
|
|
|
|
Parameters
|
|
----------
|
|
request : HttpRequest
|
|
request.id_commande : int
|
|
L'identifiant de la commande dont la livraison doit
|
|
être enregistrée.
|
|
|
|
Returns
|
|
-------
|
|
JsonResponse
|
|
Une réponse JSON indiquant le succès ou l'échec de l'opération.
|
|
|
|
"""
|
|
if request.method == "POST":
|
|
id_commande = request.POST.get("id_commande")
|
|
try:
|
|
commande = Commander.objects.get(id=id_commande)
|
|
commande.livrer = True
|
|
commande.save()
|
|
return JsonResponse(
|
|
{
|
|
"status": "success",
|
|
"message": "Livraison enregistrée avec succès."
|
|
}
|
|
)
|
|
except Commander.DoesNotExist:
|
|
return JsonResponse(
|
|
{"status": "error", "message": "Commande non trouvée."}
|
|
)
|
|
return JsonResponse(
|
|
{"status": "error", "message": "Méthode non autorisée."}
|
|
)
|
|
|
|
|
|
@login_required
|
|
def liste_demandes(request):
|
|
"""Listez des demandes en cours de validation.
|
|
|
|
Parameters
|
|
----------
|
|
request : HttpRequest
|
|
La requête HTTP entrante.
|
|
|
|
Returns
|
|
-------
|
|
JsonResponse
|
|
Une réponse JSON contenant la liste des demandes en cours
|
|
de validation.
|
|
|
|
"""
|
|
demandes_en_cours = Demander.objects.filter(
|
|
valider_par_chef=True, valider_par_logisticien=None
|
|
)
|
|
is_logisticien = (
|
|
request.user.profile.departement.nom_departement == "Logistique"
|
|
)
|
|
ma_liste_demandes = [
|
|
{
|
|
"id_demande": demande.id,
|
|
"demandeur": (
|
|
f"{demande.user.user.first_name} "
|
|
f"{demande.user.user.last_name}"
|
|
),
|
|
"produit": demande.produit.libelle,
|
|
"quantite": demande.quantite,
|
|
"motifs": demande.motifs,
|
|
"date_de_mise_a_dispo_souhaite": (
|
|
demande.date_de_mise_a_dispo_souhaite
|
|
.strftime("%Y-%m-%d")
|
|
),
|
|
"a_rendre": demande.a_rendre,
|
|
"valider_par_chef": demande.valider_par_chef,
|
|
"valider_par_logisticien": demande.valider_par_logisticien,
|
|
"is_logisticien": is_logisticien,
|
|
}
|
|
for demande in demandes_en_cours
|
|
]
|
|
|
|
return JsonResponse(ma_liste_demandes, safe=False)
|