<?php
/**
 * @copyright ONE/DEPO Project
 * @license   PHP License 3.01 <http://www.php.net/license/3_01.txt>
 */

/**
 * データインポート
 *
 * @package     dataimport
 * @author      netnee T.Ototgawa <tomokauzu.otogawa@netnee.jp>
 * @access      public
 */
class Onedepo_Logic_Dataimport2 {

    var $dataimport;
    var $dbaccess;
    var $db_name;



    function moveImages()
    {
        foreach (glob(IMAGE_WORKDIR ."/*", GLOB_NOSORT) as $filename) {
            @rename($filename, IMAGE_DIR."/1/". basename($filename));
        }
    }

    function removeImages()
    {
        foreach (glob(IMAGE_WORKDIR ."/*", GLOB_NOSORT) as $filename) {
            @unlink($filename);
        }
    }

    function moveImagesAll($file)
    {
        $svdir = IMPORTDIR_SAVED ."/". substr($file, 0, -4);
        mkdir($svdir, 0777);
        chmod($svdir, 0777);
        foreach (glob(IMPORTDIR_IMAGES ."/*", GLOB_NOSORT) as $filename) {
            @rename($filename, $svdir."/". basename($filename));
        }
    }

    function removeImagesAll()
    {
        foreach (glob(IMPORTDIR_IMAGES ."/*", GLOB_NOSORT) as $filename) {
            unlink($filename);
        }
    }

    /**
     * 今までにインポートしたupdusrnm取得。
     *
     * @access  public
     */
    function getUser($to, $from)
    {
        $params = array();
        $log =& LogFactory::getLog();

        $db = $this->dbaccess->doConnect();
        $db->setFetchMode(DB_FETCHMODE_ASSOC);

        //$params = array($to, $from);

        $basic_sql  = "SELECT updusrnm, count(updusrnm) AS count FROM t_item_basic_attr";

        $where  = " WHERE updusrnm LIKE '-imp-%' ";
        $where .= " GROUP BY updusrnm ";
        $where .= " ORDER BY updusrnm DESC";

        $cnt_sql = "SELECT count(sub) FROM ( SELECT updusrnm FROM t_item_basic_attr " . $where . " ) as sub";
        $basic_sql .= $where . " LIMIT ". $to  ." OFFSET ". $from;

        $data = $db->getAll($basic_sql, $params);
        if (DB::isError($data)) {
            $log->debug("error ".$data->userinfo, "Onedepo_Logic_Dataimport#getUser");
            die($data->getMessage());
        }

        $cnt = $db->getOne($cnt_sql);
        if (DB::isError($cnt)) {
            $log->debug("error ".$data->userinfo, "Onedepo_Logic_Dataimport#getUser");
            die($data->getMessage());
        }
        $data += array("recordcount" => $cnt);

        $this->dbaccess->doClose($db);

        return $data;
    }

    /**
     * updusrnmより、削除対象件数取得
     *
     * @access  public
     */
    function getDeleteCount($updusrnm)
    {
        $params = array();
        $log =& LogFactory::getLog();

        $db = $this->dbaccess->doConnect();
        $db->setFetchMode(DB_FETCHMODE_ASSOC);

        $sql  = "SELECT count(*) as deletecount FROM t_item_basic_attr";
        $sql .= " WHERE updusrnm=?";

        $data = $db->getOne($sql, array($updusrnm));
        if (DB::isError($data)) {
            $log->debug("error ".$data->userinfo, "Onedepo_Logic_Dataimport#getDeleteCount");
            die($data->getMessage());
        }

        $this->dbaccess->doClose($db);

        return $data;
    }

    /**
     * updusrnmより、削除対象商品C取得
     *
     * @access  public
     */
    function getDeleteItemcd($updusrnm)
    {
        $params = array();
        $log =& LogFactory::getLog();

        $db = $this->dbaccess->doConnect();
        $db->setFetchMode(DB_FETCHMODE_ASSOC);

        $sql  = "SELECT itemcd FROM t_item_basic_attr";
        $sql .= " WHERE updusrnm=?";

        $data = $db->getAll($sql, array($updusrnm));
        if (DB::isError($data)) {
            $log->debug("error ".$data->userinfo, "Onedepo_Logic_Dataimport#getDeleteItemcd");
            die($data->getMessage());
        }

        $this->dbaccess->doClose($db);

        return $data;
    }

