Index: branches/version-2_13-dev/data/class/SC_CartSession.php
===================================================================
--- branches/version-2_13-dev/data/class/SC_CartSession.php	(revision 22960)
+++ branches/version-2_13-dev/data/class/SC_CartSession.php	(revision 22975)
@@ -110,31 +110,4 @@
     }
 
-    /**
-     * 商品ごとの合計価格
-     * XXX 実際には、「商品」ではなく、「カートの明細行(≒商品規格)」のような気がします。
-     *
-     * @param integer $id
-     * @return string 商品ごとの合計価格(税込み)
-     * @deprecated SC_CartSession::getCartList() を使用してください
-     */
-    function getProductTotal($id, $productTypeId)
-    {
-        $max = $this->getMax($productTypeId);
-        for ($i = 0; $i <= $max; $i++) {
-            if (isset($this->cartSession[$productTypeId][$i]['id'])
-                && $this->cartSession[$productTypeId][$i]['id'] == $id
-            ) {
-                // 税込み合計
-                $price = $this->cartSession[$productTypeId][$i]['price'];
-                $quantity = $this->cartSession[$productTypeId][$i]['quantity'];
-                $incTax = SC_Helper_TaxRule_Ex::sfCalcIncTax($price, 0, $id[0]);
-                $total = $incTax * $quantity;
-                return $total;
-            }
-        }
-
-        return 0;
-    }
-
     // 値のセット
     function setProductValue($id, $key, $val, $productTypeId)
@@ -180,5 +153,5 @@
 
     // 全商品の合計価格
-    function getAllProductsTotal($productTypeId)
+    function getAllProductsTotal($productTypeId, $pref_id = 0, $country_id = 0)
     {
         // 税込み合計
@@ -196,16 +169,16 @@
             }
             $quantity = $this->cartSession[$productTypeId][$i]['quantity'];
-
             $incTax = SC_Helper_TaxRule_Ex::sfCalcIncTax($price,
                 $this->cartSession[$productTypeId][$i]['productsClass']['product_id'],
-                $this->cartSession[$productTypeId][$i]['id'][0]);
+                $this->cartSession[$productTypeId][$i]['id'][0],
+                $pref_id, $country_id);
+
             $total+= ($incTax * $quantity);
         }
-
         return $total;
     }
 
     // 全商品の合計税金
-    function getAllProductsTax($productTypeId)
+    function getAllProductsTax($productTypeId, $pref_id = 0, $country_id = 0)
     {
         // 税合計
@@ -217,5 +190,7 @@
             $tax = SC_Helper_TaxRule_Ex::sfTax($price,
                 $this->cartSession[$productTypeId][$i]['productsClass']['product_id'],
-                $this->cartSession[$productTypeId][$i]['id'][0]);
+                $this->cartSession[$productTypeId][$i]['id'][0],
+                $pref_id, $country_id);
+
             $total+= ($tax * $quantity);
         }
@@ -362,4 +337,6 @@
      * @param integer $key 
      * @return void
+     *
+     * MEMO: せっかく一回だけ読み込みにされてますが、税率対応の関係でちょっと保留
      */
     function setCartSession4getCartList($productTypeId, $key)
@@ -391,10 +368,14 @@
      *
      * @param integer $productTypeId 商品種別ID
+     * @param integer $pref_id 税金計算用注文者都道府県ID
+     * @param integer $country_id 税金計算用注文者国ID
      * @return array カート内商品一覧の配列
      */
