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 $nomPrenom;
public $adresse;
public $ville;
public $codePostal;
public $ville;
public $courriel;
public $versements; // tableau des versements totaux par activité/tarif
@ -19,32 +19,54 @@ class Personne
$id,
$nomPrenom,
$adresse,
$ville,
$codePostal,
$courriel
$ville,
$courriel = ""
) {
$this->id = $id;
$this->nomPrenom = $nomPrenom;
$this->adresse = $adresse;
$this->ville = $ville;
$this->codePostal = $codePostal;
$this->ville = $ville;
$this->courriel = $courriel;
$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(
$idActivite,
$idTarif,
$montant
$montant,
$tauxReduction
) {
$this->versements[] =
new Versement(
$idActivite,
$idTarif,
$montant
$montant,
$tauxReduction
);
}
}

View File

@ -135,8 +135,8 @@ class RecusPDF extends tFPDF
$nom,
$lesMontants,
$adresse,
$ville,
$code_postal)
$code_postal,
$ville)
{
$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 :",
'LTR',
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->imprimer_description('Date des versements : ',

View File

@ -7,10 +7,161 @@ use KD2\ZipWriter;
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
*/
public static function getActivites()
public static function getToutesActivites()
{
return DB::getInstance()->get(
"SELECT
@ -26,7 +177,7 @@ class Utils
* @return liste des tarifs d'une activité
* @param $activite : identifiant de l'activité
*/
public static function getTarifs($activite)
public static function getTarifsActivite($activite)
{
return DB::getInstance()->get(
"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
*/
public static function getVersementsTotaux($annee) {
public static function getVersementsTotaux_old($annee) {
$sql =
"SELECT
acc_transactions_users.id_user as idUser,
@ -191,7 +342,7 @@ class Utils
acc_transactions_users.id_user = membres.id
)
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);
}
@ -239,7 +390,7 @@ class Utils
* @param tableau des versements par personne
*/
static function genererRecus() {
}
/**

View File

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

View File

@ -2,7 +2,7 @@
{include file="%s/templates/_nav.tpl"|args:$plugin_root current_nav="index"}
<h2>Choisir l'année fiscale</h2>
<form id="formulaire_saisie" method="post" action="">
<form id="formulaire_saisie" method="post" action="action.php">
<fieldset>
{* <legend>Choisir l'année fiscale</legend> *}
<select id="annee_recu" name="annee_recu">
@ -47,15 +47,30 @@
</dl>
</fieldset>
</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">
<p class=" submit">
{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>
</div>
<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>
<table class="list">
<thead>
<tr>
@ -76,16 +91,13 @@
<span>{$activite.titreActivite} - {$activite.titreTarif}</span>
</td>
<td>
<span class="radio-btn">
<input type="radio" id="taux_normal_{$activite.idTarif}"
name="taux_reduction_{$activite.idTarif}" value="{$plugin_config->reduction[0]->taux}" disabled />
<label for="taux_normal_{$activite.idTarif}">normal</label>
</span>
<span class=" radio-btn">
<input type="radio" id="taux_majore_{$activite.idTarif}"
name="taux_reduction_{$activite.idTarif}" value="{$plugin_config->reduction[1]->taux}" disabled />
<label for="taux_majore_{$activite.idTarif}">majoré</label>
</span>
{foreach from=$plugin_config->reduction item="reduc"}
<span class="radio-btn">
<input type="radio" id="taux_{$reduc->taux}_{$activite.idTarif}"
name="taux_reduction_{$activite.idTarif}" value="{$reduc->taux}" disabled />
<label for="taux_{$reduc->taux}_{$activite.idTarif}">{$reduc->taux}{if $reduc->remarque != ""} - {$reduc->remarque}{/if}</label>
</span>
{/foreach}
</td>
<td>{if $activite.descActivite != ""}{$activite.descActivite} ; {/if}{$activite.descTarif}</td>
<td>{$activite.numeroCpt} : {$activite.nomCpt}</td>
@ -93,13 +105,14 @@
{/foreach}
</tbody>
</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 id="generer_activites" class="activites hidden">
<p class=" submit">
{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>
</div>
</form>
@ -107,7 +120,7 @@
<script type="text/javascript" src="script.js" defer="defer"></script>
{literal}
<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]")) {
laCase.addEventListener('change', (evt) => {
var idCase = evt.target;

View File

@ -3,80 +3,64 @@
<h2>Liste des versements par activité et tarif</h2>
{* TODO : vérifier le détail de ce div *}
<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="close_details">Replier toutes les activités</button>
</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">
<input type="checkbox" class="check_global" id="check_global" onclick="cocherDecocherTout(check_global)" />
<label for="check_global">Cliquer pour cocher toutes les lignes</label>
</fieldset>
{* Itération sur les activités *}
{foreach from=$listeParActiviteEtTarif item="activite"}
{* Itération sur les tarifs de l'activité *}
{foreach from=$activite->tarifs item="tarif"}
<details open="open">
<summary class="activite">
<h3>Activité « {$activite->label} »</h3>
{if !empty($activite->description)}
<h4>{$activite->description}</h4>
{/if}
<h4>tarif « {$tarif->titreTarif} », montant :
{if $tarif->montantTarif > 0}{$tarif->montantTarif|raw|money}
{else}libre
{/if}
</h4>
</summary>
{*
Itération sur les versements d'un tarif d'une activité
présentation : une table pour les versements d'une personne
*}
<?php $currentUser = -1; $firstUser = true; ?>
{foreach from=$lesVersements key="rang" item="versement"}
{if $versement.idActivite == $activite->idActivite &&
$versement.idTarif == $tarif->idTarif}
{if $versement.idUser != $currentUser}
{* changement de personne *}
{if $firstUser}
<?php $firstUser = false; ?>
{else}
{* fermer le tableau précédent *}
</fieldset>
{/if}
{* Afficher les infos de la personne *}
<?php $idVersements = $versement->idTarif."_".$versement->idUser; ?>
<h3 class="personne">Versements de {$versement.nom} : <span id="total_{$idVersements}">0,00 €</span></h3>
<fieldset class="versements" id="versements_{$idVersements}">
<input type="checkbox" class="check_{$idVersements}" id="check_{$idVersements}"
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 *}
{* Itération sur les versements *}
{foreach from=$lesVersements key="i" item="versement"}
{if $i == 0}
{* premier versement *}
<?php
$tarifCourant = $versement->idTarif;
$personneCourante = $versement->idUser;
?>
{afficher_debut_tarif versement=$versement}
{afficher_debut_personne versement=$versement}
{afficher_versement versement=$versement rang=$i}
{else}
{* autre versement *}
{if $versement.idTarif != $tarifCourant}
{* changement de tarif *}
</fieldset> {* fin versements d'une personne *}
</details>
<?php
$tarifCourant = $versement->idTarif;
$personneCourante = $versement->idUser;
?>
{afficher_debut_tarif versement=$versement}
{afficher_debut_personne versement=$versement}
{afficher_versement versement=$versement rang=$i}
{elseif $versement.idUser != $personneCourante}
{* changement de personne *}
</fieldset>
<?php
$personneCourante = $versement->idUser;
?>
{afficher_debut_personne versement=$versement}
{afficher_versement versement=$versement rang=$i}
{else}
{* même personne *}
{afficher_versement versement=$versement rang=$i}
{/if}
{/if}
{/foreach} {* Itération sur les versements *}
</fieldset>
</details>
<input type="submit" value="Générer les reçus" onclick="return verifierChoix(this.form)">
</form>

View File

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

View File

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

View File

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

View File

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

View File

@ -3,7 +3,8 @@
* ()sélectionner toutes les cases à cocher de toutes les activités
* @param id de la case globale
*/
function cocherDecocherTout(idCaseGlobale) {
function cocherDecocherTout(idCaseGlobale)
{
// chercher le formulaire englobant
var formulaire = idCaseGlobale.closest("form");
// 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 l'élément afficher le total
*/
function cocherDecocherPersonne(idCase, idTotal) {
function cocherDecocherPersonne(idCase, idTotal)
{
// chercher le fieldset englobant
var fieldset = idCase.closest("fieldset");
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 l'élément afficher le total
*/
function cocherDecocherVersement(idCase, idTotal) {
function cocherDecocherVersement(idCase, idTotal)
{
var fieldset = idCase.closest("fieldset");
var listeCases = fieldset.querySelectorAll("input[type=checkbox]");
var listeMontants = fieldset.querySelectorAll("span.montant");
@ -80,7 +83,8 @@ function cocherDecocherVersement(idCase, idTotal) {
* @param listes des montants associés
* @param id de l'élément afficher le total
*/
function calculerTotal(listeCases, listeMontants, idTotal) {
function calculerTotal(listeCases, listeMontants, idTotal)
{
var total = 0;
for (var i = 1; i < listeCases.length; ++i)
{
@ -118,7 +122,11 @@ function verifierChoix(formulaire)
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)) {
elem.classList.remove('hidden');
}
@ -127,13 +135,53 @@ function afficherMasquer(formulaire, nomClasse1, nomClasse2) {
}
}
// aiguiller la suite vers la page passée en paramètre
function aiguiller(formulaire, pageSuivante) {
formulaire.action = pageSuivante + ".php";
// vérifier
// - qu'au moins une activité/tarif est sélectionnée
// - 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é
function activerDesactiverRadio(evt) {
function activerDesactiverRadio(evt)
{
var idCase = evt.target;
// checher la ligne englobante ( <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
* @remarks : n'est plus utile
*/
function activerListener() {
function activerListener()
{
// parcourir les tables
const lesTables = document.querySelectorAll("table.list");
for (let i = 0; i < lesTables.length; ++i) {

View File

@ -2,41 +2,146 @@
namespace Garradin;
use Garradin\Plugin\RecusFiscaux\Activite;
use Garradin\Plugin\RecusFiscaux\Personne;
use Garradin\Plugin\RecusFiscaux\Tarif;
use Garradin\Plugin\RecusFiscaux\Utils;
// vérifier si l'année a bien été sélectionnée au préalable
$_SESSION['annee_recu'] = f('annee_recu');
// error_log("va.php::annee_recu = (" .$_SESSION['annee_recu'] . ")");
if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") {
\Garradin\Utils::redirect(PLUGIN_URL . 'index.php');
}
// récupérer les infos du formulaire
$lesTarifs = f('tarifs') ?: [];
$tarifsSelectionnes = f('tarifs') ?: [];
// taux de réduction associés
$lesTaux = array();
foreach ($lesTarifs as $idTarif) {
$tauxSelectionnes = array();
foreach ($tarifsSelectionnes as $idTarif) {
$nomRadio = "taux_reduction_" . $idTarif;
$valRadio = f("$nomRadio");
$lesTaux[] = $valRadio ? $valRadio: $plugin->getConfig()->reduction[0]->taux;
$tauxSelectionnes[$idTarif] = $valRadio;
}
// error_log("Tarifs = " . print_r($lesTarifs, true) . "\n");
// error_log("Réducs = " . print_r($lesTaux, true) . "\n");
$_SESSION['tauxSelectionnes'] = $tauxSelectionnes;
// liste des versements correspondants
$_SESSION['lesVersements'] = Utils::getVersementsActivite($_SESSION['annee_recu'], $lesTarifs);
// obtenir les instances de tarifs correspondant à la sélection
$lesTarifs = array();
foreach (Utils::getTarifs($tarifsSelectionnes) as $ot) {
$lesTarifs[$ot->id] = Tarif::copier($ot);
}
$_SESSION['lesTarifs'] = $lesTarifs;
// liste des activités
$activites = Utils::getActivites();
foreach ($activites as $num => $activite)
// activités correspondants aux tarifs sélectionnés
$lesActivites = array();
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é
$activite->{'tarifs'} = Utils::getTarifs($activite->{'idActivite'});
}
$versement = $params['versement'];
$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
$tpl->assign('lesActivites', $lesActivites);
$tpl->assign('lesTarifs', $lesTarifs);
$tpl->assign('lesVersements', $_SESSION['lesVersements']);
$tpl->assign('listeParActiviteEtTarif', $activites);
$tpl->assign('plugin_css', ['style.css']);
// envoyer au template

View File

@ -2,19 +2,35 @@
namespace Garradin;
use Garradin\Plugin\RecusFiscaux\Personne;
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
$_SESSION['annee_recu'] = f('annee_recu');
// error_log("vp.php::annee_recu = (" .$_SESSION['annee_recu'] . ")");
if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") {
\Garradin\Utils::redirect(PLUGIN_URL . 'index.php');
}
// liste des versements totaux par personne
// versements totaux par personne
$_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
$tpl->assign('lesVersementsTotaux', $_SESSION['lesVersementsTotaux']);
$tpl->assign('lesDonateurs', $membresDonateurs);
$tpl->assign('plugin_css', ['style.css']);
// envoyer au template