AND3000 — Gannat, France
AND3000 (Auvergne Numérique Distribution), fondée en 2009 par Éric Gauthard, est née de la fusion d'une entreprise d'antennes et d'une entreprise d'équipements de sécurité, complétées par l'informatique — son activité principale. Le stage le plus long et le plus formateur de mon parcours à ce jour, centré sur la maintenance évolutive du logiciel de gestion interne GIMI.
- PHP procédural & POO
- MySQL
- Architecture MVC maison
- API REST Google Calendar
Environnement technologique
PHP procédural et orienté objet, MySQL, architecture MVC maison, API REST Google Calendar, Visual Studio Code.
Besoins exprimés
Faire évoluer GIMI, logiciel de gestion interne déjà en production et utilisé au quotidien par les équipes, sur plusieurs volets : gestion des contrats clients, gestion des congés, planification des interventions, outils internes.
Mission — Prise en main de l'environnement
Objectif — se remettre à niveau sur PHP et MySQL avant d'intervenir sur l'existant.
Déroulement — rappel pratique des opérations CRUD appliquées à des cas métier réels plutôt qu'à des exercices scolaires (gestion des signatures d'employés : lecture, ajout, modification, suppression via PDO).
Bilan — une remise à niveau rapide, facilitée par des cas concrets issus de l'activité de l'entreprise.
// crud_signatures / index.php
<a href="./pages/create.php"> Ajouter </a>
<?php
include "components/db.php";
$sql = "SELECT * FROM signatures";
$stmt = $pdo->query($sql);
echo "<table>";
echo "<tr><th>Nom</th><th>Prénom</th><th>Téléphone</th><th>Email</th><th>Poste</th></tr>";
while ($row = $stmt->fetch()) {
echo "<tr><td>" . $row['nom']
. "</td><td>" . $row['prenom']
. "</td><td>" . $row['telephone']
. "</td><td>" . $row['email']
. "</td><td>" . $row['poste'] . "</td>
<td><a href='pages/delete.php?id_employe=" . $row['id_employe'] . "'>Supprimer</a></td>
<td><a href='pages/update.php?id_employe=" . $row['id_employe'] . "'>Modifier</a></td></tr>";
}
echo "</table>";
Mission — Outils internes
Objectif — faciliter le transfert de ressources et de fichiers entre les ordinateurs des clients.
Déroulement — développement d'un utilitaire Python (interface CustomTkinter, empaqueté avec PyInstaller) capable de détecter les navigateurs installés sur le poste d'un client et d'exporter leurs données vers un disque de destination.
Résultats — des utilitaires opérationnels utilisés en interne.
// export-navigateur / ExportNavigateur.py
NAVIGATEURS = {
"Google Chrome": {"chemin": r"Users\{USER}\AppData\Local\Google\Chrome\User Data", "type": "Chromium", "exe": "chrome.exe"},
"Microsoft Edge": {"chemin": r"Users\{USER}\AppData\Local\Microsoft\Edge\User Data", "type": "Chromium", "exe": "msedge.exe"},
"Mozilla Firefox": {"chemin": r"Users\{USER}\AppData\Roaming\Mozilla\Firefox\Profiles", "type": "Firefox", "exe": "firefox.exe"},
# ... 10 navigateurs pris en charge au total (Brave, Opera, Vivaldi, LibreWolf...)
}
def get_disques():
"""Détection des disques via ctypes Win32 — instantané, aucun subprocess."""
result = []
bitmask = ctypes.windll.kernel32.GetLogicalDrives()
for letter in string.ascii_uppercase:
if bitmask & 1:
root = f"{letter}:\\"
avail = ctypes.c_ulonglong(0)
total = ctypes.c_ulonglong(0)
ok = ctypes.windll.kernel32.GetDiskFreeSpaceExW(
root, ctypes.byref(avail), ctypes.byref(total), ctypes.byref(ctypes.c_ulonglong(0))
)
if ok and total.value > 0:
result.append({"root": root, "taille": round(total.value / 1e9, 1)})
bitmask >>= 1
return result
Mission — Signature numérique
Objectif — harmoniser les signatures d'emails des employés de l'entreprise.
Déroulement — conception d'un générateur permettant de créer automatiquement ces signatures : formulaire web, aperçu en direct, échappement systématique des champs saisis avant génération du HTML compatible clients mail.
Résultats — un générateur de signatures harmonisées mis à disposition des employés.
// generateur_signature_numerique / assets/js/main.js
// Sécurité : échappement HTML — évite qu'un champ saisi ne casse la signature
// ou n'y injecte du HTML/JS. Appliqué à toutes les valeurs avant insertion.
function esc(s) {
return String(s)
.replace(/&/g,'&')
.replace(/</g,'<')
.replace(/>/g,'>')
.replace(/"/g,'"');
}
function buildHTML(prenom, nom, poste, tel, email, photo, li, fb, yt) {
const name = [prenom, nom].filter(Boolean).join(' ') || 'Prenom Nom';
const p = poste || 'Poste';
const t = tel ? '04.70.56.58.30 - ' + tel : '04.70.56.58.30';
// ... assemblage du tableau HTML compatible clients mail (Outlook, Thunderbird...)
// les tableaux sont utilisés car les CSS modernes ne sont pas supportés par les webmails
}
Mission — Cœur du stage : évolution de GIMI
Existant — une architecture MVC déjà en production, utilisée au quotidien par les équipes.
Objectif — faire évoluer GIMI sans casser l'existant : gestion des contrats clients, gestion des demandes de congés, planification des demandes d'assistance, intégration Google Calendar.
Déroulement — intervention sur l'architecture MVC existante : gestion des contrats clients (filtrage par famille, statistiques, renouvellements), gestion des demandes de congés avec génération automatique d'un document PDF, planification des demandes d'assistance, intégration de l'API Google Calendar via un compte de service (authentification JWT signée, appels REST sans bibliothèque tierce).
Résultats — nouvelles fonctionnalités livrées et intégrées à l'outil utilisé en production par l'entreprise.
Bilan — ce travail sur un existant m'a appris à lire, comprendre et respecter une architecture déjà en place, plutôt qu'à partir d'une page blanche. L'intégration Google Calendar a aussi demandé de recoder manuellement la signature JWT, aucune librairie officielle simple n'étant disponible en PHP pur pour ce cas d'usage.
Recul critique
Une grande partie du développement a été assistée par de l'IA générative (Claude Code), précieuse pour l'efficacité mais avec ses limites : code parfois générique, nécessité de systématiquement relire et comprendre chaque suggestion parfois douteuse.