Compare commits

..

No commits in common. "main" and "feature/yann" have entirely different histories.

27 changed files with 86 additions and 469 deletions

View File

@ -3,8 +3,14 @@
x:Class="MauiAppStock.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiAppStock"
xmlns:views="clr-namespace:MauiAppStock.Views"
Shell.FlyoutBehavior="Disabled"
Title="MauiAppStock">
<ShellContent
Title="Home"
ContentTemplate="{DataTemplate views:MainPage}"
Route="MainPage" />
</Shell>

View File

@ -1,19 +1,9 @@
using MauiAppStock.Views;
namespace MauiAppStock;
namespace MauiAppStock;
public partial class AppShell : Shell
{
public AppShell()
{
InitializeComponent();
}
protected override void OnNavigating(ShellNavigatingEventArgs args)
{
base.OnNavigating(args);
bool isMainPage = args.Target?.Location?.OriginalString == "//MainPage";
Shell.SetBackButtonBehavior(this, new BackButtonBehavior { IsVisible = !isMainPage });
}
}

View File

@ -20,8 +20,7 @@ namespace MauiAppStock.Data
await db.CreateTableAsync<Appareil>();
await db.CreateTableAsync<Piece>();
await db.CreateTableAsync<AppareilPiece>(); // Table de liaison
await db.CreateTableAsync<MouvementStock>();
await db.CreateTableAsync<Fournisseur>();
await db.CreateTableAsync<MouvementStock>(); // Table des mouvements de stock
}
}
@ -67,64 +66,12 @@ namespace MauiAppStock.Data
return db.DeleteAsync(piece);
}
// CRUD pour Fournisseur
public static Task<int> AddFournisseurAsync(Fournisseur fournisseur)
{
return db.InsertAsync(fournisseur);
}
public static Task<List<Fournisseur>> GetFournisseursAsync()
{
return db.Table<Fournisseur>().ToListAsync();
}
public static Task<int> UpdateFournisseursync(Fournisseur fournisseur)
{
return db.UpdateAsync(fournisseur);
}
public static Task<int> DeleteFournisseurAsync(Fournisseur fournisseur)
{
return db.DeleteAsync(fournisseur);
}
// Liaison entre Appareil et Piece
public static Task<int> AddAppareilPieceAsync(AppareilPiece appareilPiece)
{
return db.InsertAsync(appareilPiece);
}
// CRUD pour MouvementStock
public static Task<int> AddMouvementStockAsync(MouvementStock mouvement)
{
return db.InsertAsync(mouvement);
}
public static Task<List<MouvementStock>> GetMouvementsStockAsync()
{
return db.Table<MouvementStock>().OrderByDescending(m => m.DateMouvement).ToListAsync();
}
public static async Task<List<MouvementStock>> GetMouvementsStockForPieceAsync(int pieceId)
{
return await db.Table<MouvementStock>()
.Where(m => m.PieceId == pieceId)
.OrderByDescending(m => m.DateMouvement)
.ToListAsync();
}
public static Task<int> UpdateMouvementStockAsync(MouvementStock mouvement)
{
return db.UpdateAsync(mouvement);
}
public static Task<int> DeleteMouvementStockAsync(MouvementStock mouvement)
{
return db.DeleteAsync(mouvement);
}
// Met à jour une association existante
public static Task<int> UpdateAppareilPieceAsync(AppareilPiece appareilPiece)
{
@ -193,5 +140,34 @@ namespace MauiAppStock.Data
.Where(ap => ap.AppareilId == appareilId && ap.PieceId == pieceId)
.FirstOrDefaultAsync();
}
// CRUD pour MouvementStock
public static Task<int> AddMouvementStockAsync(MouvementStock mouvement)
{
return db.InsertAsync(mouvement);
}
public static Task<List<MouvementStock>> GetMouvementsStockAsync()
{
return db.Table<MouvementStock>().OrderByDescending(m => m.DateMouvement).ToListAsync();
}
public static async Task<List<MouvementStock>> GetMouvementsStockForPieceAsync(int pieceId)
{
return await db.Table<MouvementStock>()
.Where(m => m.PieceId == pieceId)
.OrderByDescending(m => m.DateMouvement)
.ToListAsync();
}
public static Task<int> UpdateMouvementStockAsync(MouvementStock mouvement)
{
return db.UpdateAsync(mouvement);
}
public static Task<int> DeleteMouvementStockAsync(MouvementStock mouvement)
{
return db.DeleteAsync(mouvement);
}
}
}

View File

