diff --git a/.gitattributes b/.gitattributes index da47483..7a1be46 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,7 +2,6 @@ /abonnements_administrations.php -text /abonnements_autorisations.php -text /abonnements_pipelines.php -text -action/creer_ou_renouveler_abonnement.php -text action/modifier_echeance_abonnement.php -text action/renouveler_abonnement.php -text base/abonnements.php -text diff --git a/abonnements_pipelines.php b/abonnements_pipelines.php index 18fc6f3..47fb1de 100644 --- a/abonnements_pipelines.php +++ b/abonnements_pipelines.php @@ -130,9 +130,20 @@ function abonnements_post_edition($flux){ 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'], array('mois', 'annee')) + and include_spip('inc/commandes_echeances') + and commandes_nb_echeances_payees($id_commande) <= 1 + ) { + $forcer_creation = true; + } + // On crée ou renouvelle - $action = charger_fonction('creer_ou_renouveler_abonnement', 'action/'); - $retour = $action($id_auteur.'/'.$id_abonnements_offre); + include_spip('inc/abonnements'); + $retour = abonnements_creer_ou_renouveler($id_auteur, $id_abonnements_offre, $forcer_creation); // Si on a un retour correct avec un abonnement if ( diff --git a/action/creer_ou_renouveler_abonnement.php b/action/creer_ou_renouveler_abonnement.php deleted file mode 100644 index 592fc50..0000000 --- a/action/creer_ou_renouveler_abonnement.php +++ /dev/null @@ -1,79 +0,0 @@ - 0 - and ($id_abonnements_offre = intval($id_abonnements_offre)) > 0 - ) { - // On cherche la durée limite pour renouveler un abonnement - include_spip('inc/config'); - $heures_limite = lire_config('abonnements/renouvellement_heures_limite', 48); - - // Si on trouve un abonnement de cette offre (le dernier en date) - // et qu'il n'est pas trop vieux ! - if ( - $abonnement = sql_fetsel( - 'id_abonnement, date_fin', - 'spip_abonnements', - array('id_auteur = '.$id_auteur, 'id_abonnements_offre = '.$id_abonnements_offre, 'statut != "poubelle"'), - '', - 'date_fin desc', - '0,1' - ) - and $abonnement['date_fin'] >= date('Y-m-d H:i:s', strtotime('- '.$heures_limite.' hours')) - and $id_abonnement = intval($abonnement['id_abonnement']) - ) { - autoriser_exception('modifier', 'abonnement', $id_abonnement, true); - // On le renouvelle ! - $renouveler = charger_fonction('renouveler_abonnement', 'action/'); - $retour = $renouveler($id_abonnement); - autoriser_exception('modifier', 'abonnement', $id_abonnement, false); - return $retour; - } - // Sinon on en crée un nouveau - else { - include_spip('action/editer_objet'); - autoriser_exception('creer', 'abonnement', '', true); - if ($id_abonnement = objet_inserer('abonnement')) { - autoriser_exception('creer', 'abonnement', '', false); - autoriser_exception('modifier', 'abonnement', $id_abonnement, true); - $erreur = objet_modifier( - 'abonnement', $id_abonnement, - array( - 'id_auteur' => $id_auteur, - 'id_abonnements_offre' => $id_abonnements_offre, - ) - ); - autoriser_exception('modifier', 'abonnement', $id_abonnement, false); - return array($id_abonnement, $erreur); - } - } - } - - return false; -} - diff --git a/inc/abonnements.php b/inc/abonnements.php index e0be9df..2e2c58d 100644 --- a/inc/abonnements.php +++ b/inc/abonnements.php @@ -7,6 +7,85 @@ if (!defined('_ECRIRE_INC_VERSION')) return; +/** + * Créer ou renouveler un abonnement + * + * Si l'utilisateur n'a rien de cette offre, on crée un nouvel abonnement. + * Si l'utilisateur a toujours ou avait précédemment un abonnement de cette offre, on le renouvelle. + * + * On s'assure d'avoir les droits pendant les modifs + * car ce n'est pas un humain avec des droits qui déclanche ça explicitement + * + * @param int $id_auteur + * Identifiant de l'utilisateur pour lequel on veut créer un abonnement + * @param int $id_abonnements_offre + * Identifiant de l'offre d'abonnement voulue + * @param bool $forcer_creation + * `true` si on veut forcer la création sans chercher à renouveler + * @return mixed + */ +function abonnements_creer_ou_renouveler($id_auteur, $id_abonnements_offre, $forcer_creation=false) { + // Si on a bien un auteur et une offre + if ( + ($id_auteur = intval($id_auteur)) > 0 + and ($id_abonnements_offre = intval($id_abonnements_offre)) > 0 + ) { + include_spip('inc/config'); + include_spip('inc/autoriser'); + + // On cherche la durée limite pour renouveler un abonnement + $heures_limite = lire_config('abonnements/renouvellement_heures_limite', 48); + + // Si on trouve un abonnement de cette offre (le dernier en date) + // et qu'il n'est pas trop vieux ! + // et qu'on a pas forcé la création… + if ( + !$forcer_creation + and $abonnement = sql_fetsel( + 'id_abonnement, date_fin', + 'spip_abonnements', + array( + 'id_auteur = '.$id_auteur, + 'id_abonnements_offre = '.$id_abonnements_offre, + 'statut != "poubelle"' + ), + '', + 'date_fin desc', + '0,1' + ) + and $abonnement['date_fin'] >= date('Y-m-d H:i:s', strtotime('- '.$heures_limite.' hours')) + and $id_abonnement = intval($abonnement['id_abonnement']) + ) { + autoriser_exception('modifier', 'abonnement', $id_abonnement, true); + // On le renouvelle ! + $renouveler = charger_fonction('renouveler_abonnement', 'action/'); + $retour = $renouveler($id_abonnement); + autoriser_exception('modifier', 'abonnement', $id_abonnement, false); + return $retour; + } + // Sinon on en crée un nouveau + else { + include_spip('action/editer_objet'); + autoriser_exception('creer', 'abonnement', '', true); + if ($id_abonnement = objet_inserer('abonnement')) { + autoriser_exception('creer', 'abonnement', '', false); + autoriser_exception('modifier', 'abonnement', $id_abonnement, true); + $erreur = objet_modifier( + 'abonnement', $id_abonnement, + array( + 'id_auteur' => $id_auteur, + 'id_abonnements_offre' => $id_abonnements_offre, + ) + ); + autoriser_exception('modifier', 'abonnement', $id_abonnement, false); + return array($id_abonnement, $erreur); + } + } + } + + return false; +} + /** * Initialiser les dates d'échéance et de fin pour un abonnement créé * diff --git a/paquet.xml b/paquet.xml index b701223..f5a107c 100644 --- a/paquet.xml +++ b/paquet.xml @@ -1,7 +1,7 @@ - +