Cargamento
Se connecter

Guide développeur

Cargamento est une application PHP 8.2 sans framework ni dépendance Composer, avec MariaDB, servie par Apache. L'interface est en JavaScript sans bibliothèque, les dessins en SVG générés par le code.

Architecture

Trois couches, avec le moteur de calcul isolé (fiche technique §7) :

CoucheRôleOù
ÉcransCollectent les saisies, dessinent les résultats. Aucune règle métier.views/app/index.php, public/assets/js/app.js
Vitrine et comptesSite public, connexion, demande d'accès, compte.src/Controller/Site.php, views/site/*
MoteurFonctions pures, sans DOM, sans base, sans HTTP.src/Engine/*.php et public/assets/js/engine.js
API et back-officeClés, validation, plans enregistrés, référentiels.src/Api, src/Controller, src/Service

Deux moteurs jumeaux

Le serveur n'a pas Node : le moteur existe en PHP (API, tests) et en JavaScript (navigateur, calcul instantané et hors connexion). Les deux sont écrits ligne à ligne en miroir et produisent la même structure JSON, aux mêmes clés.

Règle d'or : toute modification d'un moteur est reportée dans l'autre dans le même commit, puis vérifiée par php tests/parity.php, qui génère 500 cas aléatoires (palettisations et chargements), les calcule des deux côtés (le JS dans Chromium headless) et compare chaque champ.

Points d'attention pour garder la parité :

Fonctions du moteur

PHPJSRôle
Palletizer::palletize($in)palletize(in)Palettisation d'une référence (§4), découpage de commande, lignes prêtes pour le camion.
Palletizer::bestLayer()bestLayer()Meilleur plan de couche : grille simple, blocs mixtes en longueur et en largeur.
TruckPlanner::plan($in)planTruck(in)Dépliage, rejet, gerbage, tri, rangées, numérotation, indicateurs, jauges, alertes (§5, §6).
TruckPlanner::evaluate($in, $layout)evaluateLayout(in, layout)Chargement manuel : contrôle une disposition posée à la main et la chiffre comme un plan automatique.
TruckPlanner::dockLayout($plan)dockLayout(plan)Plan de quai : plancher pivoté, rangée 1 côté porte (§6.3).
Num::num(), Num::fmt()num(), fmt()Lecture « 12,5 » / « 12.5 », affichage français.

plan() et evaluate() partagent expand() (palettes unitaires, rejets), finish() (numérotation, indicateurs, jauges, alertes, quai) et stackOut().

Chargement manuel

Les sorties détaillées sont décrites dans la documentation de l'API (/aide/api) et dans docs/openapi.json.

Routes

CheminAccèsRôle
/publicVitrine.
/demande-accespublicFormulaire de demande d'accès (table access_requests).
/mentions-legalespublicMentions légales, données personnelles, cookies (views/site/legal.php). À tenir à jour si un traitement ou un cookie change.
/connexion, /deconnexionpublicConnexion unique outil + administration. ?retour= accepte seulement un chemin local.
/aide/{slug}publicGuides Markdown.
/appcompteL'outil (trois onglets).
/p/{id}comptePlan enregistré par l'API, ouvert dans l'outil.
/comptecompteChangement de mot de passe.
/admin/*rôle adminBack-office.
/api/v1/*clé d'APIAPI REST, indépendante des comptes.
/_shotjeton disqueConnexion temporaire pour les captures (voir plus bas), 404 sinon.

Comptes et sessions

Arborescence

bin/            install.php, create-admin.php, create-api-key.php, make-doc-shots.php, build-openapi.php
config/         config.php (non versionné), config.sample.php
database/       schema.sql, seed.sql (idempotents)
deploy/         vhosts Apache HTTP et HTTPS
docs/           guides Markdown rendus sur /aide, openapi.json
public/         index.php (contrôleur frontal), sw.js, manifest, assets/
src/Engine/     moteur PHP (pur)
src/Api/        Api.php (routes, auth, erreurs), Input.php (validation)
src/Controller/ Site.php (vitrine, connexion, demandes, compte), Web.php (outil, plans, aide), Admin.php
src/Core/       Config, Database, Router, View, Auth, Markdown
src/Service/    Referentials, ApiKeys, Plans
storage/logs/   php-error.log
tests/          engine.php, parity.php, api.php, web.php, manual-ui.php, cases.json
views/          gabarits PHP

Installation

git clone … /var/www/cargamento
cd /var/www/cargamento
cp config/config.sample.php config/config.php   # renseigner la base et l'URL
mysql -e "CREATE DATABASE cargamento CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
php bin/install.php                              # tables + référentiels par défaut
php bin/create-admin.php email@societe.fr "Nom"
cp deploy/cargamento.conf deploy/cargamento-ssl.conf /etc/apache2/sites-available/
a2ensite cargamento cargamento-ssl && systemctl reload apache2
chown -R www-data:root . && chmod 640 config/config.php

Certificat : certbot certonly --webroot -w /var/www/cargamento/public -d <domaine>. Le vhost HTTP laisse passer /.well-known/acme-challenge/ et redirige le reste en HTTPS.

bin/install.php est idempotent : il crée les tables manquantes et les référentiels par défaut sans écraser les valeurs modifiées. À relancer après chaque mise à jour du schéma.

Configuration

CléRôle
app.urlURL publique, utilisée pour les liens de plans partagés renvoyés par l'API.
app.debugAffiche les erreurs PHP. Jamais en production.
app.versionAffichée en pied de page.
db.*Connexion MariaDB.
security.cookie_secureCookie de session du back-office en HTTPS uniquement.
api.rate_per_minuteAppels par clé et par minute (120).
api.max_palletsPalettes unitaires max par calcul (2 000).

Tests

php tests/engine.php    # cas T1 à T11 de la fiche §8.1 + compléments, performance (< 50 ms)
php tests/parity.php    # parité PHP / JS : 500 cas aléatoires + 125 chargements manuels perturbés (Chromium requis)
php tests/api.php       # API de bout en bout sur l'URL configurée (crée puis supprime une clé de test)
php tests/web.php       # vitrine, connexion, rester connecté, droits, demande d'accès (comptes de test supprimés à la fin)
php tests/manual-ui.php # chargement manuel dans Chromium : bac, toucher, glisser, gerber, refus, rotation, clavier, Quai

Les trois sortent avec un code non nul en cas d'échec : à brancher tels quels en intégration continue.

Persistance

Interface

Documentation

Les guides sont dans docs/*.md, rendus sur /aide/{slug} par src/Core/Markdown.php (sous-ensemble : titres, listes, tableaux, code, images, citations). https://cargamento.vozit.dev est remplacé par app.url. Les captures du guide utilisateur (public/assets/img/aide/*.png) et de la vitrine (public/assets/img/site/*.webp, dont des recadrages *-zoom mesurés dans la page et les captures du chargement manuel préparées par script dans un cadre) se régénèrent avec php bin/make-doc-shots.php. L'outil exigeant un compte, le script écrit un jeton dans storage/shot-token (valable 5 minutes, supprimé à la fin) que la route /_shot échange contre une session du premier administrateur actif.

À chaque livraison : mettre à jour les quatre guides, la vitrine (views/site/home.php) et ses captures, docs/openapi.json si l'API change (php bin/build-openapi.php docs/openapi.json), et ajouter une entrée datée dans docs/00-changelog.md.

Pièges connus

Évolutions prévues (V2, fiche §8.3)

Export PDF, comptes et sauvegarde des plans dans l'outil, charge par essieu, vue 3D, palettes mixtes, contraintes produits (ADR, alimentaire), chargement latéral, import WMS / TMS, plan de couche en 5 blocs.