Mon commit initial

This commit is contained in:
2025-12-19 09:43:33 +00:00
commit f11d1e62b4
336 changed files with 6247 additions and 0 deletions

View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,3 @@
from django.contrib import admin # noqa: F401
# Register your models here.

View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class GestionFournisseurConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "gestion_fournisseur"

View File

@@ -0,0 +1,34 @@
"""Gérez les formulaires pour la gestion des fournisseurs."""
from django import forms
from gestion_produit.models import Fournisseur
class FournisseurForm(forms.ModelForm):
"""Formulaire pour le modèle Fournisseur."""
class Meta:
"""Métadonnées pour le formulaire FournisseurForm."""
model = Fournisseur
fields = (
"nom_entreprise",
"nom_prenom_representant",
"fonction",
"telephone",
"email",
"categorie",
"rccm",
"nifp",
)
widgets = {
"nom_entreprise": forms.TextInput(attrs={"class": "form-control"}),
"nom_prenom_representant": forms.TextInput(
attrs={"class": "form-control"}
),
"fonction": forms.TextInput(attrs={"class": "form-control"}),
"telephone": forms.TextInput(attrs={"class": "form-control"}),
"email": forms.EmailInput(attrs={"class": "form-control"}),
# "note": forms.NumberInput(attrs={"class": "form-control"}),
"categorie": forms.SelectMultiple(attrs={"class": "form-select"}),
}

View File

@@ -0,0 +1,7 @@
"""Gérez les modèles pour la gestion des fournisseurs.
Les modèles définis ici ont été déplacés vers gestion_produit.models.py
pour éviter les dépendances circulaires.
"""
# Create your models here.

View File

@@ -0,0 +1,82 @@
{% extends "BASE.html" %}
{% load static %}
{% load tags_personnaliser %}
{% block page_titre %} SGL - Gestion des fournisseurs {% endblock %}
{% block "contenu" %}
<h3 class="text-center my-3">Détails du fournisseur</h3>
<div class="row">
<div class="col-12 col-lg-8 border rounded p-3 mx-auto">
<form action="{% url 'gestion_fournisseur:mise-a-jour-fournisseur' id_fournisseur %}" method="post">
{% csrf_token %}
<div class="mb-3">
<label for="rccm" class="form-label d-block">{{fournisseurForm.nom_entreprise.label}} :</label>
{{ fournisseurForm.nom_entreprise }}
</div>
<div class="mb-3">
<label for="rccm" class="form-label d-block">{{fournisseurForm.nom_prenom_representant.label}} :</label>
{{ fournisseurForm.nom_prenom_representant }}
</div>
<div class="mb-3">
<label for="rccm" class="form-label d-block">{{fournisseurForm.fonction.label}} :</label>
{{ fournisseurForm.fonction }}
</div>
<div class="mb-3">
<label for="rccm" class="form-label d-block">{{fournisseurForm.telephone.label}} :</label>
{{ fournisseurForm.telephone }}
</div>
<div class="mb-3">
<label for="rccm" class="form-label d-block">{{fournisseurForm.email.label}} :</label>
{{ fournisseurForm.email }}
</div>
<div class="mb-3">
<label for="rccm" class="form-label d-block">{{fournisseurForm.categorie.label}} :</label>
{{ fournisseurForm.categorie }}
</div>
<div class="mb-3">
<label for="rccm" class="form-label d-block">RCCM :</label>
<div>
Actuellement :
{% if fournisseur.rccm %}
<a href="{{ fournisseur.rccm.url }}" target="_blank">{{ fournisseur.rccm.name }}</a>
{% else %}
Aucun fichier téléchargé.
{% endif %}
</div>
<input type="file" name="rccm" id="rccm" class="form-control">
</div>
<div class="mb-3">
<label for="rccm" class="form-label d-block">NIFp :</label>
<div>
Actuellement :
{% if fournisseur.rccm %}
<a href="{{ fournisseur.nifp.url }}" target="_blank">{{ fournisseur.nifp.name }}</a>
{% else %}
Aucun fichier téléchargé.
{% endif %}
</div>
<input type="file" name="nifp" id="nifp" class="form-control">
</div>
<input type="submit" value="Mettre à jour" class="btn btn-primary mx-auto d-block">
</form>
</div>
</div>
<div class="row mt-2 d-flex align-items-center">
<div class="col"><h4 class="my-3">Livraison du fournisseur</h4></div>
<div class="col">
<!-- <label for="">Filtrer par date :</label> -->
<input type="month" name="" id="filtreMois" class="form-control">
</div>
</div>
<div id="liste-livraison" data-url = "{% url 'gestion_fournisseur:liste-livraison' id_fournisseur %}" data-idfournisseur="{{id_fournisseur}}"></div>
{% endblock %}
{% block "js" %}
<script src="{% static 'js/details_fournisseur.js' %}"></script>
{% endblock %}

