A fresh session started here needs a discoverable path to the source .ods files and audit scripts for future year migrations (2021-2025). The symlink is machine-local (absolute path), so it's gitignored -- CLAUDE.md documents how to recreate it if missing. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
6.9 KiB
figli_compta
Outil métier interne pour la SAS Figures Libres (collectif de 6 graphistes freelance, agissant comme proxy de facturation entre clients et graphistes). Remplace progressivement les tableurs .ods historiques (suivi manuel des entrées/sorties par personne).
Ce projet est séparé du dossier d'analyse comptable d'origine (/mnt/Data/bach/Documents/SAS Figures Libres/DEV_COMPTA, qui contient les fichiers .ods sources et les scripts Python d'audit). Ici, on ne travaille que sur l'outil (Drupal + Docker).
sources-compta/ (à la racine de ce dossier) est un lien symbolique local vers ce dossier DEV_COMPTA — pas versionné (chemin absolu propre à cette machine, voir .gitignore). Utile pour les futures migrations (2021-2025 pas encore faites) :
sources-compta/compta_figli/suivi_compta_SASFigli20XX.ods: fichiers sources par année.sources-compta/compat_bach/: fichiers personnels de Bachir (pour recoupement).sources-compta/scripts/: scripts Python d'audit/extraction (build_bachir_full.pycontient la logique d'unification des noms de clients, réutilisable/à généraliser pour la migration multi-année).sources-compta/tableaux/: exports xlsx déjà produits (soldes corrigés, anomalies, etc.) — utile pour vérifier une migration après coup.
Si ce lien n'existe pas (nouvelle machine), le recréer : ln -s "/mnt/Data/bach/Documents/SAS Figures Libres/DEV_COMPTA" sources-compta.
Stack
- Drupal 11 en decoupled progressif : Drupal sert la page (nav, auth, permissions, formulaires de saisie natifs), un dashboard Vue 3 interroge JSON:API et fait tous les calculs/pivots côté client.
- Docker : mysql (mariadb), php-8.4-fpm, nginx, phpmyadmin. Structure calquée sur le projet
leshed(même dossierDeveloper/Docker/). src/est un sous-module git séparé (bachir/drupal-figli-compta.git), le dossier parent (bachir/docker-figli-compta.git) ne contient que le Docker.
Démarrer
make build && make up
- Site : http://localhost:8990 (admin/admin — à changer avant tout usage réel)
- phpMyAdmin : http://localhost:8991
make exec_phppour un shell dans le container,vendor/bin/drush ...pour drush
Modèle de données
- Compte (taxonomie, 8 termes) : Sandrine, Maud, Ouidade, Chloé, Bachir, Valentin, EXT., EXT.WEB. (⚠️ "Provision EPAU" existait dans les tableurs historiques mais a été volontairement retiré — ne pas le réintroduire.)
- Client (taxonomie) : liste unifiée (ex. "EPAU / POPSU" et "COLLECTIF RIVAGE / OU ATTERRIR" fusionnent des noms historiquement inconsistants).
- Ligne comptable (content type) : date, type, client, montant HT/TTC, notes.
field_type_ligne(list_string) :entree,charge,versement,achat,hebergement(= toute sortie qui touche EXT.WEB),autre,ouverture.
- Répartition (Paragraph, multivalué sur
field_repartition) : compte + montant. La somme des répartitions doit être égale au montant HT — contrôle automatique (figli_compta_ledger_node_presave+ un#validatede formulaire pour un message propre) qui bloque la saisie de nouvelles lignes incohérentes.
Le flag figli_compta_ledger.skip_validation
Les données historiques migrées (2026) contiennent de vrais écarts de répartition (hérités des tableurs, préservés tels quels — on ne corrige jamais les données historiques, on les affiche). Pour importer/réassigner ce genre de ligne sans que le contrôle bloque, entourer l'opération de :
\Drupal::state()->set('figli_compta_ledger.skip_validation', TRUE);
// ... $node->save() ...
\Drupal::state()->delete('figli_compta_ledger.skip_validation');
Ce contournement ne doit jamais s'appliquer à la saisie via le formulaire normal (uniquement aux scripts d'import/migration/réassignation en masse).
Pages
/lignes(= page d'accueil du site, configurée viasystem.site.page.front) : vue "tableur" de toutes les lignes comptables. Filtres (compte, client, type, année), regroupement (mois/année), colonne par compte comme dans les tableurs d'origine, colonne Écart, ligne de totaux (soldes créditeur/débiteur par compte) en pied de tableau. Les lignes en écart ont un fin liseré rouge (pas de fond plein). "+ Ajouter une ligne" ouvre le vrai formulaire Drupal dans une modale AJAX (core/drupal.dialog.ajax), pas de formulaire dupliqué en JS./dashboard: vue agrégée simple (solde par compte / solde par client), page secondaire.
Les deux sont dans le module custom web/modules/custom/figli_compta_ledger/.
Pièges déjà rencontrés (pour ne pas les refaire)
- Mode sombre Gin actif par défaut (
html.gin--dark-mode). Ne jamais compter sur les CSS custom properties de Gin (--gin-bg-layer2etc.) avec juste un fallback clair — elles ne se résolvent pas de façon fiable sur ces routes custom. Définir des couleurs explicites en local (--figli-*) + un blochtml.gin--dark-mode #figli-xxx { ... }. - Pagination JSON:API instable : trier uniquement par un champ non-unique (
field_date_ligne) fait dupliquer/sauter des lignes entre les pages offset. Toujours ajouterdrupal_internal__nidcomme clé de tri secondaire, + dédupliquer par id côté client en filet de sécurité (fetchAllLignes()danshome.js/dashboard.js). - Bouton "Save" dans une modale jQuery UI + formulaire Paragraphs : plusieurs boutons
input[type=submit]existent dans le DOM (dragdrop-mode, collapse, remove, duplicate, le vrai submit). Cibler précisémentinput[name="op"][value="Save"], pas le premierinput[type=submit]trouvé. hook_form_altersur les formulaires de node : lebase_form_idd'un node est générique (node_form), pasnode_{bundle}_form. Utiliserhook_form_alter()et comparer$form_idexplicitement ànode_ligne_comptable_form/node_ligne_comptable_edit_form._wrapper_formatpour une modale vautdrupal_modal(pasdrupal_ajax) quand ouverte viadata-dialog-type="modal"/Drupal.ajax({dialogType: 'modal', ...}).- Twig vs Vue : les deux utilisent
{{ }}. Toujours envelopper le template Vue dans{% verbatim %}...{% endverbatim %}dans les fichiers.html.twig.
Migration des données historiques
suivi_compta_SASFigli2026_v2.ods (2026) a été entièrement migré (207 lignes + ouvertures depuis REPORT CLOTURE 2025), vérifié au centime près contre les totaux du fichier source. Les années 2021-2025 ne sont pas encore migrées. Les scripts Python d'extraction/unification de clients (réutilisables) sont dans DEV_COMPTA/scripts/ (autre dossier — voir build_bachir_full.py pour la logique d'unification des noms de clients, transposable).
Remotes git
gitea-figureslibres.io:bachir/docker-figli-compta.git(parent, SSH).gitmodulesréférencesrc/en HTTPS (https://figureslibres.io/gitea/bachir/drupal-figli-compta.git) — c'est volontaire, ne pas le changer en SSH même si le remote localgiteadesrc/est en SSH.