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

367 lines
12 KiB

<?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 array $flux
* @return array
*/
function abonnements_optimiser_base_disparus($flux) {
//Offres d'abonnement à la poubelle
$mydate = sql_quote(trim($flux['args']['date'], "'"));
sql_delete('spip_abonnements_offres', "statut='poubelle' AND maj < $mydate");
//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 < $mydate");
include_spip('action/editer_liens');
$flux['data'] += objet_optimiser_liens(['abonnement' => '*'], '*');
return $flux;
}
/**
* Des modifs supplémentaires après édition
* @param array $flux
* @return array
* @throws JsonException
*/
function abonnements_post_edition($flux) {
if (empty($flux['args']['table'])) {
return $flux;
}
// Si on modifie un abonnement
if ($flux['args']['table'] == 'spip_abonnements') {
include_spip('inc/abonnements');
$id_abonnement = intval($flux['args']['id_objet']);
$abonnement = sql_fetsel('*', 'spip_abonnements', 'id_abonnement = ' . $id_abonnement);
$offre = sql_fetsel('*', 'spip_abonnements_offres', 'id_abonnements_offre = ' . intval($abonnement['id_abonnements_offre']));
$jourdhui = date('Y-m-d H:i:s');
// Si la date de fin a été modifiée et qu'elle est dans le future
// on reprogramme la désactivation
if (isset($flux['data']['date_fin']) and $flux['data']['date_fin'] > $jourdhui) {
abonnements_programmer_desactivation($flux['args']['id_objet'], $flux['data']['date_fin']);
}
// Si on a mis l'abonnement inactif ou à la poubelle, on doit enlever les tâches liées
if (
isset($flux['data']['statut'])
and in_array($flux['data']['statut'], ['inactif', 'poubelle'])
) {
include_spip('action/editer_liens');
$liens = objet_trouver_liens(['job' => '*'], ['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']);
}
}
}
// Si on a un id_commande dans l'environnement, on lie la commande à l'abonnement
if (
$id_commande = intval(_request('id_commande'))
and defined('_DIR_PLUGIN_COMMANDES')
) {
// On lie cet abonnement avec la commande qui l'a généré
include_spip('action/editer_liens');
objet_associer(
['commande' => $id_commande],
['abonnement' => $id_abonnement]
);
}
$modifs = [];
$modifs_instituer = [];
// Si l'échéance est VIDE, et que pourtant l'offre parente A BIEN une durée
// alors c'est qu'il faut initialiser les dates !
if ($abonnement['date_echeance'] == '0000-00-00 00:00:00' and ( $duree = $offre['duree']) > 0) {
$modifs = abonnements_initialisation_dates($abonnement, $offre);
}
// Si les dates doivent être 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'];
}
// Seulement si personne n'a modifié le statut manuellement, alors on check les dates pour statufier
if (!isset($flux['data']['statut']) or !$flux['data']['statut']) {
// Si aujourd'hui est entre date_debut et date_echeance, on active
if (
$abonnement['statut'] == 'inactif'
and $jourdhui >= $abonnement['date_debut']
and $jourdhui <= $abonnement['date_echeance']
) {
$modifs_instituer['statut'] = 'actif';
spip_log("Post-édition : passage de l’abonnement $id_abonnement en actif", 'abonnements.' . _LOG_INFO);
spip_log($abonnement, 'abonnements.' . _LOG_INFO);
}
// Si aujourd'hui est en dehors des dates début et FIN, on désactive
// on ne teste pas date_echeance car ce sera à un génie de désactiver si trop dépassée
elseif (
$abonnement['statut'] == 'actif'
and (
// Avant la date de début
$jourdhui < $abonnement['date_debut']
// Ou après la date de fin MAIS seulement si elle existe !
or (
$abonnement['date_fin'] != '0000-00-00 00:00:00'
and $jourdhui >= $abonnement['date_fin']
)
)
) {
$modifs_instituer['statut'] = 'inactif';
spip_log("Post-édition : passage de l’abonnement $id_abonnement en inactif", 'abonnements.' . _LOG_INFO);
spip_log($abonnement, 'abonnements.' . _LOG_INFO);
}
}
// 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);
}
// Pour le statut on fait à part (pb de double entrée avec Champs Extras)
if (!empty($modifs_instituer)) {
include_spip('action/editer_objet');
objet_instituer('abonnement', $flux['args']['id_objet'], $modifs_instituer);
}
}
// 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) {
// Si la commande est renouvelable et que c'est le PREMIER paiement (activation)
// on force toujours la création d'un nouvel abonnement
$forcer_creation = false;
if (
in_array($commande['echeances_type'], ['mois', 'annee'])
and include_spip('inc/commandes_echeances')
and commandes_nb_echeances_payees($id_commande) <= 1
) {
$forcer_creation = true;
}
// On crée ou renouvelle
include_spip('inc/abonnements');
set_request('id_commande', $id_commande); // on garde l'id_commande dans l'environnement
$retour = abonnements_creer_ou_renouveler($id_auteur, $id_abonnements_offre, $forcer_creation);
}
}
}
return $flux;
}
/**
* Ajout de tâches nécessaires aux abonnements
*
* - Une tâche pour vérifier toutes les heures si on a pas trop dépassé des échéances
* - Une tâche pour vérifier toutes les heures si les abonnements actifs ont une tâche de désactivation
* - Une tâche pour programmer les emails de notification à envoyer
*
* @pipeline taches_generales_cron
* @param array $taches Liste des génies et leur périodicité
* @return array Liste des tâches possiblement modifiées
*/
function abonnements_taches_generales_cron($taches) {
$taches['abonnements_verifier_echeances'] = 60 * 60; // toutes les heures
$taches['abonnements_verifier_desactivation'] = 60 * 60; // toutes les heures
$taches['abonnements_verifier_notifications'] = 24 * 3600; // une fois par jour
return $taches;
}
/**
* Ajouter des choses dans la colonne de gauche
*
* Offres d'abonnements : config des notifications + notifications ponctuelles
*
* @param array $flux
* @return array
*/
function abonnements_affiche_gauche($flux) {
if (
isset($flux['args']['exec'])
and $flux['args']['exec'] == 'abonnements_offre'
and isset($flux['args']['id_abonnements_offre'])
) {
$flux['data'] .= recuperer_fond(
'prive/squelettes/navigation/inc-abonnements_notifications',
[
'id_abonnements_offre' => $flux['args']['id_abonnements_offre']
]
);
}
return $flux;
}
/**
* Ajouter la boite des abonnements sur la fiche auteur
* @param array $flux
* @return array
*/
function abonnements_affiche_milieu($flux) {
$e = trouver_objet_exec($flux['args']['exec']);
// Sur la page des auteurs
if (
is_array($e)
and $e['type'] == 'auteur'
and $e['edition'] == false
) {
$id_auteur = $flux['args']['id_auteur'];
$ins = recuperer_fond('prive/squelettes/inclure/abonnements_auteur', ['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;
}
/**
* Ajouter les offres sur les objets configurés
* @param array $flux
* @return array
*/
function abonnements_affiche_enfants($flux) {
$e = trouver_objet_exec($flux['args']['exec']);
// Sur la page d'un objet s'il fait partie de la config
if (
is_array($e)
and !$e['edition']
and in_array($e['table_objet_sql'], lire_config('abonnements/objets', []))
and $texte = recuperer_fond(
'prive/objets/editer/liens',
[
'table_source' => 'abonnements_offres',
'objet' => $e['type'],
'id_objet' => $flux['args']['id_objet']
]
)
) {
if ($p = strpos($flux['data'], '<!--affiche_milieu-->')) {
$flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
} else {
$flux['data'] .= $texte;
}
}
return $flux;
}
/**
* Afficher les contenus dans lesquels sont rangés les offres
*
* @param array $flux
* @return array
*/
function abonnements_affiche_hierarchie($flux) {
include_spip('inc/config');
// Sur la page d'une offre
if (
$flux['args']['objet'] == 'abonnements_offre'
and $objets = lire_config('abonnements/objets')
) {
include_spip('action/editer_liens');
$objets = array_map('objet_type', $objets);
// On cherche si cette offre à des liens
if (
$liens = objet_trouver_liens(
['abonnements_offre' => $flux['args']['id_objet']],
['*' => '*']
)
) {
$liens_parents = [];
$liens_offres = [];
foreach ($liens as $lien) {
// Seulement si ce lien est actuellement prévu dans la config
if (in_array($lien['objet'], $objets)) {
// Si c'est une liaison entre deux offres
if ($lien['objet'] == 'abonnements_offre') {
$liens_offres[] = "[->{$lien['objet']}{$lien['id_objet']}]";
}
else {
$liens_parents[] = "[->{$lien['objet']}{$lien['id_objet']}]";
}
}
}
if ($liens_parents) {
$liens_parents = PtoBR(propre(_T('abonnementsoffre:liens_parents_label') . join(', ', $liens_parents)));
$flux['data'] .= '<div class="parents_offres">' . $liens_parents . '</div>';
}
if ($liens_offres) {
$liens_offres = PtoBR(propre(_T('abonnementsoffre:liens_offres_label') . join(', ', $liens_offres)));
$flux['data'] .= '<div class="liens_offres">' . $liens_offres . '</div>';
}
}
}
return $flux;
}
/**
* Ajouter une feuille de style privée
* @param string $flux
* @return string
*/
function abonnements_header_prive($flux) {
$flux = abonnements_insert_head($flux);
return $flux;
}
/**
* @param string $flux
* @return string
*/
function abonnements_insert_head($flux) {
$flux .= '<link rel="stylesheet" href="' . _DIR_PLUGIN_ABONNEMENTS . 'css/abonnements_prive.css" type="text/css" />';
return $flux;
}