/** * 入力済みの購入情報をフォームに設定する. * * 受注一時テーブル, セッションの配送情報から入力済みの購入情報を取得し, * フォームに設定する. * * @param FormParam $objFormParam FormParam インスタンス * @param PurchaseHelper $objPurchase PurchaseHelper インスタンス * @param integer $uniqid 購入一時情報のユニークID * @return void */ public function setFormParams(&$objFormParam, &$objPurchase, $uniqid) { $arrOrderTemp = $objPurchase->getOrderTemp($uniqid); if (Utils::isBlank($arrOrderTemp)) { $arrOrderTemp = array('order_email' => '', 'order_birth' => ''); } $arrShippingTemp = $objPurchase->getShippingTemp(); $objFormParam->setParam($arrOrderTemp); /* * count($arrShippingTemp) > 1 は複数配送であり, * $arrShippingTemp[0] は注文者が格納されている */ if (count($arrShippingTemp) > 1) { $objFormParam->setParam($arrShippingTemp[1]); } else { if ($arrOrderTemp['deliv_check'] == 1) { $objFormParam->setParam($arrShippingTemp[1]); } else { $objFormParam->setParam($arrShippingTemp[0]); } } $objFormParam->setValue('order_email02', $arrOrderTemp['order_email']); $objFormParam->setDBDate($arrOrderTemp['order_birth'], 'order_year', 'order_month', 'order_day'); }
/** * 複数配送情報を一時保存する. * * 会員ログインしている場合は, その他のお届け先から住所情報を取得する. * * @param integer $uniqid 一時受注テーブルのユニークID * @param FormParam $objFormParam FormParam インスタンス * @param Customer $objCustomer Customer インスタンス * @param PurchaseHelper $objPurchase PurchaseHelper インスタンス * @param AddressHelper $objAddress * @return void */ public function saveMultipleShippings($uniqid, FormParam &$objFormParam, Customer &$objCustomer, PurchaseHelper &$objPurchase, AddressHelper &$objAddress) { $arrValues = array(); $arrItemTemp = array(); $arrParams = $objFormParam->getSwapArray(); foreach ($arrParams as $arrParam) { $other_deliv_id = $arrParam['shipping']; if ($objCustomer->isLoginSuccess(true)) { if ($other_deliv_id != 0) { $otherDeliv = $objAddress->getAddress($other_deliv_id, $objCustomer->getValue('customer_id')); if (!$otherDeliv) { Utils::sfDispSiteError(FREE_ERROR_MSG, '', false, "入力値が不正です。<br />正しい値を入力してください。"); Application::alias('eccube.response')->actionExit(); } foreach ($otherDeliv as $key => $val) { $arrValues[$other_deliv_id]['shipping_' . $key] = $val; } } else { $objPurchase->copyFromCustomer($arrValues[0], $objCustomer, 'shipping'); } } else { $arrValues = $objPurchase->getShippingTemp(); } if (!isset($arrItemTemp[$other_deliv_id])) { $arrItemTemp[$other_deliv_id] = array(); } if (!isset($arrItemTemp[$other_deliv_id][$arrParam['product_class_id']])) { $arrItemTemp[$other_deliv_id][$arrParam['product_class_id']] = 0; } $arrItemTemp[$other_deliv_id][$arrParam['product_class_id']] += $arrParam['quantity']; } $objPurchase->clearShipmentItemTemp(); foreach ($arrValues as $shipping_id => $arrVal) { $objPurchase->saveShippingTemp($arrVal, $shipping_id); } foreach ($arrItemTemp as $other_deliv_id => $arrProductClassIds) { foreach ($arrProductClassIds as $product_class_id => $quantity) { if ($quantity == 0) { continue; } $objPurchase->setShipmentItemTemp($other_deliv_id, $product_class_id, $quantity); } } //不必要な配送先を削除 foreach ($_SESSION['shipping'] as $id => $arrShipping) { if (!isset($arrShipping['shipment_item'])) { $objPurchase->unsetOneShippingTemp($id); } } // $arrValues[0] には, 購入者の情報が格納されている $objPurchase->saveOrderTemp($uniqid, $arrValues[0], $objCustomer); }
/** * DB更新処理 * * @param integer $order_id 受注ID * @param PurchaseHelper $objPurchase PurchaseHelper インスタンス * @param FormParam $objFormParam FormParam インスタンス * @param string $message 通知メッセージ * @param array $arrValuesBefore 更新前の受注情報 * @return integer $order_id 受注ID * * エラー発生時は負数を返す。 */ public function doRegister($order_id, PurchaseHelper &$objPurchase, &$objFormParam, &$message, &$arrValuesBefore) { $objQuery = Application::alias('eccube.query'); $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; } // 生年月日の調整 $arrValues['order_birth'] = Utils::sfGetTimestamp($arrValues['order_birth_year'], $arrValues['order_birth_month'], $arrValues['order_birth_day']); // 受注テーブルの更新 $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', 'tax_rate', 'tax_rule')); // 変更しようとしている商品情報と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 = Application::alias('eccube.helper.delivery')->getDelivTime($objFormParam->getValue('deliv_id')); //商品単価を複数配送にも適応 $arrShippingValues = array(); $arrIsNotQuantityUp = array(); foreach ($arrAllShipping as $shipping_index => $arrShipping) { $shipping_id = $arrShipping['shipping_id']; $arrShippingValues[$shipping_index] = $arrShipping; $arrShippingValues[$shipping_index]['shipping_date'] = Utils::sfGetTimestamp($arrShipping['shipping_date_year'], $arrShipping['shipping_date_month'], $arrShipping['shipping_date_day']); //商品単価を複数配送にも反映する foreach ($arrDetail as $product_detail) { foreach ($arrAllShipmentItem[$shipping_index]['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) { if ($product_detail['product_class_id'] == $shipment_product_class_id) { $arrAllShipmentItem[$shipping_index]['shipment_price'][$relation_index] = $product_detail['price']; } } } // 配送業者IDを取得 $arrShippingValues[$shipping_index]['deliv_id'] = $objFormParam->getValue('deliv_id'); // お届け時間名称を取得 $arrShippingValues[$shipping_index]['shipping_time'] = $arrDelivTime[$arrShipping['time_id']]; // 複数配送の場合は配送商品を登録 if (!Utils::isBlank($arrAllShipmentItem)) { $arrShipmentValues = array(); foreach ($arrAllShipmentItem[$shipping_index] as $key => $arrItem) { // TODO $arrItemが配列でない場合があるのを見直した方が良いかもしれない if (is_array($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; }
/** * 受注一時テーブルへ登録を行う. * * @param integer $uniqid 受注一時テーブルのユニークID * @param array $arrForm フォームの入力値 * @param PurchaseHelper $objPurchase PurchaseHelper インスタンス * @param array $arrPayment お支払い方法の配列 * @return void */ public function lfRegistData($uniqid, $arrForm, &$objPurchase, $arrPayment) { $arrForm['order_temp_id'] = $uniqid; $arrForm['update_date'] = 'CURRENT_TIMESTAMP'; if ($arrForm['point_check'] != '1') { $arrForm['use_point'] = 0; } foreach ($arrPayment as $payment) { if ($arrForm['payment_id'] == $payment['payment_id']) { $arrForm['charge'] = $payment['charge']; $arrForm['payment_method'] = $payment['payment_method']; break; } } $objPurchase->saveOrderTemp($uniqid, $arrForm); }
/** * 受注お届け先情報の取得 * * @param PurchaseHelper $objPurchase object PurchaseHelperクラス * @param $order_id integer 注文番号 * @param $arrWDAY array 曜日データの配列 * @return array お届け先情報 */ public function lfGetShippingDate(&$objPurchase, $order_id, $arrWDAY) { $arrShipping = $objPurchase->getShippings($order_id); foreach ($arrShipping as $shipping_index => $shippingData) { foreach ($shippingData as $key => $val) { if ($key == 'shipping_date' && Utils::isBlank($val) == false) { // お届け日を整形 list($y, $m, $d, $w) = explode(' ', date('Y m d w', strtotime($val))); $arrShipping[$shipping_index]['shipping_date'] = sprintf('%04d/%02d/%02d(%s)', $y, $m, $d, $arrWDAY[$w]); } } } return $arrShipping; }
public function EndSession() { // セッション情報破棄の前にcustomer_idを保存 $customer_id = $_SESSION['customer']['customer_id']; // $_SESSION['customer']の解放 unset($_SESSION['customer']); // セッションの配送情報を全て破棄する PurchaseHelper::unsetAllShippingTemp(true); // トランザクショントークンの破棄 SessionHelper::destroyToken(); /* @var $objSiteSess SiteSession */ $objSiteSess = Application::alias('eccube.site_session'); $objSiteSess->unsetUniqId(); // ログに記録する $log = sprintf("logout : user=%d\tip=%s", $customer_id, $this->getRemoteHost()); GcUtils::gfPrintLog($log, CUSTOMER_LOG_REALFILE, false); }
/** * セッションの配送情報を破棄する. * * @deprecated 2.12.0 から EC-CUBE 本体では使用していない。 * @return void */ public function unsetShippingTemp() { PurchaseHelper::unsetAllShippingTemp(true); }
/** * 受注番号、最終ポイント、加算ポイント、利用ポイントから「オーダー前ポイント」を取得する * * @param integer $order_id 受注番号 * @param integer $use_point 利用ポイント * @param integer $add_point 加算ポイント * @param integer $order_status 対応状況 * @return array オーダー前ポイントの配列 */ public function getRollbackPoint($order_id, $use_point, $add_point, $order_status) { /* @var $objQuery Query */ $objQuery = Application::alias('eccube.query'); $arrRet = $objQuery->select('customer_id', 'dtb_order', 'order_id = ?', array($order_id)); $customer_id = $arrRet[0]['customer_id']; if ($customer_id != '' && $customer_id >= 1) { $arrRet = $objQuery->select('point', 'dtb_customer', 'customer_id = ?', array($customer_id)); $point = $arrRet[0]['point']; $rollback_point = $arrRet[0]['point']; // 対応状況がポイント利用対象の場合、使用ポイント分を戻す if (PurchaseHelper::isUsePoint($order_status)) { $rollback_point += $use_point; } // 対応状況がポイント加算対象の場合、加算ポイント分を戻す if (PurchaseHelper::isAddPoint($order_status)) { $rollback_point -= $add_point; } } else { $rollback_point = ''; $point = ''; } return array($point, $rollback_point); }
/** * Page のアクション. * * @return void */ public function action() { //決済処理中ステータスのロールバック /* @var $objPurchase PurchaseHelper */ $objPurchase = Application::alias('eccube.helper.purchase'); $objPurchase->cancelPendingOrder(PENDING_ORDER_CANCEL_FLAG); /* @var $objCartSess CartSession */ $objCartSess = Application::alias('eccube.cart_session'); /* @var $objSiteSess SiteSession */ $objSiteSess = Application::alias('eccube.site_session'); /* @var $objCustomer Customer */ $objCustomer = Application::alias('eccube.customer'); $this->is_multiple = $objPurchase->isMultiple(); // 前のページで正しく登録手続きが行われた記録があるか判定 if (!$objSiteSess->isPrePage()) { Utils::sfDispSiteError(PAGE_ERROR, $objSiteSess); } // ユーザユニークIDの取得と購入状態の正当性をチェック $this->tpl_uniqid = $objSiteSess->getUniqId(); $objPurchase->verifyChangeCart($this->tpl_uniqid, $objCartSess); $this->cartKey = $objCartSess->getKey(); // カート内商品のチェック $this->tpl_message = $objCartSess->checkProducts($this->cartKey); if (!Utils::isBlank($this->tpl_message)) { Application::alias('eccube.response')->sendRedirect(CART_URL); Application::alias('eccube.response')->actionExit(); } $this->is_download = $this->cartKey == PRODUCT_TYPE_DOWNLOAD; // カートの商品を取得 $this->arrShipping = $objPurchase->getShippingTemp($this->is_multiple); $this->arrCartItems = $objCartSess->getCartList($this->cartKey); // 合計金額 $this->tpl_total_inctax = $objCartSess->getAllProductsTotal($this->cartKey); // 税額 $this->tpl_total_tax = $objCartSess->getAllProductsTax($this->cartKey); $this->tpl_total_tax = $objCartSess->getAllProductsTax($this->cartKey); $objFormParam = new FormParam(); $this->lfInitParam($objFormParam, $this->arrShipping); $objFormParam->setParam($_POST); $objFormParam->convParam(); $objFormParam->trimParam(); // 一時受注テーブルの読込 $arrOrderTemp = $objPurchase->getOrderTemp($this->tpl_uniqid); // 配送業者を取得 $objDelivery = new DeliveryHelper(); $this->arrDeliv = $objDelivery->getList($this->cartKey, false, true); $this->tpl_is_single_deliv = $objDelivery->isSingleDeliv($this->cartKey); // お届け日一覧の取得 $this->arrDelivDate = $objPurchase->getDelivDate($objCartSess, $this->cartKey); if (Utils::sfIsInt($arrOrderTemp['deliv_id'])) { $this->arrPayment = $objPurchase->getSelectablePayment($objCartSess, $arrOrderTemp['deliv_id'], true); $this->arrDelivTime = DeliveryHelper::getDelivTime($arrOrderTemp['deliv_id']); } // カート集計を元に最終計算 $arrCalcResults = $objCartSess->calculate($this->cartKey, $objCustomer, $arrOrderTemp['use_point'], $objPurchase->getShippingPref($this->is_multiple), $arrOrderTemp['charge'], $arrOrderTemp['discount'], $arrOrderTemp['deliv_id'], $arrOrderTemp['order_pref'], $arrOrderTemp['order_country_id']); $this->arrForm = array_merge($arrOrderTemp, $arrCalcResults); foreach ($objFormParam->getHashArray() as $key => $param) { if (!Utils::isBlank($param) && Utils::isBlank($this->arrForm[$key])) { $this->arrForm[$key] = $param; } } // 会員ログインチェック if ($objCustomer->isLoginSuccess(true)) { $this->tpl_login = '******'; $this->tpl_user_point = $objCustomer->getValue('point'); } // 決済モジュールを使用するかどうか $this->use_module = Application::alias('eccube.helper.payment')->useModule($this->arrForm['payment_id']); switch ($this->getMode()) { case 'select_deliv': $sqlval = $objFormParam->getHashArray(); if (Utils::isBlank($sqlval['use_point'])) { $sqlval['use_point'] = '0'; } $deliv_id = $objFormParam->getValue('deliv_id'); $arrPayment = $objPurchase->getSelectablePayment($objCartSess, $deliv_id); $sqlval['payment_id'] = $arrPayment[0]['payment_id']; $sqlval['payment_method'] = $arrPayment[0]['payment_method']; $objPurchase->saveOrderTemp($this->tpl_uniqid, $sqlval); Response::reload(); break; // 前のページに戻る // 前のページに戻る case 'return': // 正常な推移であることを記録しておく $objSiteSess->setRegistFlag(); Application::alias('eccube.response')->sendRedirect(SHOPPING_PAYMENT_URLPATH); Application::alias('eccube.response')->actionExit(); break; case 'confirm': $this->saveShippings($objFormParam, $this->arrDelivTime); $deliv_id = $objFormParam->getValue('deliv_id'); $arrPayment = $objPurchase->getSelectablePayment($objCartSess, $deliv_id); $this->lfRegistPayment($this->tpl_uniqid, $objFormParam->getHashArray(), $objPurchase, $arrPayment); /* * 決済モジュールで必要なため, 受注番号を取得 */ $this->arrForm['order_id'] = $objPurchase->getNextOrderID(); $_SESSION['order_id'] = $this->arrForm['order_id']; // 集計結果を受注一時テーブルに反映 $objPurchase->saveOrderTemp($this->tpl_uniqid, $this->arrForm, $objCustomer); // 正常に登録されたことを記録しておく $objSiteSess->setRegistFlag(); // 決済モジュールを使用する場合 if ($this->use_module) { $objPurchase->completeOrder(ORDER_PENDING); Application::alias('eccube.response')->sendRedirect(SHOPPING_MODULE_URLPATH); // 購入完了ページ } else { $objPurchase->completeOrder(ORDER_NEW); PurchaseHelper::sendOrderMail($this->arrForm['order_id'], $this); Application::alias('eccube.response')->sendRedirect(SHOPPING_COMPLETE_URLPATH); } Application::alias('eccube.response')->actionExit(); break; default: break; } }
/** * お届け先チェックの値に応じて, お届け先情報を保存する. * * 会員住所がチェックされている場合は, 会員情報からお届け先を取得する. * その他のお届け先がチェックされている場合は, その他のお届け先からお届け先を取得する. * お届け先チェックの値が不正な場合は false を返す. * * @param integer $other_deliv_id * @param string $uniqid 受注一時テーブルのユニークID * @param PurchaseHelper $objPurchase PurchaseHelper インスタンス * @param Customer $objCustomer Customer インスタンス * @param AddressHelper $objAddress * @return boolean お届け先チェックの値が妥当な場合 true */ public function registerDeliv($other_deliv_id, $uniqid, PurchaseHelper &$objPurchase, Customer &$objCustomer, AddressHelper $objAddress) { $arrValues = array(); // 会員登録住所がチェックされている場合 if ($other_deliv_id == 0) { $objPurchase->copyFromCustomer($arrValues, $objCustomer, 'shipping'); // 別のお届け先がチェックされている場合 } else { $arrOtherDeliv = $objAddress->getAddress($other_deliv_id, $objCustomer->getValue('customer_id')); if (!$arrOtherDeliv) { return false; } $objPurchase->copyFromOrder($arrValues, $arrOtherDeliv, 'shipping', ''); } $objPurchase->saveShippingTemp($arrValues, $other_deliv_id); $objPurchase->saveOrderTemp($uniqid, $arrValues, $objCustomer); return true; }