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.
 
 
 

266 lines
9.2 KiB

  1. <?php
  2. /**
  3. * Plugin Abonnements
  4. * (c) 2012 Les Développements Durables
  5. * Licence GNU/GPL v3
  6. */
  7. if (!defined('_ECRIRE_INC_VERSION'))
  8. return;
  9. /**
  10. * Optimiser la base de donnees des abonnements
  11. *
  12. * @param int $n
  13. * @return int
  14. */
  15. function abonnements_optimiser_base_disparus($flux) {
  16. //Offres d'abonnement à la poubelle
  17. sql_delete("spip_abonnements_offres", "statut='poubelle' AND maj < " . $flux['args']['date']);
  18. //Supprimer les abonnements lies à une offre d'abonnement inexistante
  19. $res = sql_select("DISTINCT abonnements.id_abonnements_offre", "spip_abonnements AS abonnements
  20. LEFT JOIN spip_abonnements_offres AS offres
  21. ON abonnements.id_abonnements_offre=offres.id_abonnements_offre", "offres.id_abonnements_offre IS NULL");
  22. while ($row = sql_fetch($res))
  23. sql_delete("spip_abonnements", "id_abonnements_offre=" . $row['id_abonnements_offre']);
  24. //Abonnements à la poubelle
  25. sql_delete("spip_abonnements", "statut='poubelle' AND maj < " . $flux['args']['date']);
  26. include_spip('action/editer_liens');
  27. $flux['data'] += objet_optimiser_liens(array('abonnement' => '*'), '*');
  28. return $flux;
  29. }
  30. /*
  31. * Des modifs supplémentaires après édition
  32. */
  33. function abonnements_post_edition($flux) {
  34. if (empty($flux['args']['table'])) {
  35. return $flux;
  36. }
  37. // Si on modifie un abonnement
  38. if ($flux['args']['table'] == 'spip_abonnements') {
  39. include_spip('inc/abonnements');
  40. $id_abonnement = intval($flux['args']['id_objet']);
  41. $abonnement = sql_fetsel('*', 'spip_abonnements', 'id_abonnement = ' . $id_abonnement);
  42. $offre = sql_fetsel('*', 'spip_abonnements_offres', 'id_abonnements_offre = ' . intval($abonnement['id_abonnements_offre']));
  43. $jourdhui = date('Y-m-d H:i:s');
  44. // Si la date de fin a été modifiée et qu'elle est dans le future
  45. // on reprogramme la désactivation
  46. if (isset($flux['data']['date_fin']) and $flux['data']['date_fin'] > $jourdhui) {
  47. abonnements_programmer_desactivation($flux['args']['id_objet'], $flux['data']['date_fin']);
  48. }
  49. // Si on a mis l'abonnement inactif ou à la poubelle, on doit enlever les tâches liées
  50. if (
  51. isset($flux['data']['statut'])
  52. and in_array($flux['data']['statut'], array('inactif', 'poubelle'))
  53. ) {
  54. include_spip('action/editer_liens');
  55. $liens = objet_trouver_liens(array('job' => '*'), array('abonnement' => $abonnement['id_abonnement']));
  56. if ($liens and is_array($liens)) {
  57. // Et on les supprime toutes !
  58. foreach ($liens as $lien) {
  59. job_queue_remove($lien['id_job']);
  60. }
  61. }
  62. }
  63. // Si on a un id_commande dans l'environnement, on lie la commande à l'abonnement
  64. if (
  65. $id_commande = intval(_request('id_commande'))
  66. and defined('_DIR_PLUGIN_COMMANDES')
  67. ) {
  68. // On lie cet abonnement avec la commande qui l'a généré
  69. include_spip('action/editer_liens');
  70. objet_associer(
  71. array('commande' => $id_commande), array('abonnement' => $id_abonnement)
  72. );
  73. }
  74. $modifs = array();
  75. $modifs_instituer = array();
  76. // Si l'échéance est VIDE, et que pourtant l'offre parente A BIEN une durée
  77. // alors c'est qu'il faut initialiser les dates !
  78. if ($abonnement['date_echeance'] == '0000-00-00 00:00:00' and ( $duree = $offre['duree']) > 0) {
  79. $modifs = abonnements_initialisation_dates($abonnement, $offre);
  80. }
  81. // Si les dates doivent être changées, on change le tableau de l'abonnement pour le test de statut qui suivra
  82. if (isset($modifs['date_debut'])) {
  83. $abonnement['date_debut'] = $modifs['date_debut'];
  84. }
  85. if (isset($modifs['date_fin'])) {
  86. $abonnement['date_fin'] = $modifs['date_fin'];
  87. }
  88. // Seulement si personne n'a modifié le statut manuellement, alors on check les dates pour statufier
  89. if (!$flux['data']['statut']) {
  90. // Si aujourd'hui est entre date_debut et date_echeance, on active
  91. if (
  92. $abonnement['statut'] == 'inactif'
  93. and $jourdhui >= $abonnement['date_debut']
  94. and $jourdhui <= $abonnement['date_echeance']
  95. ) {
  96. $modifs_instituer['statut'] = 'actif';
  97. spip_log("Post-édition : passage de l’abonnement $id_abonnement en actif", 'abonnements.'._LOG_INFO);
  98. spip_log($abonnement, 'abonnements.'._LOG_INFO);
  99. }
  100. // Si aujourd'hui est en dehors des dates début et FIN, on désactive
  101. // on ne teste pas date_echeance car ce sera à un génie de désactiver si trop dépassée
  102. elseif (
  103. $abonnement['statut'] == 'actif'
  104. and (
  105. // Avant la date de début
  106. $jourdhui < $abonnement['date_debut']
  107. // Ou après la date de fin MAIS seulement si elle existe !
  108. or (
  109. $abonnement['date_fin'] != '0000-00-00 00:00:00'
  110. and $jourdhui >= $abonnement['date_fin']
  111. )
  112. )
  113. ) {
  114. $modifs_instituer['statut'] = 'inactif';
  115. spip_log("Post-édition : passage de l’abonnement $id_abonnement en inactif", 'abonnements.'._LOG_INFO);
  116. spip_log($abonnement, 'abonnements.'._LOG_INFO);
  117. }
  118. }
  119. // S'il y a des modifs à faire on appelle l'API de modif
  120. if (!empty($modifs)) {
  121. include_spip('action/editer_objet');
  122. objet_modifier('abonnement', $flux['args']['id_objet'], $modifs);
  123. }
  124. // Pour le statut on fait à part (pb de double entrée avec Champs Extras)
  125. if (!empty($modifs_instituer)) {
  126. include_spip('action/editer_objet');
  127. objet_instituer('abonnement', $flux['args']['id_objet'], $modifs_instituer);
  128. }
  129. }
  130. // Détection magique du plugin Commandes et d'une commande d'offre d'abonnement
  131. elseif (
  132. // Si on institue une commande
  133. $flux['args']['table'] == 'spip_commandes'
  134. and $id_commande = intval($flux['args']['id_objet'])
  135. and $flux['args']['action'] == 'instituer'
  136. // Et qu'on passe en statut "paye" depuis autre chose
  137. and $flux['data']['statut'] == 'paye'
  138. and $flux['args']['statut_ancien'] != 'paye'
  139. // Et que la commande existe bien
  140. and $commande = sql_fetsel('*', 'spip_commandes', 'id_commande = ' . $id_commande)
  141. // Et que cette commande a un utilisateur correct
  142. and ( $id_auteur = $commande['id_auteur']) > 0
  143. // Et qu'on a des détails dans cette commande
  144. and $details = sql_allfetsel('*', 'spip_commandes_details', 'id_commande = ' . $id_commande)
  145. and is_array($details)
  146. ) {
  147. // On cherche si on a des offres d'abonnements dans les détails de la commande
  148. foreach ($details as $detail) {
  149. // Si on trouve une offre d'abonnement
  150. if ($detail['objet'] == 'abonnements_offre' and ( $id_abonnements_offre = $detail['id_objet']) > 0) {
  151. // Si la commande est renouvelable et que c'est le PREMIER paiement (activation)
  152. // on force toujours la création d'un nouvel abonnement
  153. $forcer_creation = false;
  154. if (
  155. in_array($commande['echeances_type'], array('mois', 'annee'))
  156. and include_spip('inc/commandes_echeances')
  157. and commandes_nb_echeances_payees($id_commande) <= 1
  158. ) {
  159. $forcer_creation = true;
  160. }
  161. // On crée ou renouvelle
  162. include_spip('inc/abonnements');
  163. set_request('id_commande', $id_commande); // on garde l'id_commande dans l'environnement
  164. $retour = abonnements_creer_ou_renouveler($id_auteur, $id_abonnements_offre, $forcer_creation);
  165. }
  166. }
  167. }
  168. return $flux;
  169. }
  170. /*
  171. * Ajout de tâches nécessaires aux abonnements
  172. *
  173. * - Une tâche pour vérifier toutes les heures si on a pas trop dépassé des échéances
  174. * - Une tâche pour vérifier toutes les heures si les abonnements actifs ont une tâche de désactivation
  175. * - Une tâche pour programmer les emails de notification à envoyer
  176. *
  177. * @pipeline taches_generales_cron
  178. * @param array $taches Liste des génies et leur périodicité
  179. * @return array Liste des tâches possiblement modifiées
  180. */
  181. function abonnements_taches_generales_cron($taches) {
  182. $taches['abonnements_verifier_echeances'] = 60 * 60; // toutes les heures
  183. $taches['abonnements_verifier_desactivation'] = 60 * 60; // toutes les heures
  184. $taches['abonnements_verifier_notifications'] = 24 * 3600; // une fois par jour
  185. return $taches;
  186. }
  187. /**
  188. * Ajouter des choses dans la colonne de gauche
  189. *
  190. * Offres d'abonnements : config des notifications + notifications ponctuelles
  191. *
  192. * @param array $flux
  193. * @return array
  194. */
  195. function abonnements_affiche_gauche($flux) {
  196. if (isset($flux['args']['exec'])
  197. and $flux['args']['exec'] == 'abonnements_offre'
  198. and isset($flux['args']['id_abonnements_offre'])
  199. ) {
  200. $flux['data'] .= recuperer_fond(
  201. 'prive/squelettes/navigation/inc-abonnements_notifications', array(
  202. 'id_abonnements_offre' => $flux['args']['id_abonnements_offre']
  203. )
  204. );
  205. }
  206. return $flux;
  207. }
  208. /*
  209. * Ajouter la boite des abonnements sur la fiche auteur
  210. */
  211. function abonnements_affiche_milieu($flux) {
  212. if ($e = trouver_objet_exec($flux['args']['exec'])
  213. AND $e['type'] == 'auteur'
  214. AND $e['edition'] == false) {
  215. $id_auteur = $flux['args']['id_auteur'];
  216. $ins = recuperer_fond('prive/squelettes/inclure/abonnements_auteur', array('id_auteur' => $id_auteur));
  217. if (($p = strpos($flux['data'], "<!--affiche_milieu-->")) !== false)
  218. $flux['data'] = substr_replace($flux['data'], $ins, $p, 0);
  219. else
  220. $flux['data'] .= $ins;
  221. }
  222. return $flux;
  223. }
  224. /*
  225. * Ajouter une feuille de style privée
  226. */
  227. function abonnements_header_prive($flux) {
  228. $flux = abonnements_insert_head($flux);
  229. return $flux;
  230. }
  231. function abonnements_insert_head($flux) {
  232. $flux .= '<link rel="stylesheet" href="' . _DIR_PLUGIN_ABONNEMENTS . 'css/abonnements_prive.css" type="text/css" />';
  233. return $flux;
  234. }