View File

@@ -0,0 +1,64 @@
{% extends "BASE.html" %}
{% load static %}
{% load tags_personnaliser %}
{% block page_titre %} SGL - Gestion des fournisseurs {% endblock %}
{% block "contenu" %}
<div class="row p-2">
<div class="col d-flex justify-content-between">
<h3>LISTE DES FOURNISSEURS </h3>
{% if user|has_group:"Logisticien" %}
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#enregistrerFournisseur">
<i class="bi bi-person-plus-fill"></i>
Ajouter un fournisseur
</button>
{% endif %}
</div>
</div>
<div class="row p-2">
<div class="col">
<input type="text" class="form-control" placeholder="Rechercher par nom du fournisseur" id="searchFournisseur">
</div>
<div class="col">
<select name="" id="filterCategorie" class="form-select">
<option value="">Selectionner la catégorie du produit</option>
{% for categorie in listeCategorie %}
<option value="{{ categorie.id }}">{{ categorie.categorie }}</option>
{% endfor %}
</select>
</div>
</div>
<div id="liste_fournisseur" data-url="{% url 'gestion_fournisseur:liste_fournisseur' %}"></div>
<!-- Modal ajout d'un nouveau fournisseur -->
<div class="modal fade" id="enregistrerFournisseur" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="informationFournisseurModalLabel">Information sur le fournisseur</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{% url 'gestion_fournisseur:index' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
<button type="submit" class="btn btn-primary">Enregistrer</button>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
{% block "js" %}
<script src="{% static 'js/gestion_fournisseur_index.js' %}"></script>
{% endblock %}

View File

@@ -0,0 +1,3 @@
from django.test import TestCase # noqa: F401
# Create your tests here.

View File

@@ -0,0 +1,33 @@
"""Gérez les URL pour la gestion des fournisseurs."""
from django.urls import path
from . import views
app_name = "gestion_fournisseur"
urlpatterns = [
path("", views.index, name="index"),
path(
"liste-fournisseur", views.liste_fournisseurs, name="liste_fournisseur"
),
path(
"liste-fournisseur-categorie",
views.liste_fournisseur_categorie,
name="liste_fournisseur_categorie",
),
path(
"liste-livraison/<int:id_fournisseur>",
views.liste_livraison_fournisseur,
name="liste-livraison",
),
path(
"details-fournisseur/<int:id_fournisseur>",
views.details_fournisseur,
name="details_fournisseur",
),
path(
"mise-a-jour-fournisseur/<int:id_fournisseur>",
views.mise_a_jour_fournisseur,
name="mise-a-jour-fournisseur",
),
]

View File

@@ -0,0 +1,195 @@
"""Vuews pour la gestion des fournisseurs."""
from django.shortcuts import render, redirect
from gestion_produit.models import Fournisseur, Categorie, Commander
from django.http import JsonResponse
from django.contrib.auth.decorators import login_required
from .forms import FournisseurForm
@login_required(login_url="login")
def index(request):
"""Gérez la vue index de la gestion des fournisseurs.
Parameters
----------
request : HttpRequest
La requête HTTP entrante.
Returns
-------
HttpResponse
La réponse HTTP avec le formulaire de fournisseur.
"""
if request.method == "POST":
form = FournisseurForm(request.POST, request.FILES)
if form.is_valid():
form.save()
form = FournisseurForm()
return render(
request,
"gestion_fournisseur/index.html",
{"form": form, "listeCategorie": Categorie.objects.all()},
)
@login_required(login_url="login")
def liste_fournisseurs(request): # noqa: ARG001
"""Renvoyez la liste des fournisseurs au format JSON.
Parameters
----------
request : HttpRequest
La requête HTTP entrante.
Returns
-------
JsonResponse
La réponse JSON contenant la liste des fournisseurs.
"""
fournisseurs = Fournisseur.objects.all().order_by("-id")
data = [
{
"id": f.id,
"nom_entreprise": f.nom_entreprise,
"representant": f.nom_prenom_representant,
"fonction": f.fonction,
"telephone": f.telephone,
"email": f.email,
"note": f.note,
}
for f in fournisseurs
]
return JsonResponse(data, safe=False)
@login_required(login_url="login")
def liste_fournisseur_categorie(request):
"""Renvoyez la liste des fournisseurs par catégorie au format JSON.
Parameters
----------
request : HttpRequest
La requête HTTP entrante.
Returns
-------
JsonResponse
La réponse JSON contenant la liste des fournisseurs filtrés par
catégorie.
"""
categorie = Categorie.objects.get(id=request.GET["c"])
fournisseur_categorie = Fournisseur.objects.filter(categorie=categorie)
data = [
{
"id": f.id,
"nom_entreprise": f.nom_entreprise,
"representant": f.nom_prenom_representant,
"fonction": f.fonction,
"telephone": f.telephone,
"email": f.email,
"note": f.note,
}
for f in fournisseur_categorie
]
return JsonResponse(data, safe=False)
@login_required(login_url="login")
def details_fournisseur(request, id_fournisseur):
"""Affichez les détails d'un fournisseur spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP entrante.
id_fournisseur : int
L'identifiant du fournisseur.
Returns
-------
HttpResponse
La réponse HTTP avec les détails du fournisseur.
"""
fournisseur = Fournisseur.objects.get(id=id_fournisseur)
fournisseur_form = FournisseurForm(instance=fournisseur)
return render(
request,
"gestion_fournisseur/details_fournisseur.html",
{
"fournisseur": fournisseur,
"fournisseurForm": fournisseur_form,
"id_fournisseur": id_fournisseur,
},
)
def mise_a_jour_fournisseur(request, id_fournisseur):
"""Mettez à jour les informations d'un fournisseur spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP entrante.
id_fournisseur : int
L'identifiant du fournisseur.
Returns
-------
HttpResponse
La réponse HTTP redirigeant vers les détails du fournisseur.
"""
fournisseur = Fournisseur.objects.get(id=id_fournisseur)
if request.method == "POST":
form = FournisseurForm(
request.POST,
request.FILES,
instance=fournisseur
)
if form.is_valid():
form.save()
return redirect(
"gestion_fournisseur:details_fournisseur",
id_fournisseur=id_fournisseur
)
def liste_livraison_fournisseur(request, id_fournisseur): # noqa: ARG001
"""Renvoyez la liste des livraisons d'un fournisseur au format JSON.
Parameters
----------
request : HttpRequest
La requête HTTP entrante.
id_fournisseur : int
L'identifiant du fournisseur.
Returns
-------
JsonResponse
La réponse JSON contenant la liste des livraisons du fournisseur.
"""
commande_fournisseur = [
{
"date": c.date_livraison,
"produit": c.produit.libelle,
"prix_achat": c.prix_achat,
"quantite": c.quantite_commander,
"montant_total": c.quantite_commander * c.prix_achat,
"date_livraison": c.date_livraison,
"statut": c.livrer,
}
for c in Commander.objects.filter(fournisseur__id=id_fournisseur)
]
return JsonResponse(commande_fournisseur, safe=False)