    /**
     * 今までにインポートしたデータ
     * itemcdで指定したものを削除。
     * @access  public
     */
    function delImport($itemcd)
    {
        $log =& LogFactory::getLog();
        $func_name = "Onedepo_Logic_Dataimport#delImport";

        $db = $this->dbaccess->doConnect();
        $db->autoCommit();
        $params = array($itemcd);

        $sql  = "SELECT * FROM f_import_delete_main(?);";

        $res = $db->getRow($sql, $params);

        if (DB::isError($res) || $res[0] < 0) {
            $log->debug("rollback", $func_name);
            $db->rollback();
            $this->dbaccess->doClose($db);
            return false;
        }
        $log->debug("commit", $func_name);

        $db->commit();
        $this->dbaccess->doClose($db);
        return true;
    }

    // csv配列にの文字コードをUTF-8変更
    function setCsvArrayEnc($data)
    {
        foreach($data as &$val) {
            foreach($val as $key => $column) {
                if(is_array($column) ) {
                    foreach($column as $key2 => $col) {
                        $val[$key][$key2] = mb_convert_encoding(trim($col), "UTF-8", "sjis-win,SJIS,EUC-JP,UTF-8,ASCII,JIS");
                        if( empty($col) ) $val[$key][$key2] = NULL;
                    }
                } else {
                    $val[$key] = mb_convert_encoding(trim($column), "UTF-8", "sjis-win,SJIS,EUC-JP,UTF-8,ASCII,JIS");
                    if( empty($column) ) $val[$key] = NULL;
                }
            }
        }
        return $data;
    }

    /**
     * デフォルトの値セット＆エンコード
     * int varchar その他のみ。必要があれば追加。
     *
     * @param   $value
     *          $type  変数の型
     * @access  public
     */
    function setValueAndEnc ($value, $type="")
    {
        if (empty($value))
            return NULL;
        switch ($type)
        {
            case 'date':
                $value = str_replace("/", "-", $value);
            break;

        }
        $value = mb_convert_encoding(trim($value), "UTF-8", "sjis-win,SJIS,EUC-JP,UTF-8,ASCII,JIS");
        return $value;
    }


    /**
     * 値のチェック
     *
     * @param   $value 値
     *          $type  変数の型
     *          $empty １なら空白許可
     * @access  public
     */
    function checkValue ($value, $type="", $empty)
    {
        //１なら空白許可
        if ($empty == 1 AND $value == '')
            return 1;
        
        switch ($type)
        {
            case 'date':
                if(preg_match("/^\d{4}[\-\/]\d{1,2}[\-\/]\d{1,2}$/", $value))
                    return 1;
            
            case 'string':
                if(is_string($value))
                    return 1;
            
            case 'int':
                if(preg_match("/^\d+$/", $value))
                    return 1;
            
            default:
                return 0;
                break;
        }
        return 0;
    }

    /**
     * 商品データインポート
     *
     * @param   $data  csvの2次元配列データ
     *          $filenm  csvのファイル名
     *          $filearr csvファイル
     *          $datediv データ区分(必要なし?)
     *
     * @access  public
     */
    function doImport_item($data, $filenm, $filearr, $datediv)
    {
        $start_date = date('Y/m/d H:i:s'); // 処理開始日時
        
        $where = array();
        $params = array();

        ob_flush();
        flush();

        $log =& LogFactory::getLog();

        $logfile = IMPORTDIR_LOGS ."/". $filenm;
        $logfp = @fopen($logfile, "w");

        $savefile = IMPORTDIR_SAVED ."/". $filenm;
        $svfp = @fopen($savefile, "w");
        $updateusrnm = "-imp-". substr($filenm,0, -4);

        $norow = 0;
        $resultmsg = "";
        $throughmsg = array();
        $okrow = 0;
        $error = false;

        $sql = "SELECT * FROM f_import_item_main(NULL,?,?,?,?,?,
                                                      ?,?,?,?,?,
                                                      ?,?,?,?);";
        $db = $this->dbaccess->doConnect();
        $db->autoCommit(false);
        //$db->query('BEGIN;');

        //文字コード変更
        $data = $this->setCsvArrayEnc($data);
        
