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.

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.

6
gestion_vehicule/apps.py Normal file
View File

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

105
gestion_vehicule/forms.py Normal file
View File

@@ -0,0 +1,105 @@
"""Gestion des formulaires liés aux véhicules."""
from . import models
from django import forms
class EnregistrerVehicule(forms.ModelForm):
"""Formulaire pour enregistrer un véhicule."""
class Meta:
"""Métadonnées du formulaire."""
model = models.Vehicule
fields = ("image", "immatriculation")
widgets = {
"immatriculation": forms.TextInput(
attrs={"class": "form-control"}
),
# "image": forms.TextInput(attrs=
# {"class": "form-control", "type": "image"}),
}
class EnregistrerDemande(forms.ModelForm):
"""Formulaire pour enregistrer une demande de véhicule."""
class Meta:
"""Métadonnées du formulaire."""
model = models.DemandeVehicule
fields = ("lieu_depart", "lieu_arrive", "date_heure")
widgets = {
"lieu_depart": forms.TextInput(attrs={"class": "form-control"}),
"lieu_arrive": forms.TextInput(attrs={"class": "form-control"}),
"date_heure": forms.DateTimeInput(
attrs={"class": "form-control", "type": "datetime-local"}
),
}
class CarnetBord(forms.ModelForm):
"""Formulaire pour le carnet de bord d'un véhicule."""
class Meta:
"""Métadonnées du formulaire."""
model = models.CarnetBord
fields = (
"vehicule",
"course",
"heure_effectif_depart",
"km_depart",
"heure_arrive",
"km_arrive",
"course_termine",
)
widgets = {
"vehicule": forms.TextInput(attrs={"class": "form-control"}),
"mois_concerne": forms.TextInput(
attrs={"class": "form-control", "type": "month"}
),
"km_debut_mois": forms.TextInput(
attrs={"class": "form-control", "type": "number"}
),
"km_fin_mois": forms.TextInput(
attrs={"class": "form-control", "type": "number"}
),
}
class PriseCarburant(forms.ModelForm):
"""Formulaire pour enregistrer une prise de carburant."""
class Meta:
"""Métadonnées du formulaire."""
model = models.CarnetCarburant
fields = (
"date",
"nom_station",
"type_carburant",
"litre",
"prix",
"kilometrage",
"observation",
)
widgets = {
"vehicule": forms.TextInput(attrs={"class": "form-control"}),
"date": forms.DateInput(
attrs={"class": "form-control", "type": "date"}
),
"nom_station": forms.TextInput(attrs={"class": "form-control"}),
"type_carburant": forms.Select(attrs={"class": "form-select"}),
"litre": forms.TextInput(
attrs={"class": "form-control", "type": "number"}
),
"prix": forms.TextInput(
attrs={"class": "form-control", "type": "number"}
),
"kilometrage": forms.TextInput(
attrs={"class": "form-control", "type": "number"}
),
"observation": forms.Textarea(attrs={"class": "form-control"}),
}

View File

