Nous accusons réception de votre cotisation « $intitule » reçue le $emission et nous vous en remercions.
-
Nous reconnaissons que vous avez acquitté la somme de {$total} €. 111
- Votre adhésion sera donc effective à compter du $souscription jusqu’au $expiration.
-
-
-
Nous vous prions de recevoir, chère adhérente, cher adhérent, nos meilleures salutations,
-
-
-représentant·e de l'asso-
-
-
Nous vous rappelons que la cotisation n’est pas soumise à la TVA et qu’elle ne donne pas lieu à la délivrance d’une facture. Elle n’ouvre pas droit au bénéfice des dispositions des articles 200, 238 bis et 885-0 V bis A du code général des impôts.
-
-EOF;
+
Nous accusons réception de votre cotisation « {$h($intitule)} » reçue le {$h($emission)} et nous vous en remercions.
+
Nous reconnaissons que vous avez acquitté la somme de {$h($total)} {$h($currency)}. Votre adhésion sera donc effective à compter du {$h($souscription)} jusqu'à {$h($expiration)}.
+
Nous vous prions de recevoir nos meilleures salutations.
+
Pour {$h($config->get('org_name'))}
+
Nous vous rappelons que la cotisation n'est pas soumise à la TVA et qu'elle ne donne pas lieu à la délivrance d'une facture. Elle n'ouvre pas droit au bénéfice des dispositions des articles 200, 238 bis et 885-0 V bis A du code général des impôts.
diff --git a/upgrade.php b/upgrade.php
index f47ac27..ff81e15 100644
--- a/upgrade.php
+++ b/upgrade.php
@@ -2,7 +2,6 @@
namespace Paheko;
use Paheko\Plugin\Facturation\Facture;
-use Paheko\Entities\Files\File;
$db = DB::getInstance();
$old_version = $plugin->oldVersion();
@@ -25,11 +24,9 @@ if (version_compare($old_version, '0.3.0', '<'))
$conf = $db->getAssoc('SELECT cle, valeur FROM plugin_facturation_config ORDER BY cle;');
foreach($conf as $k=>$v)
{
- if(!$plugin->setConfig($k, $v))
- {
- throw new UserException('Erreur dans la conversion de la configuration pour la clé : '.$k);
- }
+ $plugin->setConfigProperty($k, $v);
}
+ $plugin->save();
$db->exec('DROP TABLE `plugin_facturation_config`;');
}
@@ -59,13 +56,13 @@ if (version_compare($old_version, '0.4.0', '<'))
type_facture INTEGER NOT NULL DEFAULT 0,
numero TEXT NOT NULL UNIQUE,
receveur_membre INTEGER NOT NULL, -- bool
- receveur_id INTEGER NOT NULL,
- date_emission TEXT NOT NULL, -- CHECK (date(date_emission) IS NOT NULL AND date(date_emission) = date_emission),
- date_echeance TEXT NOT NULL, -- CHECK (date(date_echeance) IS NOT NULL AND date(date_echeance) = date_echeance),
+ receveur_id INTEGER NOT NULL,
+ date_emission TEXT NOT NULL, -- CHECK (date(date_emission) IS NOT NULL AND date(date_emission) = date_emission),
+ date_echeance TEXT NOT NULL, -- CHECK (date(date_echeance) IS NOT NULL AND date(date_echeance) = date_echeance),
reglee INTEGER DEFAULT 0, -- bool
archivee INTEGER DEFAULT 0, -- bool
moyen_paiement TEXT NOT NULL,
- contenu TEXT NOT NULL,
+ contenu TEXT NOT NULL,
total REAL DEFAULT 0
);
@@ -81,13 +78,13 @@ EOT
// 0.6.0 -
if (version_compare($old_version, '0.6.0', '<'))
{
- define('DEVIS', 0);
- define('FACT', 1);
- define('CERFA', 2);
- define('COTIS', 3);
+ defined('DEVIS') || define('DEVIS', 0);
+ defined('FACT') || define('FACT', 1);
+ defined('CERFA') || define('CERFA', 2);
+ defined('COTIS') || define('COTIS', 3);
$facture = new Facture;
$r = $db->first('SELECT id, total FROM plugin_facturation_factures;');
- if (strpos($r->total,'.'))
+ if ($r && strpos((string) $r->total, '.') !== false)
{
// SQL -> total integer
$db->exec(<<listAll();
foreach($factures as $k=>$f)
{
+ $contenu = [];
+
foreach($f->contenu as $line => $content)
{
// Petit bug qui peut arriver avec des contenus mal enregistrés en db
@@ -137,19 +136,16 @@ EOT
$facture->edit($f->id, $data);
unset($contenu);
}
-
- $path = __DIR__.'/data/default_sign.png';
- $png = (new File)->createAndStore('skel/plugin/facturation','sign.png', $path, null);
}
}
// 0.6.2 -
if (version_compare($old_version, '0.6.2', '<'))
{
- define('DEVIS', 0);
- define('FACT', 1);
- define('CERFA', 2);
- define('COTIS', 3);
+ defined('DEVIS') || define('DEVIS', 0);
+ defined('FACT') || define('FACT', 1);
+ defined('CERFA') || define('CERFA', 2);
+ defined('COTIS') || define('COTIS', 3);
$facture = new Facture;
$db->exec(<<setConfig('ttc', false);
+ $plugin->setConfigProperty('ttc', false);
+ $plugin->save();
}
// 0.8.1 - Signal menu item
@@ -217,10 +214,10 @@ if (version_compare($old_version, '0.8.5', '<'))
CREATE TABLE IF NOT EXISTS plugin_facturation_clients_tmp
(
id INTEGER PRIMARY KEY,
- nom TEXT NOT NULL,
- adresse TEXT NOT NULL,
- code_postal TEXT NOT NULL,
- ville TEXT NOT NULL,
+ nom TEXT NOT NULL,
+ adresse TEXT NOT NULL,
+ code_postal TEXT NOT NULL,
+ ville TEXT NOT NULL,
siret TEXT,
date_creation TEXT NOT NULL DEFAULT CURRENT_DATE CHECK (date(date_creation) IS NOT NULL AND date(date_creation) = date_creation),
telephone TEXT,
@@ -261,10 +258,10 @@ if (version_compare($old_version, '0.15', '<'))
CREATE TABLE IF NOT EXISTS plugin_facturation_clients_tmp
(
id INTEGER PRIMARY KEY,
- nom TEXT NOT NULL,
- adresse TEXT NOT NULL,
- code_postal TEXT NOT NULL,
- ville TEXT NOT NULL,
+ nom TEXT NOT NULL,
+ adresse TEXT NOT NULL,
+ code_postal TEXT NOT NULL,
+ ville TEXT NOT NULL,
siret TEXT,
date_creation TEXT NOT NULL DEFAULT CURRENT_DATE CHECK (date(date_creation) IS NOT NULL AND date(date_creation) = date_creation),
telephone TEXT,
@@ -293,13 +290,13 @@ EOT
type_facture INTEGER NOT NULL DEFAULT 0,
numero TEXT NOT NULL UNIQUE,
receveur_membre INTEGER NOT NULL, -- bool
- receveur_id INTEGER NOT NULL,
- date_emission TEXT NOT NULL, -- CHECK (date(date_emission) IS NOT NULL AND date(date_emission) = date_emission),
- date_echeance TEXT NOT NULL, -- CHECK (date(date_echeance) IS NOT NULL AND date(date_echeance) = date_echeance),
+ receveur_id INTEGER NOT NULL,
+ date_emission TEXT NOT NULL, -- CHECK (date(date_emission) IS NOT NULL AND date(date_emission) = date_emission),
+ date_echeance TEXT NOT NULL, -- CHECK (date(date_echeance) IS NOT NULL AND date(date_echeance) = date_echeance),
reglee INTEGER DEFAULT 0, -- bool
archivee INTEGER DEFAULT 0, -- bool
moyen_paiement TEXT NOT NULL,
- contenu TEXT NOT NULL,
+ contenu TEXT NOT NULL,
total INTEGER DEFAULT 0,
nom_contact TEXT,
numero_commande TEXT,
@@ -322,3 +319,64 @@ EOT
);
}
+
+// 0.18 - Personnalisation du rendu des factures
+if (version_compare($old_version, '0.18', '<'))
+{
+ $defaults = json_decode(file_get_contents(__DIR__ . '/config.json'), true);
+
+ foreach (['invoice_theme', 'invoice_accent_color', 'invoice_note', 'payment_terms', 'invoice_show_status'] as $key) {
+ if ($plugin->getConfig($key) === null && array_key_exists($key, $defaults)) {
+ $plugin->setConfigProperty($key, $defaults[$key]);
+ }
+ }
+
+ $plugin->save();
+}
+
+// 0.19 - Réparation des schémas partiellement migrés
+if (version_compare($old_version, '0.19', '<'))
+{
+ $tables = [
+ 'plugin_facturation_clients' => [
+ 'siret' => 'siret TEXT',
+ 'telephone' => 'telephone TEXT',
+ 'email' => 'email TEXT',
+ 'nom_contact' => 'nom_contact TEXT',
+ 'note' => 'note TEXT',
+ ],
+ 'plugin_facturation_factures' => [
+ 'nom_contact' => 'nom_contact TEXT',
+ 'numero_commande' => 'numero_commande TEXT',
+ 'reference_acheteur' => 'reference_acheteur TEXT',
+ ],
+ ];
+
+ foreach ($tables as $table => $columns) {
+ $schema = $db->getTableSchema($table);
+
+ if (!$schema) {
+ continue;
+ }
+
+ foreach ($columns as $column => $definition) {
+ if (!isset($schema['columns'][$column])) {
+ $db->exec(sprintf('ALTER TABLE %s ADD COLUMN %s;', $db->quoteIdentifier($table), $definition));
+ }
+ }
+ }
+}
+
+// 0.25 - Options d'affichage du rendu facture
+if (version_compare($old_version, '0.25', '<'))
+{
+ $defaults = json_decode(file_get_contents(__DIR__ . '/config.json'), true);
+
+ foreach (['invoice_show_address_borders', 'invoice_show_email', 'invoice_show_web'] as $key) {
+ if ($plugin->getConfig($key) === null && array_key_exists($key, $defaults)) {
+ $plugin->setConfigProperty($key, $defaults[$key]);
+ }
+ }
+
+ $plugin->save();
+}
From 3d966e4bf69618892eedc63d2d04357ee40e924a Mon Sep 17 00:00:00 2001
From: Jean-Christophe Engel
Date: Thu, 2 Jul 2026 14:20:57 +0200
Subject: [PATCH 2/4] =?UTF-8?q?Normalisation=20pr=C3=A9sentation=20Changel?=
=?UTF-8?q?og?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG | 97 --------------------------------
CHANGELOG.md | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 156 insertions(+), 97 deletions(-)
delete mode 100644 CHANGELOG
create mode 100644 CHANGELOG.md
diff --git a/CHANGELOG b/CHANGELOG
deleted file mode 100644
index d6a0e9f..0000000
--- a/CHANGELOG
+++ /dev/null
@@ -1,97 +0,0 @@
-0.25
-- Options d'affichage du rendu facture (Jason)
-0.19
-- Réparation des schémas partiellement migrés (Jason)
-0.18
-- Personnalisation du rendu des factures (Jason)
-0.17
-- Ajout archivage factures
-0.15
-- Ajout champ contact à la fiche client
-0.12
-- Ajout Mollie à la table moyens de paiement
-0.11
-- Changement mention finale pour devis
-0.9
-- Ajout possibilité choisir champs identité et adresse membre
-0.8.8
-- correction typo
-0.8.7
-- correction typo
-0.8.6
-- Correction erreur si pas de prix saisi
-0.8.5
-- Ajout numéro SIREN/SIRET pour les clients
-- Ajout pagination liste factures
-
-0.8.4
-- Correction bug si identité définie par plusieurs champs
-- Correction bug oubli choix receveur
-- Mise-à-jour Changelog
-
-0.8.3 :
-- Mise-à-jour README
-
-0.8.2 :
-- Tri des membres en ordre alphabétique
-- Élimination de plusieurs bugs
-
-0.8.1 :
-- reprise du code par jce (lesanges@zaclys.net ; https://git.roflcopter.fr/lesanges/paheko-plugin-facturation)
-- Achèvement migration vers Paheko 1.3
-
-0.7.4 :
-- Corrections de dépréciations PHP, le plugin être compatible PHP8.2
-- Quelques problèmes réglés de formulaires invalidables
-- Nettoyage du code et factorization des facture_{ajouter,modifier}.php
-
-0.7.3 :
-- Règle le problème de formulaire bloqué que je croyais avoir résolu la dernière fois :)
-
-0.7.2 :
-- Petite correction du moyen de paiement qui n'était pas retenu à cause d'un doublon dans le formulaire.
-
-0.7.1 :
-- Ajout d'une case dans la config pour choisir si les factures sont TTC ou HT
-- Le formulaire de document était cassé à cause d'un champs obligatoire invisible
-
-0.7.0 :
-- Modernisation des formulaires, de la fiche client
-- Liste dynamiques des documents et des clients + export CSV/ODS
-- Numérotation automatique des documents
-- Ajout du bouton Dupliquer sur les documents
-- Divers fixes
-- Changements de la gestion des CERFA :
- - organisation du champ `contenu` pour gérer les paramètres de CERFA sous la forme {"forme":"3","nature":"1","texte":"1"}
- - ajout d'une table `plugin_facturation_txt_cerfa` pour stocker les textes explicatifs additionnels
- - formulaires adaptés aux CERFA pour permettre le choix de la forme, de la nature, du mode de versement et du texte explicatif éventuel
-
-0.6.0 :
-- Génération des PDF par Garradin, on se débarasse de mPDF et l'installation du plugin devient standard
-- Fix #32 (prix total affiché incorrect), en stockant les prix sous formes d'entiers à la manière de Garradin
-- Possibilité de supprimer un document
-- Fix #34, problème sélection membre
-
-0.5.0 :
-Mise à jour rapide du plugin pour Garradin 1.1.
-La gestion de la signature dans les reçus fiscaux a été désactivés pour l'instant (changements de méthodes avec Garradin 1.1, flemme de m'y pencher pour le moment)
-
-0.4.1 :
-Release mineure qui corrige un problème qui apparaît, selon la configuration de PHP (?), lors de la migration depuis une version précédente.
-
-0.4.0 :
-Cette version a pour principal but d'être compatible avec Garradin 1.0 et de ne pas empêcher la mise à jour d'une ancienne installation comprenant une ancienne version du plugin.
-Le formulaire de création/édition de document a été modifié pour simplifier l'expérience utilisateur : tout les types de documents se font depuis le même formulaire, suivi des évolutions graphiques/ergonomiques de Garradin.
-
-0.3.0 :
-- Ajouts des reçus fiscaux et des reçus sur des cotisations :
-- Génération du cerfa pour reçu fiscaux, paramètres disponibles dans la config
-- Ajout d'une page d'aide
-- L'identité des destinataires membres est maintenant définie selon la configuration de Garradin, et non plus de manière statique sur la colonne "nom"
-- Suppression de la classe Facturation\Config pour utiliser celle que propose Garradin
-- Ajout du champs de numéro RNA
-
-
-0.2.0 :
-- Stockage des désignations des documents changé de serialize à json_decode
-- Petites améliorations sur les formulaires
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..5acf4b5
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,156 @@
+# Changelog
+
+## v0.25 - 2026-05-15 - @Jason
+### Added
+- Options d'affichage du rendu facture
+
+## v0.19 - 2026-05-15 - @Jason
+### Fixed
+- Réparation des schémas partiellement migrés
+
+## v0.18 - 2026-05-15 - @Jason
+### Changed
+- améliorations proposées par Jason (jojodavo@gmail.com)
+### Added
+- Personnalisation du rendu des factures
+
+## v0.17 - 2026-02-26 - @jce
+### Added
+- archivage factures
+
+## v0.15 - 2025-03-25 - @jce
+### Added
+- champ contact à la fiche client
+
+## v0.13 - 2025-02-26 - @jce
+### Changed
+- Amélioration contrôles saisie facture
+
+## v0.12 - 2025-01-04 - @jce
+### Added
+- Mollie à la table moyens de paiement
+
+## v0.11 - 2024-10-19 - @jce
+### Changed
+- mention finale pour devis
+
+## v0.9 - 2024-08-30 - @jce
+### Added
+- possibilité choisir champs identité et adresse membre
+
+## v0.8.8 - 2024-08-13 - @jce
+### Added
+- impression logo avec option de configuration
+### Changed
+- Adaptation Readme à la situation actuelle
+
+## v0.8.6 - 2024-03-29 - @jce
+### Fixed
+- Erreur si pas de prix saisi
+
+## v0.8.5 - 2024-01-12 - @jce
+### Added
+- numéro SIREN/SIRET pour les clients
+- pagination liste factures
+
+## v0.8.4 - 2024-01-11 - @jce
+### Fixed
+- Bug si identité définie par plusieurs champs
+- Bug oubli choix receveur
+
+## v0.8.2 - 2024-01-10 - @jce
+### Added
+- Tri des membres en ordre alphabétique
+### Fixed
+- Élimination de plusieurs bugs
+
+## v0.8.1 - 2023-11-03 - @jce
+### Changed
+- reprise du code par jce (lesanges@zaclys.net ; https://gitea.zaclys.com/lesanges/facturation)
+- Achèvement migration vers Paheko 1.3
+
+## v0.7.4 - 2023-04-16 - @noizette
+### Fixed
+- Corrections de dépréciations PHP, le plugin être compatible PHP8.2
+### Changed
+- Quelques problèmes réglés de formulaires invalidables
+- Nettoyage du code et factorization des facture_{ajouter,modifier}.php
+
+## v0.7.3 - 2022-03-03 - @noizette
+### Fixed
+- Règle le problème de formulaire bloqué que je croyais avoir résolu la dernière fois :)
+
+## v0.7.2 - 2022-01-31 - @noizette
+### Fixed
+- Petite correction du moyen de paiement qui n'était pas retenu à cause d'un doublon dans le formulaire.
+
+## v0.7.1 - 2022-01-10 - @noizette
+### Added
+- ajout d'une case dans la config pour choisir si les factures sont TTC ou HT
+### Fixed
+- Le formulaire de document était cassé à cause d'un champs obligatoire invisible
+
+## v0.7.0 - @noizette
+### Changed
+- Modernisation des formulaires, de la fiche client
+- Liste dynamiques des documents et des clients + export CSV/ODS
+- Numérotation automatique des documents
+- Divers fixes
+- Changements de la gestion des CERFA :
+ - organisation du champ `contenu` pour gérer les paramètres de CERFA sous la forme {"forme":"3","nature":"1","texte":"1"}
+ - ajout d'une table `plugin_facturation_txt_cerfa` pour stocker les textes explicatifs additionnels
+ - formulaires adaptés aux CERFA pour permettre le choix de la forme, de la nature, du mode de versement et du texte explicatif éventuel
+### Added
+- Ajout du bouton Dupliquer sur les documents
+
+## v0.6.0 - @noizette
+### Changed
+- Génération des PDF par Garradin, on se débarasse de mPDF et l'installation du plugin devient standard
+- Possibilité de supprimer un document
+### Fixed
+- Fix #32 (prix total affiché incorrect), en stockant les prix sous formes d'entiers à la manière de Garradin
+- Fix #34, problème sélection membre
+
+## v0.5.0 - @noizette
+### Added
+Mise à jour rapide du plugin pour Garradin 1.1.
+### Changed
+- La gestion de la signature dans les reçus fiscaux a été désactivés
+ pour l'instant (changements de méthodes avec Garradin 1.1, flemme de
+ m'y pencher pour le moment)
+
+## v0.4.1 - @noizette
+### Fixed
+- Release mineure qui corrige un problème qui apparaît, selon la
+ configuration de PHP (?), lors de la migration depuis une version
+ précédente.
+
+## v0.4.0 - @noizette
+### Changed
+- Cette version a pour principal but d'être compatible avec Garradin
+ 1.0 et de ne pas empêcher la mise à jour d'une ancienne installation
+ comprenant une ancienne version du plugin.
+- Le formulaire de création/édition de document a été modifié pour
+ simplifier l'expérience utilisateur : tout les types de documents se
+ font depuis le même formulaire, suivi des évolutions
+ graphiques/ergonomiques de Garradin.
+
+## v0.3.0 - @noizette
+### Added
+- Ajouts des reçus fiscaux et des reçus sur des cotisations :
+- Génération du cerfa pour reçu fiscaux, paramètres disponibles dans la config
+- Ajout d'une page d'aide
+- Ajout du champs de numéro RNA
+### Changed
+- L'identité des destinataires membres est maintenant définie selon la
+ configuration de Garradin, et non plus de manière statique sur la
+ colonne "nom"
+### Removed
+- Suppression de la classe Facturation\Config pour utiliser celle que
+ propose Garradin
+
+## v0.2.0 - @noizette
+### Added
+- Stockage des désignations des documents changé de serialize à json_decode
+### Changed
+- Petites améliorations sur les formulaires
From 061fb13e5dcfedd59b3d1eeda39b0bfe2a88464a Mon Sep 17 00:00:00 2001
From: Jean-Christophe Engel
Date: Thu, 2 Jul 2026 18:46:26 +0200
Subject: [PATCH 3/4] =?UTF-8?q?Conserver=20les=20tags=20html=20dans=20les?=
=?UTF-8?q?=20libell=C3=A9s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
admin/pdf.php | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/admin/pdf.php b/admin/pdf.php
index 6b32848..49ff41d 100644
--- a/admin/pdf.php
+++ b/admin/pdf.php
@@ -9,7 +9,10 @@ f(['id' => 'required|numeric']);
$id = (int) qg('id');
$sign_tag = UserTemplate\Functions::signature();
$h = static function ($value): string {
- return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
+ return htmlspecialchars_decode(
+ htmlentities($value, ENT_NOQUOTES, 'UTF-8', false),
+ ENT_NOQUOTES
+ );
};
$br = static function ($value) use ($h): string {
return nl2br($h($value));
From a17d7b09cedabef6b1998fc219a536e5203a88aa Mon Sep 17 00:00:00 2001
From: Jean-Christophe Engel
Date: Thu, 2 Jul 2026 20:30:59 +0200
Subject: [PATCH 4/4] =?UTF-8?q?Mise-=C3=A0-jour=20plugin.ini=20et=20CHANGE?=
=?UTF-8?q?LOG.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.md | 12 ++++++++----
plugin.ini | 2 +-
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5acf4b5..cbd5b07 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,16 +1,20 @@
# Changelog
-## v0.25 - 2026-05-15 - @Jason
+## v0.27.2 - 2026-07-02
+### Changed
+- Conserver les tags html dans les libellés
+
+## v0.25 - 2026-05-15 - Jason Pelletier
### Added
- Options d'affichage du rendu facture
-## v0.19 - 2026-05-15 - @Jason
+## v0.19 - 2026-05-15 - Jason Pelletier
### Fixed
- Réparation des schémas partiellement migrés
-## v0.18 - 2026-05-15 - @Jason
+## v0.18 - 2026-05-15 - Jason Pelletier
### Changed
-- améliorations proposées par Jason (jojodavo@gmail.com)
+- améliorations proposées par Jason Pelletier
### Added
- Personnalisation du rendu des factures
diff --git a/plugin.ini b/plugin.ini
index 16ef07f..b90c87f 100644
--- a/plugin.ini
+++ b/plugin.ini
@@ -2,7 +2,7 @@ name="Facturation"
description="Permet d'éditer des factures et devis à ses membres ainsi qu'à une base de clients supplémentaire."
author="Sur la base de Jean-Christophe Engel, amélioré par Jordan"
url="https://gitea.zaclys.com/lesanges/facturation"
-version="0.27"
+version="0.27.2"
menu=true
restrict_section="accounting"
restrict_level="read"