Index: /branches/version-2_13_3/data/class/helper/SC_Helper_Category.php
===================================================================
--- /branches/version-2_13_3/data/class/helper/SC_Helper_Category.php	(revision 23546)
+++ /branches/version-2_13_3/data/class/helper/SC_Helper_Category.php	(revision 23649)
@@ -178,5 +178,5 @@
      *
      * @param array $data
-     * @return int|bool
+     * @return void
      */
     public function save($data)
@@ -185,7 +185,5 @@
 
         $category_id = $data['category_id'];
-        // ミリ秒付きの時間文字列を取得. CSVへの対応.
-        // トランザクション内のCURRENT_TIMESTAMPは全てcommit()時の時間に統一されてしまう為.
-        $query = array('update_date' => SC_Utils_Ex::getFormattedDateWithMicroSecond());
+        $query = array('update_date' => 'CURRENT_TIMESTAMP');
         $objQuery->begin();
 
@@ -217,21 +215,19 @@
             $query['category_name'] = $data['category_name'];
             $query['parent_category_id'] = $data['parent_category_id'];
-            $query['create_date'] = $query['update_date'];
+            $query['create_date'] = 'CURRENT_TIMESTAMP';
             $query['creator_id']  = $_SESSION['member_id'];
             $query['rank']        = $rank;
             $query['level']       = $level;
 
-            $result = $objQuery->insert('dtb_category', $query);
+            $objQuery->insert('dtb_category', $query);
         } else {
             // 既存編集
-            $query['category_id'] = $category_id;
             $query['parent_category_id'] = $data['parent_category_id'];
             $query['category_name'] = $data['category_name'];
             $where = 'category_id = ?';
-            $result = $objQuery->update('dtb_category', $query, $where, array($category_id));
+            $objQuery->update('dtb_category', $query, $where, array($category_id));
         }
 
         $objQuery->commit();
-        return ($result) ? $query['category_id'] : FALSE;
     }
 
Index: /branches/version-2_13_3/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php
===================================================================
--- /branches/version-2_13_3/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php	(revision 23605)
+++ /branches/version-2_13_3/data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php	(revision 23649)
@@ -55,21 +55,4 @@
     /** 登録フォームカラム情報 **/
     public $arrFormKeyList;
-    /** @var string メインタイトル */
-    public $tpl_maintitle;
-    /** @var string サブタイトル */
-    public $tpl_subtitle;
-    /** @var string サブテンプレートナンバー */
-    public $tpl_subno;
-
-    /** @var array 許可タグ情報 */
-    private $arrAllowedTag;
-    /** @var int CSV ID */
-    private $csv_id;
-    /** @var  bool */
-    private $tpl_is_format_default;
-    /** @var  bool */
-    private $tpl_is_update;
-    /** @var  int */
-    private $max_upload_csv_size;
 
     /**
@@ -251,5 +234,5 @@
             }
 
-            $category_id = $this->lfRegisterCategory($line_count, $objFormParam);
+            $category_id = $this->lfRegistCategory($objQuery, $line_count, $objFormParam);
             $this->addRowResult($line_count, 'カテゴリID：'.$category_id . ' / カテゴリ名：' . $objFormParam->getValue('category_name'));
         }
@@ -374,12 +357,14 @@
      * FIXME: 登録の実処理自体は、LC_Page_Admin_Products_Categoryと共通化して欲しい。
      *
-     * @param  integer $line 処理中の行数
-     * @param SC_FormParam $objFormParam
+     * @param  SC_Query       $objQuery SC_Queryインスタンス
+     * @param  string|integer $line     処理中の行数
      * @return integer        カテゴリID
      */
