@mostajs/flotte 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,7 +3,16 @@
3
3
  Format [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) · [SemVer](https://semver.org/lang/fr/).
4
4
  Auteur : Dr Hamid MADANI <drmdh@msn.com>
5
5
 
6
- ## [0.4.0] — non publiée
6
+ ## [0.5.0] — non publiée
7
+ ### Added
8
+ - `TRANSITIONS` (figées, sans la garde) et `transitionsDepuis(statut)` → `[{ id, vers, motif }]` : l'écran n'offre
9
+ que les changements permis depuis le statut courant et sait lesquels exigent un motif, sans recopier le cycle.
10
+ Demandé par le menu « Changer le statut » de la fiche (planches B et C, ECR-16.31 et 16.36), que
11
+ `@mostajs/flotte-ui` 0.2.0 rend. Essai T-FLO-23.
12
+ - `saisirPlein` garde `piece` (photo du ticket : `{ nom, empreinte, deposePar, deposeLe }`, colonne JSON), comme
13
+ une échéance. Demandé par « Saisir un plein » de la planche D (ECR-16.40). Essai T-FLO-24.
14
+
15
+ ## [0.4.0] — 2026-10-24
7
16
  ### Added
8
17
  - `poserEcheance` garde `reference` (n° de police, de procès-verbal) et `organisme` ; `piece` accepte un objet
9
18
  (`{ nom, empreinte, deposePar, deposeLe }`) : colonne JSON. Essai T-FLO-18.
package/llms.txt CHANGED
@@ -20,6 +20,7 @@ EXPORTS
20
20
  ErreurFlotte { code, statut } (400 donnée, 404 inconnu, 409 doublon/recul/close/ouverte/occupé, 422 transition)
21
21
  CODES, LIBELLES, libelle(famille, code, t?, vars?) ; STATUTS, MOTIFS ; PERMISSIONS (flotte:domaine:action)
22
22
  regles (pur) : etatEntretien, prochainEntretien, kmParJour, consommation, evaluerDepart, cout, echeanceCourante, jours, ajouterJours
23
+ TRANSITIONS (0.5.0) figées [{ id, from, vers, motif }] ; transitionsDepuis(statut) -> [{ id, vers, motif }] (menu « Changer le statut »)
23
24
  register (7 tables ; aussi './register'), SCHEMAS, validerDeclarations
24
25
 
25
26
  API (async ; ctx = { agent })
@@ -38,7 +39,7 @@ API (async ; ctx = { agent })
38
39
  ouvrirIntervention({ vehicule, nature, plan?, description?, ouverteLe? }, ctx) corrective => a_l_atelier
39
40
  cloreIntervention(id, { km?, cout?, le? }, ctx) recale le plan ; km => relevé ; close => immuable
40
41
  relever(v, { km, le?, source?, correction?: { motif, agent } }, ctx) -> relevé + avertissements (SAUT_ANORMAL), conservés sur le relevé (0.4.0)
41
- saisirPlein({ vehicule, le, litres, montant, km, complet }, ctx) vaut relevé ; pleins(v) (0.4.0) ; consommation(v)
42
+ saisirPlein({ vehicule, le, litres, montant, km, complet, piece? (0.5.0) }, ctx) vaut relevé ; pleins(v) (0.4.0) ; consommation(v)
42
43
  affecter(v, conducteur, ctx) ; liberer(v, ctx) ; affectations(v) ; affectationCourante(v)
43
44
  peutPartir(v, { date?, conducteur?, km? }) -> { ok, motifs[], avertissements[] } TOUS les motifs, en OBJETS
44
45
  disponibles({ date?, type?, attributs? }) ; cout(v, { du, au }) -> { carburant, entretien, echeances, total, km, parKm, nonComptes }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostajs/flotte",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Le carnet du parc : registre des véhicules par type déclaré, cycle d'état, échéances, entretien au kilométrage et à la date, relevés, pleins, affectations de conducteurs, coût au km, et la réponse « ce véhicule peut-il partir ? ».",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
package/src/cycle.js CHANGED
@@ -10,6 +10,15 @@ export const TRANSITIONS = Object.freeze([
10
10
  { id: 'reformer', from: ['en_service', 'immobilise', 'a_l_atelier'], to: 'reforme', motif: true },
11
11
  ]);
12
12
 
13
+ /**
14
+ * Les transitions telles que l'écran les lit (0.5.0) : figées, sans la garde, qui reste dans le moteur. L'écran
15
+ * n'offre ainsi que les changements permis depuis un statut, et sait lesquels exigent un motif.
16
+ */
17
+ export const TRANSITIONS_PUBLIQUES = Object.freeze(TRANSITIONS.map(({ id, from, to, motif }) => Object.freeze({ id, from: Object.freeze([...from]), vers: to, motif })));
18
+
19
+ /** Les transitions permises depuis `statut`, dans l'ordre du cycle : [{ id, vers, motif }] ; [] pour un état final. */
20
+ export const transitionsDepuis = (statut) => TRANSITIONS_PUBLIQUES.filter((t) => t.from.includes(statut)).map(({ id, vers, motif }) => ({ id, vers, motif }));
21
+
13
22
  /**
14
23
  * La machine d'une instance. `audit` (AuditSink de statemachine) est celui de l'application quand elle en
15
24
  * fournit un ; sinon la machine garde son journal en mémoire.
package/src/flotte.js CHANGED
@@ -323,12 +323,12 @@ export function createFlotte({
323
323
  return ecrireReleve(vehicule, { km, le: jour, source, correction }, avert, agent);
324
324
  },
325
325
  async releves(vehicule) { await lire(vehicule); return releves(vehicule); },
326
- async saisirPlein({ vehicule, le, litres, montant, km, complet = false, carte } = {}, { agent } = {}) {
326
+ async saisirPlein({ vehicule, le, litres, montant, km, complet = false, carte, piece } = {}, { agent } = {}) {
327
327
  await lire(vehicule);
328
328
  const jour = le ?? aujourdhui();
329
329
  exigerNombre(litres, 'litres', { strict: true }); exigerNombre(montant, 'montant');
330
330
  const avert = await verifierReleve(vehicule, { km, le: jour });
331
- const p = await creer('pleins', { id: randomUUID(), vehicule, le: jour, litres, montant, km, complet: Boolean(complet), carte: carte ?? null, saisiPar: agent ?? null });
331
+ const p = await creer('pleins', { id: randomUUID(), vehicule, le: jour, litres, montant, km, complet: Boolean(complet), carte: carte ?? null, piece: piece ?? null, saisiPar: agent ?? null });
332
332
  emettre('plein.saisi', { vehicule, plein: p.id, litres, montant });
333
333
  const r = await ecrireReleve(vehicule, { km, le: jour, source: 'plein' }, avert, agent);
334
334
  return { ...p, avertissements: r.avertissements };
package/src/index.js CHANGED
@@ -6,6 +6,7 @@ export { CODES, LIBELLES, libelle } from './libelles.js';
6
6
  export { register, SCHEMAS } from './schemas.js';
7
7
  export { validerDeclarations, FORMES } from './declarations.js';
8
8
  export * as regles from './regles.js';
9
+ export { TRANSITIONS_PUBLIQUES as TRANSITIONS, transitionsDepuis } from './cycle.js';
9
10
  export const STATUTS = CODES.statut;
10
11
  export const MOTIFS = CODES.motif;
11
12
  /** Les permissions, au format domaine:action (§10 #5) : le module les nomme, rbac-tenant les vérifie. */
package/src/schemas.js CHANGED
@@ -20,7 +20,7 @@ export const ReleveCompteurSchema = s('ReleveCompteur', 'flotte_releves', {
20
20
  vehicule: TR, km: NR, le: TR, source: TR, correction: J, saisiPar: T, avertissements: J,
21
21
  }, [{ fields: { vehicule: 'asc', le: 'asc' } }]);
22
22
  export const PleinSchema = s('Plein', 'flotte_pleins', {
23
- vehicule: TR, le: TR, litres: NR, montant: NR, km: NR, complet: B, carte: T, saisiPar: T,
23
+ vehicule: TR, le: TR, litres: NR, montant: NR, km: NR, complet: B, carte: T, piece: J, saisiPar: T,
24
24
  }, [{ fields: { vehicule: 'asc', le: 'asc' } }]);
25
25
  export const AffectationSchema = s('Affectation', 'flotte_affectations', {
26
26
  vehicule: TR, conducteur: TR, du: TR, au: T, parAgent: T, closePar: T,
@@ -30,7 +30,7 @@ export const SCHEMAS = Object.freeze([VehiculeSchema, EcheanceSchema, PlanEntret
30
30
 
31
31
  export function register(registry) {
32
32
  registry.register({
33
- manifest: { name: 'flotte', package: '@mostajs/flotte', version: '0.4.0', type: 'business', priority: 45, displayName: 'Flotte (carnet du parc)',
33
+ manifest: { name: 'flotte', package: '@mostajs/flotte', version: '0.5.0', type: 'business', priority: 45, displayName: 'Flotte (carnet du parc)',
34
34
  description: 'Registre des véhicules, cycle, échéances, entretien, relevés, pleins, affectations, coût au km, peutPartir.', register: './src/schemas.js' },
35
35
  schemas: SCHEMAS.map((x) => ({ name: x.name, schema: x })),
36
36
  });