示例#1
0
    /**
     * Envoi des rappels automatiques par e-mail
     * @return boolean TRUE en cas de succès
     */
    public function sendPending()
    {
        $db = DB::getInstance();
        $config = Config::getInstance();
        // Requête compliquée qui fait tout le boulot
        // la logique est un JOIN des tables rappels, cotisations, cotisations_membres et membres
        // pour récupérer la liste des membres qui doivent recevoir une cotisation
        $query = '
		SELECT 
			*,
			/* Nombre de jours avant ou après expiration */
			(julianday(date()) - julianday(expiration)) AS nb_jours,
			/* Date de mise en œuvre du rappel */
			date(expiration, delai || \' days\') AS date_rappel
		FROM (
			SELECT m.*, r.delai, r.sujet, r.texte, r.id_cotisation, r.id AS id_rappel,
				m.' . $config->get('champ_identite') . ' AS identite,
				CASE WHEN c.duree IS NOT NULL THEN date(cm.date, \'+\'||c.duree||\' days\')
				WHEN c.fin IS NOT NULL THEN c.fin ELSE 0 END AS expiration
			FROM rappels AS r
				INNER JOIN cotisations AS c ON c.id = r.id_cotisation
				INNER JOIN cotisations_membres AS cm ON cm.id_cotisation = c.id
				INNER JOIN membres AS m ON m.id = cm.id_membre
			WHERE
				/* Inutile de sélectionner les membres sans email */
				m.email IS NOT NULL AND m.email != \'\'
				/* Les cotisations ponctuelles ne comptent pas */
				AND (c.fin IS NOT NULL OR c.duree IS NOT NULL)
				/* Rien nest envoyé aux membres des catégories cachées, logique */
				AND m.id_categorie NOT IN (SELECT id FROM membres_categories WHERE cacher = 1)
    		/* Grouper par membre, pour n\'envoyer qu\'un seul rappel par membre/cotise */
	    	GROUP BY m.id, r.id_cotisation
			ORDER BY r.delai ASC
		)
		WHERE nb_jours >= delai 
			/* Pour ne pas spammer on n\'envoie pas de rappel antérieur au dernier rappel déjà effectué */
			AND id NOT IN (SELECT id_membre FROM rappels_envoyes AS re 
				WHERE id_cotisation = re.id_cotisation 
				AND re.date >= date(expiration, delai || \' days\')
			)
		ORDER BY nb_jours DESC;';
        $db->exec('BEGIN');
        $st = $db->prepare($query);
        $res = $st->execute();
        $re = new Rappels_Envoyes();
        while ($row = $res->fetchArray(DB::ASSOC)) {
            $re->sendAuto($row);
        }
        $db->exec('END;');
        return true;
    }
示例#2
0
namespace Garradin;

require_once __DIR__ . '/../../_inc.php';
if ($user['droits']['membres'] < Membres::DROIT_ECRITURE) {
    throw new UserException("Vous n'avez pas le droit d'accéder à cette page.");
}
if (empty($_GET['id']) || !is_numeric($_GET['id'])) {
    throw new UserException("Argument du numéro de membre manquant.");
}
$id = (int) $_GET['id'];
$membre = $membres->get($id);
if (!$membre) {
    throw new UserException("Ce membre n'existe pas.");
}
$re = new Rappels_Envoyes();
$cm = new Membres\Cotisations();
$error = false;
if (Utils::post('save')) {
    if (!Utils::CSRF_check('add_rappel_' . $membre['id'])) {
        $error = 'Une erreur est survenue, merci de renvoyer le formulaire.';
    } else {
        try {
            $re->add(['id_rappel' => NULL, 'id_cotisation' => Utils::post('id_cotisation'), 'id_membre' => $membre['id'], 'media' => Utils::post('media'), 'date' => Utils::post('date')]);
            Utils::redirect('/admin/membres/cotisations/rappels.php?id=' . $membre['id'] . '&ok');
        } catch (UserException $e) {
            $error = $e->getMessage();
        }
    }
}
$tpl->assign('error', $error);