        //データインポート(1行づつ実行)
        foreach($data as $row => $rec) {
            // 追加
            if($rec['code']=='品名C') { // カラム説明の行処理しない
                
                //エラーcsvに書き込み
                $datastr = mb_convert_encoding("行,エラー,実行日時,","SJIS","UTF-8");
                $datastr .= trim($filearr[$key]) ."\n";
                @fwrite($logfp, $datastr);
                
                //成功csvに書き込み
                $datastr = trim($filearr[$key]) ."\n";
                @fwrite($svfp, $datastr);
                
                continue;
            }
            
            $logmsg = '';
            $check = false;
            
            //if ($rec['itemnm'] != mb_convert_encoding($rec['itemnm'], 'UTF-8', 'UTF-8')) $check = true;
            if ($rec['itemnm'] != mb_convert_encoding($rec['itemnm'], 'UTF-8', 'UTF-8')) $check = true;
            
            if($check) {
                $resultmsg[] = $logmsg = "文字コードが不正です。";
                // ログ
                $datastr =  $key +1 .",". mb_convert_encoding($logmsg,"SJIS","UTF-8") .
                    ",". date('Y/m/d H:i:s') .",". trim($filearr[$key]) ."\n";

                @fwrite($logfp, $datastr);
                $stop = true;
                break;
            }
            
            // 品名チェック
            if(!$this->checkValue($rec["itemnm"], 'string', 0)) {
                $throughmsg[] = $row +1 ."行目 品名の値が不正です。";
                continue;
            }
            // 品名かなチェック
            if(!$this->checkValue($rec["itemnmkana"], 'string', 0)) {
                $throughmsg[] = $row +1 ."行目 品名かなの値が不正です。";
                continue;
            }
            // 商品説明チェック
            if(!$this->checkValue($rec["itemexp"], 'string', 0)) {
                $throughmsg[] = $row +1 ."行目 商品説明の値が不正です。";
                continue;
            }
            // 公開日チェック
            if(!$this->checkValue($rec["releasedate"], 'date', 0)) {
                $throughmsg[] = $row +1 ."行目 公開日の値が不正です。";
                continue;
            }
            // お店のコメントチェック
            if(!$this->checkValue($rec["web_comment"], 'string', 0)) {
                $throughmsg[] = $row +1 ."行目 お店のコメントの値が不正です。";
                continue;
            }
/*****
            // バリエーション チェック
            if(!$this->checkValue($rec["variationnm"], 'string', 0)) {
                $throughmsg[] = $row +1 ."行目 バリエーションの値が不正です。";
                continue;
            }
*****/
            // 品番 チェック
            if(!$this->checkValue($rec["makeritemcd"], 'string', 0)) {
                $throughmsg[] = $row +1 ."行目 品番の値が不正です。";
                continue;
            }
/*****
             // JANコード チェック
            if(!$this->checkValue($rec["jancd"], 'int', 0)) {
                $throughmsg[] = $row +1 ."行目 JANコードの値が不正です。";
                continue;
            // JANコード 桁チェック
            } else if(! (strlen($rec["jancd"]) == 13) ) {
                $throughmsg[] = $row +1 ."行目 JANコードは13桁にしてください。";
                continue;
            }
 *****/
            // 発売日チェック
            if(!$this->checkValue($rec["salestartdate"], 'date', 1)) {
                $throughmsg[] = $row +1 ."行目 発売日の値が不正です。";
                continue;
            }
/*****
            // 予約終了日チェック
            if(!$this->checkValue($rec["orderclosedate"], 'date', 1)) {
                $throughmsg[] = $row +1 ."行目 予約終了日の値が不正です。";
                continue;
            }
*****/
/*****
            // 構成コメント チェック
            if(!$this->checkValue($rec["strict_comment"], 'string', 0)) {
                $throughmsg[] = $row +1 ."行目 構成コメントの値が不正です。";
                continue;
            }
 *****/
            
            // 未入力ジャンルにダミー
            foreach ($rec["genrecd"] as &$cd) { if(!$cd) $cd = 0; }
            foreach ($rec["genrenm"] as &$nm) { if(!$nm) $nm = "NULL"; }
            // ジャンル配列化
            $genrecd = sprintf('{%s,%s,%s,%s,%s}', $rec["genrecd"][0],$rec["genrecd"][1],$rec["genrecd"][2],$rec["genrecd"][3],$rec["genrecd"][4]);
            $genrenm = sprintf('{%s,%s,%s,%s,%s}', $rec["genrenm"][0],$rec["genrenm"][1],$rec["genrenm"][2],$rec["genrenm"][3],$rec["genrenm"][4]);
            
            // 品番(大文字化)
            $rec["makeritemcd"] = strtoupper($rec["makeritemcd"]);
            
            $params = array(
                //基本
                $rec["itemnm"],         // 商品名
                $rec["itemnmkana"],     // 商品名よみ
                $rec["itemexp"],        // 商品説明
                
                $rec["releasedate"],    // 公開日
                $rec["web_comment"],    // コメント
                
                $rec["variationnm"],    // バリエーション
                $rec["makeritemcd"],    // 品番
                $rec["jancd"],
                $rec["salestartdate"],  // 発売日
                $rec["orderclosedate"], // 予約終了日
                $rec["strict_comment"], // コメント
                
                $genrecd,
                $genrenm,
                
                $updateusrnm // username (-impxxxxxx)
            );

            // レコード追加処理
            $commit = false;
            $db->query('BEGIN;');
            $res  = $db->getRow($sql, $params, DB_FETCHMODE_ASSOC);
            if (DB::isError($res)) {
                $log->error("db sintax error [userinfo] = ". $res->userinfo, "Onedepo_Logic_Dataimport2#doImport_item");
                
                $stop = true;
                
                $resultmsg[] = $logmsg = "DBエラー " . $res->userinfo ;

            } else if($res["errcd"] == -30) {
                //複数のエラー
                $errmsg = rtrim($res['errmsg'], ',');
                $errmsg = explode(',', $errmsg);
                foreach($errmsg as $var) {
                    $throughmsg[] = $logmsg = $row +1 ."行目 ".$var;
                }
                $log->info("import error code=". $res["errcd"] . "error msg=". $logmsg, "Onedepo_Logic_Dataimport2#doImport_item");
            
            } else if($res["errcd"] == -20) {
                // 単一のエラー
                $throughmsg[] = $logmsg = $row +1 ."行目 ".$res["errmsg"];
                $log->info("import error code=". $res["errcd"] . "error msg=". $res["errmsg"], "Onedepo_Logic_Dataimport2#doImport_item");
            } else if($res["errcd"] < 0) {
                // その他のエラー インポート中断
                $log->info("import error code=". $res["errcd"] . "error msg=". $res["errmsg"], "Onedepo_Logic_Dataimport2#doImport_item");
                $stop = true;
                $resultmsg[] = $logmsg = $res["errmsg"];
                
            } else { //成功

                $commit = true;
                
                // 成功したレコードログ保存
                $datastr = trim($filearr[$key]) ."\n";
                @fwrite($svfp, $datastr);
            }
            
            if($commit) {

                $newitemcd = $res["code"];
                // -------------------------------------
                // 画像の登録処理
                $imglarge = $rec["image_l"];
                $imgmedium = $rec["image_m"];
                $imgsmall = $rec["image_s"];
                // サイズ小
                if (!empty($imgsmall)) {
                    $oldfile_small  = IMPORTDIR_IMAGES ."/". $imgsmall;
                    // 品目Cと紐付けたファイル名でrename
                    $newfile_small  = IMAGE_DIR ."/1/". $newitemcd ."S.jpg";

                    $error2 = false;
                    clearstatcache();
                    if (is_file($oldfile_small)) {

                        $sql2  = "select * from f_image_update(1,1,?,0,'S',0,?,NULL);";
                        $params2 = array($newitemcd, $updateusrnm);

                        $res2 = $db->getRow($sql2, $params2, DB_FETCHMODE_ASSOC);
                        if (DB::isError($res2) || $res2["errcd"] < 0) {
                            if (DB::isError($res2)) {
                                $log->info("db sintax error [userinfo] = ". $res2->userinfo, "Onedepo_Logic_Dataimport#doImport");
                                if (LOG_LEVEL <= LEVEL_DEBUG) $resultmsg[] = $msg = "DBエラー ". $res2->userinfo;
                            } else {
                                $log->info("import error(imgsmall) code=". $res2["errcd"], "Onedepo_Logic_Dataimport#doImport");
                            }
                            $error2 = true;
                        }

                        if (!$error2) {
                            @copy($oldfile_small,  $newfile_small);
                        }
                    } else {
                        $error2 = true;
                        $resultmsg[] = $msg = $row. "行目 画像小が見つかりません ". $oldfile_small;
                        $log->info("file not found ". $oldfile_small, "Onedepo_Logic_Dataimport#doImport");
                    }
                }
                // サイズ中
                if (!empty($imgmedium)) {
                    $oldfile_medium = IMPORTDIR_IMAGES ."/". $imgmedium;
                    // 品目Cと紐付けたファイル名でrename
                    $newfile_medium = IMAGE_DIR ."/1/". $newitemcd ."M.jpg";

                    $error2 = false;
                    clearstatcache();
                    if (is_file($oldfile_medium)) {

                        $sql2  = "select * from f_image_update(1,1,?,0,'M',0,?,NULL);";
                        $params2 = array($newitemcd, $updateusrnm);

                        $res2 = $db->getRow($sql2, $params2, DB_FETCHMODE_ASSOC);
                        if (DB::isError($res2) || $res2["errcd"] < 0) {
                            if (DB::isError($res2)) {
                                $log->info("db sintax error [userinfo] = ". $res2->userinfo, "Onedepo_Logic_Dataimport#doImport");
                                if (LOG_LEVEL <= LEVEL_DEBUG) $resultmsg[] = $msg = "DBエラー ". $res2->userinfo;
                            } else {
                                $log->info("import error(imgmedium) code=". $res2["errcd"], "Onedepo_Logic_Dataimport#doImport");
                            }
                            $error2 = true;
                        }

                        if (!$error2) {
                            @copy($oldfile_medium,  $newfile_medium);
                        }
                    } else {
                        $error2 = true;
                        $resultmsg[] = $msg = $row. "行目 画像中が見つかりません ". $oldfile_medium;
                        $log->info("file not found ". $oldfile_medium, "Onedepo_Logic_Dataimport#doImport");
                    }
                }
                // サイズ大
                if (!empty($imglarge)) {
                    $oldfile_large  = IMPORTDIR_IMAGES ."/". $imglarge;
                    // 品目Cと紐付けたファイル名でrename
                    $newfile_large  = IMAGE_DIR ."/1/". $newitemcd ."L.jpg";

                    $error2 = false;
                    clearstatcache();
                    if (is_file($oldfile_large)) {

                        $sql2  = "select * from f_image_update(1,1,?,0,'L',0,?,NULL);";
                        $params2 = array($newitemcd, $updateusrnm);

                        $res2 = $db->getRow($sql2, $params2, DB_FETCHMODE_ASSOC);
                        if (DB::isError($res2) || $res2["errcd"] < 0) {
                            if (DB::isError($res2)) {
                                $log->info("db sintax error [userinfo] = ". $res2->userinfo, "Onedepo_Logic_Dataimport#doImport");
                                if (LOG_LEVEL <= LEVEL_DEBUG) $resultmsg[] = $msg = "DBエラー ". $res2->userinfo;
                            } else {
                                $log->info("import error(imglarge) code=". $res2["errcd"], "Onedepo_Logic_Dataimport#doImport");
                            }
                            $error2 = true;
                        }

                        if (!$error2) {
                            @copy($oldfile_large,  $newfile_large);
                        }
                    } else {
                        $error2 = true;
                        $resultmsg[] = $msg = $row. "行目 画像大が見つかりません ". $oldfile_large;
                        $log->info("file not found ". $oldfile_large, "Onedepo_Logic_Dataimport#doImport");
                    }
                }
                // -------------------------------------

                $log->debug("commit", "Onedepo_Logic_Dataimport2#doImport_item");
                
                $db->query('COMMIT;');
                $db->commit();
                $okrow++;
            } else {
                $log->debug("rollback", "Onedepo_Logic_Dataimport2#doImport_item");
                $db->query('ROLLBACK;');
                $db->rollback();
                
                // 失敗ログ
                $datastr =  $key +1 .",". mb_convert_encoding($logmsg,"SJIS","UTF-8") .",". date('Y/m/d H:i:s') .",";
                $datastr .= trim($filearr[$key]) ."\n";
                @fwrite($logfp, $datastr);
                
                //インポート中断
                if($stop){
                    $errrow = $row +1;
                    break;
                }
            }
        }
        // -- データインポート(1行づつ実行)
        
        //最終行に処理時間を出力
        $end_date = date('Y/m/d H:i:s'); // 処理終了日時
        $datastr = mb_convert_encoding("処理時間,","SJIS","UTF-8"). $start_date .",". $end_date ."\n";
        @fwrite($logfp, $datastr);
        
        fclose($logfp);
        fclose($svfp);
        @copy($logfile, IMPORTDIR_LOGS ."/dataimport_log.csv");

        if ($stop) { // NG
            //$log->debug("rollback", "Onedepo_Logic_Dataimport2#doImport_item");
            //$db->query('ROLLBACK;');
            //$db->rollback();

            $this->dbaccess->doClose($db);

            return array("errcd"  => 0,
                         "errrow" => $errrow,
                         "errmsg" => $resultmsg,
                         "throughmsg" => $throughmsg);
        } else { // OK
            //$log->debug("commit", "Onedepo_Logic_Dataimport2#doImport_item");
            //$db->query('COMMIT;');
            //$db->commit();

            $this->dbaccess->doClose($db);

            return array("errcd"  => 1,
                         "allrow" => count($data),
                         "okrow"  => $okrow,
                         "throughmsg" => $throughmsg);
        }
    }
}
?>