@ -63,17 +63,4 @@
<PackageReference Include="sqlite-net-pcl" Version="1.10.196-beta" />
</ItemGroup>
<ItemGroup>
<MauiXaml Update="Views\EditFournisseurPage.xaml">
<SubType>Designer</SubType>
</MauiXaml>
</ItemGroup>
<ItemGroup>
<Compile Update="Views\EditFournisseurPage.xaml.cs">
<DependentUpon>EditFournisseurPage.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
</Project>

View File

@ -1,13 +0,0 @@
using SQLite;
namespace MauiAppStock.Models
{
public class Fournisseur
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Nom { get; set; }
public string Numtel { get; set; }
}
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/image" android:roundIcon="@mipmap/image" android:supportsRtl="true"></application>
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

View File

@ -1,42 +0,0 @@
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows.Input;
using MauiAppStock.Models;
using MauiAppStock.Data;
using MauiAppStock.Helpers;
namespace MauiAppStock.ViewModels
{
public class FournisseursViewModel : BaseViewModel
{
public ObservableCollection<Fournisseur> Fournisseurs { get; set; }
public ICommand LoadFournisseursCommand { get; }
public ICommand DeleteFournisseurCommand { get; }
public FournisseursViewModel()
{
Fournisseurs = new ObservableCollection<Fournisseur>();
LoadFournisseursCommand = new AsyncCommand(LoadFournisseurs);
DeleteFournisseurCommand = new AsyncCommand<Fournisseur>(DeleteFournisseur);
}
private async Task LoadFournisseurs()
{
Fournisseurs.Clear();
var fournisseursList = await Database.GetFournisseursAsync();
foreach (var fournisseur in fournisseursList)
{
Fournisseurs.Add(fournisseur);
}
}
private async Task DeleteFournisseur(Fournisseur fournisseur)
{
if (fournisseur != null)
{
await Database.DeleteFournisseurAsync(fournisseur);
Fournisseurs.Remove(fournisseur);
}
}
}
}

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Class="MauiAppStock.Views.AddFournisseurPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<StackLayout Padding="10">
<Label Text="Ajouter un Fournisseur" FontSize="24" HorizontalOptions="Center"/>
<Entry x:Name="NomEntry" Placeholder="Nom"/>
<Entry x:Name="NumEntry" Placeholder="NumTel" Keyboard="Numeric"/>
<Button Text="Enregistrer" Clicked="OnSaveClicked"/>
</StackLayout>
</ContentPage>

View File

@ -1,29 +0,0 @@
using MauiAppStock.Models;
using MauiAppStock.Data;
namespace MauiAppStock.Views
{
public partial class AddFournisseurPage : ContentPage
{
public AddFournisseurPage()
{
InitializeComponent();
}
private async void OnSaveClicked(object sender, EventArgs e)
{
{
var fournisseur = new Fournisseur
{
Nom = NomEntry.Text,
Numtel = NumEntry.Text
}
;
await Database.AddFournisseurAsync(fournisseur);
await Navigation.PopAsync();
}
}
}
}

View File

@ -4,15 +4,14 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<StackLayout Padding="10">
<Label Text="Ajouter une Pièce" FontSize="24" HorizontalOptions="Center"/>
<Entry x:Name="NomEntry" Placeholder="Nom"/>
<Editor x:Name="DescriptionEditor" Placeholder="Description" HeightRequest="100"/>
<Entry x:Name="PrixEntry" Placeholder="Prix" Keyboard="Numeric"/>
<Entry x:Name="StockEntry" Placeholder="Stock" Keyboard="Numeric"/>
<Label Text="Sélectionnez un fournisseur:"/>
<Picker x:Name="FournisseurPicker" Title="Fournisseurs"/>
<!-- <Picker x:Name="FournisseurPicker"
Title="Choisissez un Fournisseur">
</Picker> !-->
<Entry x:Name="FournisseurEntry" Placeholder="Fournisseur"/>
<Button Text="Enregistrer" Clicked="OnSaveClicked"/>
</StackLayout>
</ContentPage>

View File

