Lorsqu'on détecte une commande payée pour un abonnement, on détecte aussi si c'est une commande avec renouvellement auto, et si c'est le cas, on force toujours la création d'un nouvel abonnement dédié, jamais de renouvellement d'un ancien. Au passage la fonction pour creer_ou_renouveler est déplacée PAS dans action/ car c'est pas un humain qui appelle ça. On le met dans le inc/ et du coup on a des vrais arguments classiques.

svn/attic/branches/v3.0.12/98521
rastapopoulos@spip.org 8 years ago
parent fb27ea0be1
commit fc08368ef9

1
.gitattributes vendored

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

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

@ -1,79 +0,0 @@
<?php
// Sécurité
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 string|null $arg
* L'argument doit contenir "id_auteur/id_abonnements_offre".
* @return mixed
*/
function action_creer_ou_renouveler_abonnement_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
list($id_auteur,$id_abonnements_offre) = explode('/', $arg);
// 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
) {
// 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;
}

@ -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éé
*

@ -1,7 +1,7 @@
<paquet
prefix="abonnements"
categorie="auteur"
version="3.0.5"
version="3.0.6"
schema="2.2.0"
etat="dev"
compatibilite="[3.0.5;3.0.*]"
@ -22,7 +22,7 @@
<necessite nom="verifier" compatibilite="[1.0.0;]" />
<necessite nom="yaml" compatibilite="[1.5.0;]" />
<necessite nom="facteur" compatibilite="[3.0.1;]" />
<utilise nom="commandes" compatibilite="[1.5.0;]" />
<utilise nom="commandes" compatibilite="[1.6.8;]" />
<!-- Autorisations générales -->
<pipeline nom="autoriser" inclure="abonnements_autorisations.php" />

Loading…
Cancel
Save