You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
abonnements/abonnements_pipelines.php

225 lines
7.3 KiB
PHP

<?php
/**
* Plugin Abonnements
* (c) 2012 Les Développements Durables
* Licence GNU/GPL v3
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Optimiser la base de donnees des abonnements
*
* @param int $n
* @return int
*/
function abonnements_optimiser_base_disparus($flux){
//Offres d'abonnement à la poubelle
sql_delete("spip_abonnements_offres", "statut='poubelle' AND maj < ".$flux['args']['date']);
//Supprimer les abonnements lies à une offre d'abonnement inexistante
$res = sql_select("DISTINCT abonnements.id_abonnements_offre","spip_abonnements AS abonnements
LEFT JOIN spip_abonnements_offres AS offres
ON abonnements.id_abonnements_offre=offres.id_abonnements_offre","offres.id_abonnements_offre IS NULL");
while ($row = sql_fetch($res))
sql_delete("spip_abonnements", "id_abonnements_offre=".$row['id_abonnements_offre']);
//Abonnements à la poubelle
sql_delete("spip_abonnements", "statut='poubelle' AND maj < ".$flux['args']['date']);
include_spip('action/editer_liens');
$flux['data'] += objet_optimiser_liens(array('abonnement'=>'*'),'*');
return $flux;
}
/*
* Des modifs supplémentaires après édition
*/
function abonnements_post_edition($flux){
// Si on modifie un abonnement
if ($flux['args']['table'] == 'spip_abonnements') {
$abonnement = sql_fetsel('*', 'spip_abonnements', 'id_abonnement = '.intval($flux['args']['id_objet']));
$offre = sql_fetsel('*', 'spip_abonnements_offres', 'id_abonnements_offre = '.intval($abonnement['id_abonnements_offre']));
$modifs = array();
// Si l'échéance est VIDE, et que pourtant l'offre parente A BIEN une durée
// alors c'est qu'il faut initialiser l'échéance !
if ($abonnement['date_fin'] == '0000-00-00 00:00:00' and ($duree = $offre['duree']) > 0){
// De combien doit-on augmenter la date
switch ($offre['periode']){
case 'heures':
$ajout = " + ${duree} hours";
break;
case 'jours':
$ajout = " + ${duree} days";
break;
case 'mois':
$ajout = " + ${duree} months";
break;
default:
$ajout ='';
break;
}
// Calcul de la date de fin
$modifs['date_fin'] = date('Y-m-d H:i:s', strtotime($abonnement['date_debut'].$ajout));
$modifs = pipeline(
'abonnement_initialisation_dates',
array(
'args' => array('abonnement' => $abonnement, 'offre' => $offre),
'data' => $modifs
)
);
// Si les dates ont été changées, on change le tableau de l'abonnement pour le test de statut qui suivra
if (isset($modifs['date_debut'])) {
$abonnement['date_debut'] = $modifs['date_debut'];
}
if (isset($modifs['date_fin'])) {
$abonnement['date_fin'] = $modifs['date_fin'];
}
}
// Si le statut est "prepa" c'est une création et on doit changer ça
// car pour l'instant SPIP ne permet pas de déclarer le statut par défaut !
if ($abonnement['statut'] == 'prepa') {
$modifs['statut'] = $abonnement['statut'] = 'actif';
}
// Si on a mis l'abonnement à la poubelle, on doit enlever les tâches liées
elseif ($abonnement['statut'] == 'poubelle') {
$liens = objet_trouver_liens(array('job' => '*'), array('abonnement' => $abonnement['id_abonnement']));
if ($liens and is_array($liens)){
// Et on les supprime toutes !
foreach ($liens as $lien){
job_queue_remove($lien['id_job']);
}
}
}
// Seulement si personne n'a modifié le statut manuellement, alors on check les dates pour statufier
if (!$flux['data']['statut']) {
$jourdhui = date('Y-m-d H:i:s');
// Si aujourd'hui est dans les dates, on active
if (
$abonnement['statut'] == 'inactif'
and $jourdhui >= $abonnement['date_debut']
and $jourdhui <= $abonnement['date_fin']
) {
$modifs['statut'] = 'actif';
}
// Si aujourd'hui est en dehors des dates, on désactive
elseif (
$abonnement['statut'] == 'actif'
and ($jourdhui < $abonnement['date_debut'] or $jourdhui > $abonnement['date_fin'])
) {
$modifs['statut'] = 'inactif';
}
}
// S'il y a des modifs à faire on appelle l'API de modif
if (!empty($modifs)){
include_spip('action/editer_objet');
objet_modifier('abonnement', $flux['args']['id_objet'], $modifs);
}
// Si dans les modifications demandées au départ, il y a la date de fin, on reprogramme la désactivation
if (isset($flux['data']['date_fin'])) {
include_spip('inc/abonnements');
abonnements_programmer_desactivation($flux['args']['id_objet'], $flux['data']['date_fin']);
}
}
// Détection magique du plugin Commandes et d'une commande d'offre d'abonnement
elseif (
// Si on institue une commande
$flux['args']['table'] == 'spip_commandes'
and $id_commande = intval($flux['args']['id_objet'])
and $flux['args']['action'] == 'instituer'
// Et qu'on passe en statut "paye" depuis autre chose
and $flux['data']['statut'] == 'paye'
and $flux['args']['statut_ancien'] != 'paye'
// Et que la commande existe bien
and $commande = sql_fetsel('*', 'spip_commandes', 'id_commande = '.$id_commande)
// Et que cette commande a un utilisateur correct
and ($id_auteur = $commande['id_auteur']) > 0
// Et qu'on a des détails dans cette commande
and $details = sql_allfetsel('*', 'spip_commandes_details', 'id_commande = '.$id_commande)
and is_array($details)
) {
// On cherche si on a des offres d'abonnements dans les détails de la commande
foreach ($details as $detail) {
// Si on trouve une offre d'abonnement
if ($detail['objet'] = 'abonnements_offre' and ($id_abonnements_offre = $detail['id_objet']) > 0) {
// On crée ou renouvelle
$action = charger_fonction('creer_ou_renouveler_abonnement', 'action/');
$retour = $action($id_auteur.'/'.$id_abonnements_offre);
// Si on a un retour correct avec un abonnement
if (
is_array($retour)
and $id_abonnement = intval(reset($retour))
and $id_abonnement > 0
) {
// On lie cet abonnement avec la commande qui l'a généré
include_spip('action/editer_liens');
objet_associer(
array('commande' => $id_commande),
array('abonnement' => $id_abonnement)
);
}
}
}
}
return $flux;
}
/*
* Ajout d'une tache CRON pour vérifier toutes les heures si les abonnements actifs ont une tâche de désactivation
*/
function abonnements_taches_generales_cron($taches){
$taches['abonnements_verifier_desactivation'] = 60 * 60; // toutes les heures
$taches['abonnements_verifier_notifications'] = 24 * 3600; // une fois par jour
return $taches;
}
/*
* Ajouter la config des notifications
*/
function abonnements_affiche_gauche($flux){
if ($flux['args']['exec'] == 'abonnements_offre'){
$flux['data'] .= recuperer_fond(
'prive/squelettes/navigation/inc-abonnements_notifications',
array('id_abonnements_offre' => $flux['args']['id_abonnements_offre'])
);
}
return $flux;
}
/*
* Ajouter la boite des abonnements sur la fiche auteur
*/
function abonnements_affiche_milieu($flux){
if ($e = trouver_objet_exec($flux['args']['exec'])
AND $e['type'] == 'auteur'
AND $e['edition'] == false) {
$id_auteur = $flux['args']['id_auteur'];
$ins = recuperer_fond('prive/squelettes/inclure/abonnements_auteur',array('id_auteur'=>$id_auteur));
if (($p = strpos($flux['data'],"<!--affiche_milieu-->")) !== false)
$flux['data'] = substr_replace($flux['data'],$ins,$p,0);
else
$flux['data'] .= $ins;
}
return $flux;
}