@ -1,42 +1,44 @@
using MauiAppStock.Models;
using MauiAppStock.Data;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Maui.Controls.Internals;
namespace MauiAppStock.Views
{
public partial class AddPiecePage : ContentPage
{
private List<Fournisseur> _fournisseurs;
public AddPiecePage()
{
InitializeComponent();
LoadFournisseurs();
LoadAppareils();
}
private async void LoadFournisseurs()
private async void LoadAppareils()
{
_fournisseurs = await Database.GetFournisseursAsync();
FournisseurPicker.ItemsSource = _fournisseurs;
FournisseurPicker.ItemDisplayBinding = new Binding("Nom");
// FournisseurPicker.ItemsSource = await Database.GetAppareilsAsync();
}
private async void OnSaveClicked(object sender, EventArgs e)
{
if (double.TryParse(PrixEntry.Text, out double prix) && int.TryParse(StockEntry.Text, out int stock))
{
var selectedFournisseur = FournisseurPicker.SelectedItem as Fournisseur;
// Appareil appareilPicked = AppareilPicker.SelectedItem as Appareil;
// if (appareilPicked == null)
//{
// await DisplayAlert("ERREUR", "L'appareil n'est pas un valide", "OK");
// return;
//}
var piece = new Piece
{
Nom = NomEntry.Text,
Description = DescriptionEditor.Text,
Prix = prix,
Stock = stock,
Fournisseur = selectedFournisseur?.Nom
Stock = 0
// Appareil = appareilPicked.Id, Exemple pour fournisseur
//Fournisseur = FournisseurEntry.Text
};
await Database.AddPieceAsync(piece);
await Navigation.PopAsync();
}

View File

@ -15,9 +15,7 @@
<ListView x:Name="AssociationsListView" ItemsSource="{Binding AppareilPieces}"
IsPullToRefreshEnabled="True"
RefreshCommand="{Binding LoadAssociationsCommand}"
ItemTapped="OnAssociationTapped"
HasUnevenRows="True"
HeightRequest="500">
ItemTapped="OnAssociationTapped">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
x:Class="MauiAppStock.Views.EditFournisseurPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<StackLayout Padding="10">
<Label Text="Modifier l'Appareil" FontSize="24" HorizontalOptions="Center"/>
<Entry x:Name="NomEntry" Placeholder="Nom"/>
<Entry x:Name="NumEntry" Placeholder="NumTel" Keyboard="Numeric"/>
<Button Text="Enregistrer" Clicked="OnSaveClicked"/>
<Button Text="Supprimer" Clicked="OnDeleteClicked" TextColor="Red"/>
</StackLayout>
</ContentPage>

View File

@ -1,35 +0,0 @@
using MauiAppStock.Models;
using MauiAppStock.Data;
namespace MauiAppStock.Views
{
public partial class EditFournisseurPage : ContentPage
{
private Fournisseur _fournisseur;
public EditFournisseurPage(Fournisseur fournisseur)
{
InitializeComponent();
_fournisseur = fournisseur;
NomEntry.Text = fournisseur.Nom;
NumEntry.Text = fournisseur.Numtel;
}
private async void OnSaveClicked(object sender, EventArgs e)
{
_fournisseur.Nom = NomEntry.Text;
_fournisseur.Numtel = NumEntry.Text;
await Database.UpdateFournisseursync(_fournisseur);
await Navigation.PopAsync();
}
private async void OnDeleteClicked(object sender, EventArgs e)
{
bool confirm = await DisplayAlert("Confirmation", "Voulez-vous vraiment supprimer ce fournisseur ?", "Oui", "Non");
if (confirm)
{
await Database.DeleteFournisseurAsync(_fournisseur);
await Navigation.PopAsync();
}
}
}
}

View File

@ -4,15 +4,14 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<StackLayout Padding="10">
<Label Text="Modifier la Pièce" FontSize="24" HorizontalOptions="Center"/>
<Entry x:Name="NomEntry" Placeholder="Nom"/>
<Editor x:Name="DescriptionEditor" Placeholder="Description" HeightRequest="100"/>
<Entry x:Name="PrixEntry" Placeholder="Prix" Keyboard="Numeric"/>
<Entry x:Name="StockEntry" Placeholder="Stock" Keyboard="Numeric"/>
<Label Text="Sélectionnez un fournisseur:"/>
<Picker x:Name="FournisseurPicker" Title="Fournisseurs"/>
<Picker x:Name="AppareilPicker"
Title="Choisissez un appareil">
</Picker>
<Entry x:Name="FournisseurEntry" Placeholder="Fournisseur"/>
<Button Text="Enregistrer" Clicked="OnSaveClicked"/>
<Button Text="Supprimer" Clicked="OnDeleteClicked" TextColor="Red"/>
</StackLayout>

View File

@ -6,53 +6,41 @@ namespace MauiAppStock.Views
public partial class EditPiecePage : ContentPage
{
private Piece _piece;
private List<Fournisseur> _fournisseurs;
public EditPiecePage(Piece piece)
{
InitializeComponent();
// LoadAppareils();
_piece = piece;
// Remplir les champs de base
NomEntry.Text = piece.Nom;
DescriptionEditor.Text = piece.Description;
PrixEntry.Text = piece.Prix.ToString();
StockEntry.Text = piece.Stock.ToString();
}
protected override async void OnAppearing()
{
base.OnAppearing();
// Charger les fournisseurs
_fournisseurs = await Database.GetFournisseursAsync();
FournisseurPicker.ItemsSource = _fournisseurs;
FournisseurPicker.ItemDisplayBinding = new Binding("Nom");
// Sélectionner le fournisseur existant (si défini)
if (!string.IsNullOrEmpty(_piece.Fournisseur))
{
var fournisseurActuel = _fournisseurs.FirstOrDefault(f => f.Nom == _piece.Fournisseur);
if (fournisseurActuel != null)
{
FournisseurPicker.SelectedItem = fournisseurActuel;
}
}
StockEntry.Text = piece.Stock.ToString();
FournisseurEntry.Text = piece.Fournisseur; // TODO : Prochainement picker pour fournisseur
}
//private async void LoadAppareils()
//{
// AppareilPicker.ItemsSource = await Database.GetAppareilsAsync();
//}
private async void OnSaveClicked(object sender, EventArgs e)
{
// Appareil appareilPicked = AppareilPicker.SelectedItem as Appareil;
//if (appareilPicked == null)
//{
// await DisplayAlert("ERREUR", "L'appareil n'est pas un valide", "OK");
// return;
//}
if (double.TryParse(PrixEntry.Text, out double prix) && int.TryParse(StockEntry.Text, out int stock))
{
_piece.Nom = NomEntry.Text;
_piece.Description = DescriptionEditor.Text;
_piece.Prix = prix;
_piece.Stock = stock;
var fournisseurSelectionne = FournisseurPicker.SelectedItem as Fournisseur;
_piece.Fournisseur = fournisseurSelectionne?.Nom;
_piece.Fournisseur = FournisseurEntry.Text;
await Database.UpdatePieceAsync(_piece);
await Navigation.PopAsync();
}
@ -72,4 +60,4 @@ namespace MauiAppStock.Views
}
}
}
}
}

