prise en compte de différents champs nom et prénom

FossilOrigin-Name: 2895a7a5054d102c3262500e9e67557129592b607830a406d30fd3596cdfe6a9
This commit is contained in:
engel 2022-03-18 19:39:02 +00:00
parent 5995f33efd
commit a3aa6fa200
8 changed files with 271 additions and 108 deletions

View File

@ -43,10 +43,12 @@ class Utils
* @return versements correspondants à l'année et aux tarifs donnés
* @param $annee
* @param array $tarifs
* @param array $champsNom : liste non vide des champs de nom/prénom
*/
public static function getVersementsTarifs($annee, $tarifs)
public static function getVersementsTarifs($annee, $tarifs, $champsNom)
{
$db = DB::getInstance();
$tri = Utils::combinerTri($champsNom);
$sql = sprintf(
'SELECT
services_fees.id as idTarif,
@ -65,21 +67,25 @@ class Utils
services_fees.%s
AND
acc_transactions_lines.credit > 0)
ORDER by services_fees.id, membres.nom, acc_transactions.date',
ORDER by services_fees.id, %s, acc_transactions.date',
'"%Y"',
$annee,
$db->where('id', $tarifs));
$db->where('id', $tarifs),
$tri
);
return $db->get($sql);
}
/**
* Versements totaux par personne pour une année donnée
* @param année
* @param array $champsNom : liste non vide des champs de nom/prénom
*/
public static function getVersementsTotaux($annee)
public static function getVersementsTotaux($annee, $champsNom)
{
$sql =
"SELECT
$tri = Utils::combinerTri($champsNom);
$sql = sprintf(
'SELECT
membres.id as idUser,
sum(acc_transactions_lines.credit) AS versement
FROM
@ -89,7 +95,7 @@ class Utils
INNER JOIN acc_transactions_lines
ON acc_transactions_lines.id_transaction = acc_transactions.id
WHERE (
strftime('%Y', acc_transactions.date) = ?
strftime(%s, acc_transactions.date) = "%d"
AND
acc_transactions_lines.credit > 0
AND
@ -98,21 +104,55 @@ class Utils
acc_transactions_users.id_user = membres.id
)
GROUP by acc_transactions_users.id_user
ORDER by membres.nom COLLATE U_NOCASE;
";
return DB::getInstance()->get($sql, $annee);
ORDER by %s COLLATE U_NOCASE',
'"%Y"',
$annee,
$tri);
return DB::getInstance()->get($sql);
}
/**
* combiner les champs avec un opérateur
* @param array $champs : liste (non vide) de champs
* @return chaîne combinée
*/
private static function combinerChamps($champs)
{
$op = ' || " " || ';
$result = 'ifnull(membres.' . $champs[0] . ', "")';
for ($i = 1; $i < count($champs); ++$i)
{
$result .= $op . 'ifnull(membres.' . $champs[$i] . ', "")';
}
return $result;
}
private static function combinerTri($champs)
{
$tri = 'membres.' . $champs[0];
for ($i = 1; $i < count($champs); ++$i)
{
$tri .= ', membres.' . $champs[$i];
}
return $tri;
}
/**
* @return personnes ayant versé des dons pour une année donnée
* @param $annee
* @param array $champsNom : champs qui définissent le nom et le prénom d'une personne
*/
public static function getDonateurs($annee)
public static function getDonateurs($annee, $champsNom)
{
// concaténer les champs nom/prénoms pour la sélection
$nom = Utils::combinerChamps($champsNom) . ' as nom,';
// et pour le tri
$tri = Utils::combinerTri($champsNom);
$sql =
"SELECT
membres.id as idUser,
membres.nom as nom,
" .
$nom . "
membres.adresse as adresse,
membres.code_postal as codePostal,
membres.ville as ville
@ -132,7 +172,7 @@ class Utils
acc_transactions_users.id_user = membres.id
)
GROUP by membres.id
ORDER by membres.nom COLLATE U_NOCASE;
ORDER by " . $tri . " COLLATE U_NOCASE
";
return DB::getInstance()->get($sql, $annee);
}

View File

