diff --git a/lib/Activite.php b/lib/Activite.php deleted file mode 100644 index d59c950..0000000 --- a/lib/Activite.php +++ /dev/null @@ -1,33 +0,0 @@ -id = $id; - $this->label = $label; - $this->description = $description; - } - - /* - * @return instance de Activite initialisée avec l'objet o - */ - public static function copier($o) - { - return new Activite( - $o->id, - $o->label, - $o->description); - } -} diff --git a/lib/Personne.php b/lib/Personne.php index 9a10979..8037c1a 100644 --- a/lib/Personne.php +++ b/lib/Personne.php @@ -8,29 +8,29 @@ namespace Garradin\Plugin\RecusFiscaux; class Personne { public $id; + public $rang; // par ordre alpha de nomPrenom ; sert aux tris public $nomPrenom; public $adresse; public $codePostal; public $ville; - public $courriel; public $versements; // versements par taux de réduction public function __construct( $id, + $rang, $nomPrenom, $adresse, $codePostal, - $ville, - $courriel = "" + $ville ) { $this->id = $id; + $this->rang = $rang; $this->nomPrenom = $nomPrenom; $this->adresse = $adresse; $this->codePostal = $codePostal; $this->ville = $ville; - $this->courriel = $courriel; - $this->versements = array(); // clé = tarif, valeur = montant + $this->versements = array(); // clé = tarif, valeur = Versement } /** @@ -40,30 +40,35 @@ class Personne { return new Personne( $this->id, + $this->rang, $this->nomPrenom, $this->adresse, $this->codePostal, - $this->ville, - $this->courriel); + $this->ville); } /** * ajouter un versement * @param $tauxReduction * @param $montant + * @param $dateMin + * @param $dateMax */ public function ajouterVersement( $tauxReduction, - $montant + $montant, + $dateMin, + $dateMax ) { if (array_key_exists($tauxReduction, $this->versements)) { - $this->versements[$tauxReduction] += $montant; + $this->versements[$tauxReduction]->ajouter($montant, $dateMin, $dateMax); } else { - $this->versements[$tauxReduction] = $montant; + $this->versements[$tauxReduction] = new Versement($montant, $dateMin, $dateMax); } } + } diff --git a/lib/Tarif.php b/lib/Tarif.php deleted file mode 100644 index 997b79b..0000000 --- a/lib/Tarif.php +++ /dev/null @@ -1,41 +0,0 @@ -id = $id; - $this->idActivite = $idActivite; - $this->label = $label; - $this->description = $description; - $this->montant = $montant; - } - - /* - * @return instance de Tarif initialisée avec l'objet o - */ - public static function copier($o) - { - return new Tarif( - $o->id, - $o->idActivite, - $o->label, - $o->description, - $o->montant); - } -} diff --git a/lib/Utils.php b/lib/Utils.php index 0080075..63f8de4 100644 --- a/lib/Utils.php +++ b/lib/Utils.php @@ -8,158 +8,299 @@ use KD2\ZipWriter; class Utils { /** - * @return tarifs demandés - * @param $tarifs + * @return informations sur les tarifs */ - public static function getTarifs(array $tarifs) : array + public static function getTarifs() { $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)); + 'SELECT + id, + id_service as idActivite, + label, + description, + amount as montant + FROM services_fees'); + return Utils::toAssoc($db->get($sql), 'id'); + } + + /** + * @return informations sur les activités + */ + public static function getActivites() + { + $db = DB::getInstance(); + $sql = sprintf( + 'SELECT + services.id, + services.label, + services.description + FROM services'); + return Utils::toAssoc($db->get($sql), 'id'); + } + + /** + * @return comptes sur lesquels des versements de membres ont été faits + * @param string $annee + * @param $op : opérateur de combinaison des comptes + * @param array $comptes + */ + public static function getComptes($annee, $op, $comptes) + { + $db = DB::getInstance(); + $sql = sprintf( + 'SELECT + acc_accounts.id, + acc_accounts.code as codeCompte, + acc_accounts.label as nomCompte + 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 acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime(%s, acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + GROUP by acc_accounts.id + ORDER by acc_accounts.id', + '"%Y"', + $annee, + $db->where('code', $op, $comptes) + ); + return Utils::toAssoc($db->get($sql), 'id'); + } + + /** + * @return tarifs des activités et comptes ayant des versements de + * membres dans l'année + * @param string $annee + * @param $op : opérateur de combinaison des comptes + * @param array $comptes + */ + public static function getTarifsComptes($annee, $op, $comptes) + { + $db = DB::getInstance(); + $sql = sprintf( + ' + SELECT + services_users.id_fee as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte + FROM acc_transactions_users + 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 + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id + WHERE + (strftime(%s, acc_transactions.date) = "%d" + AND + acc_accounts.%s + ) + GROUP BY services_fees.id,acc_accounts.id + ', + '"%Y"', + $annee, + $db->where('code', $op, $comptes) + ); return $db->get($sql); } /** - * @return activités correspondant aux tarifs demandés - * @param $tarifs + * faire un tableau associatif avec le résultat d'une requête */ - public static function getActivites(array $tarifs) : array + static function toAssoc($array, $nomCle) { - $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); + $assoc = array(); + foreach ($array as $elem) + { + $ro = new \ReflectionObject($elem); + $proprietes = $ro->getProperties(); + $obj = new \stdClass(); + foreach ($proprietes as $p) + { + $pname = $p->getName(); + if ($pname == $nomCle) { + $key = $p->getValue($elem); + } + else { + $obj->$pname = $p->getValue($elem); + } + } + $assoc[$key] = $obj; + } + return $assoc; } /** * @return versements correspondants à l'année donnée * @param $annee - * @param $champsNom : liste non vide des champs de nom/prénom + * @param array $champsNom : liste non vide des champs de nom/prénom */ - public static function getVersementsPersonnes($annee, array $champsNom) : array + public static function getVersementsPersonnes($annee, $op, $comptes, $champsNom) { $db = DB::getInstance(); $tri = Utils::combinerTri($champsNom); $sql = sprintf( 'SELECT membres.id as idUser, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, 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 acc_transactions_lines on acc_transactions_lines.id_transaction = acc_transactions.id + 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 acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id WHERE (strftime(%s, acc_transactions.date) = "%d" AND - acc_transactions_lines.credit > 0) - ORDER by %s, acc_transactions.date', + acc_accounts.%s + ) + ORDER by %s, acc_accounts.id, acc_transactions.date', '"%Y"', $annee, + $db->where('code', $op, $comptes), $tri ); return $db->get($sql); } /** - * @return versements correspondants à l'année et aux tarifs donnés - * triés par tarif, nom, date - * @param $annee - * @param $tarifs - * @param $champsNom : liste non vide des champs de nom/prénom + * @return versements correspondants à : + * @param $annee : année fiscale + * @param $tarifs : tarifs sélectionnés + * @param array $comptes : comptes associés aux tarifs + * @param array $champsNom : liste non vide des champs de nom/prénom + * @remarks tri par tarif, nom, compte, date */ - public static function getVersementsTarifs($annee, - array $tarifs, - array $champsNom) : array + public static function getVersementsTarifsComptes($annee, + $tarifs, + $comptes, + $champsNom) { $db = DB::getInstance(); $tri = Utils::combinerTri($champsNom); $sql = sprintf( 'SELECT - services_fees.id as idTarif, - membres.id as idUser, - acc_transactions_lines.credit as versement, - acc_transactions.date + services_fees.id as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, + 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 + 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 + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id WHERE - (strftime(%s, acc_transactions.date) = "%d" + (strftime(%s, acc_transactions.date) = "%d" AND - services_fees.%s + services_fees.%s AND - acc_transactions_lines.credit > 0) - ORDER by services_fees.id, %s, acc_transactions.date', + acc_accounts.%s + ) + ORDER by services_fees.id, %s, acc_accounts.id, acc_transactions.date', '"%Y"', $annee, - $db->where('id', $tarifs), + $db->where('id', 'in', $tarifs), + $db->where('id', 'in', $comptes), $tri ); return $db->get($sql); } /** - * @return versements correspondants à l'année et aux comptes donnés - * @param $annee - * @param $comptes - * @param $champsNom : liste non vide des champs de nom/prénom + * @return versements correspondants à : + * @param $annee année fiscale + * @param $comptesIsoles comptes NON associés à un tarif + * @param array $champsNom : liste non vide des champs de nom/prénom + * @remarks tri par nom, compte, date */ public static function getVersementsComptes($annee, - array $comptes, - array $champsNom) : array + $comptesIsoles, + $champsNom) { $db = DB::getInstance(); $tri = Utils::combinerTri($champsNom); $sql = sprintf( - 'SELECT - acc_accounts.code as compte, + ' + SELECT + 0 as idTarif, + acc_accounts.id as idCompte, + acc_accounts.code as codeCompte, 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 acc_transactions_lines on acc_transactions_lines.id_transaction = acc_transactions.id + 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 acc_transactions_lines + ON acc_transactions_lines.id_transaction = acc_transactions.id + INNER JOIN acc_accounts + ON acc_transactions_lines.id_account = acc_accounts.id WHERE (strftime(%s, acc_transactions.date) = "%d" AND - acc_accounts.%s - AND - acc_transactions_lines.credit > 0) - ORDER by acc_accounts.code, %s, acc_transactions.date', + acc_accounts.%s + ) + + ORDER by %s, acc_accounts.id, acc_transactions.date + ', '"%Y"', $annee, - $db->where('code', $comptes), + $db->where('id', 'in', $comptesIsoles), $tri ); return $db->get($sql); } /** - * Versements totaux par personne pour une année donnée - * @param année - * @param $champsNom : liste non vide des champs de nom/prénom + * @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 getVersementsTotaux($annee, array $champsNom) : array + public static function getDonateurs($annee, $champsNom) : array { + // concaténer les champs nom/prénoms pour la sélection + $nom = Utils::combinerChamps($champsNom); + // et pour le tri $tri = Utils::combinerTri($champsNom); $sql = sprintf( 'SELECT membres.id as idUser, - sum(acc_transactions_lines.credit) AS versement + row_number() over(order by %s) as rang, + %s as nom, + membres.adresse as adresse, + membres.code_postal as codePostal, + membres.ville as ville FROM acc_transactions_users, membres, @@ -168,27 +309,38 @@ class Utils ON acc_transactions_lines.id_transaction = acc_transactions.id WHERE ( strftime(%s, acc_transactions.date) = "%d" - 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 %s COLLATE U_NOCASE', + GROUP by membres.id + ORDER by %1$s COLLATE U_NOCASE + ', + $tri, + $nom, '"%Y"', - $annee, - $tri); - return DB::getInstance()->get($sql); + $annee + ); + $donateurs = array(); + foreach (DB::getInstance()->iterate($sql) as $personne) + { + $donateurs[$personne->idUser] = new Personne($personne->idUser, + $personne->rang, + $personne->nom, + $personne->adresse, + $personne->codePostal, + $personne->ville); + } + return $donateurs; } /** * combiner les champs avec un opérateur - * @param $champs : liste (non vide) de champs + * @param array $champs : liste (non vide) de champs * @return chaîne combinée */ - private static function combinerChamps(array $champs) : string + private static function combinerChamps($champs) { $op = ' || " " || '; $result = 'ifnull(membres.' . $champs[0] . ', "")'; @@ -196,7 +348,7 @@ class Utils { $result .= $op . 'ifnull(membres.' . $champs[$i] . ', "")'; } - return $result; + return 'trim(' . $result . ')'; } /** @@ -215,102 +367,7 @@ class Utils } /** - * @return personnes ayant versé des dons pour une année donnée - * @param $annee - * @param $champsNom : champs qui définissent le nom et le prénom d'une personne - */ - public static function getDonateurs($annee, array $champsNom) : array - { - // concaténer les champs nom/prénoms pour la sélection - $nom = 'trim(' . Utils::combinerChamps($champsNom) . ') as nom,'; - // et pour le tri - $tri = Utils::combinerTri($champsNom); - $sql = - "SELECT - membres.id as idUser, - " . - $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 " . $tri . " COLLATE U_NOCASE - "; - $donateurs = array(); - foreach (DB::getInstance()->iterate($sql, $annee) as $personne) - { - $donateurs[$personne->idUser] = new Personne($personne->idUser, - $personne->nom, - $personne->adresse, - $personne->codePostal, - $personne->ville); - } - return $donateurs; - } - - /** - * renvoie un tableau avec les remarques de chaque taux de réduction - */ - public static function getLignesReduction(array $lesTaux) : array - { - foreach ($lesTaux as $elem) - { - /* - $ligne = "taux " . $elem->taux . ", ligne " . $elem->ligne; - if ($elem->remarque != "") { - $ligne .= ", " . $elem->remarque; - } - $lignes[$elem->taux] = $ligne; - */ - $lignes[$elem->taux] = $elem->remarque; - } - return $lignes; - } - - public static function getLigneReduction($taux) - { - return $_SESSION['ligneReduction'][$taux]; - } - - /** - * @return array liste de toutes les activités, tarifs et comptes associés - */ - public static function getActivitesTarifsEtComptes() - { - return DB::getInstance()->get( - "SELECT - services.id as idActivite, - services.label as titreActivite, - services.description as descActivite, - services_fees.id as idTarif, - services_fees.label as titreTarif, - services_fees.description as descTarif, - acc_accounts.code as numeroCpt, - acc_accounts.label as nomCpt - FROM services - LEFT JOIN services_fees ON services_fees.id_service = services.id - LEFT JOIN acc_accounts ON services_fees.id_account = acc_accounts.id - ORDER BY services.label" - ); - } - - /** - * @return array liste des années fiscales + * @return liste des années fiscales */ public static function getAnneesFiscales() : array { @@ -326,6 +383,15 @@ class Utils return $anneesFiscales; } + public static function getLignesReduction($lesTaux) + { + foreach ($lesTaux as $elem) + { + $lignes[$elem->taux] = $elem->remarque; + } + return $lignes; + } + /** * récupérer dans la config du plugin les champs des membres * utilisés pour le nom et le prénom ; ajouter/supprimer les diff --git a/lib/Versement.php b/lib/Versement.php index 3ac3f07..e52f98c 100644 --- a/lib/Versement.php +++ b/lib/Versement.php @@ -4,21 +4,37 @@ namespace Garradin\Plugin\RecusFiscaux; class Versement { - public $idActivite; - public $idTarif; - public $montant; - public $tauxReduction; + public $montant; + public $dateMin; // estampille + public $dateMax; // estampille public function __construct( - $idActivite, - $idTarif, $montant, - $tauxReduction + $dateMin, + $dateMax ) { - $this->idActivite = $idActivite; - $this->idTarif = $idTarif; $this->montant = $montant; - $this->tauxReduction = $tauxReduction; + $this->dateMin = $dateMin; + $this->dateMax = $dateMax; } + + /** + * ajouter un versement en fixant les dates min et max + * @param $montant + * @param $dateMin + * @param $dateMax + */ + public function ajouter($montant, $dateMin, $dateMax) + { + $this->montant += $montant; + if ($dateMin < $this->dateMin) + { + $this->dateMin = $dateMin; + } + if ($dateMax > $this->dateMax) + { + $this->dateMax = $dateMax; + } + } } diff --git a/templates/_nav.tpl b/templates/_nav.tpl index f909c92..8eec7e7 100644 --- a/templates/_nav.tpl +++ b/templates/_nav.tpl @@ -6,7 +6,7 @@ {/if} - - @@ -169,8 +195,8 @@ for (var laCase of document.querySelectorAll("input[type=checkbox]")) { laCase.addEventListener('change', (evt) => { var idCase = evt.target; - // chercher la ligne englobante () - var ligne = idCase.closest("tr"); + // chercher la ligne englobante (
  • ) + var ligne = idCase.closest("li"); // itérer sur les radio de cette ligne var lesRadios = ligne.querySelectorAll('input[type=radio]'); for (var idRadio of lesRadios) { diff --git a/templates/recu.skel b/templates/recu.skel index 8638f19..fd203ef 100644 --- a/templates/recu.skel +++ b/templates/recu.skel @@ -117,7 +117,14 @@ {{if $libelle != ""}} ({{$libelle}}) {{/if}} +
    date des versements : + {{if $dateMin == $dateMax}} + le {{$dateMin}} + {{else}} + du {{$dateMin}} au {{$dateMax}} + {{/if}}
  • +
    {{/versements}} diff --git a/templates/versements_activites.tpl b/templates/versements_activites.tpl index 7b04e84..c0668f9 100644 --- a/templates/versements_activites.tpl +++ b/templates/versements_activites.tpl @@ -1,65 +1,78 @@ -{include file="%s/templates/_nav.tpl"|args:$plugin_root current_nav="versements"} +{include file="%s/templates/_nav.tpl"|args:$plugin_root current_nav="activite"}

    Versements par activité et tarif

    - - - - - + + + + +
    {* Itération sur les versements *} - - {foreach from=$lesVersements key="num" item="versement"} + {foreach from=$lesVersements key="rang" item="versement"} {if $rang == 0} {* premier versement *} idTarif; - $personneCourante = $versement->idUser; + $pair = true; + $tarifCourant = $versement->idTarif; + $personneCourante = $versement->idUser; + $compteCourant = $versement->idCompte; ?> {afficher_debut_tarif versement=$versement} {afficher_debut_personne user=$personneCourante idVersement="%s_%s"|args:$tarifCourant,$personneCourante} - {afficher_versement versement=$versement idVersement="%s_%s"|args:$tarifCourant,$personneCourante num=$num rang=$rang} - {else} - {* autre versement *} - {if $versement.idTarif != $tarifCourant} - {* changement de tarif *} - {* fin versements d'une personne *} - {* fin versements d'une personne *} - {* fin tarif *} - idTarif; $personneCourante = $versement->idUser; - ?> - {afficher_debut_tarif versement=$versement} - {afficher_debut_personne user=$personneCourante idVersement="%s_%s"|args:$tarifCourant,$personneCourante} - {afficher_versement versement=$versement idVersement="%s_%s"|args:$tarifCourant,$personneCourante num=$num rang=$rang} - {elseif $versement.idUser != $personneCourante} - {* changement de personne *} - - - - idCompte; + ?> + {afficher_debut_tarif versement=$versement} + {afficher_debut_personne user=$personneCourante idVersement="%s_%s"|args:$tarifCourant,$personneCourante} + {afficher_debut_compte idCompte=$compteCourant} + {elseif $versement.idUser != $personneCourante} + {* changement de personne *} + {fin_compte} + {fin_personne} + idUser; - ?> - {afficher_debut_personne user=$personneCourante idVersement="%s_%s"|args:$tarifCourant,$personneCourante} - {afficher_versement versement=$versement idVersement="%s_%s"|args:$tarifCourant,$personneCourante num=$num rang=$rang} - {else} - {* même personne *} - {afficher_versement versement=$versement idVersement="%s_%s"|args:$tarifCourant,$personneCourante num=$num rang=$rang} - {/if} + $compteCourant = $versement->idCompte; + ?> + {afficher_debut_personne user=$personneCourante idVersement="%s_%s"|args:$tarifCourant,$personneCourante} + {afficher_debut_compte idCompte=$compteCourant} + {elseif $versement.idCompte != $compteCourant} + {fin_compte} + {* changement de compte *} + idCompte; + ?> + {afficher_debut_compte idCompte=$compteCourant} + {else} + {* même personne, même compte *} {/if} - - {/foreach} {* Itération sur les versements *} - {* fin versements d'une personne *} - {* fin versements d'une personne *} - {* fin tarif *} + {afficher_versement versement=$versement idVersement="%s_%s"|args:$tarifCourant,$personneCourante rang=$rang pair=$pair} + + {/foreach} {* Itération sur les versements *} + {fin_compte} + {fin_personne} + {fin_tarif}
    diff --git a/templates/versements_personnes.tpl b/templates/versements_personnes.tpl index 46364d0..27dd96d 100644 --- a/templates/versements_personnes.tpl +++ b/templates/versements_personnes.tpl @@ -14,36 +14,46 @@ onclick="return verifierChoix(this.form)" /> -
    + {* Itération sur les personnes *} - - {foreach from=$lesVersements key="num" item="versement"} + {foreach from=$lesVersements key="rang" item="versement"} {if $rang == 0} {* 1ère personne *} idUser; + $pair = true; + $personneCourante = $versement->idUser; + $compteCourant = $versement->idCompte; ?> {afficher_debut_personne user=$personneCourante idVersement=$personneCourante} - {afficher_versement versement=$versement idVersement=$personneCourante num=$num rang=$rang} + {afficher_debut_compte idCompte=$compteCourant} {elseif $versement.idUser != $personneCourante} {* changement de personne *} - - - + {fin_compte} + {fin_personne} idUser; + $pair = true; + $personneCourante = $versement->idUser; + $compteCourant = $versement->idCompte; ?> {afficher_debut_personne user=$personneCourante idVersement=$personneCourante} - {afficher_versement versement=$versement idVersement=$personneCourante num=$num rang=$rang} + {afficher_debut_compte idCompte=$compteCourant} + {elseif $versement.idCompte != $compteCourant} + {fin_compte} + {* changement de compte *} + idCompte; + ?> + {afficher_debut_compte idCompte=$compteCourant} {else} - {* même personne *} - {afficher_versement versement=$versement idVersement=$personneCourante num=$num rang=$rang} + {* même personne, même compte *} {/if} - + {afficher_versement versement=$versement idVersement=$personneCourante rang=$rang pair=$pair} + {/foreach} {* Itération sur les personnes *} - - + {fin_compte} + {fin_personne}
    diff --git a/www/admin/action.php b/www/admin/action.php index 75b5426..67602ac 100644 --- a/www/admin/action.php +++ b/www/admin/action.php @@ -8,12 +8,6 @@ use Garradin\Plugin\RecusFiscaux\Utils; // opérations communes // ------------------------------------------------------------------------ -// vérifier si l'année a bien été sélectionnée au préalable -$_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 = Utils::getChampsNom($config, $plugin); uasort($confNoms, function ($a, $b) @@ -30,6 +24,37 @@ foreach ($confNoms as $nom => $champ) $_SESSION['membresDonateurs'] = Utils::getDonateurs($_SESSION['annee_recu'], $champsNom); +// comparaison de lignes de versements +// comparer 2 lignes selon le nom +function comparerNoms($ligne1, $ligne2) +{ + return + $_SESSION['membresDonateurs'][$ligne1->idUser]->rang + - + $_SESSION['membresDonateurs'][$ligne2->idUser]->rang; +} + +// comparer 2 activités par leur libellé +function comparerActivites($ligne1, $ligne2) +{ + return strcoll( + $_SESSION['lesActivites'][$_SESSION['lesTarifs'][$ligne1->idTarif]->idActivite]->label, + $_SESSION['lesActivites'][$_SESSION['lesTarifs'][$ligne2->idTarif]->idActivite]->label); +} + +// comparer 2 lignes selon la date +function comparerDate($ligne1, $ligne2) +{ + return + strtotime($ligne1->date) - strtotime($ligne2->date); +} + +// comparer 2 lignes selon un champ numérique entier +function comparerChamp($ligne1, $ligne2, $champ) +{ + return $ligne1->$champ - $ligne2->$champ; +} + // ------------------------------------------------------------------------ // fonctions pour l'affichage // ------------------------------------------------------------------------ @@ -39,27 +64,48 @@ $tpl->register_function('afficher_debut_tarif', function ($params) { $versement = $params['versement']; $idTarif = $versement->idTarif; - $tarif = $_SESSION['lesTarifs'][$idTarif]; - $idActivite = $tarif->idActivite; - $activite = $_SESSION['lesActivites'][$idActivite]; - - $out = '
    - '; - $out .= sprintf(' -

    Activité « %s »

    ', $activite->label); - if (!empty($activite->description)) { + + $out = sprintf(' +
    + +
    + ', + $idTarif); + if ($idTarif == 0) { + // versement sur un compte non rattaché à une activité $out .= sprintf(' -

    %s

    ', $activite->description); +
    '; + $out .= ' + + +
    '; return $out; }); @@ -70,25 +116,33 @@ $tpl->register_function('afficher_debut_personne', function ($params) $idVersement = $params['idVersement']; $personne = $_SESSION['membresDonateurs'][$idUser]; - $out = '
    - -

    '; - $out .= sprintf(' - ', - $idVersement, - $idVersement); - $out .= sprintf(' -

    '; - $out .= sprintf(' -
    ', - $idVersement); + $out = sprintf(' +
    + +
    + + +
    +
    +
    ', + $idVersement, + $personne->nomPrenom + ); + return $out; +}); + +// afficher infos compte +$tpl->register_function('afficher_debut_compte', function ($params) +{ + $idCompte = $params['idCompte']; + $out = sprintf(' +
    +

    Compte N° %1$s : %2$s

    ', + $_SESSION['comptes'][$idCompte]->codeCompte, + $_SESSION['comptes'][$idCompte]->nomCompte); return $out; }); @@ -97,45 +151,65 @@ $tpl->register_function('afficher_versement', function ($params) { $versement = $params['versement']; $idVersement = $params['idVersement']; - $num = $params['num']; $rang = $params['rang']; + $pair = $params['pair']; $out = '
    ' : 'impair">'; + $out .= $pair ? 'pair">' : 'impair">'; $out .= sprintf(' - ', - $idVersement, - $idVersement, $rang, - $num, - $idVersement, $rang, $idVersement - ); - $out .= sprintf(' -
    ', $idVersement, $rang, - $versement->versement/100 - ); - $out .= sprintf(' - %s', - date_format(date_create($versement->date),"d/m/Y")); - $out .= sprintf(' - -
    ' + number_format( + $versement->versement/100, + 2, + ",", + " " + ), + date_format(date_create($versement->date),"d/m/Y") ); return $out; }); +$tpl->register_function('fin_compte', function () +{ + $out = ' +
    '; + return $out; +}); + +$tpl->register_function('fin_personne', function () +{ + $out = ' + +
    '; + return $out; +}); + +$tpl->register_function('fin_tarif', function ($params) +{ + $out = ' +
    '; + return $out; +}); + // ------------------------------------------------------------------------ // aiguillage // ------------------------------------------------------------------------ if ($_GET['action'] == 'personne') { require('versements_personnes.php'); -} else { +} else if ($_GET['action'] == 'compte') { + require('versements_personnes.php'); +} else if ($_GET['action'] == 'activite') { require('versements_activites.php'); } diff --git a/www/admin/choix_annee.php b/www/admin/choix_annee.php new file mode 100644 index 0000000..a10167a --- /dev/null +++ b/www/admin/choix_annee.php @@ -0,0 +1,24 @@ +assign('anneesFiscales', $anneesFiscales); +$tpl->assign('annee_recu', $_SESSION['annee_recu']); +$tpl->assign('from', qg('from')); + +$tpl->display(PLUGIN_ROOT . '/templates/choix_annee.tpl'); diff --git a/www/admin/generer_recus.php b/www/admin/generer_recus.php index ef64c07..34ab58d 100644 --- a/www/admin/generer_recus.php +++ b/www/admin/generer_recus.php @@ -49,6 +49,9 @@ elseif ($nbArticles > 1) } } +// libellés pour les taux de réduction +$libelles_taux = Utils::getLignesReduction($plugin->getConfig('reduction')); + // filtrer les versements sélectionnés $lesLignes = f('selected'); $versementsSelectionnes = array(); @@ -88,19 +91,20 @@ foreach ($totalPersonnes as $idPersonne => $personne) // les versements $tpl->registerSection('versements', - function () use($personne) + function () use($personne, $libelles_taux) { - foreach ($personne->versements as $taux => $montant) + foreach ($personne->versements as $taux => $versement) { - $ligne['montant'] = $montant; - $ligne['libelle'] = Utils::getLigneReduction($taux); + $ligne['montant'] = $versement->montant; + $ligne['libelle'] = $libelles_taux[$taux]; + $ligne['dateMin'] = date("d/m/Y", $versement->dateMin); + $ligne['dateMax'] = date("d/m/Y", $versement->dateMax); yield $ligne; } }); // mentions complémentaires $donnees = array( - 'Date des versements : ' => "année " . $_SESSION['annee_recu'], 'Nature du don : ' => "Numéraire", 'Mode de versement : ' => "chèque et/ou virement" ); @@ -150,6 +154,12 @@ $fichierZip = Utils::makeArchive( // unlink($f); // } +//supprimer les fichiers pdf (utile ?) +// foreach ($listeFichiersPDF as $f) +// { +// unlink($f); +// } + /** * Cumuler les versements de chaque personne * @param tableau des versements triés par idUser, date @@ -159,6 +169,8 @@ function cumulerVersementsPersonne($versements) { $totalPersonnes = array(); $idPersonneCourant = -1; + $dateMin = PHP_INT_MAX; + $dateMax = -1; $totalVersements = 0; foreach ($versements as $ligne) { @@ -169,9 +181,13 @@ function cumulerVersementsPersonne($versements) { $totalPersonnes[$idPersonneCourant]->ajouterVersement( $_SESSION['taux_reduction'], - $totalVersements + $totalVersements, + $dateMin, + $dateMax ); } + $dateMin = strtotime($ligne->date); + $dateMax = strtotime($ligne->date); $idPersonneCourant = $ligne->idUser; $totalVersements = $ligne->versement; // créer les infos de la personne, sauf si elle est déjà présente @@ -180,14 +196,18 @@ function cumulerVersementsPersonne($versements) $totalPersonnes["$idPersonneCourant"] = $_SESSION['membresDonateurs'][$ligne->idUser]->clone(); } } else { - // cumuler versements + // même personne : cumuler versements et mettre à jour les dates $totalVersements += $ligne->versement; + if (strtotime($ligne->date) < $dateMin) { $dateMin = strtotime($ligne->date); } + if (strtotime($ligne->date) > $dateMax) { $dateMax = strtotime($ligne->date); } } } // et le dernier $totalPersonnes[$idPersonneCourant]->ajouterVersement( $_SESSION['taux_reduction'], - $totalVersements + $totalVersements, + $dateMin, + $dateMax ); return $totalPersonnes; } @@ -202,39 +222,58 @@ function cumulerVersementsTarif($versements) $totalPersonnes = array(); $idTarifCourant = -1; $idPersonneCourant = -1; + $idCompteCourant = -1; + $dateMin = PHP_INT_MAX; + $dateMax = -1; $totalVersements = 0; foreach ($versements as $ligne) { if ( - $ligne->idTarif != $idTarifCourant || - $ligne->idUser != $idPersonneCourant + $ligne->idTarif != $idTarifCourant || + $ligne->idUser != $idPersonneCourant || + $ligne->idCompte != $idCompteCourant ) { if ($idTarifCourant != -1) { - // changement de tarif ou de personne + // changement de tarif, de personne ou de compte + $tarifCompte = ($idTarifCourant == 0) ? + $idCompteCourant : + $idTarifCourant . "_" . $idCompteCourant; $totalPersonnes[$idPersonneCourant]->ajouterVersement( - $_SESSION['tauxSelectionnes'][$idTarifCourant], - $totalVersements + $_SESSION['tauxSelectionnes'][$tarifCompte], + $totalVersements, + $dateMin, + $dateMax ); } - $idTarifCourant = $ligne->idTarif; + $dateMin = strtotime($ligne->date); + $dateMax = strtotime($ligne->date); + $idTarifCourant = $ligne->idTarif; $idPersonneCourant = $ligne->idUser; - $totalVersements = $ligne->versement; + $idCompteCourant = $ligne->idCompte; + $totalVersements = $ligne->versement; // créer les infos de la personne, sauf si elle est déjà présente if (!array_key_exists($idPersonneCourant, $totalPersonnes)) { $totalPersonnes["$idPersonneCourant"] = $_SESSION['membresDonateurs'][$ligne->idUser]->clone(); } } else { - // cumuler versements + // même personne : cumuler versements et mettre à jour les dates $totalVersements += $ligne->versement; + if (strtotime($ligne->date) < $dateMin) { $dateMin = strtotime($ligne->date); } + if (strtotime($ligne->date) > $dateMax) { $dateMax = strtotime($ligne->date); } } } // et le dernier + $tarifCompte = ($idTarifCourant == 0) ? + $idCompteCourant : + $idTarifCourant . "_" . $idCompteCourant; $totalPersonnes[$idPersonneCourant]->ajouterVersement( - $_SESSION['tauxSelectionnes'][$idTarifCourant], - $totalVersements + $_SESSION['tauxSelectionnes'][$tarifCompte], + $totalVersements, + $dateMin, + $dateMax ); return $totalPersonnes; } diff --git a/www/admin/index.php b/www/admin/index.php index 3791e44..a7e73a5 100644 --- a/www/admin/index.php +++ b/www/admin/index.php @@ -4,17 +4,13 @@ namespace Garradin; use Garradin\Plugin\RecusFiscaux\Utils; -// première année d'exercice -$anneeCourante = date("Y"); -$anneesFiscales = Utils::getAnneesFiscales(); -if ($anneesFiscales[0] < $anneeCourante) { - array_unshift($anneesFiscales, $anneeCourante); +// Année fiscale par défaut +if (! isset($_SESSION['annee_recu']) || $_SESSION['annee_recu'] == "") +{ + $_SESSION['annee_recu'] = date("Y") - 1; } -// 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 +// nombre de taux de réduction activés $nbTaux = 0; foreach ($plugin->getConfig('reduction') as $taux) { @@ -24,7 +20,6 @@ foreach ($plugin->getConfig('reduction') as $taux) // idem avec les champs nom/prénom $nbChamps = 0; $champsNom = Utils::getChampsNom($config, $plugin); - if (null !== $champsNom) { foreach ($champsNom as $nom => $champ) @@ -33,14 +28,36 @@ if (null !== $champsNom) } } +// comptes sur lesquels des versements de membres ont été faits +// pendant l'année fiscale choisie +$_SESSION['comptes'] = Utils::getComptes($_SESSION['annee_recu'], 'like', '7%'); + // liste des activités, cotisations et comptes associés -$activitesTarifsComptes = Utils::getActivitesTarifsEtComptes(); +$activitesTarifsComptes = Utils::getTarifsComptes($_SESSION['annee_recu'], 'like', '7%'); +$_SESSION['lesTarifs'] = Utils::getTarifs(); +$_SESSION['lesActivites'] = Utils::getActivites(); + +// liste des comptes associés à aucune activité +$comptesSansActivite = array(); +foreach ($_SESSION['comptes'] as $id => $elem) +{ + $trouve = false; + foreach ($activitesTarifsComptes as $elem) + { + if ($id == $elem->idCompte) { $trouve = true ; break; } + } + if (! $trouve) { $comptesSansActivite[] = $id; } +} // préparation de l'affichage -$tpl->assign('anneesFiscales', $anneesFiscales); -$tpl->assign('anneeCourante', $anneeCourante); +$tpl->assign('annee_recu', $_SESSION['annee_recu']); +$tpl->assign('lesComptes', $_SESSION['comptes']); +$tpl->assign('lesTarifs', $_SESSION['lesTarifs']); +$tpl->assign('lesActivites', $_SESSION['lesActivites']); $tpl->assign('activitesTarifsComptes', $activitesTarifsComptes); +$tpl->assign('comptesSansActivite', $comptesSansActivite); $tpl->assign('nbTarifs', count($activitesTarifsComptes)); +$tpl->assign('nbComptes', count($_SESSION['comptes'])); $tpl->assign('plugin_config', $plugin->getConfig()); $tpl->assign('nbTaux', $nbTaux); $tpl->assign('nbChamps', $nbChamps); diff --git a/www/admin/script.js b/www/admin/script.js index 71395f7..883517c 100644 --- a/www/admin/script.js +++ b/www/admin/script.js @@ -1,8 +1,8 @@ "use strict"; /** - * Fonction appelée quand on (dé)coche la case de sélection globale - * (dé)sélectionner toutes les cases à cocher de toutes les activités + * Fonction appelée quand on (dé)coche la case globale + * (dé)sélectionner toutes les cases de toutes les activités * @param {HTMLInputElement} idCaseGlobale id de la case globale */ function cocherDecocherTout(idCaseGlobale) @@ -11,21 +11,32 @@ function cocherDecocherTout(idCaseGlobale) let lesDetails = document.querySelectorAll("details.activite"); for (let i = 0; i < lesDetails.length; ++i) { - // itérer sur les personnes - let lesPersonnes = lesDetails[i].querySelectorAll("h4.personne"); - cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); + let idCase = lesDetails[i].querySelector("input[type=checkbox]"); + idCase.checked = idCaseGlobale.checked; + cocherDecocherTarif(idCase); } // changer le message changerMessage(idCaseGlobale.nextElementSibling, idCaseGlobale); } +/** + * Fonction appelée quand on (dé)coche la case d'activité + * (dé)sélectionner toutes les cases de cette activité + * @param {HTMLInputElement} idCaseGlobale id de la case d'activité + */ +function cocherDecocherTarif(idCaseGlobale) +{ + let lesPersonnes = idCaseGlobale.closest("details").querySelectorAll("div.personne"); + cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); +} + /** * idem dans le cas des versements des personnes - * @param {HTMLInputElement} idCaseGlobale id de la case globale + * @param {HTMLInputElement} idCaseGlobale id case à cocher d'une personne */ function cocherDecocherToutesLesPersonnes(idCaseGlobale) { - let lesPersonnes = document.querySelectorAll("h4.personne"); + let lesPersonnes = document.querySelectorAll("div.personne"); cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes); changerMessage(idCaseGlobale.nextElementSibling, idCaseGlobale); } @@ -49,7 +60,7 @@ function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes) } /** - * Fonction appelée quand on (dé)coche la case globale d'une personne + * Fonction appelée quand on (dé)coche la case d'une personne * - (dé)sélectionner toutes les cases à cocher * - faire le total des cases cochées et l'afficher * @param {HTMLInputElement} idCase id de la case qui a été cochée @@ -58,15 +69,13 @@ function cocherDecocherLesPersonnes(idCaseGlobale, lesPersonnes) function cocherDecocherPersonne(idCase, idTotal) { // chercher le fieldset des versements - let fieldset = idCase.closest("details").querySelector("fieldset"); + let fieldset = idCase.closest("details").querySelector("div.versements"); let listeCases = fieldset.querySelectorAll("input[type=checkbox]"); for (let i = 0; i < listeCases.length; ++i) { listeCases[i].checked = idCase.checked; + cocherDecocherVersement(listeCases[i], idTotal); } - // calculer et afficher le total - let listeMontants = fieldset.querySelectorAll("span.montant"); - calculerTotal(listeCases, listeMontants, idTotal); } /** @@ -78,7 +87,7 @@ function cocherDecocherPersonne(idCase, idTotal) */ function cocherDecocherVersement(idCase, idTotal) { - let fieldset = idCase.closest("fieldset"); + let fieldset = idCase.closest("div.versements"); let listeCases = fieldset.querySelectorAll("input[type=checkbox]"); let listeMontants = fieldset.querySelectorAll("span.montant"); calculerTotal(listeCases, listeMontants, idTotal); @@ -144,31 +153,26 @@ function verifierChoix(formulaire) } /** + * positionner l'action déclenchée par l'envoi du formulaire * afficher et masquer des portions de formulaire selon l'action * @param {HTMLFormElement} formulaire * @param {string} action après envoi du formulaire - * @param {any} nomClasse1 classe des éléments à afficher - * @param {any} nomClasse2 classe des éléments à masquer + * @param {any} idElem id de l'élément à afficher + * @param {any} nomClasse classe des éléments à masquer (sauf idElem) */ -function choixMethodeGeneration(formulaire, action, nomClasse1, nomClasse2) +function choixMethodeGeneration(formulaire, action, idElem, nomClasse) { formulaire.setAttribute('action', 'action.php?action=' + action); - afficherMasquer(formulaire, nomClasse1, nomClasse2); -} - -/** - * afficher et masquer des portions de formulaire - * @param {HTMLFormElement} formulaire - * @param {any} nomClasse1 classe des éléments à afficher - * @param {any} nomClasse2 classe des éléments à masquer - */ -function afficherMasquer(formulaire, nomClasse1, nomClasse2) -{ - for (let elem of formulaire.querySelectorAll(nomClasse1)) { - elem.classList.remove('hidden'); - } - for (let elem of formulaire.querySelectorAll(nomClasse2)) { - elem.classList.add('hidden'); + for (let elem of formulaire.querySelectorAll(nomClasse)) + { + if (elem.id == idElem) + { + elem.classList.remove('hidden'); + } + else + { + elem.classList.add('hidden'); + } } } @@ -190,7 +194,7 @@ function verifierCases(idElem) // vérifier qu'un radio de la même ligne est sélectionné let ligneCorrecte = false; // trouver la ligne englobante - let ligne = idCase.closest("tr"); + let ligne = idCase.closest("li"); for (let idRadio of ligne.querySelectorAll('input[type=radio]')) { if (idRadio.checked) { ligneCorrecte = true; break; } @@ -202,7 +206,7 @@ function verifierCases(idElem) } } if (nbChoix == 0) { - alert("Erreur : il faut sélectionner au moins une activité/tarif"); + alert("Erreur : il faut sélectionner au moins une ligne"); } return nbChoix != 0; } diff --git a/www/admin/style.css b/www/admin/style.css index 7253822..c79f6f3 100644 --- a/www/admin/style.css +++ b/www/admin/style.css @@ -1,8 +1,11 @@ /* liste des versements */ -div.impair { - background: rgba(var(--gSecondColor), 0.15); +div.pair { + background-color: rgba(var(--gSecondColor), 0.15); } -fieldset { +fieldset.versements +{ + margin-bottom : 0; + margin-right : 0.5em; -webkit-border-radius:8px; border-radius:8px; } @@ -23,7 +26,6 @@ span.total } summary.activite { - background: rgba(var(--gSecondColor), 0.5); margin-bottom : 0.5em; } summary.personne @@ -32,10 +34,22 @@ summary.personne padding-top : 0; padding-bottom : 0; } -h3.personne, h4.personne +div.activite +{ + background-color: rgba(var(--gSecondColor), 0.3); +} +div.personne { font-weight : normal; - background: rgba(var(--gSecondColor), 0.25); + background-color: rgba(var(--gSecondColor), 0.25); +} +h3.activite +{ + display : inline; +} +p.activite +{ + margin-left : 2.5em; } #signature { @@ -43,10 +57,6 @@ h3.personne, h4.personne max-width: 300px; max-height: 150px; } -dl.config -{ - padding : 1ex 0; -} div.explications ul { @@ -61,3 +71,42 @@ input.check_global { margin : 0.2em 0.5em; } +dl#menu +{ + min-width : 40em; + width : 50%; +} +div.versements +{ + margin-left : 4em; + display: flex; + flex-wrap: wrap; +} +/* config */ +dl.config +{ + padding : 1ex 0; +} +div.champnom +{ + display : flex; + margin-top : 0.25rem; +} +div.infos +{ + border : 1px solid rgba(var(--gMainColor)); + border-radius : 0.25rem; + padding : 0.4rem; + margin-left : 1em; + width : 20em; +} +ul#liste_activites dd +{ + display: inline-block; +} + +ul.reduction span.radio-btn +{ + margin-left : 2em; + border-spacing : 0.1em; +} diff --git a/www/admin/versements_activites.php b/www/admin/versements_activites.php index 68fd0b4..d2fa478 100644 --- a/www/admin/versements_activites.php +++ b/www/admin/versements_activites.php @@ -2,47 +2,66 @@ namespace Garradin; -use Garradin\Plugin\RecusFiscaux\Activite; use Garradin\Plugin\RecusFiscaux\Personne; -use Garradin\Plugin\RecusFiscaux\Tarif; use Garradin\Plugin\RecusFiscaux\Utils; +// ------------------------------------------------------------ // récupérer les infos du formulaire +// ------------------------------------------------------------ + +// vérifier qu'on a bien sélectionné une activité ou un compe +if (null === f('tarifs') && null === f('comptes')) +{ + \Garradin\Utils::redirect(PLUGIN_URL . 'index.php'); +} + +// tarifs sélectionnés $tarifsSelectionnes = f('tarifs') ?: []; +// comptes sélectionnés +$comptesSelectionnes = f('comptes') ?: []; + // taux de réduction associés $tauxSelectionnes = array(); -foreach ($tarifsSelectionnes as $idTarif) { +foreach ($tarifsSelectionnes as $idTarif) +{ $nomRadio = "taux_reduction_" . $idTarif; $valRadio = f("$nomRadio"); $tauxSelectionnes[$idTarif] = $valRadio; } +foreach ($comptesSelectionnes as $idCompte) +{ + $nomRadio = "taux_reduction_" . $idCompte; + $valRadio = f("$nomRadio"); + $tauxSelectionnes[$idCompte] = $valRadio; +} $_SESSION['tauxSelectionnes'] = $tauxSelectionnes; -// obtenir les instances de tarifs correspondant à la sélection -$lesTarifs = array(); -foreach (Utils::getTarifs($tarifsSelectionnes) as $ot) { - $lesTarifs[$ot->id] = $ot; -} -$_SESSION['lesTarifs'] = $lesTarifs; +// versements correspondants à la sélection, triés par tarif, nom, compte, date +$lesTarifs = array_map(fn($elem) : string => substr($elem, 0, strpos($elem, '_')), + $tarifsSelectionnes); +$lesComptes = array_map(fn($elem) : string => substr($elem, 1 + strpos($elem, '_')), + $tarifsSelectionnes); +$_SESSION['lesVersements'] = + Utils::getVersementsTarifsComptes( + $_SESSION['annee_recu'], + $lesTarifs, + $lesComptes, + $champsNom); -// activités correspondants aux tarifs sélectionnés -$lesActivites = array(); -foreach (Utils::getActivites($tarifsSelectionnes) as $activite) { - $lesActivites[$activite->id] = $activite; +// ajouter les versements sans tarif (tri par nom, compte, date) +$versementsSansTarif = Utils::getVersementsComptes($_SESSION['annee_recu'], + $comptesSelectionnes, + $champsNom); +foreach ($versementsSansTarif as $versement) +{ + $_SESSION['lesVersements'][] = $versement; } -$_SESSION['lesActivites'] = $lesActivites; - -// versements correspondants aux tarifs sélectionnés -$_SESSION['lesVersements'] = Utils::getVersementsTarifs($_SESSION['annee_recu'], - $tarifsSelectionnes, - $champsNom); // préparation de l'affichage -$tpl->assign('lesActivites', $lesActivites); -$tpl->assign('lesTarifs', $lesTarifs); $tpl->assign('lesVersements', $_SESSION['lesVersements']); $tpl->assign('plugin_css', ['style.css']); // envoyer au template $tpl->display(PLUGIN_ROOT . '/templates/versements_activites.tpl'); + diff --git a/www/admin/versements_personnes.php b/www/admin/versements_personnes.php index 56376a0..5a626bd 100644 --- a/www/admin/versements_personnes.php +++ b/www/admin/versements_personnes.php @@ -5,15 +5,24 @@ namespace Garradin; use Garradin\Plugin\RecusFiscaux\Personne; use Garradin\Plugin\RecusFiscaux\Utils; -$_SESSION['taux_reduction'] = $_POST['taux_reduction']; +// vérifier si le taux de réduction a été sélectionné au préalable +$_SESSION['taux_reduction'] = f('taux_reduction'); +if (! isset($_SESSION['taux_reduction']) || $_SESSION['taux_reduction'] == "") +{ + \Garradin\Utils::redirect(PLUGIN_URL . 'index.php'); +} // versements par personne -$_SESSION['lesVersements'] = Utils::getVersementsPersonnes($_SESSION['annee_recu'], - $champsNom); +$_SESSION['lesVersements'] = Utils::getVersementsPersonnes( + $_SESSION['annee_recu'], + 'like', + '7%', + $champsNom); // préparation de l'affichage $tpl->assign('lesVersements', $_SESSION['lesVersements']); $tpl->assign('plugin_css', ['style.css']); // envoyer au template +$tpl->assign('plugin_config', $plugin->getConfig()); $tpl->display(PLUGIN_ROOT . '/templates/versements_personnes.tpl');