Files
bachirandClaude Sonnet 5 c7f1753f88 Document the sources-compta symlink to the data-analysis workspace
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>
2026-09-03 23:12:40 +02:00

73 lines
6.9 KiB
Markdown

# 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.py` contient 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 dossier `Developer/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
```bash
make build && make up
```
- Site : http://localhost:8990 (admin/admin — à changer avant tout usage réel)
- phpMyAdmin : http://localhost:8991
- `make exec_php` pour 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 `#validate` de 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 :
```php
\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 via `system.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)
1. **Mode sombre Gin actif par défaut** (`html.gin--dark-mode`). Ne jamais compter sur les CSS custom properties de Gin (`--gin-bg-layer2` etc.) 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 bloc `html.gin--dark-mode #figli-xxx { ... }`.
2. **Pagination JSON:API instable** : trier uniquement par un champ non-unique (`field_date_ligne`) fait dupliquer/sauter des lignes entre les pages offset. Toujours ajouter `drupal_internal__nid` comme clé de tri secondaire, + dédupliquer par id côté client en filet de sécurité (`fetchAllLignes()` dans `home.js`/`dashboard.js`).
3. **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ément `input[name="op"][value="Save"]`, pas le premier `input[type=submit]` trouvé.
4. **`hook_form_alter` sur les formulaires de node** : le `base_form_id` d'un node est générique (`node_form`), pas `node_{bundle}_form`. Utiliser `hook_form_alter()` et comparer `$form_id` explicitement à `node_ligne_comptable_form` / `node_ligne_comptable_edit_form`.
5. **`_wrapper_format` pour une modale** vaut `drupal_modal` (pas `drupal_ajax`) quand ouverte via `data-dialog-type="modal"` / `Drupal.ajax({dialogType: 'modal', ...})`.
6. **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)
- `.gitmodules` référence `src/` 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 local `gitea` de `src/` est en SSH.