Changeset 90180 in spip-zone


Ignore:
Timestamp:
Jun 14, 2015, 12:44:16 AM (4 years ago)
Author:
rastapopoulos@…
Message:

On utilise la nouvelle date d'échéance.

1) Lorsqu'on initialise les dates, c'est ça qu'on teste. Par défaut la date de fin est la date d'échéance. Mais s'il y a Commandes et Bank, on regarde si l'abonnement a été activé par une transaction :

  • si c'est SEPA, on annule la date de fin, par défaut ça sera infini
  • si c'est carte bleue, on met comme date de fin celle de la carte bleue puisqu'on l'a

1bis) Au passage on déplace les tâches d'initialisation dans une fonction à part pour y voir plus clair.

2) Quand un abonnement est modifié et qu'on check les dates, on active entre date_debut et date_echeance maintenant.

3) Mais on désactive toujours seulement après date_fin, pas date_echeance. Ce qui permet de laisser une marge si jamais l'échéance est passée mais sans désactiver. Car ça se trouve c'est justement un paiement un peu en retard.

4) Quand on renouvelle un abonnement, on renouvelle à partir de la date d'échéance, et non plus de la date de fin. Et on repousse la date de fin si elle se retrouve avant la nouvelle échéance décalée.

5) Une nouvelle tâche génie est programmée toutes les heures pour vérifier les échéances. Si on a trop dépassé (48h par défaut qui sera configurable) alors on change la date de fin pour maintenant, ce qui va désactiver l'abonnement.

