/** * DB更新処理 * * @param integer $order_id 受注ID * @param SC_Helper_Purchase $objPurchase SC_Helper_Purchase インスタンス * @param SC_FormParam $objFormParam SC_FormParam インスタンス * @param string $message 通知メッセージ * @param array $arrValuesBefore 更新前の受注情報 * @return integer $order_id 受注ID * * エラー発生時は負数を返す。 */ function doRegister($order_id, &$objPurchase, &$objFormParam, &$message, &$arrValuesBefore) { $objQuery =& SC_Query_Ex::getSingletonInstance(); $arrValues = $objFormParam->getDbArray(); $where = 'order_id = ?'; $objQuery->begin(); // 支払い方法が変更されたら、支払い方法名称も更新 if ($arrValues['payment_id'] != $arrValuesBefore['payment_id']) { $arrValues['payment_method'] = $this->arrPayment[$arrValues['payment_id']]; $arrValuesBefore['payment_id'] = NULL; } // 受注テーブルの更新 $order_id = $objPurchase->registerOrder($order_id, $arrValues); $arrDetail = $objFormParam->getSwapArray(array('product_id', 'product_class_id', 'product_code', 'product_name', 'price', 'quantity', 'point_rate', 'classcategory_name1', 'classcategory_name2')); // 変更しようとしている商品情報とDBに登録してある商品情報を比較することで、更新すべき数量を計算 $max = count($arrDetail); $k = 0; $arrStockData = array(); for ($i = 0; $i < $max; $i++) { if (!empty($arrDetail[$i]['product_id'])) { $arrPreDetail = $objQuery->select('*', 'dtb_order_detail', 'order_id = ? AND product_class_id = ?', array($order_id, $arrDetail[$i]['product_class_id'])); if (!empty($arrPreDetail) && $arrPreDetail[0]['quantity'] != $arrDetail[$i]['quantity']) { // 数量が変更された商品 $arrStockData[$k]['product_class_id'] = $arrDetail[$i]['product_class_id']; $arrStockData[$k]['quantity'] = $arrPreDetail[0]['quantity'] - $arrDetail[$i]['quantity']; ++$k; } elseif (empty($arrPreDetail)) { // 新しく追加された商品 もしくは 違う商品に変更された商品 $arrStockData[$k]['product_class_id'] = $arrDetail[$i]['product_class_id']; $arrStockData[$k]['quantity'] = -$arrDetail[$i]['quantity']; ++$k; } $objQuery->delete('dtb_order_detail', 'order_id = ? AND product_class_id = ?', array($order_id, $arrDetail[$i]['product_class_id'])); } } // 上記の新しい商品のループでDELETEされなかった商品は、注文より削除された商品 $arrPreDetail = $objQuery->select('*', 'dtb_order_detail', 'order_id = ?', array($order_id)); foreach ($arrPreDetail as $key => $val) { $arrStockData[$k]['product_class_id'] = $val['product_class_id']; $arrStockData[$k]['quantity'] = $val['quantity']; ++$k; } // 受注詳細データの更新 $objPurchase->registerOrderDetail($order_id, $arrDetail); // 在庫数調整 if (ORDER_DELIV != $arrValues['status'] && ORDER_CANCEL != $arrValues['status']) { foreach ($arrStockData as $stock) { $objQuery->update('dtb_products_class', array(), 'product_class_id = ?', array($stock['product_class_id']), array('stock' => 'stock + ?'), array($stock['quantity'])); } } $arrAllShipping = $objFormParam->getSwapArray($this->arrShippingKeys); $arrAllShipmentItem = $objFormParam->getSwapArray($this->arrShipmentItemKeys); $arrDelivTime = $objPurchase->getDelivTime($objFormParam->getValue('deliv_id')); $arrShippingValues = array(); foreach ($arrAllShipping as $shipping_index => $arrShipping) { $shipping_id = $arrShipping['shipping_id']; $arrShippingValues[$shipping_index] = $arrShipping; $arrShippingValues[$shipping_index]['shipping_date'] = SC_Utils_Ex::sfGetTimestamp($arrShipping['shipping_date_year'], $arrShipping['shipping_date_month'], $arrShipping['shipping_date_day']); // 配送業者IDを取得 $arrShippingValues[$shipping_index]['deliv_id'] = $objFormParam->getValue('deliv_id'); // お届け時間名称を取得 $arrShippingValues[$shipping_index]['shipping_time'] = $arrDelivTime[$arrShipping['time_id']]; // 複数配送の場合は配送商品を登録 if (!SC_Utils_Ex::isBlank($arrAllShipmentItem)) { $arrShipmentValues = array(); foreach ($arrAllShipmentItem[$shipping_index] as $key => $arrItem) { $i = 0; foreach ($arrItem as $item) { $arrShipmentValues[$shipping_index][$i][str_replace('shipment_', '', $key)] = $item; $i++; } } $objPurchase->registerShipmentItem($order_id, $shipping_id, $arrShipmentValues[$shipping_index]); } } $objPurchase->registerShipping($order_id, $arrShippingValues, false); $objQuery->commit(); return $order_id; }
public function testRegisterShipping_非会員購入の場合_配送IDが設定される() { $order_id = '2'; $arrParams = array('30' => array('order_id' => '2', 'shipping_name01' => '配送情報02-update', 'shipping_date' => '2013/12/03 00:00:00')); $this->expected['count'] = '3'; // 件数が変わらない $this->expected['content'] = array('order_id' => '2', 'shipping_id' => '30', 'shipping_name01' => '配送情報02-update', 'shipping_date' => '2013-12-03 00:00:00'); SC_Helper_Purchase::registerShipping($order_id, $arrParams); $this->actual['count'] = $this->objQuery->count('dtb_shipping'); $this->result = $this->objQuery->setWhere('order_id = ?')->select('order_id,shipping_id,shipping_name01,shipping_date,create_date,update_date', 'dtb_shipping', '', array($order_id)); $this->actual['content'] = $this->result[0]; unset($this->actual['content']['create_date']); unset($this->actual['content']['update_date']); $this->verify('登録した配送情報'); $this->assertNotNull($this->result[0]['create_date']); $this->assertNotNull($this->result[0]['update_date']); }