@ -13,47 +13,41 @@
<form method="post" action="{$self_url}" enctype="multipart/form-data">
<fieldset>
{*
<legend>Objet (but) de l'association</legend>
*}
<dl class="config">
<dt><label>Objet (but) de l'association</label> <b title="Champ obligatoire">(obligatoire)</b></dt>
{input type="textarea" name="objet_asso" source=$plugin.config label="" required="required" cols="50" rows="4" maxlength=300}
</dl>
{*
</fieldset>
<fieldset>
<legend>Droit à la réduction d'impôt</legend>
*}
<dl class="config">
<dt><label>Articles du code général des impôts concernés par l'association : </label>
<b title="Champ obligatoire">(obligatoire ; sélectionnez tous les articles qui s'appliquent à l'asociation)</b>
<b title="Champ obligatoire">(obligatoire ; sélectionnez tous les articles qui s'appliquent à
l'asociation)</b>
</dt>
{foreach from=$plugin_config->articlesCGI key="key" item="article"}
{*
À VÉRIFIER : {input : checked ne fonctionne pas si l'attribut name est un tableau...
{*
À VÉRIFIER : {input : checked ne fonctionne pas si l'attribut name est un tableau...
{input type="checkbox" name="articlesCGI[]" value=$key label=$article.titre}
*}
<div>
<input type="checkbox" name="articlesCGI[]" value="{$key}" class="choix"
{if $article.valeur == 1}checked{/if}>
<div>
<input type="checkbox" name="articlesCGI[]" value="{$key}" class="choix"
{if $article.valeur == 1}checked{/if}>
<label>Article {$article.titre}</label>
</div>
</div>
{/foreach}
</dl>
<dl class="config">
<dt><label>Taux de réduction applicables : </label>
<b title="Champ obligatoire">(obligatoire ; sélectionnez tous les taux qui s'appliquent à l'asociation)</b>
<b title="Champ obligatoire">(obligatoire ; sélectionnez tous les taux qui s'appliquent à
l'asociation)</b>
</dt>
{foreach from=$plugin_config->reduction key="key" item="taux"}
<div>
<input type="checkbox" name="tauxReduction[]" value="{$key}" class="choix"
{if $taux.valeur == 1}checked{/if}>
<label>Taux {$taux.taux}, ligne {$taux.ligne} de la déclaration
{if $taux.remarque !== ""}({$taux.remarque})</label>{/if}
</div>
<div>
<input type="checkbox" name="tauxReduction[]" value="{$key}" class="choix"
{if $taux.valeur == 1}checked{/if}>
<label>Taux {$taux.taux}, ligne {$taux.ligne} de la déclaration
{if $taux.remarque !== ""}({$taux.remarque})</label>{/if}
</div>
{/foreach}
</dl>
</fieldset>
@ -72,25 +66,42 @@
<dl class="config">
<dt><label>Signature</label></dt>
<p>L'image de la signature doit être d'une taille « raisonnable » et avoir un fond transparent</p>
{if $plugin_config.signature != ''}
<img id="signature" src="/{$plugin_config.signature}" />
{else}
<img id="signature" src="{$default_signature}" />
{/if}
{linkbutton shape="upload" label="Changer de signature" target="_dialog" href="upload.php?p=%s"|args:$path}
<p>L'image de la signature doit être d'une taille « raisonnable » et avoir un fond transparent</p>
{if $plugin_config.signature != ''}
<img id="signature" src="/{$plugin_config.signature}" />
{else}
<img id="signature" src="{$default_signature}" />
{/if}
{linkbutton shape="upload" label="Changer de signature" target="_dialog" href="upload.php?p=%s"|args:$path}
</dl>
</fieldset>
<fieldset>
<legend>Autres informations</legend>
<dl class="config">
<dl class="config">
<dt><label>Ville</label></dt>
<p>Précède la date sur le formulaire</p>
{input type="text" name="ville_asso" source=$plugin.config label="" maxlength=50}
</dl>
</fieldset>
{* les champs de nom *}
<?php $nbChamps = count($nomChamps); ?>
<dl class="config" {if $nbChamps == 1}hidden{/if}>
<dt><label>Champs nom et prénom</label></dt>
<p>Sélectionnez et classez le(s) champ(s) qui représente(nt) le nom et le prénom du donateur</p>
<div>
{foreach from=$nomChamps key="nom" item="champ"}
<div>
<input type="checkbox" name="champsNom[]" value={$nom} class="choix" {if $nbChamps == 1 || $champ.position != 0}checked{/if} >
<label>{$champ.titre}</label>
<div class="actions">
</div>
</div>
{/foreach}
</div>
</dl>
</fieldset>
<h3 class="warning">N'oubliez pas d'enregistrer, sinon les modifications ne seront pas prises en compte !</h3>
@ -98,4 +109,26 @@
{csrf_field key="recusfiscaux_config"}
{button type="submit" name="save" label="Enregistrer" shape="right" class="main"}
</p>
</form>
</form>
{literal}
<script type="text/javascript">
(function() {
var lesDivs = document.querySelectorAll('.actions');
for (i = 0; i < lesDivs.length; ++i) {
var up = document.createElement('a');
up.className = 'icn up';
up.innerHTML = '&uarr;';
up.title = 'Déplacer vers le haut';
up.onclick = function(e) {
var field = this.parentNode.parentNode;
var p = field.previousSibling;
while (p != null && p.nodeType == 3) { p = p.previousSibling; }
field.parentNode.insertBefore(field, p);
return false;
};
lesDivs[i].appendChild(up);
}
}());
</script>
{/literal}

View File

@ -28,7 +28,8 @@
Tous les versements des membres font l'objet d'un reçu, sans
tenir compte des activités et tarifs
</h5>
<p>Choisissez cette option si vous voulez sélectionner tous les versements d'une, plusieurs ou toutes les personnes</p>
<p>Choisissez cette option si vous voulez sélectionner tous les versements d'une, plusieurs
ou toutes les personnes</p>
</div>
</label>
</dd>
@ -44,8 +45,8 @@
</h5>
<p>Choisissez cette option si vous voulez sélectionner :</p>
<ul>
<li>certaines activités ou certains tarifs</li>
<li>certains versements de certaines personnes</li>
<li>certaines activités ou certains tarifs</li>
<li>certains versements de certaines personnes</li>
</ul>
</div>
</label>
@ -58,19 +59,20 @@
<h2>Choisir le taux de réduction</h2>
<fieldset>
{if $nbTaux == 0}
<h3 class="warning">Vous devez d'abord sélectionner au moins un taux de réduction dans l'onglet de configuration</h3>
{else}
<h3 class="warning">Vous devez d'abord sélectionner au moins un taux de réduction dans l'onglet de
configuration</h3>
{/if}
{if $nbChamps == 0}
<h3 class="warning">Vous devez d'abord sélectionner au moins un champ pour le nom et le prénom dans l'onglet
de configuration</h3>
{/if}
{if $nbTaux > 0 && $nbChamps > 0}
{foreach from=$plugin_config->reduction item="reduc"}
{if $reduc->valeur == 1}
<span class="radio-btn">
<input
type="radio"
id="{$reduc->taux}"
name="taux_reduction"
value="{$reduc->taux}"
{if $nbTaux == 1}checked{/if}
/>
<label for="{$reduc->taux}">{$reduc->taux}{if $reduc->remarque != ""} - {$reduc->remarque}{/if}</label>
<input type="radio" id="{$reduc->taux}" name="taux_reduction" value="{$reduc->taux}"
{if $nbTaux == 1}checked{/if} />
<label for="{$reduc->taux}">{$reduc->taux}{if $reduc->remarque != ""} - {$reduc->remarque}{/if}</label>
</span>
{/if}
{/foreach}
@ -88,10 +90,13 @@
<div id="liste_activites_tarifs" class="activites hidden">
<h2>Choisir les activités et tarifs concernés par les reçus ainsi que le taux de réduction</h2>
<fieldset>
{if $nbTaux == 0}
<h3 class="warning">Vous devez d'abord sélectionner au moins un taux de réduction dans l'onglet de configuration</h3>
{else}
<table class="list">
{if $nbTaux == 0}
<h3 class="warning">Vous devez d'abord sélectionner au moins un taux de réduction dans l'onglet de
configuration</h3>
{/if}
{if $nbChamps == 0}
<h3 class="warning">Vous devez d'abord sélectionner au moins un champ pour le nom et le prénom dans l'onglet
de configuration</h3 {/if} {if $nbTaux > 0 && $nbChamps > 0} <table class="list">
<thead>
<tr>
<th>Cocher</th>
@ -103,50 +108,47 @@
</thead>
<tbody>
{foreach from=$activitesTarifsComptes item="activite"}
<tr>
<td>
<tr>
<td>
{if $nbTarifs == 1}
{input
{input
type="checkbox"
name="tarifs[]"
value=$activite.idTarif
checked="checked"
}
{else}
{input
{input
type="checkbox"
name="tarifs[]"
value=$activite.idTarif
}
{/if}
</td>
<td>
<span>{$activite.titreActivite} - {$activite.titreTarif}</span>
</td>
<td>
</td>
<td>
<span>{$activite.titreActivite} - {$activite.titreTarif}</span>
</td>
<td>
{foreach from=$plugin_config->reduction item="reduc"}
{if $reduc->valeur == 1}
<span class="radio-btn">
<input
type="radio"
id="taux_{$reduc->taux}_{$activite.idTarif}"
name="taux_reduction_{$activite.idTarif}"
value="{$reduc->taux}"
{if $nbTarifs > 1}disabled{/if}
{if $nbTaux == 1}checked{/if}
/>
<label for="taux_{$reduc->taux}_{$activite.idTarif}">{$reduc->taux}{if $reduc->remarque != ""} - {$reduc->remarque}{/if}</label>
<input type="radio" id="taux_{$reduc->taux}_{$activite.idTarif}"
name="taux_reduction_{$activite.idTarif}" value="{$reduc->taux}"
{if $nbTarifs > 1}disabled{/if} {if $nbTaux == 1}checked{/if} />
<label
for="taux_{$reduc->taux}_{$activite.idTarif}">{$reduc->taux}{if $reduc->remarque != ""}
- {$reduc->remarque}{/if}</label>
</span>
{/if}
{/foreach}
</td>
<td>{if $activite.descActivite != ""}{$activite.descActivite} ; {/if}{$activite.descTarif}</td>
<td>{$activite.numeroCpt} : {$activite.nomCpt}</td>
</tr>
</td>
<td>{if $activite.descActivite != ""}{$activite.descActivite} ; {/if}{$activite.descTarif}</td>
<td>{$activite.numeroCpt} : {$activite.nomCpt}</td>
</tr>
{/foreach}
</tbody>
</table>
{/if}
</table>
{/if}
</fieldset>
</div>
@ -161,24 +163,24 @@
<script type="text/javascript" src="script.js" defer="defer"></script>
{literal}
<script type="text/javascript">
// activer/désactiver les radios des activités/tarifs
for (var laCase of document.querySelectorAll("input[type=checkbox]")) {
laCase.addEventListener('change', (evt) => {
var idCase = evt.target;
// chercher la ligne englobante (<tr>)
var ligne = idCase.closest("tr");
// itérer sur les radio de cette ligne
var lesRadios = ligne.querySelectorAll('input[type=radio]');
for (var idRadio of lesRadios) {
if (idCase.checked) {
idRadio.disabled = '';
} else {
idRadio.disabled = 'disabled';
}
// activer/désactiver les radios des activités/tarifs
for (var laCase of document.querySelectorAll("input[type=checkbox]")) {
laCase.addEventListener('change', (evt) => {
var idCase = evt.target;
// chercher la ligne englobante (<tr>)
var ligne = idCase.closest("tr");
// itérer sur les radio de cette ligne
var lesRadios = ligne.querySelectorAll('input[type=radio]');
for (var idRadio of lesRadios) {
if (idCase.checked) {
idRadio.disabled = '';
} else {
idRadio.disabled = 'disabled';
}
});
}
</script>
}
});
}
</script>
{/literal}
<!-- footer -->

View File

@ -5,8 +5,27 @@ use Garradin\Files\Files;
use Garradin\Entities\Files\File;
$session->requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN);
$art_sel=f('articlesCGI') ? : [];
$art_sel = f('articlesCGI') ? : [];
$taux_sel = f('tauxReduction') ? : [];
$noms_sel = f('champsNom') ? : [];
$confNoms = $plugin->getConfig('nomChamps');
if (! isset($confNoms))
{
// récupérer les champs des membres utilisés pour le nom et le prénom
$nomChamps = array();
foreach ($config->get('champs_membres')->listAssocNames() as $name => $title)
{
if (stristr($title, 'nom'))
{
$champ = new \stdClass();
$champ->titre = $title;
$champ->position = 0;
$nomChamps[$name] = $champ;
}
}
$plugin->setConfig('nomChamps', $nomChamps);
}
$path = qg('path') ?: File::CONTEXT_CONFIG;
$context = Files::getContext($path);
@ -63,6 +82,19 @@ if (f('save') && $form->check('recusfiscaux_config'))
// ville
$plugin->setConfig('ville_asso', trim(f('ville_asso')));
// champs pour le nom et prénom
$confNoms = (array)$plugin->getConfig('nomChamps');
foreach ($confNoms as $nom => $champ)
{
$champ->position = 0;
}
$i = -count($noms_sel);
foreach ($noms_sel as $nom)
{
$confNoms[$nom]->position = $i++;
}
$plugin->setConfig('nomChamps', $confNoms);
\Garradin\Utils::redirect(PLUGIN_URL . 'config.php?ok');
}
catch (UserException $e)
@ -71,9 +103,17 @@ if (f('save') && $form->check('recusfiscaux_config'))
}
}
// trier les champs de nom pour l'affichage
$nomChamps = (array) $plugin->getConfig('nomChamps');
uasort($nomChamps, function ($a, $b)
{
return $a->position - $b->position;
});
$tpl->assign('ok', qg('ok') !== null);
$tpl->assign('path', $path);
$tpl->assign('default_signature', \Garradin\WWW_URL . "plugin/recusfiscaux/default_signature.png");
$tpl->assign('plugin_config', $plugin->getConfig());
$tpl->assign('nomChamps', $nomChamps);
$tpl->assign('plugin_css', ['style.css']);
$tpl->display(PLUGIN_ROOT . '/templates/config.tpl');

View File

@ -13,6 +13,7 @@ if ($anneesFiscales[0] < $anneeCourante) {
// libellés pour les taux de réduction
$_SESSION['ligneReduction'] = Utils::getLignesReduction($plugin->getConfig('reduction'));
// compter le nombre de taux de réduction activés
$nbTaux = 0;
foreach ($plugin->getConfig('reduction') as $taux)
@ -20,6 +21,16 @@ foreach ($plugin->getConfig('reduction') as $taux)
if ($taux->valeur == 1) { ++$nbTaux; }
}
// idem avec les champs nom/prénom
$nbChamps = 0;
if (null !== $plugin->getConfig('nomChamps'))
{
foreach ($plugin->getConfig('nomChamps') as $nom => $champ)
{
if ($champ->position != 0) { ++$nbChamps; }
}
}
// liste des activités, cotisations et comptes associés
$activitesTarifsComptes = Utils::getActivitesTarifsEtComptes();
@ -30,6 +41,7 @@ $tpl->assign('activitesTarifsComptes', $activitesTarifsComptes);
$tpl->assign('nbTarifs', count($activitesTarifsComptes));
$tpl->assign('plugin_config', $plugin->getConfig());
$tpl->assign('nbTaux', $nbTaux);
$tpl->assign('nbChamps', $nbChamps);
$tpl->assign('plugin_css', ['style.css']);
// envoyer au template

View File

@ -39,3 +39,8 @@ div.explications ul
{
list-style : initial;
}
div.actions
{
display : inline;
}

View File

@ -12,6 +12,19 @@ $_SESSION['annee_recu'] = f('annee_recu');
if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") {
\Garradin\Utils::redirect(PLUGIN_URL . 'index.php');
}
// champs pour le nom et prénom
$confNoms = (array) $plugin->getConfig('nomChamps');
uasort($confNoms, function ($a, $b)
{
return $a->position - $b->position;
});
$champsNom = array();
foreach ($confNoms as $nom => $champ)
{
if ($champ->position != 0) { $champsNom[] = $nom; }
}
// récupérer les infos du formulaire
$tarifsSelectionnes = f('tarifs') ?: [];
@ -39,11 +52,14 @@ foreach (Utils::getActivites($tarifsSelectionnes) as $activite) {
$_SESSION['lesActivites'] = $lesActivites;
// versements correspondants aux tarifs sélectionnés
$_SESSION['lesVersements'] = Utils::getVersementsTarifs($_SESSION['annee_recu'], $tarifsSelectionnes);
$_SESSION['lesVersements'] = Utils::getVersementsTarifs($_SESSION['annee_recu'],
$tarifsSelectionnes,
$champsNom);
// membres donateurs
$versementsMembres = Utils::getDonateurs($_SESSION['annee_recu'],
$champsNom);
$membresDonateurs = array();
$versementsMembres = Utils::getDonateurs($_SESSION['annee_recu']);
foreach ($versementsMembres as $versement) {
$membresDonateurs[$versement->idUser] = new Personne($versement->idUser,
$versement->nom,

View File

@ -12,12 +12,27 @@ if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") {
}
$_SESSION['taux_reduction'] = $_POST['taux_reduction'];
// champs pour le nom et prénom
$confNoms = (array) $plugin->getConfig('nomChamps');
uasort($confNoms, function ($a, $b)
{
return $a->position - $b->position;
});
$champsNom = array();
foreach ($confNoms as $nom => $champ)
{
if ($champ->position != 0) { $champsNom[] = $nom; }
}
// versements totaux par personne
$_SESSION['lesVersementsTotaux'] = Utils::getVersementsTotaux($_SESSION['annee_recu']);
$_SESSION['lesVersementsTotaux'] =
Utils::getVersementsTotaux($_SESSION['annee_recu'],
$champsNom);
// membres donateurs
$versementsMembres = Utils::getDonateurs($_SESSION['annee_recu'],
$champsNom);
$membresDonateurs = array();
$versementsMembres = Utils::getDonateurs($_SESSION['annee_recu']);
foreach ($versementsMembres as $versement) {
$membresDonateurs[$versement->idUser] = new Personne($versement->idUser,
$versement->nom,