View File

@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
x:Class="MauiAppStock.Views.FournisseursPage"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:vm="clr-namespace:MauiAppStock.ViewModels">
<ContentPage.BindingContext>
<vm:FournisseursViewModel/>
</ContentPage.BindingContext>
<ContentPage.ToolbarItems>
<ToolbarItem Text="+" Clicked="OnAddFournisseurClicked"/>
</ContentPage.ToolbarItems>
<StackLayout Padding="10">
<Label Text="Liste des Fournisseurs" FontSize="24" HorizontalOptions="Center"/>
<ListView x:Name="FournisseursListView" ItemsSource="{Binding Fournisseurs}"
IsPullToRefreshEnabled="True"
RefreshCommand="{Binding LoadFournisseursCommand}"
ItemTapped="OnFournisseurTapped">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Nom}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>

View File

@ -1,35 +0,0 @@
using MauiAppStock.Models;
using MauiAppStock.ViewModels;
namespace MauiAppStock.Views
{
public partial class FournisseursPage : ContentPage
{
public FournisseursPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
var viewModel = BindingContext as FournisseursViewModel;
viewModel.LoadFournisseursCommand.Execute(null);
}
private async void OnAddFournisseurClicked(object sender, EventArgs e)
{
// Navigation vers la page d'ajout
await Navigation.PushAsync(new AddFournisseurPage());
}
private async void OnFournisseurTapped(object sender, ItemTappedEventArgs e)
{
if (e.Item is Fournisseur selectedFournisseur)
{
// Navigation vers la page d'édition avec l'appareil sélectionné
await Navigation.PushAsync(new EditFournisseurPage(selectedFournisseur));
}
}
}
}

View File

@ -4,18 +4,9 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<StackLayout Padding="20" Spacing="20" VerticalOptions="Center">
<Label Text="Menu Principal" FontSize="30" HorizontalOptions="Center" />
<Button Text="Gestion des Appareils" BackgroundColor="Black" Clicked="OnAppareilsClicked" />
<Button Text="Gestion des Pièces" BackgroundColor="Black" Clicked="OnPiecesClicked" />
<Button Text="Gestion des Fournisseurs" BackgroundColor="Black" Clicked="OnFournisseursClicked" />
<Button Text="Associer une Pièce à un Appareil" BackgroundColor="Black" Clicked="OnAssocierPieceClicked" />
<Button Text="Mouvement de stock" BackgroundColor="Black" Clicked="OnMouvementStockClicked" />
<VerticalStackLayout Padding="20" Spacing="20">
<Image Source="logo.png"
HeightRequest="200"
Aspect="AspectFit" />
</VerticalStackLayout>
<Button Text="Gestion des Appareils" Clicked="OnAppareilsClicked" />
<Button Text="Gestion des Pièces" Clicked="OnPiecesClicked" />
<Button Text="Associer une Pièce à un Appareil" Clicked="OnAssocierPieceClicked" />
<Button Text="Mouvement de Stock" Clicked="OnMouvementStockClicked" />
</StackLayout>
</ContentPage>

