From 87d27e5da9227608785709aa82a1468294955b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florent=20Th=C3=A9venet?= Date: Fri, 30 Aug 2013 10:24:47 +0200 Subject: [PATCH] =?UTF-8?q?Gestion=20des=20quantit=C3=A9=20directement=20d?= =?UTF-8?q?ans=20POSS3->transaction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Payutc/Bom/Purchase.php | 8 +- src/Payutc/Service/POSS3.php | 142 +++++++---------------------------- tests/PurchaseRwdbTest.php | 10 ++- 3 files changed, 38 insertions(+), 122 deletions(-) diff --git a/src/Payutc/Bom/Purchase.php b/src/Payutc/Bom/Purchase.php index 0a197bc..de95812 100644 --- a/src/Payutc/Bom/Purchase.php +++ b/src/Payutc/Bom/Purchase.php @@ -102,15 +102,15 @@ public static function transaction($usr_id_buyer, $items, $poi_id, $fun_id, $usr $total_price = 0; $purchases = array(); foreach ($items as $itm) { - $price = $itm[0]['price'] * $itm[1]; + $price = $itm['price'] * $itm['qte']; $total_price += $price; $purchases[] = array( 'pur_date' => date('Y-m-d H:i:s'), 'pur_type' => 'product', - 'obj_id' => $itm[0]['id'], - 'pur_qte' => $itm[1], + 'obj_id' => $itm['id'], + 'pur_qte' => $itm['qte'], 'pur_price' => $price, - 'pur_unit_price' => $itm[0]['price'], + 'pur_unit_price' => $itm['price'], 'usr_id_buyer' => $usr_id_buyer, 'usr_id_seller' => $usr_id_seller, 'poi_id' => $poi_id, diff --git a/src/Payutc/Service/POSS3.php b/src/Payutc/Service/POSS3.php index 280c485..d7375c0 100644 --- a/src/Payutc/Service/POSS3.php +++ b/src/Payutc/Service/POSS3.php @@ -121,115 +121,27 @@ public function transaction($fun_id, $badge_id, $obj_ids) { throw new PossException($e->getMessage()); } - // récupérer les objets dans la db (note: pas de doublon) - $objects_ids = explode(" ", trim($obj_ids)); - $r = Product::getAll(array('obj_ids'=>array_unique($objects_ids), 'fun_ids'=>array($fun_id))); - $items = array(); - foreach($r as $itm) { - $items[$itm['id']] = $itm; - } - - // y'a t il de l'alcool ? - $alcool = false; - foreach($items as $itm) { - if ($itm['alcool'] > 0) { - $alcool = true; - break; - } - } - - // calcul le prix total - $total = 0; - foreach($objects_ids as $obj_id) - { - if(isset($items[$obj_id])) - { - $total += $items[$obj_id]['price']; - } else { - Log::warn("transaction($badge_id, ...) : $obj_id is unavailable"); - throw new PossException("L'article $obj_id n'est pas disponible à la vente."); + // tranformer la chaine passee en un array exploitable + // il y a deux formats : ids séparés par des espaces (pas de quantités) ou json + \error_log($obj_ids); + $objects = json_decode($obj_ids); + if (is_null($objects)) { // espaces + $objects_ids = explode(" ", trim($obj_ids)); + + $objects = array(); + foreach ($objects_ids as $id) { + $objects[] = array($id, 1); } - } - - // création de la liste des items à acheter (note: il peut y avoir des doublons) - $items_to_buy = array(); - foreach($objects_ids as $id) { - $items_to_buy[] = array($items[$id], 1); - } - - // si alcool, vérifier que le buyer est majeur - if($alcool) - { - if($buyer->isAdult() == 0) { - Log::warn("transaction($badge_id, $obj_ids) : Under-18 users can't buy alcohol"); - throw new PossException($buyer->getNickname()." est mineur il ne peut pas acheter d'alcool !"); + } else { + $objects_ids = array(); + foreach($objects as $object) { + $objects_ids[] = $object[0]; } } - // vérifier que le buyer a assez d'argent - if($buyer->getCredit() < $total) { - Log::warn("transaction($badge_id, $obj_ids) : Buyer have not enough money"); - throw new PossException($buyer->getNickname()." n'a pas assez d'argent pour effectuer la transaction."); - } - - // effectuer les achats - Purchase::transaction($buyer->getId(), $items_to_buy, - $this->application()->getId(), $fun_id, - $this->user()->getId(), $this->getRemoteIp()); - - // Retourner les infos sur l'utilisateur - $msg = $buyer->getMsgPerso($fun_id); - - return array("firstname"=>$buyer->getFirstname(), - "lastname"=>$buyer->getLastname(), - "solde"=>$buyer->getCredit(), - "msg_perso"=>$msg); - } - - /** - * $objects_list est de la forme [[obj1, qte1], [obj2, qt2], ...] - */ - public function transactionWithQte($fun_id, $badge_id, $objects_list) { - $this->checkRight(true, true, true, $fun_id); - - // Verifier que le buyer existe - try { - $buyer = User::getUserFromBadge($badge_id); - } - catch(UserNotFound $ex) { - Log::warn("transaction($fun_id, $badge_id, $objects_list) : User not found"); - throw new PossException("Ce badge n'a pas été reconnu"); - } - - // Vérifier que la carte n'est pas bloquée - try { - $buyer->checkNotBlockedMe(); - } - catch(UserIsBlockedException $ex) { - Log::warn("transaction($fun_id, $badge_id, $objects_list) : Blocked card"); - throw new PossException("Ce badge à été bloqué : son propriétaire doit le débloquer sur son interface de gestion"); - } - - // vérifier que l'utilisateur n'est pas bloqué sur cette fondation - try { - $buyer->checkNotBlockedFun($fun_id); - } - catch (UserIsBlockedException $e) { - Log::warn("transaction($fund_id, $badge_id, $objects_list) : Blocked user ({$e->getMessage()})"); - throw new PossException($e->getMessage()); - } - // récupérer les objets dans la db (note: pas de doublon) - $objects = json_decode($objects_list); - $objects_ids = array(); - foreach($objects as $object) { - $objects_ids[] = $object[0]; - } - $r = Product::getAll(array('obj_ids'=>array_unique($objects_ids), 'fun_ids'=>array($fun_id))); $items = array(); - - $alcool = false; foreach($r as $itm) { $items[$itm['id']] = $itm; } @@ -243,39 +155,41 @@ public function transactionWithQte($fun_id, $badge_id, $objects_list) { } } - // calcul le prix total + // calcul le prix total et création de la liste des items à acheter (note: il peut y avoir des doublons) $total = 0; + $items_to_buy = array(); foreach($objects as $object) { if(isset($items[$object[0]])) { - $total += $items[$object[0]]['price'] * $object[1]; + if ($object[1] > 0) { + $item = $items[$object[0]]; + $item['qte'] = $object[1]; + $items_to_buy[] = $item; + } else { + Log::warn("transaction($fun_id, $badge_id, $obj_ids) : Null quantity for article $object[0]"); + throw new PossException("La quantité pour l'article est $object[0] nulle."); + } + $total += $item['price'] * $item['qte']; } else { Log::warn("transaction($badge_id, ...) : $object[0] is unavailable"); throw new PossException("L'article $object[0] n'est pas disponible à la vente."); } } - // création de la liste des items à acheter (note: il peut y avoir des doublons) - $items_to_buy = array(); - foreach($objects as $object) { - if ($object[1] > 0) - $items_to_buy[] = array($items[$object[0]], $object[1]); - } - // si alcool, vérifier que le buyer est majeur if($alcool) { if($buyer->isAdult() == 0) { - Log::warn("transaction($badge_id, $objects_list) : Under-18 users can't buy alcohol"); + Log::warn("transaction($badge_id, $obj_ids) : Under-18 users can't buy alcohol"); throw new PossException($buyer->getNickname()." est mineur il ne peut pas acheter d'alcool !"); } } // vérifier que le buyer a assez d'argent if($buyer->getCredit() < $total) { - Log::warn("transaction($badge_id, $objects_list) : Buyer have not enough money"); - throw new PossException($buyer->getNickname()." n'a pas assez d'argent pour effectuer la transaction. $total"); + Log::warn("transaction($badge_id, $obj_ids) : Buyer have not enough money"); + throw new PossException($buyer->getNickname()." n'a pas assez d'argent pour effectuer la transaction."); } // effectuer les achats diff --git a/tests/PurchaseRwdbTest.php b/tests/PurchaseRwdbTest.php index e2d6fe6..9c37647 100644 --- a/tests/PurchaseRwdbTest.php +++ b/tests/PurchaseRwdbTest.php @@ -30,14 +30,16 @@ public function testTransaction() $date = date('Y-m-d H:i:s'); $nbSells = Purchase::getNbSell(4, 1, $date); $items = array( - array(array( + array( 'id' => 4, + 'qte' => 1, 'price' => 150, - ), 1), - array(array( + ), + array( 'id' => 4, + 'qte' => 3, 'price' => 150, - ), 3), + ), ); Purchase::transaction(1, $items, 51, 1, 9447, "localhost"); $u = new User("trecouvr");