fusion branche test

FossilOrigin-Name: 164ded799fce1137144dfbad7c2fbbaef34ec17cfdadb3a06a925e735819c033
This commit is contained in:
engel 2022-02-19 09:15:06 +00:00
commit c221014650
14 changed files with 522 additions and 191 deletions

View File

@ -10,8 +10,8 @@ class Personne
public $id; public $id;
public $nomPrenom; public $nomPrenom;
public $adresse; public $adresse;
public $ville;
public $codePostal; public $codePostal;
public $ville;
public $courriel; public $courriel;
public $versements; // tableau des versements totaux par activité/tarif public $versements; // tableau des versements totaux par activité/tarif
@ -19,32 +19,54 @@ class Personne
$id, $id,
$nomPrenom, $nomPrenom,
$adresse, $adresse,
$ville,
$codePostal, $codePostal,
$courriel $ville,
$courriel = ""
) { ) {
$this->id = $id; $this->id = $id;
$this->nomPrenom = $nomPrenom; $this->nomPrenom = $nomPrenom;
$this->adresse = $adresse; $this->adresse = $adresse;
$this->ville = $ville;
$this->codePostal = $codePostal; $this->codePostal = $codePostal;
$this->ville = $ville;
$this->courriel = $courriel; $this->courriel = $courriel;
$this->versements = array(); $this->versements = array();
} }
/* /**
* ajouter un versement pour une activité et un tarif donnés * return copie d'une personne
* @param $p
*/
public static function copier($p)
{
return new Personne(
$p->id,
$p->nomPrenom,
$p->adresse,
$p->codePostal,
$p->ville,
$p->courriel);
}
/**
* ajouter un versement
* @param $idActivite
* @param $idTarif
* @param $montant
* @param $tauxReduction
*/ */
public function ajouterVersement( public function ajouterVersement(
$idActivite, $idActivite,
$idTarif, $idTarif,
$montant $montant,
$tauxReduction
) { ) {
$this->versements[] = $this->versements[] =
new Versement( new Versement(
$idActivite, $idActivite,
$idTarif, $idTarif,
$montant $montant,
$tauxReduction
); );
} }
} }

View File

