From: Cerdic <cedric@yterium.com>
Date: Tue, 10 Dec 2013 16:09:13 +0000 (+0100)
Subject: Erreur de conception : il ne faut pas creer une transaction a chaque modif de l'objet... 
X-Git-Url: http://olivier.miskin.fr/git/?a=commitdiff_plain;h=0fb69ce8640e88e6df3bd13be26c61b917e9df90;p=spip_souscriptions.git

Erreur de conception : il ne faut pas creer une transaction a chaque modif de l'objet souscription car on risque plein de doublons : la transaction est creee dans le traiter() et passee a la souscription.
+ renseigner montant_ht = montant dans la transaction, et non montant_ht=0
+ renseigner l'id_auteur si l'auteur est connecte
+ on ne renseigne pas id_souscription dans la transaction
---

diff --git a/action/editer_souscription.php b/action/editer_souscription.php
index 25edf89..66d36b9 100644
--- a/action/editer_souscription.php
+++ b/action/editer_souscription.php
@@ -1,23 +1,23 @@
 <?php
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-function action_editer_souscription_dist($arg=null) {
+function action_editer_souscription_dist($arg = null){
 
-  if (is_null($arg)) {
-    $securiser_action = charger_fonction('securiser_action', 'inc');
-    $arg = $securiser_action();
-  }
+	if (is_null($arg)){
+		$securiser_action = charger_fonction('securiser_action', 'inc');
+		$arg = $securiser_action();
+	}
 
-  if (!$id_souscription = intval($arg)) {
-    $id_souscription = souscription_inserer();
-  }
+	if (!$id_souscription = intval($arg)){
+		$id_souscription = souscription_inserer();
+	}
 
-  if (!$id_souscription)
-    return array(0, '');
+	if (!$id_souscription)
+		return array(0, '');
 
-  $err = souscription_modifier($id_souscription);
+	$err = souscription_modifier($id_souscription);
 
-  return array($id_souscription, $err);
+	return array($id_souscription, $err);
 }
 
 /**
@@ -25,25 +25,25 @@ function action_editer_souscription_dist($arg=null) {
  *
  * @return bool
  */
-function souscription_inserer() {
+function souscription_inserer(){
 
-  $champs = array('date_souscription' => date('Y-m-d H:i:s'));
+	$champs = array('date_souscription' => date('Y-m-d H:i:s'));
 
-  // Envoyer aux plugins
-  $champs = pipeline('pre_insertion',
-                     array('args' => array('table' => 'spip_souscriptions'),
-                           'data' => $champs)
-                     );
+	// Envoyer aux plugins
+	$champs = pipeline('pre_insertion',
+		array('args' => array('table' => 'spip_souscriptions'),
+			'data' => $champs)
+	);
 
-  $id_souscription = sql_insertq("spip_souscriptions", $champs);
+	$id_souscription = sql_insertq("spip_souscriptions", $champs);
 
-  pipeline('post_insertion',
-           array('args' => array('table' => 'spip_souscriptions',
-                                 'id_objet' => $id_souscription),
-                 'data' => $champs)
-           );
+	pipeline('post_insertion',
+		array('args' => array('table' => 'spip_souscriptions',
+			'id_objet' => $id_souscription),
+			'data' => $champs)
+	);
 
-  return $id_souscription;
+	return $id_souscription;
 }
 
 /**
@@ -55,49 +55,37 @@ function souscription_inserer() {
  * @param array|bool $set
  * @return string
  */
-function souscription_modifier($id_souscription, $set=false) {
-  include_spip('inc/modifier');
-
-  $c = collecter_requests(
-                          // white list
-                          array('courriel',
-                                'recu_fiscal',
-                                'envoyer_info',
-                                'informer_comite_local',
-                                'prenom',
-                                'nom',
-                                'adresse',
-                                'code_postal',
-                                'ville',
-                                'telephone',
-                                'id_souscription_campagne',
-                                'type_souscription'),
-                          // black list
-                          array('statut', 'date'),
-                          // donnees eventuellement fournies
-                          $set
-                          );
-
-
-  $inserer_transaction = charger_fonction('inserer_transaction', 'bank');
-  $id_transaction = $inserer_transaction(_request('montant'),
-                                         '', /* montant_ht */
-                                         '', /* id_auteur */
-                                         $id_souscription, /* auteur_id => id_souscription */
-                                         _request('courriel'));
-
-  if(!$id_transaction) {
-    return "Identifiant de transaction introuvable..."; /* FIXME: à rendre traduisible. */
-  }
-
-  /* Récupération du nom du pays */
-  $code_pays = _request('pays');
-  $pays = sql_getfetsel(sql_multi("nom", $GLOBALS['spip_lang']), 'spip_pays', "code='$code_pays'");
-
-  $c = array_merge($c,
-                   array("id_transaction" => $id_transaction,
-                         "pays" => $pays));
-
-  if($err = objet_modifier_champs('souscription', $id_souscription, array(), $c))
-    return $err;
+function souscription_modifier($id_souscription, $set = false){
+	include_spip('inc/modifier');
+
+	$c = collecter_requests(
+	// white list
+		array('courriel',
+			'recu_fiscal',
+			'envoyer_info',
+			'informer_comite_local',
+			'prenom',
+			'nom',
+			'adresse',
+			'code_postal',
+			'ville',
+			'telephone',
+			'id_souscription_campagne',
+			'id_transaction',
+			'type_souscription'),
+		// black list
+		array('statut', 'date'),
+		// donnees eventuellement fournies
+		$set
+	);
+
+
+	/* Récupération du nom du pays */
+	$code_pays = _request('pays');
+	$pays = sql_getfetsel(sql_multi("nom", $GLOBALS['spip_lang']), 'spip_pays', "code='$code_pays'");
+
+	$c = array_merge($c,array("pays" => $pays));
+
+	if ($err = objet_modifier_champs('souscription', $id_souscription, array(), $c))
+		return $err;
 }
diff --git a/formulaires/souscription.php b/formulaires/souscription.php
index 12bc467..5c49e60 100644
--- a/formulaires/souscription.php
+++ b/formulaires/souscription.php
@@ -186,37 +186,55 @@ function formulaires_souscription_traiter_dist($id_souscription_campagne){
 	$row = array();
 	$hidden = '';
 	$retour = '';
+	$ret = array();
 
 	$campagne = sql_fetsel(array("type_objectif", "configuration_specifique", "type_saisie", "montants"),
 		"spip_souscription_campagnes", "id_souscription_campagne=".intval($id_souscription_campagne));
 	set_request("id_souscription_campagne",$id_souscription_campagne);
 	set_request('type_souscription',$campagne['type_objectif']);
 
-	$ret = formulaires_editer_objet_traiter('souscription',
-		'new',
-		'',
-		$lier_trad,
-		$retour,
-		$config_fonc,
-		$row,
-		$hidden);
-
-	$redirect = "";
-	$row = sql_fetsel("transaction_hash,id_transaction",
-		"spip_transactions LEFT JOIN spip_souscriptions USING(id_transaction)",
-		"id_souscription=" . $ret['id_souscription']);
-
-	if (!$row){
-		spip_log(sprintf("Erreur lors de la création de la transaction liée à la souscription [%s].", $ret['id_souscription']), "souscription");
-		$ret['message_erreur'] = "Echec creation de la transaction";
-	} else {
-		spip_log(sprintf("La souscription [%s], associée à la transaction [%s] a bien été crée.", $ret['id_souscription'], $row['id_transaction']), "souscription");
-		$hash = $row['transaction_hash'];
-		$id_transaction = $row['id_transaction'];
-		$redirect = generer_url_public("payer-acte", "id_transaction=$id_transaction&transaction_hash=$hash", false, false);
-		$ret['redirect'] = $redirect;
+	// generer la transaction et l'associer a la souscription
+	$inserer_transaction = charger_fonction('inserer_transaction', 'bank');
+	$montant = _request('montant');
+	$id_auteur = (isset($GLOBALS['visiteur_session']['id_auteur'])?$GLOBALS['visiteur_session']['id_auteur']:0);
+	$id_transaction = $inserer_transaction($montant,
+		$montant, /* montant_ht */
+		$id_auteur, /* id_auteur */
+		'', /* auteur_id */
+		_request('courriel'));
+
+	if (!$id_transaction){
+		$ret['message_erreur'] = "Erreur technique : impossible de preparer la transaction..."; /* FIXME: à rendre traduisible. */
+	}
+	else {
+
+		set_request("id_transaction",$id_transaction);
+
+		$ret = formulaires_editer_objet_traiter('souscription',
+			'new',
+			'',
+			$lier_trad,
+			$retour,
+			$config_fonc,
+			$row,
+			$hidden);
+
+		$redirect = "";
+		$row = sql_fetsel("transaction_hash,id_transaction",
+			"spip_transactions LEFT JOIN spip_souscriptions USING(id_transaction)",
+			"id_souscription=" . $ret['id_souscription']);
+
+		if (!$row){
+			spip_log(sprintf("Erreur lors de la création de la transaction liée à la souscription [%s].", $ret['id_souscription']), "souscription");
+			$ret['message_erreur'] = "Echec creation de la transaction";
+		} else {
+			spip_log(sprintf("La souscription [%s], associée à la transaction [%s] a bien été crée.", $ret['id_souscription'], $row['id_transaction']), "souscription");
+			$hash = $row['transaction_hash'];
+			$id_transaction = $row['id_transaction'];
+			$redirect = generer_url_public("payer-acte", "id_transaction=$id_transaction&transaction_hash=$hash", false, false);
+			$ret['redirect'] = $redirect;
+		}
 	}
-
 	return $ret;
 }