@@ -0,0 +1,59 @@
# Generated by Django 5.2.7 on 2025-11-06 12:10
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Vehicule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('immatriculation', models.TextField(max_length=15, verbose_name='Immatriculation')),
('image', models.ImageField(upload_to='vehicule_image', verbose_name='Image de la voiture')),
('disponible', models.BooleanField(default=True, verbose_name='Vehicule disponible ?')),
],
),
migrations.CreateModel(
name='DemandeVehicule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('lieu_depart', models.TextField(verbose_name='Lieu de départ')),
('lieu_arrive', models.TextField(verbose_name="Lieu d'arrivée")),
('date_heure', models.DateTimeField(verbose_name="Date et heure d'arrivée")),
('validation', models.BooleanField(default=None, verbose_name='Validation par le logisticien')),
('vehicule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule')),
],
),
migrations.CreateModel(
name='CarnetCarburant',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateField(verbose_name='Date')),
('nom_station', models.TextField(verbose_name='Nom de la station-service')),
('type_carburant', models.TextField(choices=[('essence', 'Essence'), ('gazoil', 'Gazoil')], verbose_name='Type du carburant')),
('litre', models.IntegerField(verbose_name='Litre')),
('prix', models.IntegerField(verbose_name='Prix par litre (en GNF)')),
('kilometrage', models.IntegerField(verbose_name='Kilometrage')),
('observation', models.TextField(verbose_name='Observation')),
('vehicule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule')),
],
),
migrations.CreateModel(
name='CarnetBord',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('mois_concerne', models.DateField(verbose_name='Mois et année concernée')),
('km_debut_mois', models.IntegerField(verbose_name='Km en début du mois')),
('km_fin_mois', models.IntegerField(verbose_name='Km en fin du mois')),
('vehicule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule')),
],
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 5.2.7 on 2025-11-06 12:56
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='demandevehicule',
name='date_heure',
field=models.DateTimeField(verbose_name='Date et heure de départ'),
),
migrations.AlterField(
model_name='demandevehicule',
name='vehicule',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.7 on 2025-11-06 12:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0002_alter_demandevehicule_date_heure_and_more'),
]
operations = [
migrations.AlterField(
model_name='demandevehicule',
name='validation',
field=models.BooleanField(default=None, null=True, verbose_name='Validation par le logisticien'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.7 on 2025-11-06 18:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0003_alter_demandevehicule_validation'),
]
operations = [
migrations.AddField(
model_name='demandevehicule',
name='motif_refus',
field=models.TextField(default='', verbose_name='Motifs du refus'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 5.2.7 on 2025-11-07 09:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0004_demandevehicule_motif_refus'),
]
operations = [
migrations.AddField(
model_name='demandevehicule',
name='course_terminer',
field=models.BooleanField(default=False, verbose_name='La course est terminée'),
),
migrations.AddField(
model_name='demandevehicule',
name='heure_course_termine',
field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Date et heure de fin de course'),
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 5.2.7 on 2025-11-07 17:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0005_demandevehicule_course_terminer_and_more'),
]
operations = [
migrations.RemoveField(
model_name='carnetbord',
name='id',
),
migrations.AlterField(
model_name='carnetbord',
name='mois_concerne',
field=models.DateField(primary_key=True, serialize=False, verbose_name='Mois et année concernée'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.7 on 2025-11-10 15:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0006_remove_carnetbord_id_alter_carnetbord_mois_concerne'),
]
operations = [
migrations.AlterField(
model_name='carnetbord',
name='km_fin_mois',
field=models.IntegerField(blank=True, null=True, verbose_name='Km en fin du mois'),
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 5.2.7 on 2025-11-12 12:03
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('authentification', '0001_initial'),
('gestion_vehicule', '0007_alter_carnetbord_km_fin_mois'),
]
operations = [
migrations.AddField(
model_name='demandevehicule',
name='chauffeur',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='chauffeur_affecter_course', to='authentification.profile'),
),
migrations.AddField(
model_name='demandevehicule',
name='nom_passager',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='passager_de_la_demande', to='authentification.profile'),
),
]

View File

@@ -0,0 +1,69 @@
# Generated by Django 5.2.7 on 2025-11-23 10:56
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0008_demandevehicule_chauffeur_and_more'),
]
operations = [
migrations.RemoveField(
model_name='carnetbord',
name='km_debut_mois',
),
migrations.RemoveField(
model_name='carnetbord',
name='km_fin_mois',
),
migrations.RemoveField(
model_name='carnetbord',
name='mois_concerne',
),
migrations.RemoveField(
model_name='demandevehicule',
name='course_terminer',
),
migrations.RemoveField(
model_name='demandevehicule',
name='heure_course_termine',
),
migrations.AddField(
model_name='carnetbord',
name='course',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.demandevehicule'),
),
migrations.AddField(
model_name='carnetbord',
name='course_termine',
field=models.BooleanField(blank=True, default=None, null=True, verbose_name='Course terminée :'),
),
migrations.AddField(
model_name='carnetbord',
name='heure_arrive',
field=models.DateTimeField(blank=True, default=None, null=True, verbose_name="Date et heure d'arrivee :"),
),
migrations.AddField(
model_name='carnetbord',
name='heure_effectif_depart',
field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Date et heure effectif de départ :'),
),
migrations.AddField(
model_name='carnetbord',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AddField(
model_name='carnetbord',
name='km_arrive',
field=models.IntegerField(default=0, verbose_name="Kilometrage d'arrivé :"),
),
migrations.AddField(
model_name='carnetbord',
name='km_depart',
field=models.IntegerField(blank=True, default=None, null=True, verbose_name='Kilometrage de départ :'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 5.2.7 on 2025-11-23 13:13
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0009_remove_carnetbord_km_debut_mois_and_more'),
]
operations = [
migrations.AddField(
model_name='carnetcarburant',
name='course',
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.demandevehicule'),
),
migrations.AlterField(
model_name='carnetbord',
name='course_termine',
field=models.BooleanField(default=False, verbose_name='Course terminée :'),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 5.2.7 on 2025-11-23 13:26
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0010_carnetcarburant_course_and_more'),
]
operations = [
migrations.RemoveField(
model_name='carnetcarburant',
name='vehicule',
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.2.7 on 2025-11-23 15:07
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0011_remove_carnetcarburant_vehicule'),
]
operations = [
migrations.AlterField(
model_name='carnetbord',
name='vehicule',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='gestion_vehicule.vehicule'),
),
]

View File

@@ -0,0 +1,38 @@
# Generated by Django 5.2.7 on 2025-11-24 11:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gestion_vehicule', '0012_alter_carnetbord_vehicule'),
]
operations = [
migrations.AlterField(
model_name='carnetbord',
name='km_arrive',
field=models.PositiveIntegerField(default=0, verbose_name="Kilometrage d'arrivé :"),
),
migrations.AlterField(
model_name='carnetbord',
name='km_depart',
field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='Kilometrage de départ :'),
),
migrations.AlterField(
model_name='carnetcarburant',
name='kilometrage',
field=models.PositiveIntegerField(verbose_name='Kilometrage'),
),
migrations.AlterField(
model_name='carnetcarburant',
name='litre',
field=models.PositiveIntegerField(verbose_name='Litre'),
),
migrations.AlterField(
model_name='carnetcarburant',
name='prix',
field=models.PositiveIntegerField(verbose_name='Prix par litre (en GNF)'),
),
]

View File

122
gestion_vehicule/models.py Normal file
View File

@@ -0,0 +1,122 @@
"""Modèles de l'application gestion_vehicule."""
from django.db import models
from authentification.models import Profile
class Vehicule(models.Model):
"""Modèle représentant un véhicule."""
immatriculation = models.TextField(
verbose_name="Immatriculation",
max_length=15
)
image = models.ImageField(
verbose_name="Image de la voiture", upload_to="vehicule_image"
)
disponible = models.BooleanField(
verbose_name="Vehicule disponible ?",
default=True)
def __str__(self):
"""Retourne une représentation en chaîne de caractères du véhicule."""
return f"{self.immatriculation}"
class DemandeVehicule(models.Model):
"""Modèle représentant une demande de véhicule."""
vehicule = models.ForeignKey(Vehicule, on_delete=models.CASCADE, null=True)
nom_passager = models.ForeignKey(
Profile,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="passager_de_la_demande",
)
chauffeur = models.ForeignKey(
Profile,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="chauffeur_affecter_course",
)
lieu_depart = models.TextField(verbose_name="Lieu de départ")
lieu_arrive = models.TextField(verbose_name="Lieu d'arrivée")
date_heure = models.DateTimeField(verbose_name="Date et heure de départ")
validation = models.BooleanField(
verbose_name="Validation par le logisticien", default=None, null=True
)
motif_refus = models.TextField(verbose_name="Motifs du refus", default="")
def __str__(self):
"""Retourne une représentation en chaîne de caractères."""
return (f"DemandeVehicule {self.pk} -"
f"{self.lieu_depart} à {self.lieu_arrive}"
f" le {self.date_heure}"
)
class CarnetBord(models.Model):
"""Modèle représentant le carnet de bord d'un véhicule."""
vehicule = models.ForeignKey(
Vehicule, null=True, blank=True, on_delete=models.CASCADE
)
course = models.ForeignKey(
DemandeVehicule, on_delete=models.CASCADE,
default=None, null=True, blank=True
)
heure_effectif_depart = models.DateTimeField(
verbose_name="Date et heure effectif de départ :",
default=None,
null=True,
blank=True,
)
km_depart = models.PositiveIntegerField(
verbose_name="Kilometrage de départ :", default=None, null=True,
blank=True
)
heure_arrive = models.DateTimeField(
verbose_name="Date et heure d'arrivee :", default=None, null=True,
blank=True
)
km_arrive = models.PositiveIntegerField(
verbose_name="Kilometrage d'arrivé :", default=0
)
course_termine = models.BooleanField(
verbose_name="Course terminée :", default=False
)
def __str__(self):
"""Retourne une représentation en chaîne de caractères."""
return f"CarnetBord {self.pk} - Vehicule: {self.vehicule}"
class CarnetCarburant(models.Model):
"""Modèle représentant le carnet de carburant d'un véhicule."""
date = models.DateField(verbose_name="Date")
nom_station = models.TextField(verbose_name="Nom de la station-service")
type_carburant = models.TextField(
verbose_name="Type du carburant",
choices={
"essence": "Essence",
"gazoil": "Gazoil",
},
)
litre = models.PositiveIntegerField(verbose_name="Litre")
prix = models.PositiveIntegerField(verbose_name="Prix par litre (en GNF)")
kilometrage = models.PositiveIntegerField(verbose_name="Kilometrage")
observation = models.TextField(verbose_name="Observation")
course = models.ForeignKey(
DemandeVehicule,
default=None,
on_delete=models.CASCADE
)
def __str__(self):
"""Retourne une représentation en chaîne de caractères."""
return (
f"CarnetCarburant {self.pk} - Station: {self.nom_station} - "
f"Date: {self.date}"
)

View File

@@ -0,0 +1,22 @@
{% extends "BASE.html" %}
{% load static %}
{% block page_titre %} SGL - Carnet du carburant {% endblock %}
{% block "contenu" %}
<h3 class="text-center mt-2">Carnet de carburant</h3>
<div class="row my-3">
<div class="col">
<label for="">Selectionner le mois concerné :</label>
<input type="month" name="" id="filtreMois" class="form-control" data-url="{% url 'gestion_vehicule:filtre-carnet-carburant' %}">
<input type="hidden" name="" id="id_vehicule" value="{{ id_vehicule }}">
</div>
</div>
<div id="tableau-carnet"></div>
{% endblock %}
{% block "js" %}
<script src="{% static 'js/carnet_carburant.js' %}"></script>
{% endblock %}

View File

@@ -0,0 +1,22 @@
{% extends "BASE.html" %}
{% load static %}
{% block page_titre %} SGL - Carnet du carburant {% endblock %}
{% block "contenu" %}
<h3 class="text-center mt-2">Carnet de carburant</h3>
<div class="row my-3">
<div class="col">
<label for="">Selectionner le mois concerné :</label>
<input type="month" name="" id="filtreMois" class="form-control" data-url="{% url 'gestion_vehicule:filtre-sortie-vehicule' %}">
<input type="hidden" name="" id="id_vehicule" value="{{ id_vehicule }}">
</div>
</div>
<div id="tableau-sortie-vehicule"></div>
{% endblock %}
{% block "js" %}
<script src="{% static 'js/carnet_sortie_vehicule.js' %}"></script>
{% endblock %}

View File

@@ -0,0 +1,131 @@
{% extends "BASE.html" %}
{% load static %}
{% load tags_personnaliser %}
{% load l10n %}
{% block page_titre %} SGL - Détails du véhicule {% endblock %}
{% block "contenu" %}
<a href="{% url 'gestion_vehicule:index' %}" class="btn btn-primary my-2">Retour</a>
<h3>Détails de la course</h3>
<div class="row mt-2 mt-lg-5">
<div class="col-12 col-lg-6">
<h5 class="text-center">Informations sur la course</h5>
<form action="">
<div class="form-group">
<label for="">Nom du passager :</label>
<input type="text" class="form-control" value="{{ detail_demande.nom_passager }}" readonly>
</div>
<div class="form-group">
<label for="">Lieu de départ :</label>
<input type="text" class="form-control" value="{{ detail_demande.lieu_depart }}" readonly>
</div>
<div class="form-group">
<label for="">Date et heure de départ prévu :</label>
<input type="datetime-local" class="form-control" value="{{ detail_demande.date_heure|date:'Y-m-d\\TH:i' }}" readonly>
</div>
<div class="form-group">
<label for="">Lieu d'arrivée :</label>
<input type="text" class="form-control" value="{{ detail_demande.lieu_arrive }}" readonly>
</div>
<div class="form-group">
<label for="">Véhicule attribué :</label>
<input type="text" class="form-control" value="{{ detail_demande.immatriculation }}" readonly>
</div>
</form>
</div>
<div class="col-12 col-lg-6 mt-3 mt-lg-0">
<h5 class="text-center">Renseigner par le chauffeur</h5>
<div class="accordion mt-2" id="accordionExample">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
Au départ
</button>
</h2>
<div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<form method="post" action="{% url 'gestion_vehicule:enregistrer-details-course-depart' detail_demande.id %}">
{% csrf_token %}
<input type="hidden" name="id-vehicule" value="{{ detail_demande.id_vehicule }}">
<div class="form-group">
<label for="">Heure effectif de départ :</label>
<input type="datetime-local" class="form-control" value="{{ detail_demande.details_course.heure_effectif_depart|date:'Y-m-d\\TH:i' }}" name="heure-depart">
</div>
<div class="form-group mt-2">
<label for="">Kilométrage de départ :</label>
<input type="number" class="form-control" name="kilometrage_depart" value="{{ detail_demande.details_course.km_depart }}">
</div>
{% if user|has_group:"Chauffeur" %}
<button type="submit" class="btn btn-primary mt-2 enregistrerButton">Enregistrer</button>
{% endif %}
</form>
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
A l'arrivée
</button>
</h2>
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<form method="post" action="{% url 'gestion_vehicule:enregistrer-details-course-arrivee' detail_demande.id %}">
{% csrf_token %}
<input type="hidden" name="id-vehicule" value="{{ detail_demande.vehicule.id }}">
<div class="form-group">
<label for="">Heure effectif d'arrivée :</label>
<input type="datetime-local" class="form-control" value="{{ detail_demande.details_course.heure_arrive|date:'Y-m-d\\TH:i' }}" name="heure-effectif-arrivee">
</div>
<div class="form-group mt-2">
<label for="">Kilométrage d'arrivée :</label>
<input type="number" class="form-control" name="kilometrage-arrivee" value="{{ detail_demande.details_course.km_arrive }}">
</div>
<div class="form-check mt-2">
<label for="" class="form-check-label">Course terminée</label>
<input type="checkbox" class="form-check-input" name="course-terminer" id="course-terminer" data-state="{{ detail_demande.details_course.course_termine }}">
</div>
{% if user|has_group:"Chauffeur" %}
<button type="submit" class="btn btn-primary mt-2 enregistrerButton">Enregistrer</button>
{% endif %}
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row mt-2">
<div class="col">
<h3>Carburant</h3>
<div class="accordion mt-4" id="accordionCarburant">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCarburant" aria-expanded="false" aria-controls="collapseThree">
Enregistrer une prise de carburant
</button>
</h2>
<div id="collapseCarburant" class="accordion-collapse collapse" data-bs-parent="#accordionCarburant">
<div class="accordion-body">
<form action="{% url 'gestion_vehicule:enregistrer-prise-carburant' detail_demande.id %}" method="post">
{% csrf_token %}
{{ detail_demande.prise_carburant_formulaire.as_p }}
<button type="submit" class="btn btn-primary">Enregistrer</button>
</form>
</div>
</div>
</div>
</div>
</div>
<!-- --------------------------------- -->
</div>
{% endblock %}
{% block "js" %}
<script src="{% static 'js/detail_course.js' %}"></script>
{% endblock %}

View File

@@ -0,0 +1,79 @@
{% extends "BASE.html" %}
{% load static %}
{% block page_titre %} SGL - Détails du véhicule {% endblock %}
{% block "contenu" %}
<a class="btn btn-primary mt-2" href="{% url 'gestion_vehicule:index' %}" >Retour</a>
<div class="row flex-column flex-lg-row p-2 border rounded m-2">
<div class="col d-flex flex-column justify-content-center">
<img src="{{ vehicule.image.url }}" class="w-100" alt="Image non disponible">
</div>
<div class="col">
<h3 class="text-center">Carnet de bord du vehicule</h3>
<form action="{% url 'gestion_vehicule:enregistrer-carnetBord' vehicule.id %}" id="carnetBordForm" method="post">
<div class="form-group">
<label for="">Immatriculation :</label>
<input type="text" class="form-control" value="{{ vehicule.immatriculation }}">
</div>
<div class="form-group mt-2">
<label for="">Mois concerné :</label>
<input type="month" class="form-control">
</div>
<div class="form-group mt-2">
<label for="">Total kilomètre parcourue :</label>
<input type="number" class="form-control">
</div>
</form>
</div>
</div>
<div class="row">
<div class="col">
<a href="{% url 'gestion_vehicule:carnet-carburant' vehicule.id %}" class="btn btn-lg btn-primary d-block m-auto">Carnet de carburant</a>
</div>
<div class="col">
<a href="{% url 'gestion_vehicule:carnet-sortie-vehicule' vehicule.id %}" class="btn btn-lg btn-primary d-block m-auto">Sortie du vehicule</a>
</div>
</div>
<!-- <div class="accordion mt-2" id="accordionExample">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
Prise de carburant
</button>
</h2>
<div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<form action="{% url 'gestion_vehicule:enregistrer-prise-carburant' vehicule.id %}" method="post">
{% csrf_token %}
{{ prise_carburant_formulaire.as_p }}
<button type="submit" class="btn btn-primary">Enregistrer</button>
</form>
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Carnet de bord du vehicule
</button>
</h2>
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<form action="{% url 'gestion_vehicule:enregistrer-carnetBord' vehicule.id %}" id="carnetBordForm" method="post">
{% csrf_token %}
{{ carnet_bord_formulaire.as_p }}
<button type="submit" class="btn btn-primary">Enregistrer</button>
</form>
</div>
</div>
</div>
</div> -->
{% endblock %}
{% block "js" %}
<script src="{% static 'js/detail_gestion_vehicule.js' %}"></script>
{% endblock %}

View File

@@ -0,0 +1,202 @@
{% extends "BASE.html" %}
{% load static %}
{% load tags_personnaliser %}
{% block page_titre %} SGL - Gestion des véhicules {% endblock %}
{% block "contenu" %}
<div class="row p-2">
<div class="col d-flex justify-content-between">
<h3>PARC AUTOMOBILE</h3>
{% if user|has_group:"Logisticien" %}
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#enregistrerVehiculeModal">Ajouter un véhicule</button>
{% endif %}
</div>
</div>
<div class="row p-2">
{% for vehicule in parc_vehicule %}
<div class="card p-2" style="width: 14rem;">
{% if vehicule.image %}
<img class="card-img-top m-auto d-block" src="{{ vehicule.image.url }}" style="width: 150px;">
{% else %}
<img class="card-img-top m-auto d-block" src="{% static 'images/exemple-produit.jpg' %}" style="width: 120px;" alt="Image par défaut">
{% endif %}
<div class="card-body">
<h5 class="card-title text-center">{{ vehicule.immatriculation }}</h5>
{% if user|has_group:"Logisticien" %}
<a href="{% url 'gestion_vehicule:detail-voiture' vehicule.id %}" class="d-block m-auto btn btn-primary d-block voir-demande">Voir</a>
{% endif %}
</div>
</div>
{% empty %}
<p class="text-center">Aucun véhicule enregistré.</p>
{% endfor %}
</div>
<div class="row d-flex mt-3">
<div class="col d-flex justify-content-between">
<h4>LISTE DES DEMANDES</h4>
{% if user|has_group:"Employe" %}
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#enregistrerDemandeModal">Faire une demande</button>
{% endif %}
</div>
</div>
{% if user|has_group:"Employe" %}
<div class="row d-flex mt-2 mb-2">
<!-- <div class="col">
<label>Filtrer par date et heure de depart</label>
<input type="datetime-local" class="form-control">
</div> -->
<div class="col">
<label>Statut de la demande :</label>
<select name="filtreStatutDemande" id="filtreStatutDemande" class="form-select">
<option value="tout">Toutes les demandes</option>
<option value="mes_demandes">Mes demandes</option>
<option value="valider">Demande validée</option>
<option value="refuser">Demande Refusée</option>
<option value="attente">Demande en attente</option>
<option value="terminer">Course terminée</option>
</select>
</div>
</div>
{% endif %}
<div class="row">
<div class="col">
<div id="tableau-demande-vehicule" data-userid = "{{ user.id }}" data-url = "{% url 'gestion_vehicule:liste-demande' %}"></div>
</div>
</div>
<!-- ---------------------------------------- MODAL ENREGISTREMENT VEHICULE ----------------------------------- -->
<div class="modal fade" id="enregistrerVehiculeModal" tabindex="-1" aria-labelledby="enregistrerVehiculeModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="enregistrerVehiculeModalLabel">Enregistrer un véhicule</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{% url 'gestion_vehicule:enregistrer-voiture' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ formulaire_enregistrer_vehicule.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>
<!-- ------------------------------------ MODAL ENREGISTREMENT DEMANDE ------------------------------------ -->
<div class="modal fade" id="enregistrerDemandeModal" tabindex="-1" aria-labelledby="enregistrerDemandeModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="enregistrerDemandeModalLabel">Enregistrer une demande</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div id="messageZone"></div>
<form data-url ="{% url 'gestion_vehicule:enregistrer-demande' %}" id="enregistrer-demande-form" enctype="multipart/form-data">
{% csrf_token %}
{{ formulaire_demande_vehicule.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>
<!-- ---------------------------------------- Modal confirmer sortie de la voiture ----------------------- -->
<div class="modal fade" id="confirmerDemandeModal" tabindex="-1" aria-labelledby="confirmerDemandeModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="confirmerDemandeModalLabel">Détail de la demande</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{% url 'gestion_vehicule:statut_demande' %}" method="post">
{% csrf_token %}
<h5 class="text-center">Décision du logisticien</h5>
<div class="d-flex justify-content-around">
<div class="form-check">
<input class="form-check-input" type="radio" name="radioValider" id="radioValider" value="Valider">
<label class="form-check-label" for="radioValider">
Valider la demande
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="radioValider" id="radioRefuser" value="Refuser">
<label class="form-check-label" for="radioRefuser">
Refuser la demande
</label>
</div>
</div>
<div id="affichage-formulaire">
<h5 class="text-center mt-3">Détail de la demande</h5>
<input type="hidden" name="id-demande" id="id-demande">
<div class="form-group mt-2">
<label for="">Nom du passager :</label>
<input type="text" class="form-control" id="nom-passager" readonly>
</div>
<div class="form-group mt-2">
<label for="">Lieu de départ</label>
<input type="text" class="form-control" id="lieu-depart" readonly>
</div>
<div class="form-group mt-2">
<label for="">Lieu d'arrivé :</label>
<input type="text" class="form-control" id="lieu-arrivee" readonly>
</div>
<div class="form-group mt-2">
<label for="">Date et heure de départ :</label>
<input type="text" class="form-control" id="date-heure-depart" readonly>
</div>
<h5 class="text-center mt-3">Attribution</h5>
<div class="form-group">
<label for="">Véhicule : </label>
<select name="vehicule" id="vehicule" class="form-select"></select>
</div>
<div class="form-group mt-2">
<label for="">Chauffeur :</label>
<select name="chauffeur" id="chauffeur" class="form-select"></select>
</div>
<!-- <h5 class="text-center mt-3">Fin de course</h5>
<div class="form-check">
<input class="form-check-input" name="course_termine" type="checkbox" role="switch" id="courseTermine">
<label class="form-check-label" for="courseTermine">Course terminée</label>
</div>
<div class="form-group mt-2">
<label for="">Date et heure de retour :</label>
<input type="datetime-local" name="date_heure_retour" id="date_heure_retour" class="form-control">
</div> -->
</div>
<div class="form-group mt-2" id="refus">
<label for="">Motifs du refus :</label>
<textarea class="form-control" name="motif" id="motif-refus"></textarea>
</div>
<div class="modal-footer" id="validation-sortie-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
<button type="submit" class="btn btn-primary" id="demanderValiderEnregistrer">Enregistrer</button>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
{% block "js" %}
<script src="{% static 'js/gestion_vehicule.js' %}"></script>
{% endblock %}

View File

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

88
gestion_vehicule/urls.py Normal file
View File

@@ -0,0 +1,88 @@
"""Gestion des URLs de l'application gestion_vehicule."""
from django.urls import path
from . import views
app_name = "gestion_vehicule"
urlpatterns = [
path(
"",
views.index,
name="index"
),
path(
"enregistrer-voiture",
views.enregistrer_voiture,
name="enregistrer-voiture"
),
path(
"enregistrer-demande",
views.enregistrer_demande,
name="enregistrer-demande"
),
path(
"liste-demande",
views.liste_demande,
name="liste-demande"
),
path(
"statut-demande",
views.statut_demande,
name="statut_demande"
),
path(
"filtre-carnet-carburant",
views.filtre_carnet_carburant,
name="filtre-carnet-carburant",
),
path(
"filtre-sortie-vehicule",
views.filtre_sortie_vehicule,
name="filtre-sortie-vehicule",
),
path(
"detail-voiture/<int:vehicule_id>",
views.detail_voiture,
name="detail-voiture"
),
path(
"enregistrer-prise-carburant/<int:course_id>",
views.enregistrer_prise_carburant,
name="enregistrer-prise-carburant",
),
path(
"carnet-carburant/<int:vehicule_id>",
views.carnet_carburant,
name="carnet-carburant",
),
path(
"carnet-sortie-vehicule/<int:vehicule_id>",
views.carnet_sortie_vehicule,
name="carnet-sortie-vehicule",
),
path(
"enregistrer-carnetBord/<int:vehicule_id>",
views.enregistrer_carnet_bord,
name="enregistrer-carnetBord",
),
path(
"carnet-vehicule-information/<str:mois_concerne>",
views.carnet_vehicule_information,
name="carnet-vehicule-information",
),
path(
"detail-course/<int:id_demande>",
views.detail_course,
name="detail-course"),
path(
"enregistrer-details-course-depart/<int:id_demande>",
views.enregistrer_information_course_depart,
name="enregistrer-details-course-depart",
),
path(
"enregistrer-details-course-arrivee/<int:id_demande>",
views.enregistrer_information_course_arrive,
name="enregistrer-details-course-arrivee",
),
]

648
gestion_vehicule/views.py Normal file
View File

@@ -0,0 +1,648 @@
"""Views pour la gestion des véhicules."""
from django.shortcuts import render, redirect
from django.http import JsonResponse
from authentification.models import Profile
from django.contrib.auth.models import Group
from django.contrib.auth.decorators import login_required
from . import forms
from . import models
@login_required(login_url="login")
def index(request):
"""Page d'accueil de la gestion des véhicules.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
Returns
-------
HttpResponse
La réponse HTTP avec le rendu de la page d'accueil de la gestion des
véhicules.
"""
formulaire_enregistrer_vehicule = forms.EnregistrerVehicule()
formulaire_demande_vehicule = forms.EnregistrerDemande()
parc_vehicule = models.Vehicule.objects.all().order_by("-id")
return render(
request,
"gestion_vehicule/index.html",
{
"formulaire_enregistrer_vehicule": formulaire_enregistrer_vehicule,
"parc_vehicule": parc_vehicule,
"formulaire_demande_vehicule": formulaire_demande_vehicule,
},
)
@login_required(login_url="login")
def enregistrer_voiture(request):
"""Enregistrer un nouveau véhicule dans le système.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
Returns
-------
HttpResponseRedirect
Redirige vers la page d'accueil de la gestion des véhicules après
l'enregistrement du véhicule.
"""
if request.method == "POST":
form_enregistrement = forms.EnregistrerVehicule(
request.POST,
request.FILES,
)
if form_enregistrement.is_valid:
form_enregistrement.save()
return redirect("gestion_vehicule:index")
return None
@login_required(login_url="login")
def enregistrer_demande(request):
"""Enregistrer une nouvelle demande de véhicule.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
Returns
-------
JsonResponse
Une réponse JSON indiquant le succès ou l'échec de l'enregistrement
de la demande de véhicule.
"""
if request.method == "POST":
form_demande = forms.EnregistrerDemande(request.POST)
if form_demande.is_valid():
form = form_demande.save(commit=False)
form.nom_passager = request.user.profile
form.save()
models.CarnetBord.objects.create(
course=models.DemandeVehicule.objects.get(id=form.id)
)
return JsonResponse(
{"success": True, "message": "Demande enregistrée avec succès"}
)
return JsonResponse(
{
"success": False,
"message": (
"Une erreur s'est produit lors de "
"l'enregistrement de la demande"
),
}
)
return None
@login_required(login_url="login")
def liste_demande(request):
"""Afficher la liste des demandes de véhicules.
La liste des demandes affichées dépend du groupe de l'utilisateur connecté:
- Si l'utilisateur appartient au groupe "Chauffeur", seules les demandes
qui lui sont assignées sont affichées.
- Sinon, toutes les demandes de véhicules sont affichées.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
Returns
-------
JsonResponse
Une réponse JSON contenant la liste des demandes de véhicules.
"""
liste_demande_vehicule = []
if request.user.groups.filter(name="Chauffeur").exists():
liste_demande_vehicule = models.DemandeVehicule.objects.filter(
chauffeur__user_id=request.user.id
)
else:
liste_demande_vehicule = models.DemandeVehicule.objects.all()
demandes_en_cours = []
parc_vehicule = [
{"id": vehicule.id, "immatriculation": vehicule.immatriculation}
for vehicule in models.Vehicule.objects.filter(disponible=True)
]
chauffeur_group = Group.objects.get(name="Chauffeur")
chauffeurs = [
{
"chauffeur_id": chauffeur.user.id,
"chauffeur_name": (
f"{chauffeur.user.first_name} {chauffeur.user.last_name}"
),
}
for chauffeur in Profile.objects.filter(user__groups=chauffeur_group)
]
demandes_en_cours = [
{
"id_demande": demande.id,
"nom_passager": (
f"{demande.nom_passager.user.first_name} "
f"{demande.nom_passager.user.last_name}"
),
"lieu_depart": demande.lieu_depart,
"date_heure_depart": demande.date_heure.strftime("%d/%m/%Y %H:%M"),
"lieu_arrivee": demande.lieu_arrive,
"validation": demande.validation,
"vehicule": parc_vehicule,
"chauffeurs": chauffeurs,
"motif_refus": demande.motif_refus,
"user_id": demande.nom_passager.user.id,
"is_logisticien": (
request.user.profile.departement
.nom_departement == "Logistique"
),
"is_chauffeur": (
request.user.groups.filter(name="Chauffeur")
.exists()
),
}
for demande in liste_demande_vehicule
]
return JsonResponse(demandes_en_cours, safe=False)
def detail_course(request, id_demande):
"""Afficher les détails d'une demande de véhicule spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
id_demande : int
L'identifiant de la demande de véhicule.
Returns
-------
HttpResponse
La réponse HTTP avec le rendu de la page de détails de la demande de
véhicule.
"""
la_demande = models.DemandeVehicule.objects.get(id=id_demande)
vehicule = la_demande.vehicule
details_course = models.CarnetBord.objects.get(course=la_demande)
print("Détails course:", la_demande.id)
return render(
request,
"gestion_vehicule/detail_course.html",
{
"detail_demande": {
"id": la_demande.id,
"nom_passager": (
f"{la_demande.nom_passager.user.first_name} "
f"{la_demande.nom_passager.user.last_name}"
),
"lieu_depart": la_demande.lieu_depart,
"date_heure": la_demande.date_heure,
"lieu_arrive": la_demande.lieu_arrive,
"immatriculation": la_demande.vehicule.immatriculation,
"id_vehicule": la_demande.vehicule.id,
"details_course": details_course,
"prise_carburant_formulaire": forms.PriseCarburant(
initial={"vehicule": vehicule.immatriculation}
),
},
},
)
@login_required(login_url="login")
def statut_demande(request):
"""Mettre à jour le statut d'une demande de véhicule.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
request.id-demande : int
L'identifiant de la demande de véhicule à mettre à jour.
request.radioValider : str
Le statut de validation de la demande
("Valider", "Refuser", ou autre).
request.vehicule : int
L'identifiant du véhicule assigné (si validée).
request.chauffeur : int
L'identifiant du chauffeur assigné (si validée).
request.motif : str
Le motif de refus (si refusée).
request.course_termine : str
Indique si la course est terminée ("on" si cochée).
request.date_heure_retour : str
La date et l'heure de retour de la course (si terminée).
request.heure_course_termine : str
L'heure de fin de la course (si terminée).
Returns
-------
HttpResponseRedirect
Redirige vers la page d'accueil de la gestion des véhicules après
la mise à jour du statut de la demande.
"""
if request.method == "POST":
demande = models.DemandeVehicule.objects.get(
id=request.POST["id-demande"]
)
if "radioValider" in request.POST:
if request.POST["radioValider"] == "Valider":
demande.validation = True
demande.vehicule = models.Vehicule.objects.get(
id=request.POST["vehicule"]
)
demande.chauffeur = models.Profile.objects.get(
user_id=request.POST["chauffeur"]
)
elif request.POST["radioValider"] == "Refuser":
demande.validation = False
demande.motif_refus = request.POST["motif"]
else:
demande.validation = None
if (
"course_termine" in request.POST
and "date_heure_retour" in request.POST
and request.POST["course_termine"] == "on"
and request.POST["date_heure_retour"] != ""
):
demande.course_terminer = True
demande.heure_course_termine = request.POST["date_heure_retour"]
demande.save()
return redirect("gestion_vehicule:index")
@login_required(login_url="login")
def detail_voiture(request, vehicule_id):
"""Afficher les détails d'un véhicule spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
vehicule_id : int
L'identifiant du véhicule.
Returns
-------
HttpResponse
La réponse HTTP avec le rendu de la page de détails du véhicule.
"""
vehicule = models.Vehicule.objects.get(id=vehicule_id)
return render(
request,
"gestion_vehicule/detail_vehicule.html",
{
"vehicule": vehicule,
"carnet_bord_formulaire": forms.CarnetBord(
initial={"vehicule": vehicule.immatriculation}
),
},
)
@login_required(login_url="login")
def enregistrer_prise_carburant(request, course_id):
"""Enregistrer une prise de carburant pour une course spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
course_id : int
L'identifiant de la course pour laquelle enregistrer la prise de
carburant.
Returns
-------
HttpResponseRedirect
Redirige vers la page de détails de la course après l'enregistrement
de la prise de carburant.
"""
course = models.DemandeVehicule(id=course_id)
if request.method == "POST":
prise_carburant = forms.PriseCarburant(request.POST)
if prise_carburant.is_valid():
d = prise_carburant.save(commit=False)
d.course = course
d.save()
return redirect("gestion_vehicule:detail-course", id_demande=course_id)
@login_required(login_url="login")
def carnet_carburant(request, vehicule_id):
"""Afficher le carnet de carburant d'un véhicule spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
vehicule_id : int
L'identifiant du véhicule.
Returns
-------
HttpResponse
La réponse HTTP avec le rendu de la page du carnet de carburant
du véhicule.
"""
return render(
request,
"gestion_vehicule/carnet_carburant.html",
{
"id_vehicule": vehicule_id
}
)
def carnet_sortie_vehicule(request, vehicule_id):
"""Afficher le carnet de sortie d'un véhicule spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
vehicule_id : int
L'identifiant du véhicule.
Returns
-------
HttpResponse
La réponse HTTP avec le rendu de la page du carnet de sortie
du véhicule.
"""
return render(
request,
"gestion_vehicule/carnet_sortie_vehicule.html",
{"id_vehicule": vehicule_id},
)
@login_required(login_url="login")
def filtre_carnet_carburant(request):
"""Filtrer les prises de carburant d'un véhicule pour un mois spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
request.id_vehicule : int
L'identifiant du véhicule.
request.mois : str
Le mois au format "YYYY-MM".
Returns
-------
JsonResponse
Une réponse JSON contenant la liste des prises de carburant
filtrées.
"""
id_vehicule = request.GET["id_vehicule"]
annee, mois = request.GET["mois"].split("-")
prises_carburant = models.CarnetCarburant.objects.filter(
course__vehicule=models.Vehicule.objects.get(id=id_vehicule),
date__year=annee,
date__month=mois,
)
mon_carnet = [
{
"date": p.date,
"nom_station": p.nom_station,
"type_carburant": p.type_carburant,
"litre": p.litre,
"prix": p.prix,
"montant_total": p.litre * p.prix,
"kilometrage": p.kilometrage,
"observation": p.observation,
"nom_chauffeur": (
f"{p.course.chauffeur.user.first_name} "
f"{p.course.chauffeur.user.last_name}"
),
}
for p in prises_carburant
]
return JsonResponse(mon_carnet, safe=False)
def filtre_sortie_vehicule(request):
"""Filtrer les sorties d'un véhicule pour un mois spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
request.id_vehicule : int
L'identifiant du véhicule.
request.mois : str
Le mois au format "YYYY-MM".
Returns
-------
JsonResponse
Une réponse JSON contenant la liste des sorties de véhicule
filtrées.
"""
id_vehicule = request.GET["id_vehicule"]
annee, mois = request.GET["mois"].split("-")
sortie_vehicule = models.CarnetBord.objects.filter(
course__vehicule=models.Vehicule.objects.get(id=id_vehicule),
heure_effectif_depart__year=annee,
heure_effectif_depart__month=mois,
)
mes_sorties = [
{
"nom_passager": (
f"{p.course.nom_passager.user.first_name} "
f"{p.course.nom_passager.user.last_name}"
),
"lieu_depart": p.course.lieu_depart,
"heure_depart_prevu": p.course.date_heure,
"heure_depart_effectif": p.heure_effectif_depart,
"lieu_arrive": p.course.lieu_arrive,
"heure_arrive": p.heure_arrive,
"nom_chauffeur": (
f"{p.course.chauffeur.user.first_name} "
f"{p.course.chauffeur.user.last_name}"
),
}
for p in sortie_vehicule
]
return JsonResponse(mes_sorties, safe=False)
@login_required(login_url="login")
def enregistrer_carnet_bord(request, vehicule_id):
"""Enregistrer ou mettre à jour le carnet de bord d'un véhicule.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
request.mois_concerne : str
Le mois concerné au format "YYYY-MM".
request.km_debut_mois : int
Le kilométrage au début du mois.
request.km_fin_mois : int
Le kilométrage à la fin du mois.
vehicule_id : int
L'identifiant du véhicule.
Returns
-------
HttpResponseRedirect
Redirige vers la page de détails du véhicule après l'enregistrement
ou la mise à jour du carnet de bord.
"""
if request.method == "POST":
annee, mois = request.POST["mois_concerne"].split("-")
carnet_bord, created = models.CarnetBord.objects.update_or_create(
mois_concerne="-".join([annee, mois, "01"]),
defaults={
"km_debut_mois": request.POST["km_debut_mois"],
"km_fin_mois": request.POST["km_fin_mois"],
"vehicule": models.Vehicule.objects.get(id=vehicule_id),
},
)
if created:
print("Création effectuée")
else:
print("Mise à jour effectué")
return redirect(detail_voiture, vehicule_id)
@login_required(login_url="login")
def carnet_vehicule_information(request, mois_concerne): # noqa: ARG001
"""Récupérer les informations du carnet de bord pour un mois spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
mois_concerne : str
Le mois concerné au format "YYYY-MM".
Returns
-------
JsonResponse
Une réponse JSON contenant les informations du carnet de bord
pour le mois spécifié.
"""
annee, mois = mois_concerne.split("-")
try:
carnet_bord = models.CarnetBord.objects.get(
mois_concerne="-".join([annee, mois, "01"])
)
except models.CarnetBord.DoesNotExist:
carnet_dict = {}
else:
carnet_dict = {
"km_debut": carnet_bord.km_debut_mois,
"km_fin": carnet_bord.km_fin_mois,
}
return JsonResponse(carnet_dict)
def enregistrer_information_course_depart(request, id_demande):
"""Enregistrer les informations de départ d'une course spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
id_demande : int
L'identifiant de la demande de véhicule.
Returns
-------
HttpResponseRedirect
Redirige vers la page de détails de la course après l'enregistrement
des informations de départ.
"""
demande = models.DemandeVehicule.objects.get(id=id_demande)
vehicule = models.Vehicule.objects.get(id=request.POST["id-vehicule"])
course = models.CarnetBord.objects.get(course=demande)
course.vehicule = vehicule
course.course = demande
course.heure_effectif_depart = request.POST["heure-depart"]
course.km_depart = request.POST["kilometrage_depart"]
course.save()
return redirect("gestion_vehicule:detail-course", id_demande)
def enregistrer_information_course_arrive(request, id_demande):
"""Enregistrer les informations d'arrivée d'une course spécifique.
Parameters
----------
request : HttpRequest
La requête HTTP reçue.
id_demande : int
L'identifiant de la demande de véhicule.
Returns
-------
HttpResponseRedirect
Redirige vers la page de détails de la course après l'enregistrement
des informations d'arrivée.
"""
demande = models.DemandeVehicule.objects.get(id=id_demande)
vehicule = models.Vehicule.objects.get(id=demande.vehicule.id)
course_termier = False
if "course_terminer" in request.POST:
course_termier = True
course = models.CarnetBord.objects.get(course=demande)
course.vehicule = vehicule
course.course = demande
course.heure_arrive = request.POST["heure-effectif-arrivee"]
course.km_arrive = request.POST["kilometrage-arrivee"]
course.course_termine = course_termier
course.save()
return redirect("gestion_vehicule:detail-course", id_demande)