View File

@ -19,11 +19,6 @@ namespace MauiAppStock.Views
{
await Navigation.PushAsync(new PiecesPage());
}
private async void OnFournisseursClicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new FournisseursPage());
}
private async void OnAssocierPieceClicked(object sender, EventArgs e)
{

View File

@ -3,7 +3,6 @@
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<StackLayout Padding="10">
<Label Text="Sélectionnez un Appareil" FontSize="24" HorizontalOptions="Center" />
<ListView x:Name="AppareilsListView" ItemTapped="OnAppareilTapped">
<ListView.ItemTemplate>

View File

@ -10,11 +10,7 @@ namespace MauiAppStock.Views
InitializeComponent();
LoadAppareils();
}
protected override void OnAppearing()
{
base.OnAppearing();
LoadAppareils(); // Rafraîchit la liste à chaque affichage
}
private async void LoadAppareils()
{
var appareils = await Database.GetAppareilsAsync();
@ -29,7 +25,5 @@ namespace MauiAppStock.Views
await Navigation.PushAsync(new AppareilPiecesPage(selectedAppareil));
}
}
}
}

View File

@ -1,99 +0,0 @@
# 📱 AppSAV Application de Gestion de Stock SAV
AppSAV est une application mobile destinée à la gestion du stock de pièces détachées pour une entreprise spécialisée dans la réparation dappareils. Elle permet à lutilisateur de gérer efficacement les matériels, les pièces associées, ainsi que le suivi des mouvements de stock.
---
## ✨ Fonctionnalités principales
- 🔧 **Gestion des appareils**
- Ajout, modification et suppression d'appareils.
- Affectation dun identifiant unique, dun nom et dun état à chaque appareil.
- 🔗 **Association des pièces détachées aux appareils**
- Attribution de pièces à un appareil.
- Indication des pièces recommandées.
- 🔍 **Recherche par appareil**
- Trouver rapidement les pièces associées à un appareil.
- 📄 **Informations détaillées**
- Détails sur les appareils (historique dutilisation des pièces, etc.).
- Détails sur les pièces (prix, stock, fournisseur…).
- 📦 **Gestion des pièces détachées**
- Ajout, modification, suppression.
- Gestion du stock.
- 📊 **Suivi des entrées/sorties**
- Mouvements de stock avec commentaires (entrée, sortie, quantité, etc.).
- 🏭 **Gestion des fournisseurs**
- Ajout, modification, suppression des fournisseurs.
- Coordonnées de contact.
---
## 🛠️ Technologies utilisées
- 🧩 **.NET MAUI (.NET 8.0)**
- 🗄️ **SQLite** (base de données locale)
- 🖥️ **IDE** : Rider / Visual Studio
- 🧪 Méthode agile : **Scrum**
---
## 🚀 Installation
### Prérequis
- [.NET MAUI SDK](https://learn.microsoft.com/en-us/dotnet/maui/overview/) (version 8.0)
- Android Emulator ou appareil physique
- IDE compatible : JetBrains Rider ou Visual Studio 2022+
- Git
### Instructions
```bash
# Cloner le projet
git clone https://gitea.btssio-poitiers.fr/brunetg/AppSAV.git
cd AppSAV
# Restaurer les dépendances
dotnet restore
# Lancer lapplication
dotnet build
dotnet maui run --framework net8.0-android
```
---
## 📁 Structure de projet
```
/AppSAV
├── Data/ # Contient les fichiers relatifs à la base de données
├── Helpers/ # Contient une commande asynchrone qui contourne l'installation de CommunityToolKit
├── Models/ # Contient les entités de l'application
├── ViewModels/ # Contient la gestion de données de l'interface utilisateur
└── Views/ # Contient les pages et le Code-Behind associé
```
---
## 📄 Licence
Projet pédagogique réalisé dans le cadre de l'AP du S4 de BTS - SIO : SLAM (Lycée Aliénor d'Aquitaine) Session 2025.
---
## 👥 Auteurs
- **Axel BESBOT**
- **Yann ASTIER**
- **Giovanny BRUNET**
- **Kylian BAYARD**
- **Lucas RAGUENEAU**
Encadré par : *Louis BOUSSARIE* *Romaric THIBAULT FERRAND*

Binary file not shown.

Binary file not shown.