Mon commit initial
This commit is contained in:
0
gestion_fournisseur/__init__.py
Normal file
0
gestion_fournisseur/__init__.py
Normal file
BIN
gestion_fournisseur/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/admin.cpython-310.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/admin.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/admin.cpython-313.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/admin.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/apps.cpython-310.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/apps.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/apps.cpython-313.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/apps.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/forms.cpython-310.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/forms.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/forms.cpython-313.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/forms.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/models.cpython-310.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/models.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/models.cpython-313.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/models.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/tests.cpython-313.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/tests.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/urls.cpython-310.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/urls.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/urls.cpython-313.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/urls.cpython-313.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/views.cpython-310.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/views.cpython-310.pyc
Normal file
Binary file not shown.
BIN
gestion_fournisseur/__pycache__/views.cpython-313.pyc
Normal file
BIN
gestion_fournisseur/__pycache__/views.cpython-313.pyc
Normal file
Binary file not shown.
3
gestion_fournisseur/admin.py
Normal file
3
gestion_fournisseur/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin # noqa: F401
|
||||
|
||||
# Register your models here.
|
||||
6
gestion_fournisseur/apps.py
Normal file
6
gestion_fournisseur/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class GestionFournisseurConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "gestion_fournisseur"
|
||||
34
gestion_fournisseur/forms.py
Normal file
34
gestion_fournisseur/forms.py
Normal 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"}),
|
||||
}
|
||||
0
gestion_fournisseur/migrations/__init__.py
Normal file
0
gestion_fournisseur/migrations/__init__.py
Normal 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.
7
gestion_fournisseur/models.py
Normal file
7
gestion_fournisseur/models.py
Normal 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.
|
||||
@@ -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 %}
|
||||
64
gestion_fournisseur/templates/gestion_fournisseur/index.html
Normal file
64
gestion_fournisseur/templates/gestion_fournisseur/index.html
Normal 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 %}
|
||||
3
gestion_fournisseur/tests.py
Normal file
3
gestion_fournisseur/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase # noqa: F401
|
||||
|
||||
# Create your tests here.
|
||||
33
gestion_fournisseur/urls.py
Normal file
33
gestion_fournisseur/urls.py
Normal 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",
|
||||
),
|
||||
]
|
||||
195
gestion_fournisseur/views.py
Normal file
195
gestion_fournisseur/views.py
Normal 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)
|
||||
Reference in New Issue
Block a user