Exemple #1
0
function spiplistes_courriers_statut_compter ($statut='tous') {
	$sql_where = spiplistes_listes_sql_where_or(
		($statut == 'tous')
		? _SPIPLISTES_COURRIERS_STATUTS
		: $statut
		);
	return(spiplistes_sql_compter('spip_courriers', $sql_where));
}
function spiplistes_auteur_abonnement_details ($id_auteur, $auteur_statut, $email) {
	
	include_spip("inc/spiplistes_api");
	include_spip("inc/spiplistes_api_presentation");

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		;

	$result = "";

	$flag_editable = (
		(($connect_statut == '0minirezo') && $connect_toutes_rubriques)
		|| ($connect_id_auteur == $id_auteur)
		);

	if($flag_editable) {
		
		// recupere la liste des abonnements disponibles
		$sql_where = spiplistes_listes_sql_where_or(_SPIPLISTES_LISTES_STATUTS_PERIODIQUES)
			. " OR statut=".sql_quote(_SPIPLISTES_LIST_PUBLIC);
			
		// les auteurs ont droit aux listes privees (internes)
		if(($auteur_statut == '1comite') || ($auteur_statut == '0minirezo')) {
			$sql_where .= " OR statut=".sql_quote(_SPIPLISTES_LIST_PRIVATE);
		}

		$sql_result = sql_select(
			array('id_liste','titre','texte','date','statut')
			, "spip_listes"
			, $sql_where
			, ''
			, array("titre ASC")
			);

		$nb_listes_dispo = sql_count($sql_result);
//spiplistes_log(gettype($nb_listes_dispo).":".$nb_listes_dispo);

		// si liste disponible, affiche formulaire
		if($sql_result && $nb_listes_dispo) {
			
			// recupere la liste des listes
			$listes = array();
			while($row = sql_fetch($sql_result)) {
				$texte = propre($row['texte']);
				if(strlen($legend = textebrut($texte)) > 40) {
					$texte = couper($texte, 40);
				}
				$texte = strip_tags($texte, '<strong>');
				$listes[] = array(
					'id_liste' => intval($row['id_liste'])
					, 'titre' => $row['titre']
					, 'texte' => $texte
					, 'date' => $row['date']
					, 'statut' => $row['statut']
					, 'legend' => $legend
				);
			} // end while
			
			// si retour de formulaire, ajoute/retire les abonnements
			if(_request('btn_abonnements_valider')) {
				$abos_set = _request('abos_set');
				$abo_ajoute = array();
				// liste des abonnements de id_auteur
				$auteur_abos_current_list = spiplistes_abonnements_listes_auteur($id_auteur);
				// ajoute/retire les abonnements desires
				if(count($abos_set)) {
					// Abonnements ?
					foreach($abos_set as $value) {
						if(!in_array($value, $auteur_abos_current_list)) {
							$abo_ajoute[] = $value;
						}
					}
					if(count($abo_ajoute)) {
						spiplistes_abonnements_ajouter($id_auteur, $abo_ajoute);
					}
					// Desabonnements ?
					foreach($auteur_abos_current_list as $value) {
						if(!in_array($value, $abos_set)) {
							spiplistes_abonnements_auteur_desabonner($id_auteur, $value);
						}
					}
				}
				// desabonne de tout
				else {
					if(spiplistes_abonnements_auteur_desabonner($id_auteur, "toutes") === false) {
						$result .= spiplistes_boite_alerte(_T('spiplistes:Erreur_sur_la_base'), true);
					}
				}
			} // end if
			
			// si retour de formulaire, modifie le format de reception
			if($abo_format = _request('abo_format')) {
				spiplistes_format_abo_modifier($id_auteur, $abo_format);
			}
			
			// recupere le format d'abonnement de id_auteur
			$abo_format = spiplistes_format_abo_demande($id_auteur);		
		
			// recupere la liste ou auteur est abonne
			$auteur_abos_current_list = spiplistes_abonnements_listes_auteur($id_auteur);
			
			$bloc_visible = _request('btn_abonnements_valider');
			
			$debut_block = ($bloc_visible ? "spiplistes_debut_block_visible" : "spiplistes_debut_block_invisible");
			
			$result .= ""
				. "<!-- formulaire abonnement spiplistes -->\n" 
				. "<a name='abonnement'></a>\n"
				. debut_cadre_enfonce(_DIR_PLUGIN_SPIPLISTES_IMG_PACK."courriers_listes-24.png"
					, true, '', _T('spiplistes:listes_de_diffusion_'))
				. spiplistes_bouton_block_depliable(
					_T('spiplistes:abonnements_aux_courriers')
					, $bloc_visible
					, "abos_block")
				. "<div class='verdana2'>"
				;
			if($n = count($auteur_abos_current_list)) {
				$result .= $n."/"
					. spiplistes_nb_listes_str_get ($nb_listes_dispo)
					. ". "
					. _T('spiplistes:format_de_reception')." : "
						.	(
							(in_array($abo_format, array('html', 'texte')))
							? _T('spiplistes:'.$abo_format)
							: "&lt;"._T('spiplistes:aucun')."&gt;"
							)
					;
			} else {
				$result .= _T('spiplistes:Sans_abonnement');
			}
			$result .= ""
				. "</div>\n"
				. $debut_block("abos_block")
				. "<form action='".generer_url_ecrire("auteur_infos", "id_auteur=$id_auteur")."' method='post' style='margin-bottom:0;' name='abos_formulaire'>\n"
				. debut_cadre_formulaire("", true)
				. "\n<p class='verdana2' style='margin-top:0;margin-bottom:0;'>"
				.	(
						($abo_format!='html' && $abo_format!='texte')
						? _T('spiplistes:Alert_abonnement_sans_format')
						: _T('spiplistes:vous_etes_abonne_aux_listes_selectionnees_').":"
					)
				. "</p>\n"
				//
				. "<!-- liste des abonnements -->\n"
				. "<ul class='liste-listes'>\n"
				;
			foreach($listes as $key=>$value) {
				$id_liste = $value['id_liste'];
				$auteur_est_abonne = in_array($id_liste, $auteur_abos_current_list);
				$checked = $auteur_est_abonne ? "checked='checked'" : "";
				$label = $auteur_est_abonne ? "Arreter_abonnement_a" : "Abonner_a";
				$label = _T("spiplistes:".$label)." ".$value['titre'];
				$prochain_envoi = 
					($value['date'] > 0)
					? _T('spiplistes:Prochain_envoi_').": <span style='font-weight:bold;'>".affdate_heure($value['date'])."</span>"
					: _T('spiplistes:envoi_non_programme')
					;
				$result .= ""
					. "<li>\n"
					. "<label>\n"
					. "<input name='abos_set[]' type='checkbox' value='$id_liste' title=\"$label\" $checked />\n"
					. spiplistes_bullet_titre_liste('puce', $value['statut'], '', true)
					. "<span title=\"".$value['legend']."\">\n"
					. "<span class='titre'>".typo($value['titre'])."</span> \n"
					. "<span class='description'>".typo($value['texte'])." </span>\n"
					. "<span class='periodicite'>($prochain_envoi)</span>\n"
					. "</span>\n"
					. "</label></li>\n"
					;
			}
			$result .= ""
				. "</ul>\n"
				. "<!-- fin liste des abonnements -->\n"
				. fin_cadre_formulaire(true)
				//
				// selection du format de reception
				. debut_cadre_formulaire("margin-top:1ex", true)
				. ((empty($abo_format) || ($abo_format=="non")) 
					? "<p>"._T('spiplistes:Format_obligatoire_pour_diffusion')."</p>" : "" )
				. _T('spiplistes:format_de_reception')
				. "<ul class='liste-format'>\n"
				;
			$checked = ($abo_format=="html" ? "checked='checked'" : "");
			$result .= ""
				. "<li style='width:50%;float:left;'>\n"
				. " <input type='radio' name='abo_format' value='html' id='format_rcpt_html' title='"._T('spiplistes:html')."' $checked />"
				. " <label for='format_rcpt_html'>"._T('spiplistes:version_html')."</label></li>\n"
				;
			$checked = ($abo_format=="texte" ? "checked='checked'" : "");
			$result .= ""
				. "<li>\n"
				. " <input type='radio' name='abo_format' value='texte' id='format_rcpt_texte' title='"._T('spiplistes:texte')."' $checked />"
				. " <label for='format_rcpt_texte'>"._T('spiplistes:version_texte')."</label></li>\n"
				. "</ul>\n"
				. fin_cadre_formulaire(true)
				;
			if(spiplistes_format_valide($abo_format) && ($abo_format!="non")) {
				$result .= ""
					. debut_cadre_formulaire("margin-top:1ex", true)
					. "<ul class='liste-format-desabo'>\n"
					. "<li>\n"
					. spiplistes_form_input_radio('abo_format', 'non', _T('spiplistes:Suspendre_abonnements')
						, false, true, false)
					. "</li>\n"
					. "</ul>\n"
					. fin_cadre_formulaire(true)
					;
			}
			$result .= ""
				//
				. "<div style='text-align:right;margin-top:1ex;'><input type='submit' name='btn_abonnements_valider' "
					. " value='"._T('spiplistes:Valider_abonnement')."' class='fondo' /></div>\n"
				. "</form>\n"
				. fin_block()
				. fin_cadre_enfonce(true)
				;
		}
	}
	
	return($result);
}
function exec_spiplistes_import_export(){

	include_spip('inc/presentation');
	include_spip('inc/acces');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_presentation');

	global $connect_statut
		, $connect_toutes_rubriques
		, $connect_id_auteur
		;
	static $eol = PHP_EOL;
	
	// initialise les variables postées par le formulaire
	foreach(array(
		'btn_valider_import', 'abos_liste', 'format_abo', 'forcer_abo'	// retour import
		, 'btn_valider_export', 'export_id' // retour export
		, 'separateur', 'exporter_statut_auteur'
		) as $key) {
		$$key = _request($key);
	}

	$separateur = (($separateur == 'tab') ? "\t" : ';');
	
	$flag_admin = ($connect_statut == "0minirezo") && $connect_toutes_rubriques;
	$flag_moderateur = false;
	
	$flag_autorise = 
		$flag_admin
		|| (
				$flag_moderateur = ($listes_moderees = spiplistes_mod_listes_id_auteur($connect_id_auteur))
			)
		;

	// exportation de liste. Retour formulaire local.
	// les admins tt rubriques peuvent tt exporter
	// le moderateur ne peut exporter que sa liste
	if(
		$flag_autorise
		&& 
			(	$flag_admin
				|| in_array($export_id, $listes_moderees)
			)
	) {
	
		// generation du fichier export ?
		if($btn_valider_export && $export_id) {
		
			$sql_select = array('a.email', 'a.nom', 'a.login', 'a.statut');
			$sql_from = array('spip_auteurs AS a');
			$sql_where = array("a.statut!=".sql_quote('5poubelle'));
			if(($id_liste = intval($export_id)) > 0) {
			// exportation d'une liste ID ? 
				$sql_from[] = "spip_auteurs_listes AS l";
				$sql_where[] = "l.id_liste=".sql_quote($id_liste);
				$sql_where[] = "a.id_auteur=l.id_auteur";
			}
			else {
			// autre type de liste
				if($export_id == "sans_abonnement") {
					if(spiplistes_spip_est_inferieur_193()) {
						$sql_where[] = "a.id_auteur NOT IN (SELECT id_auteur FROM spip_auteurs_listes GROUP BY id_auteur)";
					} else {
						$selection = sql_select("id_auteur", "spip_auteurs_listes", '','id_auteur','','','','',false);
						$sql_where[] = "a.id_auteur NOT IN ($selection)";
					}
				} 
				else if($export_id == "desabo") {
					$sql_from[] = "spip_auteurs_elargis AS f";
					$sql_where[] = "a.id_auteur=f.id_auteur";
					$sql_where[] = "f.`spip_listes_format`=".sql_quote('non');
				}
			}

			$sql_result = sql_select(
				$sql_select
				, $sql_from
				, $sql_where
				);

			$nb_inscrits = sql_count($sql_result);
			$exporter_statut_auteur = ($exporter_statut_auteur == 'oui');
			
			$str_export = ''
				. '# ' . spiplistes_html_signature(_SPIPLISTES_PREFIX, false).$eol
				. '# '._T('spiplistes:membres_liste').$eol
				. '# liste id: $export_id\n'
				. '# '.spiplistes_nom_site_texte().$eol
				. '# '.$GLOBALS['meta']['adresse_site'].$eol
				. '# date: '.date('Y-m-d').$eol
				. '# nb abos: '.$nb_inscrits.$eol.$eol
				. '#'.$eol
				. '# \'email\''.$separateur.'\'login\''.$separateur.'\'nom\''
				. ($exporter_statut_auteur ? $separateur.'\'statut\'' : '')
				. $eol.$eol
				;
			
			while($row = sql_fetch($sql_result)) {
				$str_export .= $row['email'].$separateur.$row['login'].$separateur.$row['nom']
					. ($exporter_statut_auteur ? $separateur.$row['statut'] : '')
					. "\n"
					;
			}
			// envoie le fichier
			header('Content-type: text/plain');
			header('Content-Disposition: attachment; filename="export_liste_$export_id-'.date("Y-m-d").'.txt"');
			echo ($str_export);
			exit;
		}
		// fin de generation du fichier export
	}

////////////////////////////////////
// PAGE CONTENU
////////////////////////////////////

	$titre_page = _T('spiplistes:listes_de_diffusion_');
	// Permet entre autres d'ajouter les classes a' la page : <body class='$rubrique $sous_rubrique'>
	$rubrique = _SPIPLISTES_PREFIX;
	$sous_rubrique = "import_export";

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo($commencer_page(_T('spiplistes:spiplistes') . " - " . _T('spiplistes:import_export'), $rubrique, $sous_rubrique));

	// la gestion du courrier est réservée aux admins 
	if (!$flag_autorise) {
		die (spiplistes_terminer_page_non_autorisee() . fin_page());
	}       

	$page_result = ""
		. "<br /><br /><br />\n"
		. spiplistes_gros_titre($titre_page, '', true)
		. barre_onglets($rubrique, $sous_rubrique)
		. debut_gauche($rubrique, true)
		. pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		//. creer_colonne_droite($rubrique, true)  // spiplistes_boite_raccourcis() s'en occupe
		. spiplistes_boite_raccourcis(true)
		. spiplistes_boite_autocron()
		. pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		. debut_droite($rubrique, true)
		;
	
	// importation
	$flag_import_fichier_ok = 
		(count($_FILES) && is_array($fichier_import = $_FILES['fichier_import']) 
		&& !$fichier_import['error']);

	if($btn_valider_import && $flag_import_fichier_ok) {
		if(!($abos_liste && is_array($abos_liste) && count($abos_liste))) {
		// A oublie' de selectionner une liste de destination
			$page_result .= spiplistes_boite_alerte(_T('spiplistes:Selectionnez_une_liste_pour_import'), true);
		}
	}
		
	// import form
	$page_result .= ""
		. debut_cadre_trait_couleur(_DIR_PLUGIN_SPIPLISTES_IMG_PACK.'listes_in-24.png', true
									, '', _T('spiplistes:Importer'))
		. "<p class='verdana2'>"._T('spiplistes:_aide_import')."</p>\n"
		;
	
	if($flag_import_fichier_ok)
	{
		//syslog(LOG_NOTICE, 'memory_limit: ' . get_cfg_var('memory_limit'));
		//syslog(LOG_NOTICE, 'memory_get_usage[1]: ' . memory_get_usage());
		//syslog(LOG_NOTICE, 'memory_get_peak_usage[1]: ' . memory_get_peak_usage());
		//syslog(LOG_NOTICE, 'filesize: ' . filesize($fichier_import['tmp_name']));
		   
		if($abos_liste && is_array($abos_liste) && count($abos_liste))
		{
			include_spip('inc/spiplistes_import');
			$page_result .= ''
				. debut_boite_info(true)
				. spiplistes_titre_boite_info(_T('spiplistes:Resultat_import'))
				. spiplistes_import(
					$fichier_import['tmp_name']
					, $fichier_import['name']
					, $abos_liste
					, $format_abo
					, $separateur
					, $flag_admin
					, $listes_moderees
					, $forcer_abo
					)
				. fin_boite_info(true)
				. '<br />'
				;
		}
	}

	$list = sql_select(
		array('id_liste','titre','texte')
		, 'spip_listes'
		, spiplistes_listes_sql_where_or(_SPIPLISTES_LISTES_STATUTS_OK));

	$nb_listes = sql_count($list);
	
	if($nb_listes) {
		$listes_array = array();
		while($row = sql_fetch($list)) {
			$listes_array[] = $row;
		}
	}
	
	if(!$nb_listes) {
		$page_result .= spiplistes_boite_alerte(_T('spiplistes:Pas_de_liste_pour_import'), true);
	} 
	else {
		$page_result .= ""
			. "<form action='" . generer_url_ecrire(_SPIPLISTES_EXEC_IMPORT_EXPORT) . "' method='post' enctype='multipart/form-data'name='importform'>\n"
			. debut_cadre_relief("", true, "", _T('spiplistes:Liste_de_destination'))
			. "<p class='verdana2'>"._T('spiplistes:Selectionnez_une_liste_de_destination')."</p>\n"
			. "<ul class='liste-listes verdana2'>\n"
			;

		$listes_sans_patron = array();

		if(count($listes_array) > 0) {
			// une liste sans patron ne peut pas contenir d'abonnés.
			// récupère la liste des listes qui n'ont pas de patron.
			$sql_result = sql_select('id_liste', 'spip_listes'
				, array("patron=''"
					, "(statut=".implode(" OR statut=", array_map("sql_quote", explode(";", _SPIPLISTES_LISTES_STATUTS_OK))).")"
				)
			);
			while($row = sql_fetch($sql_result)) {
				$listes_sans_patron[] = $row['id_liste'];
			}
		}
		
		// liste des listes (destination)
		$couleur_ligne = 0;
		foreach($listes_array as $row) {
			$id_liste = $row['id_liste'] ;
			if(
				!in_array($id_liste, $listes_sans_patron)
				&&
				($flag_admin || in_array($id_liste, $listes_moderees))
			) {
				$titre = couper($row['titre'], 30, '...');
				$texte = couper($row['texte'], 30, '...');
				$label = _T('spiplistes:Liste_de_destination').": $titre";
				$checked = ($nb_listes == 1) ? "checked='checked'" : "";
				$class = ($couleur_ligne++ % 2) ? "class='row-even'" : "";
				$page_result .= ""
					. "<li style='padding:4px' $class >"
					. "<input name='abos_liste[]' type='checkbox' id='abos_$id_liste' value='$id_liste' title=\"$label\" $checked />\n"
					. "<label for='abos_$id_liste'><strong>".$titre."</strong> <em>".$texte."</em></label>\n"
					. "</li>\n"
					;
			}
		}
		$page_result .= ""
			. "</ul>"
			. fin_cadre_relief(true)
			//
			// Sélection du format de réception
			. debut_cadre_relief("", true, "", _T('spiplistes:format_de_reception_'))
			. "<ul class='liste-listes verdana2'>\n"
			. "<li>"
				. spiplistes_form_input_radio('format_abo', 'html', _T('spiplistes:html'), true, true, false)
				. "</li>\n"
			. "<li>"
				. spiplistes_form_input_radio('format_abo', 'texte', _T('spiplistes:texte'), false, true, false)
				. "</li>\n"
			. "<li>"
				. spiplistes_form_input_radio('format_abo', 'non', _T('spiplistes:desabonnement'), false, true, false)
				. "</li>\n"
			. "</ul>"
			. fin_cadre_relief(true)
			//
			// cadre insertion nom de fichier
			. debut_cadre_relief("", true, "", _T('spiplistes:importer_fichier'))
			. "<input type='file' size='40' name='fichier_import' />"
			//
			. spiplistes_fieldset_separateur($separateur)
			//
			// forcer les abonnements
			. spiplistes_fieldset_option(
				_T('spiplistes:option_import_')
				, 'forcer_abo'
				, 'oui'
				, _T('spiplistes:forcer_abos_'), ($forcer_abo == 'oui')
				
				)
			//
			. fin_cadre_relief(true)
			. spiplistes_form_bouton_valider('btn_valider_import')
			. spiplistes_form_fin(true)
			;
	} // end else
	$page_result .= fin_cadre_trait_couleur(true);
	// fin formulaire import

	// export //(original from erational.org)
	// formulaire d'export

	if ($nb_listes > 0) {
		$page_result .= ""
			. debut_cadre_trait_couleur(_DIR_PLUGIN_SPIPLISTES_IMG_PACK.'listes_out-24.png', true, "", _T('spiplistes:Exporter'))
			// exportation par listes
			. spiplistes_form_debut(generer_url_ecrire(_SPIPLISTES_EXEC_IMPORT_EXPORT), true)
			. debut_cadre_relief("", true, "", _T('spiplistes:Exporter_une_liste_d_abonnes'))
			. "<ul class='liste-listes verdana2'>\n"
			;
		$couleur_ligne = 0;
		foreach($listes_array as $row) {
			$id_liste = intval($row['id_liste']);
			if($flag_admin || in_array($id_liste, $listes_moderees)) {
				$titre = couper($row['titre'], 30, '...');
				$class = ($couleur_ligne++ % 2) ? "class='row-even'" : "";
				list($nb_abos, $html, $texte) = spiplistes_listes_nb_abonnes_compter($id_liste, true);
				if($nb_abos > 0) {
					$page_result .= ""
						. "<li style='padding:4px'  $class >"
						. spiplistes_form_input_radio('export_id', $id_liste
							, "<strong>".$titre."</strong> <em>"
								. spiplistes_nb_abonnes_liste_str_get($id_liste, $nb_abos, $html, $texte)
								. "</em>"
							, ($nb_listes==1), true, false)
						. "</li>\n"
						;
				}
			}
		}
		$page_result .= ""
			. "</ul>"
			. fin_cadre_relief(true)
			. "<!-- fin de liste export -->\n"
			//
			// exportation autres
			. debut_cadre_relief("", true, "", _T('spiplistes:Exporter_une_liste_de_non_abonnes'))
			. "<div class='verdana2'>\n"
			. spiplistes_form_input_radio('export_id', 'sans_abonnement', _T('spiplistes:abonne_aucune_liste'), false, true, false)
			. spiplistes_form_input_radio('export_id', 'desabo', _T('spiplistes:desabonnes'), false, true, false)
			. "</div>"
			. fin_cadre_relief(true)
			. "<fieldset class='verdana2'><legend>"._T('spiplistes:export_etendu_').":</legend>"
			. spiplistes_form_input_checkbox('exporter_statut_auteur', 'oui'
				, _T('spiplistes:exporter_statut'), false, true, false)
			. "</fieldset>\n"
			//
			. spiplistes_fieldset_separateur($separateur)
			//
			. spiplistes_form_bouton_valider('btn_valider_export')
			. spiplistes_form_fin(true)
			. fin_cadre_trait_couleur(true)
			;
	}

	echo($page_result);
	
	echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>''))
		, spiplistes_html_signature(_SPIPLISTES_PREFIX)
		, fin_gauche(), fin_page();
}
Exemple #4
0
/**
 * cron_spiplistes_cron() renvoie:
 * - nul, si la tache n'a pas a etre effectuee
 * - positif, si la tache a ete effectuee
 * - negatif, si la tache doit etre poursuivie ou recommencee
 * @return null|int
 */
