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 @@
-
+