@ -135,8 +135,8 @@ class RecusPDF extends tFPDF
$nom, $nom,
$lesMontants, $lesMontants,
$adresse, $adresse,
$ville, $code_postal,
$code_postal) $ville)
{ {
$this->AddPage(); $this->AddPage();
@ -164,9 +164,9 @@ class RecusPDF extends tFPDF
"Le bénéficiaire reconnaît avoir reçu au titre des dons et versements ouvrant droit à réduction d'impôt :", "Le bénéficiaire reconnaît avoir reçu au titre des dons et versements ouvrant droit à réduction d'impôt :",
'LTR', 'LTR',
1); 1);
foreach ($lesMontants as $montant) foreach ($lesMontants as $taux => $montant)
{ {
$this->imprimer_montant(" - la somme de ", $montant, "aide aux personnes en difficulté"); $this->imprimer_montant(" - la somme de ", $montant, Utils::getLigneReduction($taux));
} }
$this->Cell(0, 3, "", 'LR', 1); $this->Cell(0, 3, "", 'LR', 1);
$this->imprimer_description('Date des versements : ', $this->imprimer_description('Date des versements : ',

View File

@ -7,10 +7,161 @@ use KD2\ZipWriter;
class Utils class Utils
{ {
// ------------------------------------------------------------
// test nouvelle organisation
/**
* @return tarifs demandés
* @param array $tarifs
*/
public static function getTarifs($tarifs)
{
$db = DB::getInstance();
$sql = sprintf(
'SELECT id, id_service as idActivite, label, description, amount as montant
FROM services_fees
WHERE services_fees.%s',
$db->where('id', $tarifs));
return $db->get($sql);
}
/**
* @return activités correspondant aux tarifs demandés
* @param array $tarifs
*/
public static function getActivites($tarifs)
{
$db = DB::getInstance();
$sql = sprintf(
'SELECT services.id, services.label, services.description
FROM services
LEFT JOIN services_fees ON services_fees.id_service = services.id
WHERE services_fees.%s
GROUP BY services.id',
$db->where('id', $tarifs));
return $db->get($sql);
}
/**
* @return versements correspondants à l'année et aux tarifs donnés
* @param $annee
* @param array $tarifs
*/
public static function getVersementsTarifs($annee, $tarifs)
{
$db = DB::getInstance();
$sql = sprintf(
'SELECT
services_fees.id as idTarif,
membres.id as idUser,
acc_transactions_lines.credit as versement,
acc_transactions.date
FROM acc_transactions_users
INNER JOIN membres on acc_transactions_users.id_user = membres.id
INNER JOIN acc_transactions on acc_transactions_users.id_transaction = acc_transactions.id
INNER JOIN services_users on acc_transactions_users.id_service_user = services_users.id
INNER JOIN services_fees on services_users.id_fee = services_fees.id
INNER JOIN acc_transactions_lines on acc_transactions_lines.id_transaction = acc_transactions.id
WHERE
(strftime(%s, acc_transactions.date) = "%d"
AND
services_fees.%s
AND
acc_transactions_lines.credit > 0)
ORDER by services_fees.id, membres.nom, acc_transactions.date',
'"%Y"',
$annee,
$db->where('id', $tarifs));
return $db->get($sql);
}
/**
* Versements totaux par personne pour une année donnée
* @param année
*/
public static function getVersementsTotaux($annee)
{
$sql =
"SELECT
membres.id as idUser,
sum(acc_transactions_lines.credit) AS versement
FROM
acc_transactions_users,
membres,
acc_transactions
INNER JOIN acc_transactions_lines
ON acc_transactions_lines.id_transaction = acc_transactions.id
WHERE (
strftime('%Y', acc_transactions.date) = ?
AND
acc_transactions_lines.credit > 0
AND
acc_transactions_users.id_transaction = acc_transactions.id
AND
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);
}
/**
* @return personnes ayant versé des dons pour une année donnée
* @param $annee
*/
public static function getDonateurs($annee)
{
$sql =
"SELECT
membres.id as idUser,
membres.nom as nom,
membres.adresse as adresse,
membres.code_postal as codePostal,
membres.ville as ville
FROM
acc_transactions_users,
membres,
acc_transactions
INNER JOIN acc_transactions_lines
ON acc_transactions_lines.id_transaction = acc_transactions.id
WHERE (
strftime('%Y', acc_transactions.date) = ?
AND
acc_transactions_lines.credit > 0
AND
acc_transactions_users.id_transaction = acc_transactions.id
AND
acc_transactions_users.id_user = membres.id
)
GROUP by membres.id
ORDER by membres.nom COLLATE U_NOCASE;
";
return DB::getInstance()->get($sql, $annee);
}
public static function getLignesReduction($lesTaux)
{
foreach ($lesTaux as $elem)
{
$ligne = "taux " . $elem->taux . ", ligne " . $elem->ligne;
if ($elem->remarque != "") {
$ligne .= ", " . $elem->remarque;
}
$lignes[$elem->taux] = $ligne;
}
return $lignes;
}
public static function getLigneReduction($taux)
{
return $_SESSION['ligneReduction'][$taux];
}
// ------------------------------------------------------------
/** /**
* @return liste des activités * @return liste des activités
*/ */
public static function getActivites() public static function getToutesActivites()
{ {
return DB::getInstance()->get( return DB::getInstance()->get(
"SELECT "SELECT
@ -26,7 +177,7 @@ class Utils
* @return liste des tarifs d'une activité * @return liste des tarifs d'une activité
* @param $activite : identifiant de l'activité * @param $activite : identifiant de l'activité
*/ */
public static function getTarifs($activite) public static function getTarifsActivite($activite)
{ {
return DB::getInstance()->get( return DB::getInstance()->get(
"SELECT "SELECT
@ -163,10 +314,10 @@ class Utils
} }
/** /**
* liste du total de versements par personne pour une année donnée * Versements totaux par personne pour une année donnée
* @param année * @param année
*/ */
public static function getVersementsTotaux($annee) { public static function getVersementsTotaux_old($annee) {
$sql = $sql =
"SELECT "SELECT
acc_transactions_users.id_user as idUser, acc_transactions_users.id_user as idUser,
@ -191,7 +342,7 @@ class Utils
acc_transactions_users.id_user = membres.id acc_transactions_users.id_user = membres.id
) )
GROUP by acc_transactions_users.id_user GROUP by acc_transactions_users.id_user
ORDER by membres.nom COLLATE NOCASE; ORDER by membres.nom COLLATE U_NOCASE;
"; ";
return DB::getInstance()->get($sql, $annee); return DB::getInstance()->get($sql, $annee);
} }

View File

@ -7,14 +7,18 @@ class Versement
public $idActivite; public $idActivite;
public $idTarif; public $idTarif;
public $montant; public $montant;
public $tauxReduction;
public function __construct( public function __construct(
$idActivite, $idActivite,
$idTarif, $idTarif,
$montant $montant,
) { $tauxReduction
)
{
$this->idActivite = $idActivite; $this->idActivite = $idActivite;
$this->idTarif = $idTarif; $this->idTarif = $idTarif;
$this->montant = $montant; $this->montant = $montant;
$this->tauxReduction = $tauxReduction;
} }
} }

View File

@ -2,7 +2,7 @@
{include file="%s/templates/_nav.tpl"|args:$plugin_root current_nav="index"} {include file="%s/templates/_nav.tpl"|args:$plugin_root current_nav="index"}
<h2>Choisir l'année fiscale</h2> <h2>Choisir l'année fiscale</h2>
<form id="formulaire_saisie" method="post" action=""> <form id="formulaire_saisie" method="post" action="action.php">
<fieldset> <fieldset>
{* <legend>Choisir l'année fiscale</legend> *} {* <legend>Choisir l'année fiscale</legend> *}
<select id="annee_recu" name="annee_recu"> <select id="annee_recu" name="annee_recu">
@ -47,15 +47,30 @@
</dl> </dl>
</fieldset> </fieldset>
</div> </div>
<div id="div_taux_reduc" class="tous hidden">
<h2>Choisir le taux de réduction</h2>
<fieldset>
{foreach from=$plugin_config->reduction item="reduc"}
<span class="radio-btn">
<input type="radio" id="{$reduc->taux}"
name="taux_reduction" value="{$reduc->taux}" />
<label for="{$reduc->taux}">{$reduc->taux}{if $reduc->remarque != ""} - {$reduc->remarque}{/if}</label>
</span>
{/foreach}
</fieldset>
</div>
<div id="generer_tous" class="tous hidden"> <div id="generer_tous" class="tous hidden">
<p class=" submit"> <p class=" submit">
{csrf_field key="generer_tous_recus"} {csrf_field key="generer_tous_recus"}
{button type="submit" name="generer_tous" label="Poursuivre" shape="right" class="main" onclick="aiguiller(this.form, 'versements_personnes');" } {button type="submit" name="generer_tous" label="Poursuivre" shape="right" class="main" onclick="return verifierRadio('div_taux_reduc');" }
</p> </p>
</div> </div>
<div id="liste_activites_tarifs" class="activites hidden"> <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> <h2>Choisir les activités et tarifs concernés par les reçus ainsi que le taux de réduction</h2>
<fieldset>
<table class="list"> <table class="list">
<thead> <thead>
<tr> <tr>
@ -76,16 +91,13 @@
<span>{$activite.titreActivite} - {$activite.titreTarif}</span> <span>{$activite.titreActivite} - {$activite.titreTarif}</span>
</td> </td>
<td> <td>
<span class="radio-btn"> {foreach from=$plugin_config->reduction item="reduc"}
<input type="radio" id="taux_normal_{$activite.idTarif}" <span class="radio-btn">
name="taux_reduction_{$activite.idTarif}" value="{$plugin_config->reduction[0]->taux}" disabled /> <input type="radio" id="taux_{$reduc->taux}_{$activite.idTarif}"
<label for="taux_normal_{$activite.idTarif}">normal</label> name="taux_reduction_{$activite.idTarif}" value="{$reduc->taux}" disabled />
</span> <label for="taux_{$reduc->taux}_{$activite.idTarif}">{$reduc->taux}{if $reduc->remarque != ""} - {$reduc->remarque}{/if}</label>
<span class=" radio-btn"> </span>
<input type="radio" id="taux_majore_{$activite.idTarif}" {/foreach}
name="taux_reduction_{$activite.idTarif}" value="{$plugin_config->reduction[1]->taux}" disabled />
<label for="taux_majore_{$activite.idTarif}">majoré</label>
</span>
</td> </td>
<td>{if $activite.descActivite != ""}{$activite.descActivite} ; {/if}{$activite.descTarif}</td> <td>{if $activite.descActivite != ""}{$activite.descActivite} ; {/if}{$activite.descTarif}</td>
<td>{$activite.numeroCpt} : {$activite.nomCpt}</td> <td>{$activite.numeroCpt} : {$activite.nomCpt}</td>
@ -93,13 +105,14 @@
{/foreach} {/foreach}
</tbody> </tbody>
</table> </table>
<p class="help">Si vous ne savez pas quel taux de réduction utiliser, n'en choisissez aucun</p> {*<p class="help">Si vous ne savez pas quel taux de réduction utiliser, n'en choisissez aucun</p>*}
</fieldset>
</div> </div>
<div id="generer_activites" class="activites hidden"> <div id="generer_activites" class="activites hidden">
<p class=" submit"> <p class=" submit">
{csrf_field key="generer_recus_activites"} {csrf_field key="generer_recus_activites"}
{button type="submit" name="generer_activites" label="Poursuivre" shape="right" class="main" onclick="aiguiller(this.form, 'versements_activites');" } {button type="submit" name="generer_activites" label="Poursuivre" shape="right" class="main" onclick="return verifierCases('liste_activites_tarifs');" }
</p> </p>
</div> </div>
</form> </form>
@ -107,7 +120,7 @@
<script type="text/javascript" src="script.js" defer="defer"></script> <script type="text/javascript" src="script.js" defer="defer"></script>
{literal} {literal}
<script type="text/javascript"> <script type="text/javascript">
// activer/désactiver les radios // activer/désactiver les radios des activités/tarifs
for (var laCase of document.querySelectorAll("input[type=checkbox]")) { for (var laCase of document.querySelectorAll("input[type=checkbox]")) {
laCase.addEventListener('change', (evt) => { laCase.addEventListener('change', (evt) => {
var idCase = evt.target; var idCase = evt.target;

View File

@ -3,80 +3,64 @@
<h2>Liste des versements par activité et tarif</h2> <h2>Liste des versements par activité et tarif</h2>
{* TODO : vérifier le détail de ce div *}
<div class="year-header noprint"> <div class="year-header noprint">
<button type="button" data-icon="↓" class="icn-btn" id="open_details">Déplier toutes les activités</button> <button type="button" data-icon="↓" class="icn-btn" id="open_details">Déplier toutes les activités</button>
<button type="button" data-icon="↑" class="icn-btn" id="close_details">Replier toutes les activités</button> <button type="button" data-icon="↑" class="icn-btn" id="close_details">Replier toutes les activités</button>
</div> </div>
<form method="post" action="generer_activites.php"> {*
<form method="post" id="imprimer_activites" action="imprimer_activites.php">
<input type="submit" value="Fabriquer PDF">
</form>
*}
<form method="post" id="versements_activites" action="generer_activites.php">
<fieldset class="versements" id="versements_global"> <fieldset class="versements" id="versements_global">
<input type="checkbox" class="check_global" id="check_global" onclick="cocherDecocherTout(check_global)" /> <input type="checkbox" class="check_global" id="check_global" onclick="cocherDecocherTout(check_global)" />
<label for="check_global">Cliquer pour cocher toutes les lignes</label> <label for="check_global">Cliquer pour cocher toutes les lignes</label>
</fieldset> </fieldset>
{* Itération sur les activités *} {* Itération sur les versements *}
{foreach from=$listeParActiviteEtTarif item="activite"} {foreach from=$lesVersements key="i" item="versement"}
{if $i == 0}
{* Itération sur les tarifs de l'activité *} {* premier versement *}
{foreach from=$activite->tarifs item="tarif"} <?php
$tarifCourant = $versement->idTarif;
<details open="open"> $personneCourante = $versement->idUser;
<summary class="activite"> ?>
<h3>Activité « {$activite->label} »</h3> {afficher_debut_tarif versement=$versement}
{if !empty($activite->description)} {afficher_debut_personne versement=$versement}
<h4>{$activite->description}</h4> {afficher_versement versement=$versement rang=$i}
{/if} {else}
<h4>tarif « {$tarif->titreTarif} », montant : {* autre versement *}
{if $tarif->montantTarif > 0}{$tarif->montantTarif|raw|money} {if $versement.idTarif != $tarifCourant}
{else}libre {* changement de tarif *}
{/if} </fieldset> {* fin versements d'une personne *}
</h4> </details>
</summary> <?php
$tarifCourant = $versement->idTarif;
{* $personneCourante = $versement->idUser;
Itération sur les versements d'un tarif d'une activité ?>
présentation : une table pour les versements d'une personne {afficher_debut_tarif versement=$versement}
*} {afficher_debut_personne versement=$versement}
<?php $currentUser = -1; $firstUser = true; ?> {afficher_versement versement=$versement rang=$i}
{foreach from=$lesVersements key="rang" item="versement"} {elseif $versement.idUser != $personneCourante}
{if $versement.idActivite == $activite->idActivite && {* changement de personne *}
$versement.idTarif == $tarif->idTarif} </fieldset>
{if $versement.idUser != $currentUser} <?php
{* changement de personne *} $personneCourante = $versement->idUser;
{if $firstUser} ?>
<?php $firstUser = false; ?> {afficher_debut_personne versement=$versement}
{else} {afficher_versement versement=$versement rang=$i}
{* fermer le tableau précédent *} {else}
</fieldset> {* même personne *}
{/if} {afficher_versement versement=$versement rang=$i}
{* Afficher les infos de la personne *} {/if}
<?php $idVersements = $versement->idTarif."_".$versement->idUser; ?> {/if}
<h3 class="personne">Versements de {$versement.nom} : <span id="total_{$idVersements}">0,00 €</span></h3> {/foreach} {* Itération sur les versements *}
<fieldset class="versements" id="versements_{$idVersements}"> </fieldset>
<input type="checkbox" class="check_{$idVersements}" id="check_{$idVersements}" </details>
onclick="cocherDecocherPersonne(check_{$idVersements}, total_{$idVersements})" />
<label for="check_{$idVersements}">Cliquer pour cocher toutes les lignes</label>
<br />
<hr>
<?php $currentUser = $versement->idUser; ?>
{/if}
{* afficher les infos du versement de la personne*}
<div {if $rang%2==0}class="pair" {else}class="impair" {/if}>
<input type="checkbox" class="check_{$idVersements}" id="check_{$idVersements}_{$rang}"
name="selected[]" value={$rang}
onclick="cocherDecocherVersement(check_{$idVersements}_{$rang}, total_{$idVersements})" />
<label for=check_{$idVersements}_{$rang}></label>
<span class="montant">{$versement.versement|raw|money}</span>
<span>{$versement.date|date_format:"%d/%m/%Y"}</span>
</div>
{/if}
{/foreach} {* Itération sur les versements *}
</fieldset>
</details>
{/foreach} {* Itération sur les tarifs de l'activité *}
{/foreach} {* Itération sur les activités *}
<input type="submit" value="Générer les reçus" onclick="return verifierChoix(this.form)"> <input type="submit" value="Générer les reçus" onclick="return verifierChoix(this.form)">
</form> </form>

View File

@ -17,8 +17,8 @@
<th>Nom Prénom</th> <th>Nom Prénom</th>
<th>Montant</th> <th>Montant</th>
<th>Adresse</th> <th>Adresse</th>
<th>Ville</th>
<th>Code postal</th> <th>Code postal</th>
<th>Ville</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -31,11 +31,11 @@
value=$rang} value=$rang}
</td> </td>
<td>{$versement.idUser}</td> <td>{$versement.idUser}</td>
<td>{$versement.nom}</td> <td>{$lesDonateurs[$versement.idUser]->nomPrenom}</td>
<td class="montant">{$versement.montant|raw|money}</td> <td class="montant">{$versement.versement|raw|money}</td>
<td>{$versement.adresse}</td> <td>{$lesDonateurs[$versement.idUser]->adresse}</td>
<td>{$versement.ville}</td> <td>{$lesDonateurs[$versement.idUser]->codePostal}</td>
<td>{$versement.codePostal}</td> <td>{$lesDonateurs[$versement.idUser]->ville}</td>
</tr> </tr>
{/foreach} {/foreach}
</tbody> </tbody>

View File

@ -4,7 +4,7 @@ namespace Garradin;
$session->requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN); $session->requireAccess($session::SECTION_CONFIG, $session::ACCESS_ADMIN);
$art_sel=f('articlesCGI') ? : []; $art_sel=f('articlesCGI') ? : [];
error_log("art sel=" . print_r($art_sel, true) . "\n");
if (f('save') && $form->check('recusfiscaux_config')) if (f('save') && $form->check('recusfiscaux_config'))
{ {
try { try {
@ -18,9 +18,7 @@ if (f('save') && $form->check('recusfiscaux_config'))
foreach ($art_sel as $article) { foreach ($art_sel as $article) {
$confArticles[$article]->valeur = 1; $confArticles[$article]->valeur = 1;
} }
error_log("confArticles=" . print_r($confArticles, true) . "\n");
$plugin->setConfig("articlesCGI", $confArticles); $plugin->setConfig("articlesCGI", $confArticles);
error_log("plugin->config=" . print_r($plugin->getConfig("articlesCGI"), true) . "\n");
\Garradin\Utils::redirect(PLUGIN_URL . 'config.php?ok'); \Garradin\Utils::redirect(PLUGIN_URL . 'config.php?ok');
} }
catch (UserException $e) catch (UserException $e)

View File

@ -11,10 +11,9 @@ $lesLignes = f('selected');
// filtrer les versements sélectionnés // filtrer les versements sélectionnés
$versementsSelectionnes = array(); $versementsSelectionnes = array();
foreach ($lesLignes as $indice => $ligne) { foreach ($lesLignes as $ligne) {
$versementsSelectionnes[] = $_SESSION['lesVersements'][$ligne]; $versementsSelectionnes[] = $_SESSION['lesVersements'][$ligne];
} }
// cumuler les versements d'une personne // cumuler les versements d'une personne
$totalPersonnes = cumulerVersements($versementsSelectionnes); $totalPersonnes = cumulerVersements($versementsSelectionnes);
@ -42,8 +41,14 @@ foreach ($totalPersonnes as $idPersonne => $personne) {
); );
// extraire les montants des versements // extraire les montants des versements
$lesMontants = array(); $lesMontants = array();
foreach ($personne->versements as $versement) { foreach ($personne->versements as $versement)
$lesMontants[] = $versement->montant; {
if (array_key_exists($versement->tauxReduction, $lesMontants)) {
$lesMontants[$versement->tauxReduction] += $versement->montant;
}
else {
$lesMontants[$versement->tauxReduction] = $versement->montant;
}
} }
$pdf->imprimer_recu( $pdf->imprimer_recu(
$_SESSION['annee_recu'], $_SESSION['annee_recu'],
@ -51,8 +56,8 @@ foreach ($totalPersonnes as $idPersonne => $personne) {
$personne->nomPrenom, $personne->nomPrenom,
$lesMontants, $lesMontants,
$personne->adresse, $personne->adresse,
$personne->ville, $personne->codePostal,
$personne->codePostal $personne->ville
); );
// fabriquer le nom du fichier PDF // fabriquer le nom du fichier PDF
$nom = str_replace(' ', '_', $personne->nomPrenom); $nom = str_replace(' ', '_', $personne->nomPrenom);
@ -73,44 +78,38 @@ $fichierZip = Utils::makeArchive(
); );
/** /**
* Cumuler les versements de chaque personne par tarif et activité * Cumuler les versements de chaque personne par tarif
* @param tableau des versements * @param tableau des versements triés par idTarif, idUser, date
* @return tableau des versements cumulés * @return tableau des versements cumulés : id => Personne
*/ */
function cumulerVersements($versements) function cumulerVersements($versements)
{ {
$totalPersonnes = array(); $totalPersonnes = array();
$idActivite_courant = -1;
$idTarif_courant = -1; $idTarif_courant = -1;
$idPersonne_courant = -1; $idPersonne_courant = -1;
$totalVersements = 0; $totalVersements = 0;
foreach ($versements as $ligne) { foreach ($versements as $ligne)
{
if ( if (
$ligne->idActivite != $idActivite_courant ||
$ligne->idTarif != $idTarif_courant || $ligne->idTarif != $idTarif_courant ||
$ligne->idUser != $idPersonne_courant $ligne->idUser != $idPersonne_courant
) { )
if ($idActivite_courant != -1) { {
$totalPersonnes["$idPersonne_courant"]->ajouterVersement( if ($idTarif_courant != -1) {
$idActivite_courant, $totalPersonnes[$idPersonne_courant]->ajouterVersement(
$_SESSION['lesTarifs'][$idTarif_courant]->idActivite,
$idTarif_courant, $idTarif_courant,
$totalVersements/100 $totalVersements/100,
$_SESSION['tauxSelectionnes'][$idTarif_courant]
); );
} }
$idActivite_courant = $ligne->idActivite;
$idTarif_courant = $ligne->idTarif; $idTarif_courant = $ligne->idTarif;
$idPersonne_courant = $ligne->idUser; $idPersonne_courant = $ligne->idUser;
$totalVersements = $ligne->versement; $totalVersements = $ligne->versement;
// créer les infos de la personne, sauf si elle est déjà présente // créer les infos de la personne, sauf si elle est déjà présente
if (!array_key_exists($idPersonne_courant, $totalPersonnes)) { if (!array_key_exists($idPersonne_courant, $totalPersonnes))
$totalPersonnes["$idPersonne_courant"] = new Personne( {
$ligne->idUser, $totalPersonnes["$idPersonne_courant"] = Personne::copier($_SESSION['membresDonateurs'][$ligne->idUser]);
$ligne->nom,
$ligne->adresse,
$ligne->ville,
$ligne->codePostal,
$ligne->courriel
);
} }
} else { } else {
// cumuler versements // cumuler versements
@ -118,11 +117,12 @@ function cumulerVersements($versements)
} }
} }
// et le dernier // et le dernier
$totalPersonnes["$idPersonne_courant"]->ajouterVersement( $totalPersonnes[$idPersonne_courant]->ajouterVersement(
$idActivite_courant, $_SESSION['lesTarifs'][$idTarif_courant]->idActivite,
$idTarif_courant, $idTarif_courant,
$totalVersements/100 $totalVersements/100,
); $_SESSION['tauxSelectionnes'][$idTarif_courant]
);
return $totalPersonnes; return $totalPersonnes;
} }

View File

@ -11,24 +11,19 @@ $lesLignes = f('selected');
// filtrer les versements sélectionnés // filtrer les versements sélectionnés
$versementsSelectionnes = array(); $versementsSelectionnes = array();
foreach ($lesLignes as $indice => $ligne) { foreach ($lesLignes as $ligne) {
$versementsSelectionnes[] = $_SESSION['lesVersementsTotaux'][$ligne]; $versementsSelectionnes[] = $_SESSION['lesVersementsTotaux'][$ligne];
} }
error_log("versements sélectionnés " . print_r($versementsSelectionnes, true));
// générer les reçus // générer les reçus
$nomAsso = Utils::getNomAsso(); $nomAsso = Utils::getNomAsso();
$adresseAsso = Utils::getAdresseAsso(); $adresseAsso = Utils::getAdresseAsso();
// TODO
// - associer le taux de réduction à chaque montant total
$logoCERFA = PLUGIN_ROOT . "/data/logoCerfa.png"; $logoCERFA = PLUGIN_ROOT . "/data/logoCerfa.png";
$signature = PLUGIN_ROOT . "/data/default_signature.png"; $signature = PLUGIN_ROOT . "/data/default_signature.png";
$listeFichiers = []; $listeFichiers = [];
foreach ($versementsSelectionnes as $idPersonne => $personne) { foreach ($versementsSelectionnes as $ligne) {
// générer un fichier par reçu // générer un fichier par reçu
$pdf = new RecusPDF( $pdf = new RecusPDF(
'DejaVu', 'DejaVu',
@ -39,17 +34,18 @@ foreach ($versementsSelectionnes as $idPersonne => $personne) {
$signature $signature
); );
// extraire les montants des versements // extraire les montants des versements
$lesMontants[$_SESSION['taux_reduction']] = $ligne->versement/100;
$pdf->imprimer_recu( $pdf->imprimer_recu(
$_SESSION['annee_recu'], $_SESSION['annee_recu'],
$personne->idUser, $ligne->idUser,
$personne->nom, $_SESSION['membresDonateurs'][$ligne->idUser]->nomPrenom,
array($personne->montant/100), $lesMontants,
$personne->adresse, $_SESSION['membresDonateurs'][$ligne->idUser]->adresse,
$personne->ville, $_SESSION['membresDonateurs'][$ligne->idUser]->codePostal,
$personne->codePostal $_SESSION['membresDonateurs'][$ligne->idUser]->ville
); );
// fabriquer le nom du fichier PDF // fabriquer le nom du fichier PDF
$nom = str_replace(' ', '_', $personne->nom); $nom = str_replace(' ', '_', $_SESSION['membresDonateurs'][$ligne->idUser]->nomPrenom);
$nom = str_replace("'", "", $nom); $nom = str_replace("'", "", $nom);
// $nomFichier = Utils::getPDFDirectory() . "/" . 'recu_' . $annee_recu . '_' . $nom . '.pdf'; // $nomFichier = Utils::getPDFDirectory() . "/" . 'recu_' . $annee_recu . '_' . $nom . '.pdf';
$nomFichier = PLUGIN_ROOT . '/pdf/recu_' . $_SESSION['annee_recu'] . '_' . $nom . '.pdf'; $nomFichier = PLUGIN_ROOT . '/pdf/recu_' . $_SESSION['annee_recu'] . '_' . $nom . '.pdf';

View File

@ -11,6 +11,9 @@ if ($anneesFiscales[0] < $anneeCourante) {
array_unshift($anneesFiscales, $anneeCourante); array_unshift($anneesFiscales, $anneeCourante);
} }
// libellés pour les taux de réduction
$_SESSION['ligneReduction'] = Utils::getLignesReduction($plugin->getConfig('reduction'));
// liste des activités, cotisations et comptes associés // liste des activités, cotisations et comptes associés
$activitesTarifsComptes = Utils::getActivitesTarifsEtComptes(); $activitesTarifsComptes = Utils::getActivitesTarifsEtComptes();

View File

@ -3,7 +3,8 @@
* ()sélectionner toutes les cases à cocher de toutes les activités * ()sélectionner toutes les cases à cocher de toutes les activités
* @param id de la case globale * @param id de la case globale
*/ */
function cocherDecocherTout(idCaseGlobale) { function cocherDecocherTout(idCaseGlobale)
{
// chercher le formulaire englobant // chercher le formulaire englobant
var formulaire = idCaseGlobale.closest("form"); var formulaire = idCaseGlobale.closest("form");
// itérer sur la liste des éléments détails : 1 par couple <activité, tarif> // itérer sur la liste des éléments détails : 1 par couple <activité, tarif>
@ -39,7 +40,8 @@ function cocherDecocherTout(idCaseGlobale) {
* @param id de la case qui a été cochée * @param id de la case qui a été cochée
* @param id de l'élément afficher le total * @param id de l'élément afficher le total
*/ */
function cocherDecocherPersonne(idCase, idTotal) { function cocherDecocherPersonne(idCase, idTotal)
{
// chercher le fieldset englobant // chercher le fieldset englobant
var fieldset = idCase.closest("fieldset"); var fieldset = idCase.closest("fieldset");
var listeCases = fieldset.querySelectorAll("input[type=checkbox]"); var listeCases = fieldset.querySelectorAll("input[type=checkbox]");
@ -67,7 +69,8 @@ function cocherDecocherPersonne(idCase, idTotal) {
* @param id de la case qui a été cochée * @param id de la case qui a été cochée
* @param id de l'élément afficher le total * @param id de l'élément afficher le total
*/ */
function cocherDecocherVersement(idCase, idTotal) { function cocherDecocherVersement(idCase, idTotal)
{
var fieldset = idCase.closest("fieldset"); var fieldset = idCase.closest("fieldset");
var listeCases = fieldset.querySelectorAll("input[type=checkbox]"); var listeCases = fieldset.querySelectorAll("input[type=checkbox]");
var listeMontants = fieldset.querySelectorAll("span.montant"); var listeMontants = fieldset.querySelectorAll("span.montant");
@ -80,7 +83,8 @@ function cocherDecocherVersement(idCase, idTotal) {
* @param listes des montants associés * @param listes des montants associés
* @param id de l'élément afficher le total * @param id de l'élément afficher le total
*/ */
function calculerTotal(listeCases, listeMontants, idTotal) { function calculerTotal(listeCases, listeMontants, idTotal)
{
var total = 0; var total = 0;
for (var i = 1; i < listeCases.length; ++i) for (var i = 1; i < listeCases.length; ++i)
{ {
@ -118,7 +122,11 @@ function verifierChoix(formulaire)
return ok; return ok;
} }
function afficherMasquer(formulaire, nomClasse1, nomClasse2) { /**
* fonction appelée pour afficher et masquer des portions de formulaire
*/
function afficherMasquer(formulaire, nomClasse1, nomClasse2)
{
for (var elem of formulaire.querySelectorAll(nomClasse1)) { for (var elem of formulaire.querySelectorAll(nomClasse1)) {
elem.classList.remove('hidden'); elem.classList.remove('hidden');
} }
@ -127,13 +135,53 @@ function afficherMasquer(formulaire, nomClasse1, nomClasse2) {
} }
} }
// aiguiller la suite vers la page passée en paramètre // vérifier
function aiguiller(formulaire, pageSuivante) { // - qu'au moins une activité/tarif est sélectionnée
formulaire.action = pageSuivante + ".php"; // - qu'un radio de chaque activité/tarif sélectionné a été sélectionné :)
function verifierCases(idElem)
{
var div = document.getElementById(idElem);
var nbChoix = 0;
// parcourir les cases à cocher
for (var idCase of div.querySelectorAll("input[type=checkbox]"))
{
if (idCase.checked) {
++nbChoix;
// vérifier qu'un radio de la même ligne est sélectionné
var ligneCorrecte = false;
// trouver la ligne englobante
var ligne = idCase.closest("tr");
for (var idRadio of ligne.querySelectorAll('input[type=radio]'))
{
if (idRadio.checked) { ligneCorrecte = true; break; }
}
if (! ligneCorrecte) {
alert("Erreur : il faut sélectionner un taux de réduction dans chaque ligne cochée");
return false;
}
}
}
if (nbChoix == 0) {
alert("Erreur : il faut sélectionner au moins une activité/tarif");
}
return nbChoix != 0;
}
// vérifier qu'un radio a été sélectionné dans la div paramètre
function verifierRadio(idElem)
{
var div = document.getElementById(idElem);
for (var idRadio of div.querySelectorAll('input[type=radio]'))
{
if (idRadio.checked) { return true; }
}
alert("Erreur : il faut sélectionner un taux de réduction");
return false;
} }
// inutilisé // inutilisé
function activerDesactiverRadio(evt) { function activerDesactiverRadio(evt)
{
var idCase = evt.target; var idCase = evt.target;
// checher la ligne englobante ( <tr>) // checher la ligne englobante ( <tr>)
var ligne = idCase.closest("tr"); var ligne = idCase.closest("tr");
@ -148,21 +196,12 @@ function activerDesactiverRadio(evt) {
} }
} }
/**
* indiquer le nom du script php à activer
* @param formulaire
* @param script php
*/
function activer(formulaire, script) {
formulaire.action = script;
}
/** /**
* Associer un écouteur à la première case à cocher de chaque table * Associer un écouteur à la première case à cocher de chaque table
* @remarks : n'est plus utile * @remarks : n'est plus utile
*/ */
function activerListener() { function activerListener()
{
// parcourir les tables // parcourir les tables
const lesTables = document.querySelectorAll("table.list"); const lesTables = document.querySelectorAll("table.list");
for (let i = 0; i < lesTables.length; ++i) { for (let i = 0; i < lesTables.length; ++i) {

View File

@ -2,41 +2,146 @@
namespace Garradin; namespace Garradin;
use Garradin\Plugin\RecusFiscaux\Activite;
use Garradin\Plugin\RecusFiscaux\Personne;
use Garradin\Plugin\RecusFiscaux\Tarif;
use Garradin\Plugin\RecusFiscaux\Utils; use Garradin\Plugin\RecusFiscaux\Utils;
// vérifier si l'année a bien été sélectionnée au préalable // vérifier si l'année a bien été sélectionnée au préalable
$_SESSION['annee_recu'] = f('annee_recu'); $_SESSION['annee_recu'] = f('annee_recu');
// error_log("va.php::annee_recu = (" .$_SESSION['annee_recu'] . ")");
if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") { if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") {
\Garradin\Utils::redirect(PLUGIN_URL . 'index.php'); \Garradin\Utils::redirect(PLUGIN_URL . 'index.php');
} }
// récupérer les infos du formulaire // récupérer les infos du formulaire
$lesTarifs = f('tarifs') ?: []; $tarifsSelectionnes = f('tarifs') ?: [];
// taux de réduction associés // taux de réduction associés
$lesTaux = array(); $tauxSelectionnes = array();
foreach ($lesTarifs as $idTarif) { foreach ($tarifsSelectionnes as $idTarif) {
$nomRadio = "taux_reduction_" . $idTarif; $nomRadio = "taux_reduction_" . $idTarif;
$valRadio = f("$nomRadio"); $valRadio = f("$nomRadio");
$lesTaux[] = $valRadio ? $valRadio: $plugin->getConfig()->reduction[0]->taux; $tauxSelectionnes[$idTarif] = $valRadio;
} }
// error_log("Tarifs = " . print_r($lesTarifs, true) . "\n"); $_SESSION['tauxSelectionnes'] = $tauxSelectionnes;
// error_log("Réducs = " . print_r($lesTaux, true) . "\n");
// liste des versements correspondants // obtenir les instances de tarifs correspondant à la sélection
$_SESSION['lesVersements'] = Utils::getVersementsActivite($_SESSION['annee_recu'], $lesTarifs); $lesTarifs = array();
foreach (Utils::getTarifs($tarifsSelectionnes) as $ot) {
$lesTarifs[$ot->id] = Tarif::copier($ot);
}
$_SESSION['lesTarifs'] = $lesTarifs;
// liste des activités // activités correspondants aux tarifs sélectionnés
$activites = Utils::getActivites(); $lesActivites = array();
foreach ($activites as $num => $activite) foreach (Utils::getActivites($tarifsSelectionnes) as $activite) {
$lesActivites[$activite->id] = Activite::copier($activite);
}
$_SESSION['lesActivites'] = $lesActivites;
// versements correspondants aux tarifs sélectionnés
$_SESSION['lesVersements'] = Utils::getVersementsTarifs($_SESSION['annee_recu'], $tarifsSelectionnes);
// membres donateurs
$membresDonateurs = array();
$versementsMembres = Utils::getDonateurs($_SESSION['annee_recu']);
foreach ($versementsMembres as $versement) {
$membresDonateurs[$versement->idUser] = new Personne($versement->idUser,
$versement->nom,
$versement->adresse,
$versement->codePostal,
$versement->ville);
}
$_SESSION['membresDonateurs'] = $membresDonateurs;
// ------------------------------------------------------------------------
// fonctions pour l'affichage
// afficher les informations d'une activité et d'un tarif
$tpl->register_function('afficher_debut_tarif', function ($params)
{ {
// ajouter les tarifs de l'activité $versement = $params['versement'];
$activite->{'tarifs'} = Utils::getTarifs($activite->{'idActivite'}); $idTarif = $versement->idTarif;
} $tarif = $_SESSION['lesTarifs'][$idTarif];
$idActivite = $tarif->idActivite;
$activite = $_SESSION['lesActivites'][$idActivite];
$out = '<details open="open">
<summary class="activite">';
$out .= sprintf('
<h3>Activité « %s »</h3>', $activite->label);
if (!empty($activite->description)) {
$out .= sprintf('
<h4>%s</h4>', $activite->description);
}
$out .= sprintf('
<h4>tarif « %s »', $tarif->label);
if ($tarif->montant > 0) {
$out .= sprintf(' montant : %.2f €', $tarif->montant/100);
} else {
$out .= ' montant : libre';
}
$out .= '</h4>
</summary>';
return $out;
});
// afficher les informations d'une personne
$tpl->register_function('afficher_debut_personne', function ($params)
{
$versement = $params['versement'];
$idUser = $versement->idUser;
$personne = $_SESSION['membresDonateurs'][$idUser];
$idVersement = $versement->idTarif . "_" . $versement->idUser;
$out = sprintf('<h3 class="personne">Versements de %s : <span id="total_%s">0,00 €</span></h3>',
$personne->nomPrenom,
$idVersement);
$out .= sprintf('
<fieldset class="versements" id="versements_%s">',
$idVersement);
$out .= sprintf('
<input type="checkbox" class="check_%s" id="check_%s"',
$idVersement,
$idVersement);
$out .= sprintf(' onclick="cocherDecocherPersonne(check_%s, total_%s)" />',
$idVersement,
$idVersement);
$out .= sprintf('
<label for="check_%s">Cliquer pour cocher toutes les lignes</label>',
$idVersement);
$out .= '<br />
<hr>';
return $out;
});
// afficher un versement
$tpl->register_function('afficher_versement', function ($params)
{
$versement = $params['versement'];
$rang = $params['rang'];
$idVersement = $versement->idTarif . "_" . $versement->idUser;
$out = '<div class="';
$out .= ($rang%2==0) ? 'pair">' : 'impair">';
$out .= sprintf('
<input type="checkbox" class="check_%s" id="check_%s_%s"
name="selected[]" value="%s"
onclick="cocherDecocherVersement(check_%s_%s, total_%s)" />
<label for="check_%s_%s"></label>
<span class="montant">%.2f</span>
<span>%s</span>
</div>',
$idVersement, $idVersement,
$rang, $rang,
$idVersement, $rang, $idVersement, $idVersement, $rang,
$versement->versement/100,
date_format(date_create($versement->date),"d/m/Y"));
return $out;
});
// ------------------------------------------------------------------------
// préparation de l'affichage // préparation de l'affichage
$tpl->assign('lesActivites', $lesActivites);
$tpl->assign('lesTarifs', $lesTarifs);
$tpl->assign('lesVersements', $_SESSION['lesVersements']); $tpl->assign('lesVersements', $_SESSION['lesVersements']);
$tpl->assign('listeParActiviteEtTarif', $activites);
$tpl->assign('plugin_css', ['style.css']); $tpl->assign('plugin_css', ['style.css']);
// envoyer au template // envoyer au template

View File

@ -2,19 +2,35 @@
namespace Garradin; namespace Garradin;
use Garradin\Plugin\RecusFiscaux\Personne;
use Garradin\Plugin\RecusFiscaux\Utils; use Garradin\Plugin\RecusFiscaux\Utils;
$_SESSION['taux_reduction'] = $_POST['taux_reduction'];
// vérifier si l'année a bien été sélectionnée au préalable // vérifier si l'année a bien été sélectionnée au préalable
$_SESSION['annee_recu'] = f('annee_recu'); $_SESSION['annee_recu'] = f('annee_recu');
// error_log("vp.php::annee_recu = (" .$_SESSION['annee_recu'] . ")");
if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") { if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") {
\Garradin\Utils::redirect(PLUGIN_URL . 'index.php'); \Garradin\Utils::redirect(PLUGIN_URL . 'index.php');
} }
// liste des versements totaux par personne
// versements totaux par personne
$_SESSION['lesVersementsTotaux'] = Utils::getVersementsTotaux($_SESSION['annee_recu']); $_SESSION['lesVersementsTotaux'] = Utils::getVersementsTotaux($_SESSION['annee_recu']);
// membres donateurs
$membresDonateurs = array();
$versementsMembres = Utils::getDonateurs($_SESSION['annee_recu']);
foreach ($versementsMembres as $versement) {
$membresDonateurs[$versement->idUser] = new Personne($versement->idUser,
$versement->nom,
$versement->adresse,
$versement->codePostal,
$versement->ville);
}
$_SESSION['membresDonateurs'] = $membresDonateurs;
// préparation de l'affichage // préparation de l'affichage
$tpl->assign('lesVersementsTotaux', $_SESSION['lesVersementsTotaux']); $tpl->assign('lesVersementsTotaux', $_SESSION['lesVersementsTotaux']);
$tpl->assign('lesDonateurs', $membresDonateurs);
$tpl->assign('plugin_css', ['style.css']); $tpl->assign('plugin_css', ['style.css']);
// envoyer au template // envoyer au template