-    function getCartList($productTypeId)
-    {
+    function getCartList($productTypeId, $pref_id = 0, $country_id = 0)
+    {
+        $objProduct = new SC_Product_Ex();
         $max = $this->getMax($productTypeId);
         $arrRet = array();
+/*
 
         $const_name = '_CALLED_SC_CARTSESSION_GETCARTLIST_' . $productTypeId;
@@ -406,13 +387,43 @@
         }
 
+*/
         for ($i = 0; $i <= $max; $i++) {
             if (isset($this->cartSession[$productTypeId][$i]['cart_no'])
                 && $this->cartSession[$productTypeId][$i]['cart_no'] != '') {
+
                 // 商品情報は常に取得
-
+                // TODO: 同一インスタンス内では1回のみ呼ぶようにしたい
+                // TODO: ここの商品の合計処理は getAllProductsTotalや getAllProductsTaxとで類似重複なので統一出来そう
+/*
                 // 同一セッション内では初回のみDB参照するようにしている
                 if (!$is_first) {
                     $this->setCartSession4getCartList($productTypeId, $i);
                 }
+*/
+
+                $this->cartSession[$productTypeId][$i]['productsClass']
+                    =& $objProduct->getDetailAndProductsClass($this->cartSession[$productTypeId][$i]['id']);
+
+                $price = $this->cartSession[$productTypeId][$i]['productsClass']['price02'];
+                $this->cartSession[$productTypeId][$i]['price'] = $price;
+
+                $this->cartSession[$productTypeId][$i]['point_rate']
+                    = $this->cartSession[$productTypeId][$i]['productsClass']['point_rate'];
+
+                $quantity = $this->cartSession[$productTypeId][$i]['quantity'];
+
+                $arrTaxRule = SC_Helper_TaxRule_Ex::getTaxRule(
+                                    $this->cartSession[$productTypeId][$i]['productsClass']['product_id'],
+                                    $this->cartSession[$productTypeId][$i]['id'][0],
+                                    $pref_id,
+                                    $country_id);
+                $incTax = $price + SC_Helper_TaxRule_Ex::calcTax($price, $arrTaxRule['tax_rate'], $arrTaxRule['tax_rule'], $arrTaxRule['tax_adjust']);
+
+                $total = $incTax * $quantity;
+                $this->cartSession[$productTypeId][$i]['price_inctax'] = $incTax;
+                $this->cartSession[$productTypeId][$i]['total_inctax'] = $total;
+                $this->cartSession[$productTypeId][$i]['tax_rate'] = $arrTaxRule['tax_rate'];
+                $this->cartSession[$productTypeId][$i]['tax_rule'] = $arrTaxRule['tax_rule'];
+                $this->cartSession[$productTypeId][$i]['tax_adjust'] = $arrTaxRule['tax_adjust'];
 
                 $arrRet[] = $this->cartSession[$productTypeId][$i];
@@ -682,18 +693,19 @@
      * @param integer $discount 値引き
      * @param integer $deliv_id 配送業者ID
+     * @param integer $order_pref 注文者の都道府県ID
+     * @param integer $order_country_id 注文者の国
      * @return array カートの計算結果の配列
      */
     function calculate($productTypeId, &$objCustomer, $use_point = 0,
-        $deliv_pref = '', $charge = 0, $discount = 0, $deliv_id = 0
+        $deliv_pref = '', $charge = 0, $discount = 0, $deliv_id = 0,
+        $order_pref = 0, $order_country_id = 0
     ) {
+
         $results = array();
         $total_point = $this->getAllProductsPoint($productTypeId);
-        $results['tax'] = $this->getAllProductsTax($productTypeId);
-        $results['subtotal'] = $this->getAllProductsTotal($productTypeId);
+        // MEMO: 税金計算は注文者の住所基準
+        $results['tax'] = $this->getAllProductsTax($productTypeId, $order_pref, $order_country_id);
+        $results['subtotal'] = $this->getAllProductsTotal($productTypeId, $oder_pref, $order_country_id);
         $results['deliv_fee'] = 0;
-
-        $arrTaxInfo = SC_Helper_TaxRule_Ex::getTaxRule();
-        $results['order_tax_rate'] = $arrTaxInfo['tax_rate'];
-        $results['order_tax_rule'] = $arrTaxInfo['calc_rule'];
 
         // 商品ごとの送料を加算
