Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 7 additions & 13 deletions .github/workflows/publish-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:

env:
REGISTRY: ghcr.io
IMAGE_PREFIX: ghcr.io/arrhes/application
IMAGE_PREFIX: ghcr.io/arrhes/fec

jobs:
build-and-push:
Expand Down Expand Up @@ -45,23 +45,17 @@ jobs:

- name: Build images with docker compose
env:
ARRHES_VERSION: ${{ steps.version.outputs.version }}
VITE_API_BASE_URL: ${{ vars.VITE_API_BASE_URL }}
VERSION: ${{ steps.version.outputs.version }}
VITE_WEBSITE_BASE_URL: ${{ vars.VITE_WEBSITE_BASE_URL }}
run: |
docker compose -f .workflows/.build/compose.yml build ci
docker compose -f .workflows/.build/compose.yml build api website
docker compose -f workflows/build/compose.yml build

- name: Tag and push images
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
IMAGES=("api" "website")

for img in "${IMAGES[@]}"; do
SRC="arrhes-${img}:${VERSION}"
DEST="${IMAGE_PREFIX}/${img}"
SRC="fec:${VERSION}"
DEST="${IMAGE_PREFIX}/website"

docker tag "${SRC}" "${DEST}:${VERSION}"
docker push "${DEST}:${VERSION}"
done
docker tag "${SRC}" "${DEST}:${VERSION}"
docker push "${DEST}:${VERSION}"
152 changes: 151 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,154 @@

