diff --git a/lib/Personne.php b/lib/Personne.php index 9a10979..31b4344 100644 --- a/lib/Personne.php +++ b/lib/Personne.php @@ -8,28 +8,28 @@ 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 } @@ -40,11 +40,11 @@ class Personne { return new Personne( $this->id, + $this->rang, $this->nomPrenom, $this->adresse, $this->codePostal, - $this->ville, - $this->courriel); + $this->ville); } /** diff --git a/lib/Utils.php b/lib/Utils.php index d2c3400..7d7dc29 100644 --- a/lib/Utils.php +++ b/lib/Utils.php @@ -111,40 +111,135 @@ class Utils /** * @return versements correspondants à l'année et aux comptes donnés * @param $annee + * @param $op : opérateur de combinaison des comptes * @param array $comptes * @param array $champsNom : liste non vide des champs de nom/prénom + * exemples : + * op = 'in', comptes = ['706', '7780', '756'] + * op = 'like', comptes = '7%' */ - public static function getVersementsComptes($annee, $comptes, $champsNom) + public static function getVersementsComptes($annee, $op, $comptes, $champsNom) { $db = DB::getInstance(); $tri = Utils::combinerTri($champsNom); $sql = sprintf( 'SELECT - acc_accounts.code as compte, - membres.id as idUser, - acc_transactions_lines.credit as versement, - acc_transactions.date + services_fees.id as idTarif, + acc_accounts.code as compte, + 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 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 - acc_accounts.%s + acc_accounts.%s AND - acc_transactions_lines.credit > 0) - ORDER by acc_accounts.code, %s, acc_transactions.date', + acc_transactions_lines.credit > 0) + ORDER by %s, acc_transactions.date', '"%Y"', $annee, - $db->where('code', $comptes), + $db->where('code', $op, $comptes), $tri ); return $db->get($sql); } /** + * @return personnes ayant versé des dons pour une année donnée + * @param $annee + * @param array $champsNom : champs qui définissent le nom et le prénom d'une personne + */ + public static function getDonateurs($annee, $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, + 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, + acc_transactions + INNER JOIN acc_transactions_lines + 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 membres.id + ORDER by %1$s COLLATE U_NOCASE + ', + $tri, + $nom, + '"%Y"', + $annee + ); + // error_log("getDonateurs = " . print_r($sql, true)); + $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 array $champs : liste (non vide) de champs + * @return chaîne combinée + */ + private static function combinerChamps($champs) + { + $op = ' || " " || '; + $result = 'ifnull(membres.' . $champs[0] . ', "")'; + for ($i = 1; $i < count($champs); ++$i) + { + $result .= $op . 'ifnull(membres.' . $champs[$i] . ', "")'; + } + return 'trim(' . $result . ')'; + } + + private static function combinerTri($champs) + { + $tri = 'membres.' . $champs[0]; + for ($i = 1; $i < count($champs); ++$i) + { + $tri .= ', membres.' . $champs[$i]; + } + return $tri; + } + + /** OBSOLETE * Versements totaux par personne pour une année donnée * @param année * @param array $champsNom : liste non vide des champs de nom/prénom @@ -179,38 +274,7 @@ class Utils return DB::getInstance()->get($sql); } - /** - * combiner les champs avec un opérateur - * @param array $champs : liste (non vide) de champs - * @return chaîne combinée - */ - private static function combinerChamps($champs) - { - $op = ' || " " || '; - $result = 'ifnull(membres.' . $champs[0] . ', "")'; - for ($i = 1; $i < count($champs); ++$i) - { - $result .= $op . 'ifnull(membres.' . $champs[$i] . ', "")'; - } - return $result; - } - - private static function combinerTri($champs) - { - $tri = 'membres.' . $champs[0]; - for ($i = 1; $i < count($champs); ++$i) - { - $tri .= ', membres.' . $champs[$i]; - } - return $tri; - } - - /** - * @return personnes ayant versé des dons pour une année donnée - * @param $annee - * @param array $champsNom : champs qui définissent le nom et le prénom d'une personne - */ - public static function getDonateurs($annee, $champsNom) : array + public static function getDonateurs_old($annee, $champsNom) : array { // concaténer les champs nom/prénoms pour la sélection $nom = 'trim(' . Utils::combinerChamps($champsNom) . ') as nom,'; @@ -258,17 +322,11 @@ class Utils { 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]; diff --git a/templates/versements_activites.tpl b/templates/versements_activites.tpl index 6762f0e..1abcd10 100644 --- a/templates/versements_activites.tpl +++ b/templates/versements_activites.tpl @@ -8,6 +8,7 @@ +
diff --git a/templates/versements_personnes.tpl b/templates/versements_personnes.tpl index cae6d14..de7c87d 100644 --- a/templates/versements_personnes.tpl +++ b/templates/versements_personnes.tpl @@ -8,6 +8,7 @@ onclick="cocherDecocherToutesLesPersonnes(check_global)" /> + diff --git a/www/admin/versements_personnes.php b/www/admin/versements_personnes.php index 56376a0..1a16cca 100644 --- a/www/admin/versements_personnes.php +++ b/www/admin/versements_personnes.php @@ -8,8 +8,74 @@ use Garradin\Plugin\RecusFiscaux\Utils; $_SESSION['taux_reduction'] = $_POST['taux_reduction']; // versements par personne -$_SESSION['lesVersements'] = Utils::getVersementsPersonnes($_SESSION['annee_recu'], - $champsNom); +$_SESSION['lesVersements'] = Utils::getVersementsComptes($_SESSION['annee_recu'], + "like", + '7%', + $champsNom); + + // Utils::getVersementsPersonnes($_SESSION['annee_recu'], + // $champsNom); + +// ------------------------------------------------------------------------ +// tests +// ------------------------------------------------------------------------ +/* +$versementsComptes = Utils::getVersementsComptes("2021", + // "in", + // ['706', '7780', '756'], + "like", + '7%', + $champsNom); +// table triée par nom, date +// error_log("versementsComptes triée par nom, date = " . print_r($versementsComptes, true)); + +// comparer 2 lignes selon le nom +function comparerNoms($ligne1, $ligne2) +{ + return + $_SESSION['membresDonateurs'][$ligne1->idUser]->rang + - + $_SESSION['membresDonateurs'][$ligne2->idUser]->rang; +} + +// comparer 2 lignes selon la date +function comparerDate($ligne1, $ligne2) +{ + return + strtotime($ligne1->date) - strtotime($ligne2->date); +} + +// comparer 2 lignes selon un champ +function comparerChamp($ligne1, $ligne2, $champ) +{ + return $ligne1->$champ - $ligne2->$champ; +} + +// autres tris +// par tarif, nom, date +usort($versementsComptes, function($ligne1, $ligne2) +{ + $result = comparerChamp($ligne1, $ligne2, 'idTarif'); //$ligne1->idTarif - $ligne2->idTarif; + if ($result == 0) { $result = comparerNoms($ligne1, $ligne2); } + if ($result == 0) { $result = comparerDate($ligne1, $ligne2); } + return $result; +}); +// error_log("versementsComptes triée par tarif, nom, date = " . print_r($versementsComptes, true)); + +// par nom, compte, date... +usort($versementsComptes, function($ligne1, $ligne2) +{ + $result = comparerNoms($ligne1, $ligne2); + if ($result == 0) { $result = comparerChamp($ligne1, $ligne2, 'compte'); } + if ($result == 0) { $result = comparerDate($ligne1, $ligne2); } + return $result; +}); + +// error_log("versementsComptes triée par nom, compte, date = " . print_r($versementsComptes, true)); +*/ +// ------------------------------------------------------------------------ +// fin tests +// ------------------------------------------------------------------------ // préparation de l'affichage $tpl->assign('lesVersements', $_SESSION['lesVersements']);