Files
ms1inscription-v5/php/inc_fx_rabais.php
2026-05-13 09:43:32 -04:00

1482 lines
76 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// fonction qui vérifie si le rabais fait déjà partie du panier et retourner le pra_id (JSP)
// param : id du rabais
// créé : 2013-06-19
function fxCheckRabais($intRabais) {
global $objDatabase;
$sqlCheck = "SELECT pra_id FROM inscriptions_panier_rabais WHERE rab_id = " . intval($intRabais) . " ORDER BY pra_id LIMIT 1";
$intPanierRabais = $objDatabase->fxGetVar($sqlCheck);
// insérer le rabais dans le panier s'il n'est pas présent
$sqlRabais = "SELECT rab_id, rab_description_fr, rab_description_en, rab_pourcent, rab_montant, rab_priorite, rab_date_limite, rab_code, rab_code_manuel, rab_epreuves, rab_produits, rab_effacable, rab_taxes, rab_epr_diff, rab_nb_epr_diff, rab_nb_epr_diff2, rab_produits_inclus, rab_plus_moins_cher, rab_noms_identiques, rab_date_limite_debut FROM inscriptions_rabais WHERE rab_id = " . intval($intRabais);
$recRabais = $objDatabase->fxGetRow($sqlRabais);
if ($intPanierRabais == NULL) {
if ($recRabais != null) {
if ($recRabais['rab_code_manuel'] == 2)
$strDepot = ", pra_depot = 1";
else
$strDepot = ", pra_depot = 0";
$sqlInsert = "INSERT INTO inscriptions_panier_rabais SET pra_maj = '" . fxGetDateTime() . "', rab_id = " . intval($intRabais) . ", rab_description_fr = '" . $objDatabase->fxEscape(fxUnescape($recRabais['rab_description_fr'])) . "', rab_description_en = '" . $objDatabase->fxEscape(fxUnescape($recRabais['rab_description_en'])) . "', rab_code = '" . $objDatabase->fxEscape(fxUnescape($recRabais['rab_code'])) . "', rab_pourcent = " . intval($recRabais['rab_pourcent']) . ", rab_montant = " . floatval($recRabais['rab_montant']) . ", rab_date_limite = '" . $objDatabase->fxEscape(fxUnescape($recRabais['rab_date_limite'])) . "', rab_priorite = " . intval($recRabais['rab_priorite']) . ", rab_effacable = " . intval($recRabais['rab_effacable']) . ", rab_epreuves = '" . $objDatabase->fxEscape(fxUnescape($recRabais['rab_epreuves'])) . "', rab_produits = '" . $objDatabase->fxEscape(fxUnescape($recRabais['rab_produits'])) . "', rab_taxes = " . intval($recRabais['rab_taxes']) . ", rab_epr_diff = " . intval($recRabais['rab_epr_diff']) . ", rab_nb_epr_diff = " . intval($recRabais['rab_nb_epr_diff']) . ", rab_nb_epr_diff2 = " . intval($recRabais['rab_nb_epr_diff2']) . ", rab_plus_moins_cher = " . intval($recRabais['rab_plus_moins_cher']) . ", rab_produits_inclus = " . intval($recRabais['rab_produits_inclus']) . ", rab_noms_identiques = " . intval($recRabais['rab_noms_identiques']) . ", rab_date_limite_debut = '" . $objDatabase->fxEscape($recRabais['rab_date_limite_debut']) . "'" . $strDepot;
$qryInsert = $objDatabase->fxQuery($sqlInsert);
// récupérer le id ajouté
$intPanierRabais = $objDatabase->fxGetLastId();
}
}
return $intPanierRabais;
}
// fonction qui ajoute, modifie ou supprime un rabais au panier (JSP)
// param : action (add/mod/del), numéro de panier, infos de l'événement, données POST, langue
// créé : 2013-06-19
function fxSetRabais($strAction, $strNoPanier, $tabEvenement, $tabData, $strLangue) {
global $objDatabase;
switch($strAction) {
case 'add':
// vérifier si le rabais est valide
$sqlRabais = "SELECT rab_id, rab_montant, rab_pourcent, rab_date_limite_debut, rab_date_limite, rab_heure_limite_debut, rab_heure_limite_fin FROM inscriptions_rabais WHERE (rab_date_limite_debut <= '" . fxGetDate() . "' OR rab_date_limite_debut = '0000-00-00' OR rab_date_limite_debut IS NULL) AND rab_date_limite >= '" . fxGetDate() . "' AND rab_actif = 1 AND rab_qte > 0 AND rab_code = '" . $objDatabase->fxEscape($tabData['rab_code']) . "' AND rab_code_manuel = 1 AND eve_id IN(" . intval($tabEvenement['general']['eve_id']) . ", " . intval($tabEvenement['general']['eve_id_membership']) . ")";
$tabRabais = $objDatabase->fxGetRow($sqlRabais);
if ($tabRabais != NULL) {
// Vérifier les dates et heures limites
$blnRabais = true;
$strDate = fxGetDate();
$strTime = fxGetTime();
if ($strDate > $tabRabais['rab_date_limite'] || (trim($tabRabais['rab_date_limite_debut']) != '' && $strDate < $tabRabais['rab_date_limite_debut'])) {
$blnRabais = false;
}
if ($strDate == $tabRabais['rab_date_limite']) {
if (trim($tabRabais['rab_heure_limite_fin']) != '' && $strTime > $tabRabais['rab_heure_limite_fin']) {
$blnRabais = false;
}
}
if ($strDate == $tabRabais['rab_date_limite_debut']) {
if (trim($tabRabais['rab_heure_limite_debut']) != '' && $strTime < $tabRabais['rab_heure_limite_debut']) {
$blnRabais = false;
}
}
if ($blnRabais) {
$intPanierRabais = fxCheckRabais($tabRabais['rab_id']);
if ($intPanierRabais != 0) {
// vérifier si le rabais exise déjà pour ce panier
$sqlCheck = "SELECT COUNT(*) AS nb FROM inscriptions_panier_rabais_acheteurs WHERE pra_id = " . intval($intPanierRabais) . " AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$intNb = $objDatabase->fxGetVar($sqlCheck);
if ($intNb < 1) {
$intRabaisPourcent = 0;
if ($tabRabais['rab_pourcent'] > 0) { // si rabais en %
if ($tabRabais['rab_pourcent'] == 100) { // si rabais 100%
// effacer les autres rabais
$sqlDelete = "DELETE FROM inscriptions_panier_rabais_acheteurs WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryDelete = $objDatabase->fxQuery($sqlDelete);
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET rab_montant = 0 WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryUpadte = $objDatabase->fxQuery($sqlUpdate);
$sqlUpdate = "UPDATE inscriptions_panier_produits_new SET rab_montant = 0 WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryUpadte = $objDatabase->fxQuery($sqlUpdate);
}
// vérifier si les rabais pourcent ne dépassent pas 100%
$sqlRabaisPourcent = "SELECT SUM(r.rab_pourcent) FROM inscriptions_panier_rabais r, inscriptions_panier_rabais_acheteurs a WHERE r.pra_id = a.pra_id AND r.pra_depot = 0 AND a.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND r.rab_montant = 0";
$intRabaisPourcent = $objDatabase->fxGetVar($sqlRabaisPourcent);
$intRabaisPourcent += $tabRabais['rab_pourcent'];
}
if ($intRabaisPourcent <= 100 || $tabRabais['rab_montant'] > 0) { // si la somme des rabais dans le panier ne dépasse pas 100% ou rabais en $$
// ajouter le rabais dans panier acheteurs
$sqlInsert = "INSERT INTO inscriptions_panier_rabais_acheteurs SET pra_id = " . intval($intPanierRabais) . ", no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryInsert = $objDatabase->fxQuery($sqlInsert);
// afficher le message de succès
$_SESSION['msg'] = 'p301';
// calculer le montant dans panier_epreuves_commandees
fxMajRabais($strNoPanier);
} else {
// afficher le message d'erreur
if ($strLangue == 'fr')
$_SESSION['msg'] = 'e131';
else
$_SESSION['msg'] = 'e531';
}
} else {
// afficher le message d'erreur
if ($strLangue == 'fr')
$_SESSION['msg'] = 'e122';
else
$_SESSION['msg'] = 'e522';
}
}
} else {
// afficher le message d'erreur
if ($strLangue == 'fr')
$_SESSION['msg'] = 'e120';
else
$_SESSION['msg'] = 'e520';
}
} else {
// afficher le message d'erreur
if ($strLangue == 'fr')
$_SESSION['msg'] = 'e120';
else
$_SESSION['msg'] = 'e520';
}
break;
case 'del':
// effacer le montant du rabais
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET pra_id = 0, rab_priorite = 0, rab_montant = 0 WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND pra_id = " . intval($tabData['pra_id']);
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
$sqlUpdate = "UPDATE inscriptions_panier_produits SET pra_id = 0, rab_priorite = 0, rab_montant = 0 WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND pra_id = " . intval($tabData['pra_id']);
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
// effacer le rabais
$sqlDelete = "DELETE FROM inscriptions_panier_rabais_acheteurs WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND pra_id = " . intval($tabData['pra_id']);
$qryDelete = $objDatabase->fxQuery($sqlDelete);
}
// rediriger vers le panier
if ($strLangue == 'fr')
$strPage = 'panier';
else
$strPage = 'cart';
header("Location: " . $GLOBALS['vDomaine'] . '/' . $strPage . '/checkout/' . $tabEvenement['general']['eve_label_url']);
exit;
}
// fonction qui met à jour les montants des rabais dans le panier (JSP)
// param : no panier
// créé : 2013-06-25
function fxMajRabais($strNoPanier) {
global $objDatabase;
$arrRabaisAppliques = array();
$strWhere = '';
// vider les rabais existants pour les épreuves commandées, ceux-ci seront recalculés plus bas
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET pra_id = 0, rab_priorite = 0, rab_montant = 0 WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
// vider les rabais existants pour les produits ajoutés, ceux-ci seront recalculés plus bas
$sqlUpdate = "UPDATE inscriptions_panier_produits_new SET pra_id = 0, rab_priorite = 0, rab_montant = 0 WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
// vider les rabais existants
// récupérer le détails des rabais (montant/pourcent) dans le panier
$sqlPanierRabais = "
SELECT r.rab_id, r.pra_id, r.rab_montant, r.rab_pourcent, r.rab_priorite, r.rab_epreuves, r.rab_produits, r.rab_taxes, r.rab_epr_diff, r.rab_nb_epr_diff, r.rab_nb_epr_diff2, r.rab_plus_moins_cher, r.rab_produits_inclus, r.rab_noms_identiques
FROM inscriptions_panier_rabais r, inscriptions_panier_rabais_acheteurs a
WHERE a.pra_id = r.pra_id AND a.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
";
$recPanierRabais = $objDatabase->fxGetResults($sqlPanierRabais);
if ($recPanierRabais != null) { // s'il y a des rabais dans ce panier
for ($intCtr = 1; $intCtr <= count($recPanierRabais); $intCtr++) {
// mettre à jour les participants
if (trim($recPanierRabais[$intCtr]['rab_epreuves']) != '') {
// vérifier si le rabais est un montant ou pourcent
if ($recPanierRabais[$intCtr]['rab_pourcent'] > 0)
$strMontant = "(pec_prix * (" . intval($recPanierRabais[$intCtr]['rab_pourcent']) . " / 100))";
else
$strMontant = floatval($recPanierRabais[$intCtr]['rab_montant']);
if ($recPanierRabais[$intCtr]['rab_epr_diff'] == 1) { // appliquer le rabais seulement aux épreuves dfférentes
if ($recPanierRabais[$intCtr]['rab_noms_identiques'] == 1) { // si les noms doivent êtres identiques
// récupérer les pec_id et epr_id des participants aux noms identiques
$sqlPanierEpreuves = "
SELECT
pec_id, epr_id, par_nom, par_prenom
FROM
inscriptions_panier_participants
WHERE
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND
LOWER(CONCAT(par_prenom,' ',par_nom)) IN(
SELECT
LOWER(CONCAT(par_prenom,' ',par_nom))
FROM
inscriptions_panier_participants
WHERE
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
GROUP BY
LOWER(CONCAT(par_prenom,' ',par_nom))
HAVING
COUNT(LOWER(CONCAT(par_prenom,' ',par_nom))) > 1
)
";
$recPanierEpreuves = $objDatabase->fxGetResultsKey($sqlPanierEpreuves, 'pec_id');
if ($recPanierEpreuves != null) {
// exécuter la requête
$sqlUpdate = ".
UPDATE
inscriptions_panier_epreuves_commandees
SET
pra_id = " . intval($recPanierRabais[$intCtr]['pra_id']) . ",
rab_priorite = " . intval($recPanierRabais[$intCtr]['rab_priorite']) . ",
rab_montant = " . $strMontant . "
WHERE
pec_prix > 0 AND
rab_priorite < " . intval($recPanierRabais[$intCtr]['rab_priorite']) . " AND
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND
pec_id IN(" . implode(',', array_keys($recPanierEpreuves)) . ") AND
epr_id IN(" . $recPanierRabais[$intCtr]['rab_epreuves'] . ")
";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
$intNbAffectedRows = $objDatabase->fxGetNbAffectedRows();
if (intval($intNbAffectedRows) > 0) {
$arrRabaisAppliques[] = $recPanierRabais[$intCtr]['pra_id'];
}
}
} else {
$tabEpreuves = explode(',', $recPanierRabais[$intCtr]['rab_epreuves']);
foreach ($tabEpreuves as $epr_id) {
// exécuter la requête
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET pra_id = " . intval($recPanierRabais[$intCtr]['pra_id']) . ", rab_priorite = " . intval($recPanierRabais[$intCtr]['rab_priorite']) . ", rab_montant = " . $strMontant . " WHERE pec_prix > 0 AND rab_priorite < " . intval($recPanierRabais[$intCtr]['rab_priorite']) . " AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND epr_id = " . intval($epr_id) . " LIMIT 1";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
$intNbAffectedRows = $objDatabase->fxGetNbAffectedRows();
if (intval($intNbAffectedRows) > 0) {
$arrRabaisAppliques[] = $recPanierRabais[$intCtr]['pra_id'];
}
}
}
} else {
if ($recPanierRabais[$intCtr]['rab_nb_epr_diff2'] > 0) {
// info épreuves commandées
$sqlEpreuves = "SELECT c.*, e.epr_code, 0 AS rabais FROM inscriptions_panier_epreuves_commandees c, inscriptions_epreuves e WHERE c.epr_id = e.epr_id AND ep_id <> 0 AND c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$tabEpreuves = $objDatabase->fxGetResults($sqlEpreuves);
if (count($tabEpreuves) >= $recPanierRabais[$intCtr]['rab_nb_epr_diff2']) {
if ($recPanierRabais[$intCtr]['rab_plus_moins_cher'] == 1) {
$strOrder = "ASC";
} else {
$strOrder = "DESC";
}
// exécuter la requête
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET pra_id = " . intval($recPanierRabais[$intCtr]['pra_id']) . ", rab_priorite = " . intval($recPanierRabais[$intCtr]['rab_priorite']) . ", rab_montant = " . $strMontant . " WHERE pec_prix > 0 AND rab_priorite < " . intval($recPanierRabais[$intCtr]['rab_priorite']) . " AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND epr_id IN(" . $recPanierRabais[$intCtr]['rab_epreuves'] . ") ORDER BY pec_prix " . $strOrder . " LIMIT " . intval($recPanierRabais[$intCtr]['rab_nb_epr_diff2']);
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
$intNbAffectedRows = $objDatabase->fxGetNbAffectedRows();
if (intval($intNbAffectedRows) > 0) {
$arrRabaisAppliques[] = $recPanierRabais[$intCtr]['pra_id'];
}
}
} elseif ($recPanierRabais[$intCtr]['rab_noms_identiques'] == 1) { // si les noms doivent êtres identiques
// récupérer les pec_id et epr_id des participants aux noms identiques
$sqlPanierEpreuves = "SELECT pec_id, epr_id, par_nom, par_prenom FROM inscriptions_panier_participants WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND LOWER(CONCAT(par_prenom,' ',par_nom)) IN(SELECT LOWER(CONCAT(par_prenom,' ',par_nom)) FROM inscriptions_panier_participants WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' GROUP BY LOWER(CONCAT(par_prenom,' ',par_nom)) HAVING COUNT(LOWER(CONCAT(par_prenom,' ',par_nom))) > 1)";
$recPanierEpreuves = $objDatabase->fxGetResultsKey($sqlPanierEpreuves, 'pec_id');
if ($recPanierEpreuves != null) {
// exécuter la requête
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET pra_id = " . intval($recPanierRabais[$intCtr]['pra_id']) . ", rab_priorite = " . intval($recPanierRabais[$intCtr]['rab_priorite']) . ", rab_montant = " . $strMontant . " WHERE pec_prix > 0 AND rab_priorite < " . intval($recPanierRabais[$intCtr]['rab_priorite']) . " AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND pec_id IN(" . implode(',', array_keys($recPanierEpreuves)) . ") AND epr_id IN(" . $recPanierRabais[$intCtr]['rab_epreuves'] . ")";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
$intNbAffectedRows = $objDatabase->fxGetNbAffectedRows();
if (intval($intNbAffectedRows) > 0) {
$arrRabaisAppliques[] = $recPanierRabais[$intCtr]['pra_id'];
}
}
} else {
// exécuter la requête
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET pra_id = " . intval($recPanierRabais[$intCtr]['pra_id']) . ", rab_priorite = " . intval($recPanierRabais[$intCtr]['rab_priorite']) . ", rab_montant = " . $strMontant . " WHERE pec_prix > 0 AND rab_priorite < " . intval($recPanierRabais[$intCtr]['rab_priorite']) . " AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND epr_id IN(" . $recPanierRabais[$intCtr]['rab_epreuves'] . ")";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
$intNbAffectedRows = $objDatabase->fxGetNbAffectedRows();
if (intval($intNbAffectedRows) > 0) {
$arrRabaisAppliques[] = $recPanierRabais[$intCtr]['pra_id'];
}
}
}
} /* else { // si le rabais s'applique à toutes les épreuves
// vérifier si le rabais est un montant ou pourcent
if ($recPanierRabais[$intCtr]['rab_pourcent'] > 0)
$strMontant = "(pec_prix * (" . intval($recPanierRabais[$intCtr]['rab_pourcent']) . " / 100))";
else
$strMontant = floatval($recPanierRabais[$intCtr]['rab_montant']);
if ($recPanierRabais[$intCtr]['rab_epr_diff'] == 1) { // appliquer le rabais seulement aux épreuves dfférentes
$sqlPanierEprDiff = "SELECT distinct(epr_id) AS epr_id FROM inscriptions_panier_epreuves_commandees c, inscriptions_rabais r WHERE no_panier = '" . fxUnescape($strNoPanier) . "' AND find_in_set(c.epr_id, r.rab_epreuves)";
$tabPanierEprDiff = $objDatabase->fxGetResults($sqlPanierEprDiff);
$tabEpreuves = array_map(function ($tab) { return $tab['epr_id']; }, $tabPanierEprDiff);
foreach ($tabEpreuves as $epr_id) {
// exécuter la requête
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET pra_id = " . intval($recPanierRabais[$intCtr]['pra_id']) . ", rab_priorite = " . intval($recPanierRabais[$intCtr]['rab_priorite']) . ", rab_montant = " . $strMontant . " WHERE pec_prix > 0 AND rab_priorite < " . intval($recPanierRabais[$intCtr]['rab_priorite']) . " AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND epr_id = " . intval($epr_id) . " LIMIT 1";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
}
} else {
// exécuter la requête
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees SET pra_id = " . intval($recPanierRabais[$intCtr]['pra_id']) . ", rab_priorite = " . intval($recPanierRabais[$intCtr]['rab_priorite']) . ", rab_montant = " . $strMontant . " WHERE pec_prix > 0 AND rab_priorite < " . intval($recPanierRabais[$intCtr]['rab_priorite']) . " AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
}
} */
// mettre à jour les produits
if (trim($recPanierRabais[$intCtr]['rab_produits']) != '') {
// vérifier si le rabais est un montant ou pourcent
if ($recPanierRabais[$intCtr]['rab_pourcent'] > 0)
$strMontant = "(pro_prix * (" . intval($recPanierRabais[$intCtr]['rab_pourcent']) . " / 100))";
else
$strMontant = floatval($recPanierRabais[$intCtr]['rab_montant']);
// exécuter la requête
$sqlUpdate = "UPDATE inscriptions_panier_produits_new SET pra_id = " . intval($recPanierRabais[$intCtr]['pra_id']) . ", rab_priorite = " . intval($recPanierRabais[$intCtr]['rab_priorite']) . ", rab_montant = " . $strMontant . " WHERE pro_prix > 0 AND rab_priorite < " . intval($recPanierRabais[$intCtr]['rab_priorite']) . " AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND pro_id IN(" . $recPanierRabais[$intCtr]['rab_produits'] . ")";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
if ($objDatabase->fxGetNbAffectedRows() > 0) {
$arrRabaisAppliques[] = $recPanierRabais[$intCtr]['pra_id'];
}
}
if (trim($recPanierRabais[$intCtr]['rab_epreuves']) == '' && trim($recPanierRabais[$intCtr]['rab_produits']) == '') { // si le rabais est appliqué sur le total du panier
$arrRabaisAppliques[] = $recPanierRabais[$intCtr]['pra_id'];
}
}
// vérifier les rabais_panier_acheteurs et effacer si non appliqué dans epreuves_commandees ou produits_new
if (!empty($arrRabaisAppliques)) {
$arrRabaisAppliques = array_unique($arrRabaisAppliques);
$strWhere = " AND pra_id NOT IN(" . implode(',', $arrRabaisAppliques) . ")";
}
$sqlPanierRabais = "DELETE FROM inscriptions_panier_rabais_acheteurs WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'" . $strWhere;
$qryDelPanierRabais = $objDatabase->fxQuery($sqlPanierRabais);
if ($objDatabase->fxGetNbAffectedRows() > 0) {
if (isset($_SESSION['msg'])) {
if ($_SESSION['msg'] == 'p121' || $_SESSION['msg'] == 'p521' || $_SESSION['msg'] == 'p301') {
$_SESSION['msg'] = 'e303';
}
}
}
}
fxCheckGenereDon($strNoPanier);
}
function fxMajStockRabais($strAction, $strNoPanier) {
global $objDatabase;
$sqlUpdate = "UPDATE inscriptions_rabais SET rab_qte = (rab_qte " . $strAction . " 1) WHERE rab_id IN(SELECT r.rab_id FROM inscriptions_panier_rabais_acheteurs p, inscriptions_panier_rabais r WHERE p.pra_id = r.pra_id AND p.no_panier = '" . $strNoPanier . "') AND rab_qte_limitee = 1";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
}
// fonction qui ajoute, supprime un rabais au panier automatique (SL)
// param : action (add/mod/del), numéro de panier, infos de l'événement, données POST, langue
// créé : 2013-10-23
function fxSetRabaisauto($strAction, $strNoPanier, $tabEvenement, $strLangue) {
global $objDatabase;
switch($strAction) {
case 'add':
// verifier si epreuves differentes
$sqlPanier = "SELECT distinct(epr_id) FROM inscriptions_panier_epreuves_commandees c, inscriptions_rabais r WHERE no_panier = '" . fxUnescape($strNoPanier) . "' and find_in_set(c.epr_id, r.rab_epreuves)";
// $sqlPanier = "SELECT distinct(epr_id) FROM inscriptions_panier_epreuves_commandees WHERE no_panier = '" . fxUnescape($strNoPanier) . "'";
$tabPanier = $objDatabase->fxFetchArray(2,$sqlPanier);
$intNbEprDiff = count($tabPanier);
// echo "in nb diff = " . $intNbEprDiff;
if($intNbEprDiff > 1) { // au moins 2 epreuves differentes dans le panier.
if($intNbEprDiff > 4)
$intNbEprDiff = 4; // pour limite de 4 et +
// create where
$strInSet = "(";
for($i = 1; $i <= count($tabPanier); $i++){
$strInSet .= $tabPanier[$i]['epr_id'] . ",";
}
$strInSet = substr($strInSet, 0, strlen($strInSet) -1);
$strInSet .= ")";
// echo $strInSet;
// verifier si un rabais pour epr_diff existe
$sqlRabais = "SELECT * FROM (SELECT * FROM inscriptions_rabais WHERE rab_actif = 1 AND rab_epr_diff = 1 AND rab_date_limite >= '" . fxGetDate() . "' AND rab_code = '" . intval($intNbEprDiff) . "DIFF' AND rab_code_manuel = 0 AND eve_id = " . intval($tabEvenement['general']['eve_id']) . " ORDER BY rab_priorite, rab_date_limite) AS rabais GROUP BY rab_condition ORDER BY rab_priorite";
$tabRabais = $objDatabase->fxGetResults($sqlRabais);
} else {
// vérifier les rabais disponibles
$sqlRabais = "SELECT * FROM (SELECT * FROM inscriptions_rabais WHERE rab_epr_diff = 0 AND rab_actif = 1 AND rab_date_limite >= '" . fxGetDate() . "' AND rab_code_manuel = 0 AND eve_id = " . intval($tabEvenement['general']['eve_id']) . " ORDER BY rab_priorite, rab_date_limite) AS rabais GROUP BY rab_condition ORDER BY rab_priorite";
$tabRabais = $objDatabase->fxGetResults($sqlRabais);
} // fin else (pas d'epr diff)
// info épreuves commandées
$sqlEpreuves = "SELECT c.*, e.epr_code, 0 AS rabais FROM inscriptions_panier_epreuves_commandees c, inscriptions_epreuves e WHERE c.epr_id = e.epr_id AND ep_id <> 0 AND c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$tabEpreuves = $objDatabase->fxGetResults($sqlEpreuves);
$intRabaisCtr = 1;
$mem_rabaistab = null;
// cherche si un rabais s'applique
for ($intCtr = 1; $intCtr <= count($tabRabais); $intCtr++) {
if($tabRabais[$intCtr]['rab_condition'] != '')
$rab_rech = json_decode($tabRabais[$intCtr]['rab_condition']);
else
$rab_rech = '';
$intNbRabais = 1;
$mem_rabaistab[$intRabaisCtr]['max'] = 0;
if($rab_rech != '') {
foreach ($rab_rech as $key => $value) {
$mem_rabaistab[$intRabaisCtr][$key] = $value;
$mem_rabaistab[$intRabaisCtr]['max'] += $value;
}
}
$mem_rabaistab[$intRabaisCtr]['x_rabais'] = $intCtr;
$mem_rabaistab[$intRabaisCtr]['rab_id'] = $tabRabais[$intCtr]['rab_id'];
$mem_rabaistab[$intRabaisCtr]['condition'] = $tabRabais[$intCtr]['rab_condition'];
for ($intCtr2 = 1; $intCtr2 <= count($tabEpreuves); $intCtr2++) {
$strCodeEpreuve = $tabEpreuves[$intCtr2]['epr_code'];
if ($tabEpreuves[$intCtr2]['rabais'] != 1) {
if ($rab_rech != '' && array_key_exists($strCodeEpreuve, $rab_rech) && $mem_rabaistab[$intRabaisCtr][$strCodeEpreuve] > 0) {
$mem_rabaistab[$intRabaisCtr][$strCodeEpreuve] -= 1;
$mem_rabaistab[$intRabaisCtr]['x_participants'][$intNbRabais] = $intCtr2;
$mem_rabaistab[$intRabaisCtr]['max'] -= 1;
$intNbRabais += 1;
}
}
}
if ($mem_rabaistab[$intRabaisCtr]['max'] == 0) { // if rabais est ok
// if ($rab_rech != '' && $mem_rabaistab[$intRabaisCtr]['max'] == 0) { // if rabais est ok
if($rab_rech != '') {
$mem_parti = $mem_rabaistab[$intRabaisCtr]['x_participants'];
foreach ($mem_parti as $key => $value)
$tabEpreuves[$value]['rabais'] = 1;
}
// ??? $intCtr--;
$intRabaisCtr++;
} else
unset($mem_rabaistab[$intRabaisCtr]);
}
// effacer les autre rabais
$sqlDelete = "DELETE FROM inscriptions_panier_rabais_acheteurs WHERE pra_type = 'auto' AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryDelete = $objDatabase->fxQuery($sqlDelete);
for ($intCtr = 1; $intCtr <= count($mem_rabaistab); $intCtr++) {
$intPanierRabais = fxCheckRabais($mem_rabaistab[$intCtr]['rab_id']);
// calculer rab_montant
$sqlMontants = "SELECT * FROM inscriptions_rabais WHERE rab_id = " . intval($intPanierRabais) . " AND eve_id = " . intval($tabEvenement['general']['eve_id']);
$tabMontants = $objDatabase->fxGetResults($sqlMontants);
// ajouter le rabais dans panier acheteurs
$sqlInsert = "INSERT INTO inscriptions_panier_rabais_acheteurs SET pra_type = 'auto', pra_id = " . intval($intPanierRabais) . ", no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryInsert = $objDatabase->fxQuery($sqlInsert);
}
// } // fin else (pas d'epr diff)
break;
}
}
//avant MSIN-3675
function fxSetRabaisauto2avant($strAction, $strNoPanier, $tabEvenement, $strLangue) {
global $objDatabase;
switch($strAction) {
case 'add':
// get rabais avec condition disponible
$sqlRabaisCondition = "
SELECT *
FROM (
SELECT *
FROM
inscriptions_rabais
WHERE
rab_epr_diff = 0 AND
rab_actif = 1 AND
rab_qte > 0 AND
rab_date_limite >= '" . fxGetDate() . "' AND
rab_date_limite_debut <= '" . fxGetDate() . "' AND
rab_code_manuel = 0 AND
rab_condition != '' AND
eve_id IN(
" . intval($tabEvenement['general']['eve_id']) . ", " . intval($tabEvenement['general']['eve_id_membership']) . "
)
ORDER BY
rab_priorite, rab_date_limite
) AS rabais
GROUP BY rab_condition
ORDER BY rab_priorite
";
$tabRabaisCondition = $objDatabase->fxGetResults($sqlRabaisCondition);
$sqlRabaisSansCondition = "
SELECT *
FROM (
SELECT *
FROM inscriptions_rabais
WHERE
rab_actif = 1 AND
rab_qte > 0 AND
rab_date_limite >= '" . fxGetDate() . "' AND
rab_date_limite_debut <= '" . fxGetDate() . "' AND
rab_code_manuel = 0 AND
rab_condition = '' AND
eve_id IN(
" . intval($tabEvenement['general']['eve_id']) . ", " . intval($tabEvenement['general']['eve_id_membership']) . "
)
ORDER BY rab_priorite, rab_date_limite
) AS rabais
group by rab_code
ORDER BY rab_priorite
";
// echo($sqlRabaisSansCondition);
// echo("<br>");
$tabRabaisSansCondition = $objDatabase->fxGetResults($sqlRabaisSansCondition);
// print_r($tabRabaisSansCondition);exit;
$sqlPanierEprDiff = "
SELECT distinct(epr_id)
FROM
inscriptions_panier_epreuves_commandees c, inscriptions_rabais r
WHERE
no_panier = '" . fxUnescape($strNoPanier) . "' AND
find_in_set(c.epr_id, r.rab_epreuves)
";
$tabPanierEprDiff = $objDatabase->fxGetResults($sqlPanierEprDiff);
// info épreuves commandées
$sqlEpreuves = "SELECT c.*, e.epr_code, 0 AS rabais FROM inscriptions_panier_epreuves_commandees c, inscriptions_epreuves e WHERE c.epr_id = e.epr_id AND ep_id <> 0 AND c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$tabEpreuves = $objDatabase->fxGetResults($sqlEpreuves);
// info épreuves commandées avec nom identiques
$sqlEpreuvesNomsIdentiques = "
SELECT
c.*, e.epr_code, 0 AS rabais
FROM
inscriptions_panier_epreuves_commandees c
JOIN inscriptions_epreuves e ON c.epr_id = e.epr_id
WHERE
c.ep_id <> 0 AND
c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND
c.epr_id IN(
SELECT
epr_id
FROM
inscriptions_panier_participants
WHERE
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND
LOWER(CONCAT(par_prenom,' ',par_nom)) IN(
SELECT
LOWER(CONCAT(par_prenom,' ',par_nom))
FROM
inscriptions_panier_participants
WHERE
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
GROUP BY
LOWER(CONCAT(par_prenom,' ',par_nom))
HAVING
COUNT(LOWER(CONCAT(par_prenom,' ',par_nom))) > 1
)
)
";
$tabEpreuvesNomsIdentiques = $objDatabase->fxGetResults($sqlEpreuvesNomsIdentiques);
$intRabaisCtr = 1;
$arrRabais = [];
// cherche si un rabais par condition s'applique
for ($intCtr = 1; $intCtr <= count($tabRabaisCondition); $intCtr++) {
$arrCondition = json_decode($tabRabaisCondition[$intCtr]['rab_condition']);
$intNbRabais = 1;
if ($arrCondition != '') {
$arrRabais[$intRabaisCtr]['max'] = 0;
foreach ($arrCondition as $key => $value) {
$arrRabais[$intRabaisCtr][$key] = $value;
$arrRabais[$intRabaisCtr]['max'] += $value;
}
$arrRabais[$intRabaisCtr]['x_rabais'] = $intCtr;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisCondition[$intCtr]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisCondition[$intCtr]['rab_condition'];
if ($tabRabaisCondition[$intCtr]['rab_noms_identiques'] == 1) { // si les noms des participants doivent être identiques
for ($intCtr2 = 1; $intCtr2 <= count($tabEpreuvesNomsIdentiques); $intCtr2++) {
$strCodeEpreuve = $tabEpreuvesNomsIdentiques[$intCtr2]['epr_code'];
if ($tabEpreuvesNomsIdentiques[$intCtr2]['rabais'] != 1) {
if (array_key_exists($strCodeEpreuve, $arrCondition) && $arrRabais[$intRabaisCtr][$strCodeEpreuve] > 0) {
$arrRabais[$intRabaisCtr][$strCodeEpreuve] -= 1;
$arrRabais[$intRabaisCtr]['x_participants'][$intNbRabais] = $intCtr2;
$arrRabais[$intRabaisCtr]['max'] -= 1;
$intNbRabais += 1;
}
}
}
} else {
for ($intCtr2 = 1; $intCtr2 <= count($tabEpreuves); $intCtr2++) {
$strCodeEpreuve = $tabEpreuves[$intCtr2]['epr_code'];
if ($tabEpreuves[$intCtr2]['rabais'] != 1) {
if (array_key_exists($strCodeEpreuve, $arrCondition) && $arrRabais[$intRabaisCtr][$strCodeEpreuve] > 0) {
$arrRabais[$intRabaisCtr][$strCodeEpreuve] -= 1;
$arrRabais[$intRabaisCtr]['x_participants'][$intNbRabais] = $intCtr2;
$arrRabais[$intRabaisCtr]['max'] -= 1;
$intNbRabais += 1;
}
}
}
}
if ($arrRabais[$intRabaisCtr]['max'] == 0) { // if rabais est ok
$mem_parti = $arrRabais[$intRabaisCtr]['x_participants'];
foreach ($mem_parti as $key => $value) {
$tabEpreuves[$value]['rabais'] = 1;
}
$intRabaisCtr++;
} else
unset($arrRabais[$intRabaisCtr]);
}
}
// cherche si un rabais SANS condition s'applique
for ($i = 1; $i <= count($tabRabaisSansCondition); $i++) {
if (intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff']) > 0) {
if (intval($tabRabaisSansCondition[$i]['rab_epr_diff']) === 1) {
if (intval($tabRabaisSansCondition[$i]['rab_noms_identiques']) === 1) { // si les noms des participants doivent être identiques
if ($tabEpreuvesNomsIdentiques != null) {
$arrEpreeuve = array_map(function($arr) { return $arr['epr_id']; }, $tabEpreuvesNomsIdentiques);
$intNbEpr = count(array_unique($arrEpreeuve));
} else {
$intNbEpr = 1;
}
} else {
$intNbEpr = count($tabPanierEprDiff);
}
/*if ($intNbEpr > 4)
$intNbEpr = 4;*/
} else {
$intNbEpr = count($tabEpreuves);
}
$mem_int_code = $tabRabaisSansCondition[$i]['rab_nb_epr_diff'];
$intNbRabais = 1;
$arrRabais[$intRabaisCtr]['max'] = 0;
if ($intNbEpr == $mem_int_code) {
$arrRabais[$intRabaisCtr]['x_rabais'] = $i;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisSansCondition[$i]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisSansCondition[$i]['rab_condition'];
$arrRabais[$intRabaisCtr]['code'] = $tabRabaisSansCondition[$i]['rab_code'];
}
$intRabaisCtr++;
} elseif ($tabRabaisSansCondition[$i]['rab_nb_epr_diff2'] > 0) {
$intNbEpr = count($tabEpreuves);
$mem_int_code = $tabRabaisSansCondition[$i]['rab_nb_epr_diff2'];
$intNbRabais = 1;
$arrRabais[$intRabaisCtr]['max'] = 0;
if ($mem_int_code <= $intNbEpr) {
$arrRabais[$intRabaisCtr]['x_rabais'] = $i;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisSansCondition[$i]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisSansCondition[$i]['rab_condition'];
$arrRabais[$intRabaisCtr]['code'] = $tabRabaisSansCondition[$i]['rab_code'];
}
$intRabaisCtr++;
}
}
// gerer rabais dans DB (tables _panier_rabais_*
// effacer les autres rabais
$sqlDelete = "DELETE FROM inscriptions_panier_rabais_acheteurs WHERE pra_type = 'auto' AND no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryDelete = $objDatabase->fxQuery($sqlDelete);
for ($intCtr = 1; $intCtr <= count($arrRabais); $intCtr++) {
if (isset($arrRabais[$intCtr]['rab_id'])) {
$intPanierRabais = fxCheckRabais($arrRabais[$intCtr]['rab_id']);
// calculer rab_montant
$sqlMontants = "SELECT * FROM inscriptions_rabais WHERE rab_id = " . intval($intPanierRabais) . " AND eve_id IN(" . intval($tabEvenement['general']['eve_id']) . ", " . intval($tabEvenement['general']['eve_id_membership']) . ")";
$tabMontants = $objDatabase->fxGetResults($sqlMontants);
// ajouter le rabais dans panier acheteurs
$sqlInsert = "INSERT INTO inscriptions_panier_rabais_acheteurs SET pra_type = 'auto', pra_id = " . intval($intPanierRabais) . ", no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryInsert = $objDatabase->fxQuery($sqlInsert);
}
}
break;
}
// calculer le montant dans panier participants
fxMajRabais($strNoPanier);
}
//MSIN-3675 fxSetRabaisauto2avant2
function fxSetRabaisauto2avant2($strAction, $strNoPanier, $tabEvenement, $strLangue) {
global $objDatabase;
switch($strAction) {
case 'add':
// =====================================================
// RABAIS AVEC CONDITION
// =====================================================
// rab_condition = JSON définissant les règles (ex: {"5KM":2,"10KM":1})
// rab_epr_diff = 0 → les épreuves peuvent être identiques
// rab_actif = 1 → rabais actif
// rab_qte > 0 → quantité restante disponible
// rab_date_limite / rab_date_limite_debut → période de validité
// rab_code_manuel = 0 → rabais automatique (non saisi par l'utilisateur)
// eve_id → événement concerné
$sqlRabaisCondition = "
SELECT *
FROM (
SELECT *
FROM inscriptions_rabais
WHERE
rab_epr_diff = 0 AND
rab_actif = 1 AND
rab_qte > 0 AND
rab_date_limite >= '" . fxGetDate() . "' AND
rab_date_limite_debut <= '" . fxGetDate() . "' AND
rab_code_manuel = 0 AND
rab_condition != '' AND
eve_id IN(
" . intval($tabEvenement['general']['eve_id']) . ",
" . intval($tabEvenement['general']['eve_id_membership']) . "
)
ORDER BY rab_priorite, rab_date_limite
) AS rabais
GROUP BY rab_condition
ORDER BY rab_priorite
";
$tabRabaisCondition = $objDatabase->fxGetResults($sqlRabaisCondition);
// =====================================================
// RABAIS SANS CONDITION
// =====================================================
// rab_condition = '' → pas de JSON → logique basée sur le nombre dépreuves
// rab_nb_epr_diff = nombre EXACT dépreuves requis
// rab_nb_epr_diff2 = nombre MINIMUM dépreuves
// rab_epr_diff = 1 → on exige des épreuves différentes
// rab_noms_identiques = 1 → même nom/prénom requis
// rab_code = code du rabais
$sqlRabaisSansCondition = "
SELECT *
FROM (
SELECT *
FROM inscriptions_rabais
WHERE
rab_actif = 1 AND
rab_qte > 0 AND
rab_date_limite >= '" . fxGetDate() . "' AND
rab_date_limite_debut <= '" . fxGetDate() . "' AND
rab_code_manuel = 0 AND
rab_condition = '' AND
eve_id IN(
" . intval($tabEvenement['general']['eve_id']) . ",
" . intval($tabEvenement['general']['eve_id_membership']) . "
)
ORDER BY rab_priorite, rab_date_limite
) AS rabais
GROUP BY rab_code
ORDER BY rab_priorite
";
$tabRabaisSansCondition = $objDatabase->fxGetResults($sqlRabaisSansCondition);
// =====================================================
// ÉPREUVES DU PANIER
// =====================================================
// epr_id = épreuve inscrite
// rab_epreuves = liste des épreuves auxquelles le rabais sapplique
$sqlPanierEprDiff = "
SELECT DISTINCT(epr_id)
FROM inscriptions_panier_epreuves_commandees c, inscriptions_rabais r
WHERE
no_panier = '" . fxUnescape($strNoPanier) . "' AND
FIND_IN_SET(c.epr_id, r.rab_epreuves)
";
$tabPanierEprDiff = $objDatabase->fxGetResults($sqlPanierEprDiff);
// Épreuves commandées (toutes)
$sqlEpreuves = "
SELECT c.*, e.epr_code, 0 AS rabais
FROM inscriptions_panier_epreuves_commandees c, inscriptions_epreuves e
WHERE
c.epr_id = e.epr_id AND
ep_id <> 0 AND
c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
";
$tabEpreuves = $objDatabase->fxGetResults($sqlEpreuves);
// Épreuves avec noms identiques
// rab_noms_identiques = 1 → même participant requis pour appliquer rabais
$sqlEpreuvesNomsIdentiques = "
SELECT
c.*, e.epr_code, 0 AS rabais
FROM
inscriptions_panier_epreuves_commandees c
JOIN inscriptions_epreuves e ON c.epr_id = e.epr_id
WHERE
c.ep_id <> 0 AND
c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND
c.epr_id IN(
SELECT epr_id
FROM inscriptions_panier_participants
WHERE
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND
LOWER(CONCAT(par_prenom,' ',par_nom)) IN(
SELECT LOWER(CONCAT(par_prenom,' ',par_nom))
FROM inscriptions_panier_participants
WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
GROUP BY LOWER(CONCAT(par_prenom,' ',par_nom))
HAVING COUNT(LOWER(CONCAT(par_prenom,' ',par_nom))) > 1
)
)
";
$tabEpreuvesNomsIdentiques = $objDatabase->fxGetResults($sqlEpreuvesNomsIdentiques);
// =====================================================
// TRAITEMENT RABAIS AVEC CONDITION
// =====================================================
// rab_condition = JSON → règles exactes par type dépreuve
// max = nombre total restant à satisfaire
// x_participants = index des participants utilisés
$intRabaisCtr = 1;
$arrRabais = [];
for ($intCtr = 1; $intCtr <= count($tabRabaisCondition); $intCtr++) {
$arrCondition = json_decode($tabRabaisCondition[$intCtr]['rab_condition']);
$intNbRabais = 1;
if ($arrCondition != '') {
$arrRabais[$intRabaisCtr]['max'] = 0;
foreach ($arrCondition as $key => $value) {
$arrRabais[$intRabaisCtr][$key] = $value;
$arrRabais[$intRabaisCtr]['max'] += $value;
}
$arrRabais[$intRabaisCtr]['x_rabais'] = $intCtr;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisCondition[$intCtr]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisCondition[$intCtr]['rab_condition'];
if ($tabRabaisCondition[$intCtr]['rab_noms_identiques'] == 1) {
// Seulement participants avec même nom
for ($intCtr2 = 1; $intCtr2 <= count($tabEpreuvesNomsIdentiques); $intCtr2++) {
$strCodeEpreuve = $tabEpreuvesNomsIdentiques[$intCtr2]['epr_code'];
if ($tabEpreuvesNomsIdentiques[$intCtr2]['rabais'] != 1) {
if (
array_key_exists($strCodeEpreuve, $arrCondition) &&
$arrRabais[$intRabaisCtr][$strCodeEpreuve] > 0
) {
$arrRabais[$intRabaisCtr][$strCodeEpreuve] -= 1;
$arrRabais[$intRabaisCtr]['x_participants'][$intNbRabais] = $intCtr2;
$arrRabais[$intRabaisCtr]['max'] -= 1;
$intNbRabais++;
}
}
}
} else {
// Tous les participants
for ($intCtr2 = 1; $intCtr2 <= count($tabEpreuves); $intCtr2++) {
$strCodeEpreuve = $tabEpreuves[$intCtr2]['epr_code'];
if ($tabEpreuves[$intCtr2]['rabais'] != 1) {
if (
array_key_exists($strCodeEpreuve, $arrCondition) &&
$arrRabais[$intRabaisCtr][$strCodeEpreuve] > 0
) {
$arrRabais[$intRabaisCtr][$strCodeEpreuve] -= 1;
$arrRabais[$intRabaisCtr]['x_participants'][$intNbRabais] = $intCtr2;
$arrRabais[$intRabaisCtr]['max'] -= 1;
$intNbRabais++;
}
}
}
}
// max == 0 → toutes les conditions respectées → rabais valide
if ($arrRabais[$intRabaisCtr]['max'] == 0) {
$mem_parti = $arrRabais[$intRabaisCtr]['x_participants'];
foreach ($mem_parti as $key => $value) {
$tabEpreuves[$value]['rabais'] = 1;
}
$intRabaisCtr++;
} else {
unset($arrRabais[$intRabaisCtr]);
}
}
}
// =====================================================
// TRAITEMENT RABAIS SANS CONDITION
// =====================================================
for ($i = 1; $i <= count($tabRabaisSansCondition); $i++) {
if (intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff']) > 0) {
if (intval($tabRabaisSansCondition[$i]['rab_epr_diff']) === 1) {
if (intval($tabRabaisSansCondition[$i]['rab_noms_identiques']) === 1) {
// Compte seulement participants avec même nom
if ($tabEpreuvesNomsIdentiques != null) {
$arrEpreeuve = array_map(function($arr) { return $arr['epr_id']; }, $tabEpreuvesNomsIdentiques);
$intNbEpr = count(array_unique($arrEpreeuve));
} else {
$intNbEpr = 1;
}
} else {
$intNbEpr = count($tabPanierEprDiff);
}
} else {
$intNbEpr = count($tabEpreuves);
}
// Nombre EXACT dépreuves requis
$mem_int_code = $tabRabaisSansCondition[$i]['rab_nb_epr_diff'];
$intNbRabais = 1;
$arrRabais[$intRabaisCtr]['max'] = 0;
if (
(
intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff_de']) > 0 &&
$intNbEpr >= intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff_de']) &&
$intNbEpr <= $mem_int_code
)
||
(
intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff_de']) == 0 &&
$intNbEpr == $mem_int_code
)
) {
$arrRabais[$intRabaisCtr]['x_rabais'] = $i;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisSansCondition[$i]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisSansCondition[$i]['rab_condition'];
$arrRabais[$intRabaisCtr]['code'] = $tabRabaisSansCondition[$i]['rab_code'];
}
$intRabaisCtr++;
} elseif ($tabRabaisSansCondition[$i]['rab_nb_epr_diff2'] > 0) {
// Nombre MINIMUM dépreuves requis
$intNbEpr = count($tabEpreuves);
$mem_int_code = $tabRabaisSansCondition[$i]['rab_nb_epr_diff2'];
$intNbRabais = 1;
$arrRabais[$intRabaisCtr]['max'] = 0;
if ($mem_int_code <= $intNbEpr) {
$arrRabais[$intRabaisCtr]['x_rabais'] = $i;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisSansCondition[$i]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisSansCondition[$i]['rab_condition'];
$arrRabais[$intRabaisCtr]['code'] = $tabRabaisSansCondition[$i]['rab_code'];
}
$intRabaisCtr++;
}
}
// =====================================================
// ÉCRITURE DB
// =====================================================
// inscriptions_panier_rabais_acheteurs = rabais appliqués au panier
// pra_type = 'auto' → rabais automatique
// DELETE → reset des rabais avant recalcul
$sqlDelete = "
DELETE FROM inscriptions_panier_rabais_acheteurs
WHERE
pra_type = 'auto' AND
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
";
$qryDelete = $objDatabase->fxQuery($sqlDelete);
for ($intCtr = 1; $intCtr <= count($arrRabais); $intCtr++) {
if (isset($arrRabais[$intCtr]['rab_id'])) {
$intPanierRabais = fxCheckRabais($arrRabais[$intCtr]['rab_id']);
// rab_montant / rab_pourcent récupéré ici
$sqlMontants = "
SELECT *
FROM inscriptions_rabais
WHERE
rab_id = " . intval($intPanierRabais) . " AND
eve_id IN(
" . intval($tabEvenement['general']['eve_id']) . ",
" . intval($tabEvenement['general']['eve_id_membership']) . "
)
";
$tabMontants = $objDatabase->fxGetResults($sqlMontants);
$sqlInsert = "
INSERT INTO inscriptions_panier_rabais_acheteurs
SET
pra_type = 'auto',
pra_id = " . intval($intPanierRabais) . ",
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
";
$qryInsert = $objDatabase->fxQuery($sqlInsert);
}
}
break;
}
// =====================================================
// RECALCUL FINAL
// =====================================================
// Recalcule le montant des rabais dans le panier
fxMajRabais($strNoPanier);
}
function fxSetRabaisauto2($strAction, $strNoPanier, $tabEvenement, $strLangue) {
global $objDatabase;
switch($strAction) {
case 'add':
// =====================================================
// RABAIS AVEC CONDITION
// =====================================================
// rab_condition = JSON définissant les règles (ex: {"5KM":2,"10KM":1})
// rab_epr_diff = 0 → les épreuves peuvent être identiques
// rab_actif = 1 → rabais actif
// rab_qte > 0 → quantité restante disponible
// rab_date_limite / rab_date_limite_debut → période de validité
// rab_code_manuel = 0 → rabais automatique (non saisi par l'utilisateur)
// eve_id → événement concerné
$sqlRabaisCondition = "
SELECT *
FROM (
SELECT *
FROM inscriptions_rabais
WHERE
rab_epr_diff = 0 AND
rab_actif = 1 AND
rab_qte > 0 AND
rab_date_limite >= '" . fxGetDate() . "' AND
rab_date_limite_debut <= '" . fxGetDate() . "' AND
rab_code_manuel = 0 AND
rab_condition != '' AND
eve_id IN(
" . intval($tabEvenement['general']['eve_id']) . ",
" . intval($tabEvenement['general']['eve_id_membership']) . "
)
ORDER BY rab_priorite, rab_date_limite
) AS rabais
GROUP BY rab_condition
ORDER BY rab_priorite
";
$tabRabaisCondition = $objDatabase->fxGetResults($sqlRabaisCondition);
// =====================================================
// RABAIS SANS CONDITION
// =====================================================
// rab_condition = '' → pas de JSON → logique basée sur le nombre dépreuves
// rab_nb_epr_diff = nombre EXACT dépreuves requis
// rab_nb_epr_diff2 = nombre MINIMUM dépreuves
// rab_epr_diff = 1 → on exige des épreuves différentes
// rab_noms_identiques = 1 → même nom/prénom requis
// rab_code = code du rabais
$sqlRabaisSansCondition = "
SELECT *
FROM (
SELECT *
FROM inscriptions_rabais
WHERE
rab_actif = 1 AND
rab_qte > 0 AND
rab_date_limite >= '" . fxGetDate() . "' AND
rab_date_limite_debut <= '" . fxGetDate() . "' AND
rab_code_manuel = 0 AND
rab_condition = '' AND
eve_id IN(
" . intval($tabEvenement['general']['eve_id']) . ",
" . intval($tabEvenement['general']['eve_id_membership']) . "
)
ORDER BY rab_priorite, rab_date_limite
) AS rabais
GROUP BY rab_code
ORDER BY rab_priorite
";
$tabRabaisSansCondition = $objDatabase->fxGetResults($sqlRabaisSansCondition);
// =====================================================
// ÉPREUVES DU PANIER
// =====================================================
// epr_id = épreuve inscrite
// rab_epreuves = liste des épreuves auxquelles le rabais sapplique
$sqlPanierEprDiff = "
SELECT DISTINCT(epr_id)
FROM inscriptions_panier_epreuves_commandees c, inscriptions_rabais r
WHERE
no_panier = '" . fxUnescape($strNoPanier) . "' AND
FIND_IN_SET(c.epr_id, r.rab_epreuves)
";
$tabPanierEprDiff = $objDatabase->fxGetResults($sqlPanierEprDiff);
// Épreuves commandées (toutes)
$sqlEpreuves = "
SELECT c.*, e.epr_code, 0 AS rabais
FROM inscriptions_panier_epreuves_commandees c, inscriptions_epreuves e
WHERE
c.epr_id = e.epr_id AND
ep_id <> 0 AND
c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
";
$tabEpreuves = $objDatabase->fxGetResults($sqlEpreuves);
// Épreuves avec noms identiques
// rab_noms_identiques = 1 → même participant requis pour appliquer rabais
$sqlEpreuvesNomsIdentiques = "
SELECT
c.*, e.epr_code, 0 AS rabais
FROM
inscriptions_panier_epreuves_commandees c
JOIN inscriptions_epreuves e ON c.epr_id = e.epr_id
WHERE
c.ep_id <> 0 AND
c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND
c.epr_id IN(
SELECT epr_id
FROM inscriptions_panier_participants
WHERE
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "' AND
LOWER(CONCAT(par_prenom,' ',par_nom)) IN(
SELECT LOWER(CONCAT(par_prenom,' ',par_nom))
FROM inscriptions_panier_participants
WHERE no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
GROUP BY LOWER(CONCAT(par_prenom,' ',par_nom))
HAVING COUNT(LOWER(CONCAT(par_prenom,' ',par_nom))) > 1
)
)
";
$tabEpreuvesNomsIdentiques = $objDatabase->fxGetResults($sqlEpreuvesNomsIdentiques);
// =====================================================
// TRAITEMENT RABAIS AVEC CONDITION
// =====================================================
// rab_condition = JSON → règles exactes par type dépreuve
// max = nombre total restant à satisfaire
// x_participants = index des participants utilisés
$intRabaisCtr = 1;
$arrRabais = [];
for ($intCtr = 1; $intCtr <= count($tabRabaisCondition); $intCtr++) {
$arrCondition = json_decode($tabRabaisCondition[$intCtr]['rab_condition']);
$intNbRabais = 1;
if ($arrCondition != '') {
$arrRabais[$intRabaisCtr]['max'] = 0;
foreach ($arrCondition as $key => $value) {
$arrRabais[$intRabaisCtr][$key] = $value;
$arrRabais[$intRabaisCtr]['max'] += $value;
}
$arrRabais[$intRabaisCtr]['x_rabais'] = $intCtr;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisCondition[$intCtr]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisCondition[$intCtr]['rab_condition'];
if ($tabRabaisCondition[$intCtr]['rab_noms_identiques'] == 1) {
// Seulement participants avec même nom
for ($intCtr2 = 1; $intCtr2 <= count($tabEpreuvesNomsIdentiques); $intCtr2++) {
$strCodeEpreuve = $tabEpreuvesNomsIdentiques[$intCtr2]['epr_code'];
if ($tabEpreuvesNomsIdentiques[$intCtr2]['rabais'] != 1) {
if (
array_key_exists($strCodeEpreuve, $arrCondition) &&
$arrRabais[$intRabaisCtr][$strCodeEpreuve] > 0
) {
$arrRabais[$intRabaisCtr][$strCodeEpreuve] -= 1;
$arrRabais[$intRabaisCtr]['x_participants'][$intNbRabais] = $intCtr2;
$arrRabais[$intRabaisCtr]['max'] -= 1;
$intNbRabais++;
}
}
}
} else {
// Tous les participants
for ($intCtr2 = 1; $intCtr2 <= count($tabEpreuves); $intCtr2++) {
$strCodeEpreuve = $tabEpreuves[$intCtr2]['epr_code'];
if ($tabEpreuves[$intCtr2]['rabais'] != 1) {
if (
array_key_exists($strCodeEpreuve, $arrCondition) &&
$arrRabais[$intRabaisCtr][$strCodeEpreuve] > 0
) {
$arrRabais[$intRabaisCtr][$strCodeEpreuve] -= 1;
$arrRabais[$intRabaisCtr]['x_participants'][$intNbRabais] = $intCtr2;
$arrRabais[$intRabaisCtr]['max'] -= 1;
$intNbRabais++;
}
}
}
}
// max == 0 → toutes les conditions respectées → rabais valide
if ($arrRabais[$intRabaisCtr]['max'] == 0) {
$mem_parti = $arrRabais[$intRabaisCtr]['x_participants'];
foreach ($mem_parti as $key => $value) {
$tabEpreuves[$value]['rabais'] = 1;
}
$intRabaisCtr++;
} else {
unset($arrRabais[$intRabaisCtr]);
}
}
}
// =====================================================
// TRAITEMENT RABAIS SANS CONDITION
// =====================================================
for ($i = 1; $i <= count($tabRabaisSansCondition); $i++) {
if (intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff']) > 0) {
if (intval($tabRabaisSansCondition[$i]['rab_epr_diff']) === 1) {
if (intval($tabRabaisSansCondition[$i]['rab_noms_identiques']) === 1) {
// Compte seulement participants avec même nom
if ($tabEpreuvesNomsIdentiques != null) {
$arrEpreeuve = array_map(function($arr) { return $arr['epr_id']; }, $tabEpreuvesNomsIdentiques);
$intNbEpr = count(array_unique($arrEpreeuve));
} else {
$intNbEpr = 1;
}
} else {
// atester MSIN-3765
//$intNbEpr = count($tabPanierEprDiff);
$arrEpreeuve = array_map(function($arr) { return $arr['epr_id']; }, $tabEpreuves);
$intNbEpr = count(array_unique($arrEpreeuve));
}
} else {
$intNbEpr = count($tabEpreuves);
}
// Nombre EXACT dépreuves requis
$mem_int_code = $tabRabaisSansCondition[$i]['rab_nb_epr_diff'];
$intNbRabais = 1;
$arrRabais[$intRabaisCtr]['max'] = 0;
if (
(
intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff_de']) > 0 &&
$intNbEpr >= intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff_de']) &&
$intNbEpr <= $mem_int_code
)
||
(
intval($tabRabaisSansCondition[$i]['rab_nb_epr_diff_de']) == 0 &&
$intNbEpr == $mem_int_code
)
) {
$arrRabais[$intRabaisCtr]['x_rabais'] = $i;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisSansCondition[$i]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisSansCondition[$i]['rab_condition'];
$arrRabais[$intRabaisCtr]['code'] = $tabRabaisSansCondition[$i]['rab_code'];
}
$intRabaisCtr++;
} elseif ($tabRabaisSansCondition[$i]['rab_nb_epr_diff2'] > 0) {
// Nombre MINIMUM dépreuves requis
$intNbEpr = count($tabEpreuves);
$mem_int_code = $tabRabaisSansCondition[$i]['rab_nb_epr_diff2'];
$intNbRabais = 1;
$arrRabais[$intRabaisCtr]['max'] = 0;
if ($mem_int_code <= $intNbEpr) {
$arrRabais[$intRabaisCtr]['x_rabais'] = $i;
$arrRabais[$intRabaisCtr]['rab_id'] = $tabRabaisSansCondition[$i]['rab_id'];
$arrRabais[$intRabaisCtr]['condition'] = $tabRabaisSansCondition[$i]['rab_condition'];
$arrRabais[$intRabaisCtr]['code'] = $tabRabaisSansCondition[$i]['rab_code'];
}
$intRabaisCtr++;
}
}
// =====================================================
// ÉCRITURE DB
// =====================================================
// inscriptions_panier_rabais_acheteurs = rabais appliqués au panier
// pra_type = 'auto' → rabais automatique
// DELETE → reset des rabais avant recalcul
$sqlDelete = "
DELETE FROM inscriptions_panier_rabais_acheteurs
WHERE
pra_type = 'auto' AND
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
";
$qryDelete = $objDatabase->fxQuery($sqlDelete);
for ($intCtr = 1; $intCtr <= count($arrRabais); $intCtr++) {
if (isset($arrRabais[$intCtr]['rab_id'])) {
$intPanierRabais = fxCheckRabais($arrRabais[$intCtr]['rab_id']);
// rab_montant / rab_pourcent récupéré ici
$sqlMontants = "
SELECT *
FROM inscriptions_rabais
WHERE
rab_id = " . intval($intPanierRabais) . " AND
eve_id IN(
" . intval($tabEvenement['general']['eve_id']) . ",
" . intval($tabEvenement['general']['eve_id_membership']) . "
)
";
$tabMontants = $objDatabase->fxGetResults($sqlMontants);
$sqlInsert = "
INSERT INTO inscriptions_panier_rabais_acheteurs
SET
pra_type = 'auto',
pra_id = " . intval($intPanierRabais) . ",
no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'
";
$qryInsert = $objDatabase->fxQuery($sqlInsert);
}
}
break;
}
// =====================================================
// RECALCUL FINAL
// =====================================================
// Recalcule le montant des rabais dans le panier
fxMajRabais($strNoPanier);
}
function fxCheckEpreuveRabais($tab_data, $int_eve_id, $int_epr_id, $int_rab_id){
/*
* get rab_epreuves from inscriptions_rabais
* */
var_dump($tab_data['rab_epreuves']);
}
// fonction qui vérifie si l'épreuve doit générer un don MSIN-2566 (JSP)
// param : no panier
// créé : 2018-12-16
function fxCheckGenereDon($strNoPanier) {
global $objDatabase;
// désactiver
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees c, inscriptions_panier_epreuves e SET c.pec_don_actif = 0 WHERE c.epr_id = e.epr_id AND (c.pec_prix - c.rab_montant) < e.epr_montant_min_don AND c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
// activer
$sqlUpdate = "UPDATE inscriptions_panier_epreuves_commandees c, inscriptions_panier_epreuves e SET c.pec_don_actif = 1 WHERE c.epr_id = e.epr_id AND (c.pec_prix - c.rab_montant) >= e.epr_montant_min_don AND c.no_panier = '" . $objDatabase->fxEscape($strNoPanier) . "'";
$qryUpdate = $objDatabase->fxQuery($sqlUpdate);
}