-    public function lfRegisterCategory($line, SC_FormParam &$objFormParam)
+    public function lfRegistCategory($objQuery, $line, &$objFormParam)
     {
         // 登録データ対象取得
         $arrList = $objFormParam->getDbArray();
+        // 登録時間を生成(DBのCURRENT_TIMESTAMPだとcommitした際、全て同一の時間になってしまう)
+        $arrList['update_date'] = $this->lfGetDbFormatTimeWithLine($line);
 
         // 登録情報を生成する。
@@ -390,6 +375,28 @@
         $sqlval = $this->lfSetCategoryDefaultData($sqlval);
 
-        $objCategory = new SC_Helper_Category_Ex();
-        $category_id = $objCategory->save($sqlval);
+        if ($sqlval['category_id'] != '') {
+            // 同じidが存在すればupdate存在しなければinsert
+            $where = 'category_id = ?';
+            $category_exists = $objQuery->exists('dtb_category', $where, array($sqlval['category_id']));
+            if ($category_exists) {
+                // UPDATEの実行
+                $where = 'category_id = ?';
+                $objQuery->update('dtb_category', $sqlval, $where, array($sqlval['category_id']));
+            } else {
+                $sqlval['create_date'] = $arrList['update_date'];
+                // 新規登録
+                $category_id = $this->registerCategory($sqlval['parent_category_id'],
+                                        $sqlval['category_name'],
+                                        $_SESSION['member_id'],
+                                        $sqlval['category_id']);
+            }
+            $category_id = $sqlval['category_id'];
+            // TODO: 削除時処理
+        } else {
+            // 新規登録
+            $category_id = $this->registerCategory($sqlval['parent_category_id'],
+                                        $sqlval['category_name'],
+                                        $_SESSION['member_id']);
+        }
 
         return $category_id;
@@ -450,7 +457,5 @@
     public function lfCheckErrorDetail($item, $arrErr)
     {
-        $objCategory = new SC_Helper_Category_Ex();
-        // スタティック変数を初期化
-        $objCategory->getTree(true);
+        $objQuery =& SC_Query_Ex::getSingletonInstance();
         /*
         // カテゴリIDの存在チェック
@@ -463,5 +468,5 @@
             && $item['parent_category_id'] != ''
             && $item['parent_category_id'] != '0'
-            && !$objCategory->get($item['parent_category_id'])
+            && !SC_Helper_DB_Ex::sfIsRecord('dtb_category', 'category_id', array($item['parent_category_id']))
         ) {
             $arrErr['parent_category_id'] = '※ 指定の親カテゴリID(' . $item['parent_category_id'] . ')は、存在しません。';
@@ -479,11 +484,14 @@
             && $item['category_name'] != ''
         ) {
-            $exists = false;
-            $arrBrother = $objCategory->getTreeBranch($item['parent_category_id']);
-            foreach ($arrBrother as $brother) {
-                if ($brother['category_name'] == $item['category_name'] && $brother['category_id'] != $item['category_id']) {
-                    $exists = true;
-                }
-            }
+            $parent_category_id = $item['parent_category_id'];
+            if ($parent_category_id == '') {
+                $parent_category_id = (string) '0';
+            }
+            $where = 'parent_category_id = ? AND category_id <> ? AND category_name = ?';
+            $exists = $objQuery->exists('dtb_category',
+                        $where,
+                        array($parent_category_id,
+                                $item['category_id'],
+                                $item['category_name']));
             if ($exists) {
                 $arrErr['category_name'] = '※ 既に同名のカテゴリが存在します。';
@@ -491,5 +499,6 @@
         }
         // 登録数上限チェック
-        $count = count($objCategory->getList());
+        $where = 'del_flg = 0';
+        $count = $objQuery->count('dtb_category', $where);
         if ($count >= CATEGORY_MAX) {
             $item['category_name'] = '※ カテゴリの登録最大数を超えました。';
@@ -498,7 +507,6 @@
         if (array_search('parent_category_id', $this->arrFormKeyList) !== FALSE
                 and $item['parent_category_id'] != '') {
-            // 階層上限チェック
-            $arrParent = $objCategory->get($item['parent_category_id']);
-            if ($arrParent['level'] >= LEVEL_MAX) {
+            $level = $objQuery->get('level', 'dtb_category', 'category_id = ?', array($parent_category_id));
+            if ($level >= LEVEL_MAX) {
                 $arrErr['parent_category_id'] = '※ ' . LEVEL_MAX . '階層以上の登録はできません。';
             }
@@ -518,3 +526,100 @@
         return $arrErr;
     }
+
+    /**
+     * カテゴリを登録する
+     *
+     * @param integer 親カテゴリID
+     * @param string カテゴリ名
+     * @param integer 作成者のID
+     * @param integer 指定カテゴリID
+     * @return integer カテゴリID
+     */
+    public function registerCategory($parent_category_id, $category_name, $creator_id, $category_id = null)
+    {
+        $objQuery =& SC_Query_Ex::getSingletonInstance();
+
+        $rank = null;
+        if ($parent_category_id == 0) {
+            // ROOT階層で最大のランクを取得する。
+            $where = 'parent_category_id = ?';
+            $rank = $objQuery->max('rank', 'dtb_category', $where, array($parent_category_id)) + 1;
+        } else {
+            // 親のランクを自分のランクとする。
+            $where = 'category_id = ?';
+            $rank = $objQuery->get('rank', 'dtb_category', $where, array($parent_category_id));
+            // 追加レコードのランク以上のレコードを一つあげる。
+            $where = 'rank >= ?';
+            $arrRawSql = array(
+                'rank' => '(rank + 1)',
+            );
+            $objQuery->update('dtb_category', array(), $where, array($rank), $arrRawSql);
+        }
+
+        $where = 'category_id = ?';
+        // 自分のレベルを取得する(親のレベル + 1)
+        $level = $objQuery->get('level', 'dtb_category', $where, array($parent_category_id)) + 1;
+
+        $arrCategory = array();
+        $arrCategory['category_name'] = $category_name;
+        $arrCategory['parent_category_id'] = $parent_category_id;
+        $arrCategory['create_date'] = 'CURRENT_TIMESTAMP';
+        $arrCategory['update_date'] = 'CURRENT_TIMESTAMP';
+        $arrCategory['creator_id']  = $creator_id;
+        $arrCategory['rank']        = $rank;
+        $arrCategory['level']       = $level;
+        //カテゴリIDが指定されていればそれを利用する
+        if (isset($category_id)) {
+            $arrCategory['category_id'] = $category_id;
+            // シーケンスの調整
+            $seq_count = $objQuery->currVal('dtb_category_category_id');
+            if ($seq_count < $arrCategory['category_id']) {
+                $objQuery->setVal('dtb_category_category_id', $arrCategory['category_id'] + 1);
+            }
+        } else {
+            $arrCategory['category_id'] = $objQuery->nextVal('dtb_category_category_id');
+        }
+        $objQuery->insert('dtb_category', $arrCategory);
+
+        return $arrCategory['category_id'];
+    }
+
+    /**
+     * 指定された行番号をmicrotimeに付与してDB保存用の時間を生成する。
+     * トランザクション内のCURRENT_TIMESTAMPは全てcommit()時の時間に統一されてしまう為。
+     *
+     * @param  string $line_no 行番号
+     * @return string $time DB保存用の時間文字列
+     */
+    public function lfGetDbFormatTimeWithLine($line_no = '')
+    {
+        $time = date('Y-m-d H:i:s');
+        // 秒以下を生成
+        if ($line_no != '') {
+            $microtime = sprintf('%06d', $line_no);
+            $time .= ".$microtime";
+        }
+
+        return $time;
+    }
+
+    /**
+     * 指定されたキーと値の有効性のDB確認
+     *
+     * @param  string  $table   テーブル名
+     * @param  string  $keyname キー名
+     * @param  array   $item    入力データ配列
+     * @return boolean true:有効なデータがある false:有効ではない
+     */
+    public function lfIsDbRecord($table, $keyname, $item)
+    {
+        if (array_search($keyname, $this->arrFormKeyList) !== FALSE  //入力対象である
+            && $item[$keyname] != ''   // 空ではない
+            && !SC_Helper_DB_Ex::sfIsRecord($table, $keyname, (array) $item[$keyname]) //DBに存在するか
+        ) {
+            return false;
+        }
+
+        return true;
+    }
 }