[![Licence AGPL-3.0](https://img.shields.io/badge/licence-AGPL--3.0-blue.svg)](LICENSE)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
[![Node.js](https://img.shields.io/badge/Node.js-25-green.svg)](https://nodejs.org/)
[![Node.js](https://img.shields.io/badge/Node.js-22-green.svg)](https://nodejs.org/)

Outil open source de validation de **Fichiers des 脡critures Comptables** (FEC), conforme 脿 l'[article A47 A-1 du Livre des proc茅dures fiscales](https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000027804775/).

L'ensemble du traitement est effectu茅 **localement dans le navigateur** : aucune donn茅e n'est transmise 脿 un serveur.

## Fonctionnalit茅s

- Validation de fichiers FEC au format texte tabul茅 (`.txt`) et XML (`.xml`)
- 19 contr么les de conformit茅 : structure, colonnes, formats, coh茅rence comptable
- Distinction erreurs / avertissements avec localisation (ligne, champ)
- Traitement 100% local, gratuit et sans inscription

### Contr么les effectu茅s

| # | Contr么le | S茅v茅rit茅 |
|---|----------|----------|
| 1 | Nom de fichier (`{SIREN}FEC{AAAAMMJJ}`) | Erreur |
| 2 | Pr茅sence de l'en-t锚te | Erreur |
| 3 | Ordre des 18 colonnes obligatoires | Erreur |
| 4 | Nombre minimum de colonnes (18) | Erreur |
| 5 | S茅parateur tabulation ou pipe | Erreur |
| 6 | Format des dates (`AAAAMMJJ`) | Erreur |
| 7 | Format num茅rique (virgule d茅cimale) | Erreur |
| 8 | CompteNum (3 premiers caract猫res num茅riques) | Erreur |
| 9 | Champs obligatoires non vides | Erreur |
| 10 | Pr茅sence D茅bit/Cr茅dit ou Montant/Sens | Erreur |
| 11 | Valeurs du champ Sens (`D`, `C`, `+1`, `-1`) | Erreur |
| 12 | Validit茅 calendaire des dates | Erreur |
| 13 | Fichier non vide | Erreur |
| 14 | Encodage (ASCII, ISO-8859-15, UTF-8) | Avertissement |
| 15 | Ordre chronologique (ValidDate) | Avertissement |
| 16 | S茅quence continue des EcritureNum | Avertissement |
| 17 | 脡critures d'ouverture (脿-nouveaux) | Avertissement |
| 18 | 脡quilibre d茅bit/cr茅dit par 茅criture | Avertissement |
| 19 | Coh茅rence PieceDate / EcritureDate | Avertissement |

## Architecture

Monorepo pnpm avec deux packages :

```
packages/
engine/ Moteur de validation FEC (TypeScript pur, aucune d茅pendance navigateur)
website/ Interface web (React 19, Vite 7, PandaCSS, TanStack Router)
```

### `@arrhes/fec-engine`

Librairie TypeScript exportant les parseurs, validateurs et types FEC. Peut 锚tre utilis茅e ind茅pendamment du site web.

```ts
import { validateFecFile } from "@arrhes/fec-engine"

const result = validateFecFile(fileContent, "123456789FEC20240101.txt")
// result.summary -> { errors: 0, warnings: 2, total: 19, lines: 1042 }
// result.checks -> FecCheckResult[]
```

### `@arrhes/fec-website`

Application React avec validation c么t茅 client. Le fichier est lu via `File.text()` et pass茅 au moteur de validation directement dans le navigateur.

## Pr茅requis

- [Node.js](https://nodejs.org/) >= 22
- [pnpm](https://pnpm.io/) >= 10
- [Docker](https://docs.docker.com/get-docker/) et Docker Compose (pour le d茅veloppement conteneuris茅 et le build de production)
- [just](https://github.com/casey/just) (optionnel, raccourcis de commandes)

## D茅marrage rapide

```bash
# Cloner le d茅p么t
git clone https://github.com/arrhes/fec.git
cd fec

# Installer les d茅pendances
pnpm install

# Lancer le serveur de d茅veloppement (Vite)
pnpm dev
```

Le site est accessible sur `http://localhost:5173`.

### D茅veloppement avec Docker

```bash
# D茅marrer l'environnement de d茅veloppement conteneuris茅
just dev up
# ou directement :
./scripts/dev-up.sh

# Arr锚ter
just dev down
```

Le site est alors accessible sur `http://localhost:19004`.

## Scripts

| Commande | Description |
|----------|-------------|
| `pnpm dev` | D茅marre les serveurs de d茅veloppement (tous les packages) |
| `pnpm build` | Compile tous les packages |
| `pnpm test` | Ex茅cute les tests (vitest) |
| `pnpm check` | Lint et format avec Biome |
| `pnpm check:fix` | Corrige automatiquement les probl猫mes de lint/format |
| `just build` | Build Docker de production |
| `just dev up` | Environnement de d茅veloppement Docker |
| `just dev down` | Arr锚t de l'environnement Docker |

## Build de production

Le build de production cr茅e une image Docker avec Nginx pour servir le site statique :

```bash
# Via just
just build

# Ou directement
docker compose -f workflows/build/compose.yml --env-file workflows/build/.env.example build
```

Variables d'environnement requises (voir `workflows/build/.env.example`) :

| Variable | Description |
|----------|-------------|
| `VITE_WEBSITE_BASE_URL` | URL publique du site |

## Stack technique

| Composant | Technologie |
|-----------|-------------|
| Langage | TypeScript 5.9 |
| Runtime | Node.js 22 |
| Frontend | React 19 |
| Bundler | Vite 7 |
| Routeur | TanStack Router |
| CSS | PandaCSS |
| Tests | Vitest |
| Lint / Format | Biome |
| Validation | Valibot |
| Gestionnaire de paquets | pnpm |
| CI/CD | GitHub Actions |
| Production | Docker, Nginx |

## Licence

[AGPL-3.0](LICENSE)
1 change: 0 additions & 1 deletion workflows/build/compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
#
# Required environment variables:
# VERSION - Semver tag for all images (default: latest)
# VITE_API_BASE_URL - Public URL of the API (baked into dashboard JS bundle)
#
# Before starting, copy and configure the API environment file:
# cp workflows/build/api/.env.example workflows/build/api/.env
Expand Down
Loading