nouvelle version des structures de données

FossilOrigin-Name: ff5fc2aff4eab5aa2817d5b6183a5ab842bc701609fb255e97728a2a95e19c14
This commit is contained in:
engel 2022-02-10 16:05:24 +00:00
parent 2a7f5ad834
commit 341afe6a7b
9 changed files with 263 additions and 109 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,19 +19,31 @@ 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();
}
public static function copier($p)
{
return new Personne(
$p->id,
$p->nomPrenom,
$p->adresse,
$p->codePostal,
$p->ville,
$p->courriel);
}
/*
* ajouter un versement pour une activité et un tarif donnés
*/

View File

@ -135,8 +135,8 @@ class RecusPDF extends tFPDF
$nom,
$lesMontants,
$adresse,
$ville,
$code_postal)
$code_postal,
$ville)
{
$this->AddPage();

View File

@ -7,10 +7,79 @@ 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.id, acc_transactions.date',
'"%Y"',
$annee,
$db->where('id', $tarifs));
return $db->get($sql);
}
// ------------------------------------------------------------
/**
* @return liste des activités
*/
public static function getActivites()
public static function getToutesActivites()
{
return DB::getInstance()->get(
"SELECT
@ -26,7 +95,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

View File

@ -7,6 +7,7 @@ class Versement
public $idActivite;
public $idTarif;
public $montant;
public $tauxReduction;
public function __construct(
$idActivite,

View File

@ -3,7 +3,6 @@
<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>
@ -16,67 +15,46 @@
<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; ?>
{* 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}
{* fermer le tableau précédent *}
{* 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}
{* 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 *}
<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>
@ -34,8 +34,8 @@
<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>{$versement.ville}</td>
</tr>
{/foreach}
</tbody>

View File

@ -14,7 +14,6 @@ $versementsSelectionnes = array();
foreach ($lesLignes as $indice => $ligne) {
$versementsSelectionnes[] = $_SESSION['lesVersements'][$ligne];
}
// cumuler les versements d'une personne
$totalPersonnes = cumulerVersements($versementsSelectionnes);
@ -51,8 +50,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 +72,36 @@ $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
* @return tableau des versements cumulés
*/
function cumulerVersements($versements)
{
$totalPersonnes = array();
$idActivite_courant = -1;
$idTarif_courant = -1;
$idPersonne_courant = -1;
$totalVersements = 0;
foreach ($versements as $ligne) {
if (
$ligne->idActivite != $idActivite_courant ||
$ligne->idTarif != $idTarif_courant ||
$ligne->idUser != $idPersonne_courant
) {
if ($idActivite_courant != -1) {
if ($idTarif_courant != -1) {
$totalPersonnes["$idPersonne_courant"]->ajouterVersement(
$idActivite_courant,
$_SESSION['lesTarifs'][$idTarif_courant]->idActivite,
$idTarif_courant,
$totalVersements/100
);
}
$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
@ -119,7 +110,7 @@ function cumulerVersements($versements)
}
// et le dernier
$totalPersonnes["$idPersonne_courant"]->ajouterVersement(
$idActivite_courant,
$_SESSION['lesTarifs'][$idTarif_courant]->idActivite,
$idTarif_courant,
$totalVersements/100
);

View File

@ -45,8 +45,8 @@ foreach ($versementsSelectionnes as $idPersonne => $personne) {
$personne->nom,
array($personne->montant/100),
$personne->adresse,
$personne->ville,
$personne->codePostal
$personne->codePostal,
$personne->ville
);
// fabriquer le nom du fichier PDF
$nom = str_replace(' ', '_', $personne->nom);

View File

@ -2,41 +2,144 @@
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[] = $valRadio ? $valRadio: $plugin->getConfig()->reduction[0]->taux;
}
// error_log("Tarifs = " . print_r($lesTarifs, true) . "\n");
// error_log("Réducs = " . print_r($lesTaux, true) . "\n");
// 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 versements correspondants
$_SESSION['lesVersements'] = Utils::getVersementsActivite($_SESSION['annee_recu'], $lesTarifs);
// 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;
// liste des activités
$activites = Utils::getActivites();
foreach ($activites as $num => $activite)
// versements correspondants aux tarifs sélectionnés
$_SESSION['lesVersements'] = Utils::getVersementsTarifs($_SESSION['annee_recu'], $tarifsSelectionnes);
// membres donateurs
$membresDonateurs = array();
$versementsMembres = Utils::getVersementsTotaux($_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