/**
  * Page のアクション.
  *
  * @return void
  */
 public function action()
 {
     $objDeliv = new SC_Helper_Delivery_Ex();
     $mode = $this->getMode();
     if (!empty($_POST)) {
         $objFormParam = new SC_FormParam_Ex();
         $objFormParam->setParam($_POST);
         $this->arrErr = $this->lfCheckError($mode, $objFormParam);
         if (!empty($this->arrErr['deliv_id'])) {
             trigger_error('', E_USER_ERROR);
             return;
         }
     }
     switch ($mode) {
         case 'delete':
             // ランク付きレコードの削除
             $objDeliv->delete($_POST['deliv_id']);
             $this->objDisplay->reload();
             // PRG pattern
             break;
         case 'up':
             $objDeliv->rankUp($_POST['deliv_id']);
             $this->objDisplay->reload();
             // PRG pattern
             break;
         case 'down':
             $objDeliv->rankDown($_POST['deliv_id']);
             $this->objDisplay->reload();
             // PRG pattern
             break;
         default:
             break;
     }
     $this->arrDelivList = $objDeliv->getList();
 }
 /**
  * Page を初期化する.
  *
  * @return void
  */
 public function init()
 {
     parent::init();
     $this->tpl_title = '入力内容のご確認';
     $masterData = new SC_DB_MasterData_Ex();
     $this->arrPref = $masterData->getMasterData('mtb_pref');
     $this->arrCountry = $masterData->getMasterData('mtb_country');
     $this->arrSex = $masterData->getMasterData('mtb_sex');
     $this->arrJob = $masterData->getMasterData('mtb_job');
     $this->arrMAILMAGATYPE = $masterData->getMasterData('mtb_mail_magazine_type');
     $this->arrReminder = $masterData->getMasterData('mtb_reminder');
     $this->arrDeliv = SC_Helper_Delivery_Ex::getIDValueList('service_name');
     $this->httpCacheControl('nocache');
 }
 /**
 * カートの内容を計算する.
 *
 * カートの内容を計算し, 下記のキーを保持する連想配列を返す.
 *
 * - tax: 税額
 * - subtotal: カート内商品の小計
 * - deliv_fee: カート内商品の合計送料
 * - total: 合計金額
 * - payment_total: お支払い合計
 * - add_point: 加算ポイント
 *
 * @param integer       $productTypeId 商品種別ID
 * @param SC_Customer   $objCustomer   ログイン中の SC_Customer インスタンス
 * @param integer       $use_point     今回使用ポイント
 * @param integer|array $deliv_pref    配送先都道府県ID.
                                    複数に配送する場合は都道府県IDの配列
 * @param  integer $charge           手数料
 * @param  integer $discount         値引き
 * @param  integer $deliv_id         配送業者ID
 * @param  integer $order_pref       注文者の都道府県ID
 * @param  integer $order_country_id 注文者の国
 * @return array   カートの計算結果の配列
 */
 public function calculate($productTypeId, &$objCustomer, $use_point = 0, $deliv_pref = '', $charge = 0, $discount = 0, $deliv_id = 0, $order_pref = 0, $order_country_id = 0)
 {
     $results = array();
     $total_point = $this->getAllProductsPoint($productTypeId);
     // MEMO: 税金計算は注文者の住所基準
     $results['tax'] = $this->getAllProductsTax($productTypeId, $order_pref, $order_country_id);
     $results['subtotal'] = $this->getAllProductsTotal($productTypeId, $order_pref, $order_country_id);
     $results['deliv_fee'] = 0;
     // 商品ごとの送料を加算
     if (OPTION_PRODUCT_DELIV_FEE == 1) {
         $cartItems = $this->getCartList($productTypeId);
         foreach ($cartItems as $arrItem) {
             $results['deliv_fee'] += $arrItem['productsClass']['deliv_fee'] * $arrItem['quantity'];
         }
     }
     // 配送業者の送料を加算
     if (OPTION_DELIV_FEE == 1 && !SC_Utils_Ex::isBlank($deliv_pref) && !SC_Utils_Ex::isBlank($deliv_id)) {
         $results['deliv_fee'] += SC_Helper_Delivery_Ex::getDelivFee($deliv_pref, $deliv_id);
     }
     // 送料無料チェック
     if ($this->isDelivFree($productTypeId)) {
         $results['deliv_fee'] = 0;
     }
     // 合計を計算
     $results['total'] = $results['subtotal'];
     $results['total'] += $results['deliv_fee'];
     $results['total'] += $charge;
     $results['total'] -= $discount;
     // お支払い合計
     $results['payment_total'] = $results['total'] - $use_point * POINT_VALUE;
     // 加算ポイントの計算
     if (USE_POINT !== false) {
         $results['add_point'] = SC_Helper_DB_Ex::sfGetAddPoint($total_point, $use_point);
         if ($objCustomer != '') {
             // 誕生日月であった場合
             if ($objCustomer->isBirthMonth()) {
                 $results['birth_point'] = BIRTH_MONTH_POINT;
                 $results['add_point'] += $results['birth_point'];
             }
         }
         if ($results['add_point'] < 0) {
             $results['add_point'] = 0;
         }
     }
     return $results;
 }
 /**
  * Page のアクション.
  *
  * @return void
  */
 public function action()
 {
     $objPurchase = new SC_Helper_Purchase_Ex();
     $objFormParam = new SC_FormParam_Ex();
     // パラメータ情報の初期化
     $this->lfInitParam($objFormParam);
     $objFormParam->setParam($_REQUEST);
     $objFormParam->convParam();
     $order_id = $objFormParam->getValue('order_id');
     // DBから受注情報を読み込む
     $this->setOrderToFormParam($objFormParam, $order_id);
     $this->arrForm = $objFormParam->getFormParamList();
     $this->arrAllShipping = $objFormParam->getSwapArray(array_merge($this->arrShippingKeys, $this->arrShipmentItemKeys));
     $this->tpl_shipping_quantity = count($this->arrAllShipping);
     $this->arrDelivTime = SC_Helper_Delivery_Ex::getDelivTime($objFormParam->getValue('deliv_id'));
     $this->arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
     $this->setTemplate($this->tpl_mainpage);
 }
 /**
  * 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
  *
  * エラー発生時は負数を返す。
  */
 public 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;
     }
     // 生年月日の調整
     $arrValues['order_birth'] = SC_Utils_Ex::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 = SC_Helper_Delivery_Ex::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'] = SC_Utils_Ex::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 (!SC_Utils_Ex::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;
 }
 public function lfCheckError(&$objFormParam)
 {
     // 入力データを渡す。
     $arrRet = $objFormParam->getHashArray();
     $objErr = new SC_CheckError_Ex($arrRet);
     $objErr->arrErr = $objFormParam->checkError();
     if (!isset($objErr->arrErr['name'])) {
         // 既存チェック
         $objDelivery = new SC_Helper_Delivery_Ex();
         if ($objDelivery->checkExist($arrRet)) {
             $objErr->arrErr['service_name'] = '※ 同じ名称の組み合わせは登録できません。<br>';
         }
     }
     return $objErr->arrErr;
 }
 /**
  * 配送業者IDから, 支払い方法, お届け時間の配列を取得する.
  *
  * 結果の連想配列の添字の値は以下の通り
  * - 'arrDelivTime' - お届け時間の配列
  * - 'arrPayment' - 支払い方法の配列
  * - 'img_show' - 支払い方法の画像の有無
  *
  * @param  SC_CartSession $objCartSess SC_CartSession インスタンス
  * @param  integer        $deliv_id    配送業者ID
  * @return array          支払い方法, お届け時間を格納した配列
  */
 public function getSelectedDeliv(&$objCartSess, $deliv_id)
 {
     $arrResults = array();
     if (strval($deliv_id) === strval(intval($deliv_id))) {
         $arrResults['arrDelivTime'] = SC_Helper_Delivery_Ex::getDelivTime($deliv_id);
         $total = $objCartSess->getAllProductsTotal($objCartSess->getKey());
         $payments_deliv = SC_Helper_Delivery_Ex::getPayments($deliv_id);
         $objPayment = new SC_Helper_Payment_Ex();
         $payments_total = $objPayment->getByPrice($total);
         $arrPayment = array();
         foreach ($payments_total as $payment) {
             if (in_array($payment['payment_id'], $payments_deliv)) {
                 $arrPayment[] = $payment;
             }
         }
         $arrResults['arrPayment'] = $arrPayment;
         $arrResults['img_show'] = $this->hasPaymentImage($arrResults['arrPayment']);
     }
     return $arrResults;
 }