ajout bouton générer

FossilOrigin-Name: c4ee1e2f9ebe9c1a99adb825034569a4274d92e953df1a30475210c08bc3aa28
This commit is contained in:
engel 2022-04-24 12:07:36 +00:00
parent 78f6a982a4
commit bbfba688c6
5 changed files with 187 additions and 61 deletions

View File

@ -8,28 +8,28 @@ namespace Garradin\Plugin\RecusFiscaux;
class Personne class Personne
{ {
public $id; public $id;
public $rang; // par ordre alpha de nomPrenom ; sert aux tris
public $nomPrenom; public $nomPrenom;
public $adresse; public $adresse;
public $codePostal; public $codePostal;
public $ville; public $ville;
public $courriel;
public $versements; // versements par taux de réduction public $versements; // versements par taux de réduction
public function __construct( public function __construct(
$id, $id,
$rang,
$nomPrenom, $nomPrenom,
$adresse, $adresse,
$codePostal, $codePostal,
$ville, $ville
$courriel = ""
) )
{ {
$this->id = $id; $this->id = $id;
$this->rang = $rang;
$this->nomPrenom = $nomPrenom; $this->nomPrenom = $nomPrenom;
$this->adresse = $adresse; $this->adresse = $adresse;
$this->codePostal = $codePostal; $this->codePostal = $codePostal;
$this->ville = $ville; $this->ville = $ville;
$this->courriel = $courriel;
$this->versements = array(); // clé = tarif, valeur = montant $this->versements = array(); // clé = tarif, valeur = montant
} }
@ -40,11 +40,11 @@ class Personne
{ {
return new Personne( return new Personne(
$this->id, $this->id,
$this->rang,
$this->nomPrenom, $this->nomPrenom,
$this->adresse, $this->adresse,
$this->codePostal, $this->codePostal,
$this->ville, $this->ville);
$this->courriel);
} }
/** /**

View File

@ -111,40 +111,135 @@ class Utils
/** /**
* @return versements correspondants à l'année et aux comptes donnés * @return versements correspondants à l'année et aux comptes donnés
* @param $annee * @param $annee
* @param $op : opérateur de combinaison des comptes
* @param array $comptes * @param array $comptes
* @param array $champsNom : liste non vide des champs de nom/prénom * @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(); $db = DB::getInstance();
$tri = Utils::combinerTri($champsNom); $tri = Utils::combinerTri($champsNom);
$sql = sprintf( $sql = sprintf(
'SELECT 'SELECT
services_fees.id as idTarif,
acc_accounts.code as compte, acc_accounts.code as compte,
membres.id as idUser, membres.id as idUser,
acc_transactions_lines.credit as versement, acc_transactions_lines.credit as versement,
acc_transactions.date acc_transactions.date
FROM acc_transactions_users FROM acc_transactions_users
INNER JOIN membres on acc_transactions_users.id_user = membres.id INNER JOIN membres
INNER JOIN acc_transactions on acc_transactions_users.id_transaction = acc_transactions.id ON acc_transactions_users.id_user = membres.id
INNER JOIN services_users on acc_transactions_users.id_service_user = services_users.id INNER JOIN acc_transactions
INNER JOIN acc_transactions_lines on acc_transactions_lines.id_transaction = acc_transactions.id 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 WHERE
(strftime(%s, acc_transactions.date) = "%d" (strftime(%s, acc_transactions.date) = "%d"
AND AND
acc_accounts.%s acc_accounts.%s
AND AND
acc_transactions_lines.credit > 0) acc_transactions_lines.credit > 0)
ORDER by acc_accounts.code, %s, acc_transactions.date', ORDER by %s, acc_transactions.date',
'"%Y"', '"%Y"',
$annee, $annee,
$db->where('code', $comptes), $db->where('code', $op, $comptes),
$tri $tri
); );
return $db->get($sql); 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 * Versements totaux par personne pour une année donnée
* @param année * @param année
* @param array $champsNom : liste non vide des champs de nom/prénom * @param array $champsNom : liste non vide des champs de nom/prénom
@ -179,38 +274,7 @@ class Utils
return DB::getInstance()->get($sql); return DB::getInstance()->get($sql);
} }
/** public static function getDonateurs_old($annee, $champsNom) : array
* 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
{ {
// concaténer les champs nom/prénoms pour la sélection // concaténer les champs nom/prénoms pour la sélection
$nom = 'trim(' . Utils::combinerChamps($champsNom) . ') as nom,'; $nom = 'trim(' . Utils::combinerChamps($champsNom) . ') as nom,';
@ -258,17 +322,11 @@ class Utils
{ {
foreach ($lesTaux as $elem) 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; $lignes[$elem->taux] = $elem->remarque;
} }
return $lignes; return $lignes;
} }
public static function getLigneReduction($taux) public static function getLigneReduction($taux)
{ {
return $_SESSION['ligneReduction'][$taux]; return $_SESSION['ligneReduction'][$taux];

View File

@ -8,6 +8,7 @@
<label for="check_global">Cliquer pour cocher toutes les lignes</label> <label for="check_global">Cliquer pour cocher toutes les lignes</label>
<button type="button" data-icon="↑" class="icn-btn" id="close_details_activite" onclick="montrerMasquerDetails(this.id, 'details.activite', 'toutes les activités')">Replier toutes les activités</button> <button type="button" data-icon="↑" class="icn-btn" id="close_details_activite" onclick="montrerMasquerDetails(this.id, 'details.activite', 'toutes les activités')">Replier toutes les activités</button>
<button type="button" data-icon="↑" class="icn-btn" id="close_details_personne" onclick="montrerMasquerDetails(this.id, 'details.personne', 'toutes les personnes')">Replier toutes les personnes</button> <button type="button" data-icon="↑" class="icn-btn" id="close_details_personne" onclick="montrerMasquerDetails(this.id, 'details.personne', 'toutes les personnes')">Replier toutes les personnes</button>
<input type="submit" value="Générer les reçus" form="versements_activites" onclick="return verifierChoix(this.form)">
</fieldset> </fieldset>
<form method="post" id="versements_activites" action="generer_recus.php?type=activite"> <form method="post" id="versements_activites" action="generer_recus.php?type=activite">

View File

@ -8,6 +8,7 @@
onclick="cocherDecocherToutesLesPersonnes(check_global)" /> onclick="cocherDecocherToutesLesPersonnes(check_global)" />
<label for="check_global">Cliquer pour cocher toutes les lignes</label> <label for="check_global">Cliquer pour cocher toutes les lignes</label>
<button type="button" data-icon="↑" class="icn-btn" id="close_details_personne" onclick="montrerMasquerDetails(this.id, 'details.personne', 'toutes les personnes')">Replier toutes les personnes</button> <button type="button" data-icon="↑" class="icn-btn" id="close_details_personne" onclick="montrerMasquerDetails(this.id, 'details.personne', 'toutes les personnes')">Replier toutes les personnes</button>
<input type="submit" value="Générer les reçus" form="versements_personnes" onclick="return verifierChoix(this.form)">
</fieldset> </fieldset>
<form method="post" id="versements_personnes" action="generer_recus.php?type=personne"> <form method="post" id="versements_personnes" action="generer_recus.php?type=personne">

View File

@ -8,9 +8,75 @@ use Garradin\Plugin\RecusFiscaux\Utils;
$_SESSION['taux_reduction'] = $_POST['taux_reduction']; $_SESSION['taux_reduction'] = $_POST['taux_reduction'];
// versements par personne // versements par personne
$_SESSION['lesVersements'] = Utils::getVersementsPersonnes($_SESSION['annee_recu'], $_SESSION['lesVersements'] = Utils::getVersementsComptes($_SESSION['annee_recu'],
"like",
'7%',
$champsNom); $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 // préparation de l'affichage
$tpl->assign('lesVersements', $_SESSION['lesVersements']); $tpl->assign('lesVersements', $_SESSION['lesVersements']);
$tpl->assign('plugin_css', ['style.css']); $tpl->assign('plugin_css', ['style.css']);