function cron_spiplistes_cron ($last_time) { 

	include_spip('inc/utils');
	include_spip('inc/spiplistes_api_globales');
	include_spip('base/spiplistes_tables');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_courrier');
	include_spip('inc/spiplistes_api_abstract_sql');

	$prefix_log = 'CRON: ';

	// initialise les options (prefs spiplistes)
	foreach(array(
		'opt_suspendre_trieuse'
		) as $key) {
		$$key = spiplistes_pref_lire($key);
	}

	if($opt_suspendre_trieuse == 'oui') {
		spiplistes_log($prefix_log.'SUSPEND MODE !!!');
		if(spiplistes_courriers_en_queue_compter('etat='.sql_quote('')) > 0) {
			include_spip('inc/spiplistes_meleuse');
			return(spiplistes_meleuse($last_time));
		}
		else {
			return($last_time);
		}
	}

	$current_time = time();

	$sql_select = array(
		'id_liste', 'titre', 'titre_message', 'date', 'maj'
		, 'message_auto', 'periode', 'lang', 'patron', 'statut'
	);

	// demande les listes auto a' envoyer (date <= maintenant)
	$sql_where = 'message_auto='.sql_quote('oui').'
			AND date > 0  
			AND date <= NOW()
			AND ('.spiplistes_listes_sql_where_or(_SPIPLISTES_LISTES_STATUTS_OK).')
			'
		;
	$listes_privees_et_publiques = sql_select(
		$sql_select
		, 'spip_listes'
		, $sql_where
		);
	
	$nb_listes_ok = sql_count($listes_privees_et_publiques);
	
	spiplistes_debug_log($prefix_log.'nb listes depart: '.$nb_listes_ok);

	if($nb_listes_ok > 0) {
	
		$mod_listes_ids = spiplistes_mod_listes_get_id_auteur('toutes');
		
		while($row = sql_fetch($listes_privees_et_publiques)) {
		
			// initalise les variables
			foreach($sql_select as $key) {
				$$key = $row[$key];
			}
			$id_liste = intval($id_liste);
			$periode = intval($periode);
			$envoyer_quand = $date;
			$dernier_envoi = $maj;
		
			// demande id_auteur de la liste pour signer le courrier
			// si plusieurs moderateurs, prend le premier
			$id_auteur = 
				(isset($mod_listes_ids[$id_liste]) && ($mod_listes_ids[$id_liste][0] > 0))
				? $mod_listes_ids[$id_liste][0]
				: 1 // attribue a l'admin principal si manquant
				;
			
			// Tampon date prochain envoi (dans 'date') et d'envoi (dans 'maj')
			$sql_set = $next_time = false;
			if(in_array($statut, explode(';', _SPIPLISTES_LISTES_STATUTS_PERIODIQUES))) 
			{
				// prendre la date du jour plutot que la dernier date choisie
				// sinon, une lettre quotidienne du mois precedent
				// se verra envoyee autant de fois que de jours en attente
				//$job_time = strtotime($envoyer_quand);
				$job_time = strtotime(spiplistes_sql_now());
					
				$job_heure = date('H', $job_time);
				$job_minute = date('i', $job_time);
				$job_mois = date('m', $job_time);
				$job_jour = (($statut == _SPIPLISTES_LIST_PUB_MONTHLY) ? 1 : date('j', $job_time));
				$job_an = date('Y'); // la date est forcee par celle du systeme (eviter erreurs)
				switch($statut) {
					case _SPIPLISTES_LIST_PRIV_YEARLY:
					case _SPIPLISTES_LIST_PUB_YEARLY:
						$next_time = mktime($job_heure, $job_minute, 0, $job_mois, $job_jour, $job_an+1);
						break;
					case _SPIPLISTES_LIST_PRIV_MENSUEL:
					case _SPIPLISTES_LIST_PRIV_MONTHLY:
					case _SPIPLISTES_LIST_PUB_MENSUEL:
					case _SPIPLISTES_LIST_PUB_MONTHLY:
						$next_time = mktime($job_heure, $job_minute, 0, $job_mois+1, $job_jour, $job_an);
						break;
					case _SPIPLISTES_LIST_PRIV_HEBDO:
					case _SPIPLISTES_LIST_PRIV_WEEKLY:
					case _SPIPLISTES_LIST_PUB_HEBDO:
					case _SPIPLISTES_LIST_PUB_WEEKLY:
						$next_time = mktime($job_heure, $job_minute, 0, $job_mois, $job_jour+7, $job_an);
						break;
					case _SPIPLISTES_LIST_PRIV_DAILY:
					case _SPIPLISTES_LIST_PUB_DAILY:
						$next_time = mktime($job_heure, $job_minute, 0, $job_mois, $job_jour+$periode, $job_an);
						break;
					default:
						$sql_set = array('date' => sql_quote(''), 'message_auto' => sql_quote('non'));
						break;
				}
			}
			else if($periode) {
				$next_time = time() + (_SPIPLISTES_TIME_1_DAY * $periode);
			}
			else {
				// pas de periode ? c'est un envoyer_maintenant.
				// applique le tampon date d'envoi et repasse la liste en auto non
				$sql_set = array('date' => sql_quote(''), 'message_auto' => sql_quote('non'));
			}
			if($next_time || count($sql_set)) {
				if($next_time) {
					// prochaine date d'envoi dans 'date'
					$sql_set = array('date' => sql_quote(normaliser_date($next_time)));
				}
				$sql_set['maj'] = 'NOW()';
				sql_update(
					'spip_listes'
					, $sql_set
					, 'id_liste='.sql_quote($id_liste).' LIMIT 1'
					);
			}
	
			/////////////////////////////
			// preparation du courrier a placer dans le panier (spip_courriers)
			// en cas de periode, la date est dans le passe'
			// pour avoir les elements publies depuis cette date
			if (
				empty($titre_message)
				&& (spiplistes_pref_lire_defaut('opt_completer_titre_nom_site', 'oui') == 'oui')
			) {
					$titre .= _T('spiplistes:_de_')
						. spiplistes_nom_site_texte($lang);
			}
			else {
				$titre = $titre_message;
			}
			
			spiplistes_debug_log ($prefix_log.'utiliser patron '._SPIPLISTES_PATRONS_DIR.$patron);
			
			list($courrier_html, $courrier_texte) = spiplistes_courriers_assembler_patron (
				_SPIPLISTES_PATRONS_DIR . $patron
				, array('date' => $dernier_envoi, 'patron'=>$patron, 'lang'=>$lang));
			
			//$taille_courrier_ok = (($n = spiplistes_strlen(spiplistes_courrier_version_texte($courrier_html))) > 10);
			$taille_courrier_ok = (($n = strlen($courrier_texte)) > 10);
			
			spiplistes_debug_log($prefix_log.'taille courrier pour la liste #'.$id_liste.' : '.$n);

			if($taille_courrier_ok) {
				include_spip('inc/filtres');
				$courrier_html = spiplistes_liens_absolus ($courrier_html);
				$date_debut_envoi = $date_fin_envoi = "''";
				$statut = _SPIPLISTES_COURRIER_STATUT_ENCOURS;
			}
			else {
				$date_debut_envoi = $date_fin_envoi = 'NOW()';
				$statut = _SPIPLISTES_COURRIER_STATUT_VIDE;
				spiplistes_debug_log($prefix_log.'courrier vide');
			}

			// Place le courrier dans le casier
			$id_courrier = sql_insert(
				'spip_courriers'
				,	'('
					. 'titre
						,date
						,statut
						,type
						,id_auteur
						,id_liste
						,date_debut_envoi
						,date_fin_envoi
						,texte
						,message_texte'
					. ')'
				, 	'('
					. sql_quote($titre)
					. ',NOW()'
					. ','.sql_quote($statut)
					. ','.sql_quote(_SPIPLISTES_COURRIER_TYPE_LISTEAUTO)
					. ','.sql_quote($id_auteur)
					. ','.sql_quote($id_liste)
					. ','.$date_debut_envoi
					. ','.$date_fin_envoi
					. ','.sql_quote($courrier_html)
					. ','.sql_quote($courrier_texte)
					. ')'
			);

			if($taille_courrier_ok) {
				// place les etiquettes
				// (ajout des abonnes dans la queue (spip_auteurs_courriers))
				spiplistes_courrier_remplir_queue_envois($id_courrier, $id_liste);
			} 
		} // end while // fin traitement des listes
	}	
	
	/////////////////////////////
	// Si panier des etiquettes plein, appel de la meleuse
	if(
		$n = 
			spiplistes_courriers_en_queue_compter('etat='.sql_quote(''))
	){

		spiplistes_debug_log($prefix_log.$n.' job(s), appel meleuse');

		include_spip('inc/spiplistes_meleuse');
		return(spiplistes_meleuse($last_time));
	}
	else {
		spiplistes_debug_log($prefix_log.'NO JOB');
	}
	return ($last_time); 
} // cron_spiplistes_cron()