Ajoute field_ecart (Montant HT - somme répartition), stocké à la sauvegarde

Phase 1 du chantier filtrage serveur de /lignes : l'écart devient une
vraie valeur stockée plutôt que recalculée à la volée en résolvant les
paragraphes de répartition, pour que le futur filtre "Écarts uniquement"
côté serveur puisse filtrer directement dessus.

Contrairement au Montant TTC (protégé par un garde-fou pour ne jamais
altérer un TTC historique), l'écart n'a pas de valeur passée à
protéger -- il reflète l'état *actuel* de la répartition, donc
recalculé sans condition à chaque sauvegarde. figli_compta_ledger_
node_presave() calculait déjà cette somme pour la validation
répartition == HT ; le stockage était quasi gratuit à ajouter au même
endroit.

Migration (update hooks 8009/8010) : rétro-calcul mécanique pour les
1556 lignes existantes (tous types, contrairement aux migrations TVA/
cotisation qui ne concernaient que les entrées client) -- aucune
ambiguïté à arbitrer, juste HT moins répartition. Vérifié
indépendamment ligne par ligne après coup : 0 écart entre la valeur
recalculée à la main et celle stockée par la migration.

Nouveau flag d'état 'figli_compta_ledger.skip_revision', utilisé
uniquement par cette migration : backfiller un champ purement calculé
sur 1556 lignes déjà migrées n'est pas un changement éditorial qui
justifie 1556 nouvelles révisions -- vérifié qu'aucune révision
supplémentaire n'a été créée. Reste indépendant de skip_validation
(déjà utilisé par tous les autres scripts de migration de ce module,
et qui doit continuer à créer une révision).

Restructuration de figli_compta_ledger_node_presave() : le calcul de
l'écart et son stockage se font maintenant même sous skip_validation
(seul le lancement de l'exception reste conditionnel) -- vérifié que
l'exception se déclenche toujours normalement sur une vraie
répartition incohérente, et que Montant TTC/Cotisation restent
inchangés sur une sauvegarde qui ne touche ni HT ni TVA.
This commit is contained in:
2026-09-08 13:37:39 +02:00
parent 00956825fa
commit 7bcf65d25b
6 changed files with 234 additions and 66 deletions
@@ -7,6 +7,7 @@ dependencies:
- field.field.node.ligne_comptable.field_cotisation_active
- field.field.node.ligne_comptable.field_cotisation_urssaf
- field.field.node.ligne_comptable.field_date_ligne
- field.field.node.ligne_comptable.field_ecart
- field.field.node.ligne_comptable.field_entree_liee
- field.field.node.ligne_comptable.field_flag
- field.field.node.ligne_comptable.field_montant_ht
@@ -175,5 +176,6 @@ content:
placeholder: ''
third_party_settings: { }
hidden:
field_ecart: true
promote: true
sticky: true
@@ -7,6 +7,7 @@ dependencies:
- field.field.node.ligne_comptable.field_cotisation_active
- field.field.node.ligne_comptable.field_cotisation_urssaf
- field.field.node.ligne_comptable.field_date_ligne
- field.field.node.ligne_comptable.field_ecart
- field.field.node.ligne_comptable.field_entree_liee
- field.field.node.ligne_comptable.field_flag
- field.field.node.ligne_comptable.field_montant_ht
@@ -65,6 +66,17 @@ content:
third_party_settings: { }
weight: 0
region: content
field_ecart:
type: number_decimal
label: above
settings:
thousand_separator: ''
decimal_separator: .
scale: 2
prefix_suffix: true
third_party_settings: { }
weight: 13
region: content
field_entree_liee:
type: entity_reference_label
label: above
@@ -0,0 +1,23 @@
uuid: 79bd7ee6-1e84-4edd-8065-775929c45fcb
langcode: en
status: true
dependencies:
config:
- field.storage.node.field_ecart
- node.type.ligne_comptable
id: node.ligne_comptable.field_ecart
field_name: field_ecart
entity_type: node
bundle: ligne_comptable
label: Écart
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
min: null
max: null
prefix: ''
suffix: ''
field_type: decimal
@@ -0,0 +1,20 @@
uuid: 95ae1d5b-db18-4ebf-93a4-34d6522a32d6
langcode: en
status: true
dependencies:
module:
- node
id: node.field_ecart
field_name: field_ecart
entity_type: node
type: decimal
settings:
precision: 12
scale: 2
module: core
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false