Ce n'est PAS FINI. Il manque :

  • rendre configurable les deux délais qui sont en lire_config()
  • afficher la nouvelle date d'échéance dans l'admin et la rendre éditable dans le form d'édition d'un abonnement
  • possiblement changer la désactivation par Jobs en utilisant un génie (perf issue d'après cerdic)
  • sûrement plein de bugs à corriger, j'espère pas trop…
Location:
_plugins_/abonnements/trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/abonnements/trunk/abonnements_pipelines.php

    r89806 r90180  
    4242        // Si on modifie un abonnement
    4343        if ($flux['args']['table'] == 'spip_abonnements') {
     44                include_spip('inc/abonnements');
    4445                $abonnement = sql_fetsel('*', 'spip_abonnements', 'id_abonnement = '.intval($flux['args']['id_objet']));
    4546                $offre = sql_fetsel('*', 'spip_abonnements_offres', 'id_abonnements_offre = '.intval($abonnement['id_abonnements_offre']));
    46                
    47                 $modifs = array();
    48                
    49                 // Si l'échéance est VIDE, et que pourtant l'offre parente A BIEN une durée
    50                 // alors c'est qu'il faut initialiser l'échéance !
    51                 if ($abonnement['date_fin'] == '0000-00-00 00:00:00' and ($duree = $offre['duree']) > 0){
    52                         // De combien doit-on augmenter la date
    53                         switch ($offre['periode']){
    54                                 case 'heures':
    55                                         $ajout = " + ${duree} hours";
    56                                         break;
    57                                 case 'jours':
    58                                         $ajout = " + ${duree} days";
    59                                         break;
    60                                 case 'mois':
    61                                         $ajout = " + ${duree} months";
    62                                         break;
    63                                 default:
    64                                         $ajout ='';
    65                                         break;
    66                         }
    67                        
    68                         // Calcul de la date de fin
    69                         $modifs['date_fin'] = date('Y-m-d H:i:s', strtotime($abonnement['date_debut'].$ajout));
    70                        
    71                         $modifs = pipeline(
    72                                 'abonnement_initialisation_dates',
    73                                 array(
    74                                         'args' => array('abonnement' => $abonnement, 'offre' => $offre),
    75                                         'data' => $modifs
    76                                 )
    77                         );
    78                        
    79                         // Si les dates ont été changées, on change le tableau de l'abonnement pour le test de statut qui suivra
    80                         if (isset($modifs['date_debut'])) {
    81                                 $abonnement['date_debut'] = $modifs['date_debut'];
    82                         }
    83                         if (isset($modifs['date_fin'])) {
    84                                 $abonnement['date_fin'] = $modifs['date_fin'];
    85                         }
    86                 }
    87                
    88                 // Si le statut est "prepa" c'est une création et on doit changer ça
    89                 // car pour l'instant SPIP ne permet pas de déclarer le statut par défaut !
    90                 if ($abonnement['statut'] == 'prepa') {
    91                         $modifs['statut'] = $abonnement['statut'] = 'actif';
    92                 }
    93                 // Si on a mis l'abonnement à la poubelle, on doit enlever les tâches liées
    94                 elseif ($abonnement['statut'] == 'poubelle') {
     47                $jourdhui = date('Y-m-d H:i:s');
     48               
     49                // Si la date de fin a été modifiée et qu'elle est dans le future
     50                // on reprogramme la désactivation
     51                if (isset($flux['data']['date_fin']) and $flux['data']['date_fin'] > $jourdhui) {
     52                        abonnements_programmer_desactivation($flux['args']['id_objet'], $flux['data']['date_fin']);
     53                }
     54               
     55                // Si on a mis l'abonnement inactif ou à la poubelle, on doit enlever les tâches liées
     56                if (in_array($abonnement['statut'], array('inactif', 'poubelle'))) {
    9557                        $liens = objet_trouver_liens(array('job' => '*'), array('abonnement' => $abonnement['id_abonnement']));
    9658                        if ($liens and is_array($liens)){
     
    10264                }
    10365               
     66                $modifs = array();
     67               
     68                // Si l'échéance est VIDE, et que pourtant l'offre parente A BIEN une durée
     69                // alors c'est qu'il faut initialiser les dates !
     70                if ($abonnement['date_echeance'] == '0000-00-00 00:00:00' and ($duree = $offre['duree']) > 0) {
     71                        $modifs = abonnements_initialisation_dates($abonnement, $offre);
     72                }
     73               
     74                // Si les dates doivent être changées, on change le tableau de l'abonnement pour le test de statut qui suivra
     75                if (isset($modifs['date_debut'])) {
     76                        $abonnement['date_debut'] = $modifs['date_debut'];
     77                }
     78                if (isset($modifs['date_fin'])) {
     79                        $abonnement['date_fin'] = $modifs['date_fin'];
     80                }
     81               
    10482                // Seulement si personne n'a modifié le statut manuellement, alors on check les dates pour statufier
    10583                if (!$flux['data']['statut']) {
    106                         $jourdhui = date('Y-m-d H:i:s');
    107                         // Si aujourd'hui est dans les dates, on active
     84                        // Si aujourd'hui est entre date_debut et date_echeance, on active
    10885                        if (
    10986                                $abonnement['statut'] == 'inactif'
    11087                                and $jourdhui >= $abonnement['date_debut']
    111                                 and $jourdhui <= $abonnement['date_fin']
     88                                and $jourdhui <= $abonnement['date_echeance']
    11289                        ) {
    11390                                $modifs['statut'] = 'actif';
    11491                        }
    115                         // Si aujourd'hui est en dehors des dates, on désactive
     92                        // Si aujourd'hui est en dehors des dates début et FIN, on désactive
     93                        // on ne teste pas date_echeance car ce sera à un génie de désactiver si trop dépassée
    11694                        elseif (
    11795                                $abonnement['statut'] == 'actif'
    118                                 and ($jourdhui < $abonnement['date_debut'] or $jourdhui > $abonnement['date_fin'])
     96                                and ($jourdhui < $abonnement['date_debut'] or $jourdhui >= $abonnement['date_fin'])
    11997                        ) {
    12098                                $modifs['statut'] = 'inactif';
     
    126104                        include_spip('action/editer_objet');
    127105                        objet_modifier('abonnement', $flux['args']['id_objet'], $modifs);
    128                 }
    129                
    130                 // Si dans les modifications demandées au départ, il y a la date de fin, on reprogramme la désactivation
    131                 if (isset($flux['data']['date_fin'])) {
    132                         include_spip('inc/abonnements');
    133                         abonnements_programmer_desactivation($flux['args']['id_objet'], $flux['data']['date_fin']);
    134106                }
    135107        }
     
    180152
    181153/*
    182  * Ajout d'une tache CRON pour vérifier toutes les heures si les abonnements actifs ont une tâche de désactivation
     154 * Ajout de tâches nécessaires aux abonnements
     155 *
     156 * - Une tâche pour vérifier toutes les heures si on a pas trop dépassé des échéances
     157 * - Une tâche pour vérifier toutes les heures si les abonnements actifs ont une tâche de désactivation
     158 * - Une tâche pour programmer les emails de notification à envoyer
     159 *
     160 * @pipeline taches_generales_cron
     161 * @param array $taches Liste des génies et leur périodicité
     162 * @return array Liste des tâches possiblement modifiées
    183163 */
    184164function abonnements_taches_generales_cron($taches){
     165        $taches['abonnements_verifier_echeances'] = 60 * 60; // toutes les heures
    185166        $taches['abonnements_verifier_desactivation'] = 60 * 60; // toutes les heures
    186167        $taches['abonnements_verifier_notifications'] = 24 * 3600; // une fois par jour
  • _plugins_/abonnements/trunk/action/modifier_echeance_abonnement.php

    r87947 r90180  
    2222                and $id_abonnement = intval($id_abonnement)
    2323                and autoriser('modifier', 'abonnement', $id_abonnement)
    24                 and $abonnement = sql_fetsel('date_debut, date_fin', 'spip_abonnements', 'id_abonnement = '.$id_abonnement)
     24                and $abonnement = sql_fetsel('date_debut, date_echeance, date_fin', 'spip_abonnements', 'id_abonnement = '.$id_abonnement)
    2525        ) {
     26                $jourdhui = date('Y-m-d H:i:s');
     27               
    2628                // Calculons la date de départ du renouvellement
    27                 $date_depart = $abonnement['date_fin'];
    28                 // Si la date de fin n'était pas encore défini, on reprend depuis le début
     29                // Par défaut on part de la dernière échéance
     30                $date_depart = $abonnement['date_echeance'];
     31               
     32                // Si la date d'échéance n'était pas encore définie, on reprend depuis le début
    2933                if ($date_depart == '0000-00-00 00:00:00'){
    3034                        $date_depart = $abonnement['date_debut'];
    3135                }
    32                 // Et si la date de fin était *déjà passée*, alors on renouvelle *à partir d'aujourd'hui* !
    33                 $jourdhui = date('Y-m-d H:i:s');
    34                 if ($date_depart < $jourdhui) {
     36                // Et si la date d'échéance était *déjà passée*, alors on renouvelle *à partir d'aujourd'hui* !
     37                elseif ($date_depart < $jourdhui) {
    3538                        $date_depart = $jourdhui;
    3639                }
     
    5457                // Si la période existe
    5558                if ($ajout){
     59                        $modifications = array();
     60                       
    5661                        // Si la durée est positive, on ajoute un + devant (le - est déjà là pour les négatives)
    5762                        if ($duree > 0){
    5863                                $ajout = ' +'.$ajout;
    5964                        }
     65                        // Calcul de la date de fin
     66                        $modifications['date_echeance'] = date('Y-m-d H:i:s', strtotime($date_depart.$ajout));
    6067                       
    61                         // Calcul de la date de fin
    62                         $nouvelle_echeance = date('Y-m-d H:i:s', strtotime($date_depart.$ajout));
     68                        // Si la date de fin n'est PAS infinie ET qu'elle se retrouve plus petite que l'échéance
     69                        // On la remet au moins au même endroit que la nouvelle échéance
     70                        if (
     71                                $abonnement['date_fin'] != '0000-00-00 00:00:00'
     72                                and $abonnement['date_fin'] < $modifications['date_echeance']
     73                        ) {
     74                                $modifications['date_fin'] = $modifications['date_echeance'];
     75                        }
    6376                       
    6477                        // On lance la modification
    6578                        include_spip('action/editer_objet');
    66                         $erreur = objet_modifier('abonnement', $id_abonnement, array('date_fin' => $nouvelle_echeance));
     79                        $erreur = objet_modifier('abonnement', $id_abonnement, $modifications);
    6780                       
    6881                        return array($id_abonnement, $erreur);
     
    7285        return false;
    7386}
    74 
  • _plugins_/abonnements/trunk/inc/abonnements.php

    r71605 r90180  
    77
    88if (!defined('_ECRIRE_INC_VERSION')) return;
     9
     10/**
     11 * Initialiser les dates d'échéance et de fin pour un abonnement créé
     12 *
     13 * @pipeline_appel abonnement_initialisation_dates
     14 * @param array $abonnement
     15 *              Informations sur l'abonnement à initialiser
     16 * @param array $offre
     17 *              Informations sur l'offre de l'abonnement à initialiser
     18 * @return array
     19 *              Retourne les modifications de dates initialisées
     20 **/
     21function abonnements_initialisation_dates($abonnement, $offre){
     22        $modifs = array();
     23       
     24        // De combien doit-on augmenter la date
     25        switch ($offre['periode']){
     26                case 'heures':
     27                        $ajout = " + ${duree} hours";
     28                        break;
     29                case 'jours':
     30                        $ajout = " + ${duree} days";
     31                        break;
     32                case 'mois':
     33                        $ajout = " + ${duree} months";
     34                        break;
     35                default:
     36                        $ajout = '';
     37                        break;
     38        }
     39       
     40        // Par défaut les dates de fin et de la prochaine échéance sont les mêmes
     41        $modifs['date_echeance'] = date('Y-m-d H:i:s', strtotime($abonnement['date_debut'].$ajout));
     42        $modifs['date_fin'] = $modifs['date_echeance'];
     43       
     44        // Mais s'il y a le plugin Commandes et Bank et qu'on trouve commande et transaction
     45        if (
     46                _DIR_PLUGIN_COMMANDES
     47                and _DIR_PLUGIN_BANK
     48                and include_spip('action/editer_liens')
     49                and $lien_commande = objet_trouver_liens(array('commande' => '*'), array('abonnement' => $abonnement['id_abonnement']))
     50                and is_array($lien_commande)
     51                // On prend juste la première commande qu'on trouve
     52                and $id_commande = intval($lien_commande[0]['id_commande'])
     53                // On cherche le dernier paiement bien payé pour cette commande
     54                and $transaction = sql_fetsel(
     55                        '*', 'spip_transactions', array('id_commande = '.$id_commande, 'statut = "ok"')
     56                )
     57        ) {
     58                // On a trouvé la transaction qui a activé la commande qui a activé l'abonnement
     59                // Si on détecte un prélèvement SEPA, on annule la date de fin !
     60                if ($refcb = $transaction['refcb'] and strpos($refcb, 'SEPA') === 0) {
     61                        $modifs['date_fin'] = '0000-00-00 00:00:00';
     62                }
     63                // Si ya une fin de validité de carte bleue on en déduit une fin d'abonnement !
     64                elseif ($validite = $transaction['validite']) {
     65                        include_spip('inc/bank');
     66                        list($year, $month) = explode('-', $validite);
     67                        $modifs['date_fin'] = bank_date_fin_mois($year, $month);
     68                }
     69        }
     70       
     71        $modifs = pipeline(
     72                'abonnement_initialisation_dates',
     73                array(
     74                        'args' => array('abonnement' => $abonnement, 'offre' => $offre),
     75                        'data' => $modifs
     76                )
     77        );
     78       
     79        return $modifs;
     80}
     81
    982
    1083/*
     
    85158        );
    86159}
    87 
    88 ?>
Note: See TracChangeset for help on using the changeset viewer.