Ignore:
Timestamp:
2009/06/12 21:47:32 (15 years ago)
Author:
Seasoft
Message:

・受注.対応状況を発送済みにするタイミングでポイントを加算、発送済みから外れるタイミングで減算するように改訂。
・受注管理で使用ポイントや加算ポイントが変動した場合、顧客テーブルに反映するように改訂。
・ポイント加算するかの判定を拡張することで、発送済み以外のタイミングにも対応させる試み。

Location:
branches/comu-ver2/data/class
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/comu-ver2/data/class/helper/SC_Helper_DB.php

    r18095 r18100  
    18161816        return SC_Utils_Ex::sfGetAddPoint($totalpoint, $use_point, $CONF['point_rate']); 
    18171817    } 
     1818 
     1819    /** 
     1820     * 受注.対応状況の更新 
     1821     * 
     1822     * ・必ず呼び出し元でトランザクションブロックを開いておくこと。 
     1823     * 
     1824     * @param integer $orderId 注文番号 
     1825     * @param integer|null $newStatus 対応状況 (null=変更無し) 
     1826     * @param integer|null $newAddPoint 加算ポイント (null=変更無し) 
     1827     * @param integer|null $newUsePoint ポイント (null=変更無し) 
     1828     * @return void 
     1829     */ 
     1830    function sfUpdateOrderStatus($orderId, $newStatus = null, $newAddPoint = null, $newUsePoint = null) { 
     1831        $objQuery = new SC_Query(); 
     1832         
     1833        $arrOrderOld = $objQuery->getRow('dtb_order', 'status, add_point, use_point, customer_id', 'order_id = ?', array($orderId)); 
     1834         
     1835        // 対応状況 
     1836        if (is_null($newStatus)) { 
     1837            $newStatus = $arrOrderOld['status']; 
     1838        } 
     1839         
     1840        if (USE_POINT !== false) { 
     1841            $addPoint = 0; 
     1842             
     1843            // 使用ポイント 
     1844            if (!is_null($newUsePoint)) { 
     1845                $addPoint += $arrOrderOld['use_point']; // 変更前のポイントを戻す 
     1846                $addPoint -= $newUsePoint;              // 変更後のポイントを引く 
     1847            } 
     1848             
     1849            // ▼加算ポイント 
     1850            // 変更前の状態が加算対象の場合、 
     1851            if (SC_Utils_Ex::sfIsAddPoint($arrOrderOld['status'])) { 
     1852                $addPoint -= $arrOrderOld['add_point']; 
     1853            } 
     1854             
     1855            // 変更後の状態が加算対象の場合、 
     1856            if (SC_Utils_Ex::sfIsAddPoint($newStatus)) { 
     1857                $addPoint += is_null($newAddPoint) ? $arrOrderOld['add_point'] : $newAddPoint; 
     1858            } 
     1859            // ▲加算ポイント 
     1860             
     1861            if ($addPoint != 0) { 
     1862                // ▼顧客テーブルの更新 
     1863                $sqlval = array(); 
     1864                $where = ''; 
     1865                $arrVal = array(); 
     1866                $arrRawSql = array(); 
     1867                 
     1868                $sqlval['update_date'] = 'Now()'; 
     1869                $arrRawSql['point'] = 'point + ?'; 
     1870                $arrVal[] = $addPoint; 
     1871                $where .= 'customer_id = ?'; 
     1872                $arrVal[] = $arrOrderOld['customer_id']; 
     1873                 
     1874                $objQuery->update('dtb_customer', $sqlval, $where, $arrVal, $arrRawSql); 
     1875                // ▲顧客テーブルの更新 
     1876                 
     1877                // ポイントをマイナスした場合、 
     1878                if ($addPoint < 0) { 
     1879                    $sql = 'SELECT point FROM dtb_customer WHERE customer_id = ?'; 
     1880                    $point = $objQuery->getone($sql, array($arrOrderOld['customer_id'])); 
     1881                    // 変更後のポイントがマイナスの場合、 
     1882                    if ($point < 0) { 
     1883                        // ロールバック 
     1884                        $objQuery->rollback(); 
     1885                        // エラー 
     1886                        SC_Utils_Ex::sfDispSiteError(LACK_POINT); 
     1887                    } 
     1888                } 
     1889            } 
     1890        } 
     1891         
     1892        // ▼受注テーブルの更新 
     1893        $sqlval = array(); 
     1894        if (USE_POINT !== false) { 
     1895            if (!is_null($newAddPoint)) { 
     1896                $sqlval['add_point'] = $newAddPoint; 
     1897            } 
     1898            if (!is_null($newUsePoint)) { 
     1899                $sqlval['use_point'] = $newUsePoint; 
     1900            } 
     1901        } 
     1902        // ステータスが発送済みに変更の場合、発送日を更新 
     1903        if ($arrOrderOld['status'] != ORDER_DELIV && $newStatus == ORDER_DELIV) { 
     1904            $sqlval['commit_date'] = 'Now()'; 
     1905        } 
     1906        $sqlval['status'] = $newStatus; 
     1907        $sqlval['update_date'] = 'Now()'; 
     1908         
     1909        $objQuery->update('dtb_order', $sqlval, 'order_id = ?', array($orderId)); 
     1910        // ▲受注テーブルの更新 
     1911    } 
    18181912} 
    18191913?> 
  • branches/comu-ver2/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php

    r18089 r18100  
    154154            if(count($this->arrErr) == 0) { 
    155155                if ($_POST['mode'] == 'add') { 
    156                 $order_id = $this->lfRegistNewData(); 
    157  
    158                 $this->tpl_order_id = $order_id; 
    159                 $this->tpl_mode = 'edit'; 
    160  
    161                 $arrData['order_id'] = $order_id; 
    162                 $this->objFormParam->setParam($arrData); 
     156                    $order_id = $this->lfRegistNewData(); 
     157 
     158                    $this->tpl_order_id = $order_id; 
     159                    $this->tpl_mode = 'edit'; 
     160 
     161                    $arrData['order_id'] = $order_id; 
     162                    $this->objFormParam->setParam($arrData); 
    163163 
    164164                    $text = "'新規受注を登録しました。'"; 
     
    523523        #} 
    524524    } 
    525     /* DB登録処理 */ 
     525 
     526    /** 
     527     * DB更新処理 
     528     * 
     529     * @param integer $order_id 注文番号 
     530     * @return void 
     531     */ 
    526532    function lfRegistData($order_id) { 
    527533        $objQuery = new SC_Query(); 
     
    530536 
    531537        // 入力データを渡す。 
    532         $arrRet =  $this->objFormParam->getHashArray(); 
    533         foreach($arrRet as $key => $val) { 
     538        $arrRet = $this->objFormParam->getHashArray(); 
     539        foreach ($arrRet as $key => $val) { 
    534540            // 配列は登録しない 
    535             if(!is_array($val)) { 
     541            if (!is_array($val)) { 
    536542                $sqlval[$key] = $val; 
    537543            } 
    538544        } 
     545        $sqlval['update_date'] = 'Now()'; 
    539546 
    540547        unset($sqlval['total_point']); 
    541548        unset($sqlval['point']); 
     549        unset($sqlval['commit_date']); 
    542550 
    543551        $where = "order_id = ?"; 
    544552 
    545         // 受注ステータスの判定 
    546         if ($sqlval['status'] == ODERSTATUS_COMMIT) { 
    547             // 受注テーブルの発送済み日を更新する 
    548             $sqlval['commit_date'] = "Now()"; 
    549         } 
     553        // 受注.対応状況の更新 
     554        SC_Helper_DB_Ex::sfUpdateOrderStatus($order_id, $sqlval['status'], $sqlval['add_point'], $sqlval['use_point']); 
     555        unset($sqlval['status']); 
     556        unset($sqlval['add_point']); 
     557        unset($sqlval['use_point']); 
    550558 
    551559        // 受注テーブルの更新 
     
    553561         
    554562        // 受注テーブルの名称列を更新 
    555         $objDb = new SC_Helper_DB_Ex(); 
    556         $objDb->sfUpdateOrderNameCol($order_id); 
     563        SC_Helper_DB_Ex::sfUpdateOrderNameCol($order_id); 
    557564         
    558565        // 受注詳細データの更新 
     
    561568 
    562569        $max = count($arrDetail); 
    563         for($i = 0; $i < $max; $i++) { 
     570        for ($i = 0; $i < $max; $i++) { 
    564571            $sqlval = array(); 
    565572            $sqlval['order_id'] = $order_id; 
     
    580587    } 
    581588 
    582     /* DB登録処理(追加) */ 
     589    /** 
     590     * DB登録処理 
     591     * 
     592     * @return integer 注文番号 
     593     */ 
    583594    function lfRegistNewData() { 
    584595        $objQuery = new SC_Query(); 
     
    588599        // 入力データを渡す。 
    589600        $arrRet =  $this->objFormParam->getHashArray(); 
    590         foreach($arrRet as $key => $val) { 
     601        foreach ($arrRet as $key => $val) { 
    591602            // 配列は登録しない 
    592             if(!is_array($val)) { 
     603            if (!is_array($val)) { 
    593604                $sqlval[$key] = $val; 
    594605            } 
    595606        } 
    596         $sqlval['create_date'] = "Now()"; 
    597  
    598         // 注文ステータス:指定が無ければ新規受付に設定 
    599         if($sqlval["status"] == ""){ 
    600             $sqlval['status'] = '1'; 
    601         } 
    602  
    603         // customer_id 
    604         if($sqlval["customer_id"] == ""){ 
    605             $sqlval['customer_id'] = '0'; 
    606         } 
    607  
     607 
     608        // 受注テーブルに書き込まない列を除去 
    608609        unset($sqlval['order_id']);  
    609610        unset($sqlval['total_point']); 
    610611        unset($sqlval['point']); 
    611  
    612         $where = "order_id = ?"; 
    613  
    614         // 受注ステータスの判定 
    615         if ($sqlval['status'] == ODERSTATUS_COMMIT) { 
    616             // 受注テーブルの発送済み日を更新する 
    617             $sqlval['commit_date'] = "Now()"; 
    618         } 
     612        unset($sqlval['commit_date']); 
     613 
     614        // ポイントは別登録 
     615        $addPoint = $sqlval['add_point']; 
     616        $usePoint = $sqlval['use_point']; 
     617        $sqlval['add_point'] = 0; 
     618        $sqlval['use_point'] = 0; 
     619 
     620        // 注文ステータス:指定が無ければ新規受付に設定 
     621        if (strlen($sqlval['status']) == 0) { 
     622            $sqlval['status'] = ORDER_NEW; 
     623        } 
     624        // customer_id 
     625        if ($sqlval["customer_id"] == "") { 
     626            $sqlval['customer_id'] = '0'; 
     627        } 
     628 
     629        $sqlval['create_date'] = 'Now()';       // 受注日 
     630        $sqlval['update_date'] = 'Now()';       // 更新日時 
    619631 
    620632        // 受注テーブルの登録 
     
    622634        $order_id = $objQuery->currval('dtb_order', 'order_id');  
    623635 
     636        // 受注.対応状況の更新 
     637        SC_Helper_DB_Ex::sfUpdateOrderStatus($order_id, null, $addPoint, $usePoint); 
     638 
    624639        // 受注テーブルの名称列を更新 
    625         $objDb = new SC_Helper_DB_Ex(); 
    626         $objDb->sfUpdateOrderNameCol($order_id); 
     640        SC_Helper_DB_Ex::sfUpdateOrderNameCol($order_id); 
    627641 
    628642        // 受注詳細データの更新 
    629643        $arrDetail = $this->objFormParam->getSwapArray(array("product_id", "product_code", "product_name", "price", "quantity", "point_rate", "classcategory_id1", "classcategory_id2", "classcategory_name1", "classcategory_name2")); 
    630         $objQuery->delete("dtb_order_detail", $where, array($order_id)); 
     644        $objQuery->delete("dtb_order_detail", 'order_id = ?', array($order_id)); 
    631645 
    632646        $max = count($arrDetail); 
    633         for($i = 0; $i < $max; $i++) { 
     647        for ($i = 0; $i < $max; $i++) { 
    634648            $sqlval = array(); 
    635649            $sqlval['order_id'] = $order_id; 
     
    646660            $objQuery->insert("dtb_order_detail", $sqlval); 
    647661        } 
     662 
    648663        $objQuery->commit(); 
    649664 
  • branches/comu-ver2/data/class/pages/admin/order/LC_Page_Admin_Order_Status.php

    r18099 r18100  
    6464        $objSess = new SC_Session(); 
    6565        $objDb = new SC_Helper_DB_Ex(); 
    66         $objQuery = new SC_Query(); 
    6766 
    6867        // 認証可否の判定 
     
    8281        case 'update': 
    8382            if (!isset($_POST['change_status'])) $_POST['change_status'] = ""; 
    84             if (!empty($_POST['change_status'])) { 
    85                 $this->lfStatusMove($_POST['change_status'], $_POST['move']); 
     83             
     84            switch ($_POST['change_status']) { 
     85                case '': 
     86                    break; 
     87                 
     88                // 削除 
     89                case 'delete': 
     90                    $this->lfDelete($_POST['move']); 
     91                    break; 
     92                 
     93                // 更新 
     94                default: 
     95                    $this->lfStatusMove($_POST['change_status'], $_POST['move']); 
     96                    break; 
    8697            } 
     98             
    8799            //ステータス情報 
    88100            $status = isset($_POST['status']) ? $_POST['status'] : ""; 
     
    151163    } 
    152164 
    153     //ステータス情報の更新(削除) 
    154     function lfStatusMove($status_id, $arrMove){ 
     165    /** 
     166     * ステータス情報の更新 
     167     */ 
     168    function lfStatusMove($statusId, $arrOrderId) { 
    155169        $objQuery = new SC_Query(); 
     170         
     171        if (!isset($arrOrderId) || !is_array($arrOrderId)) { 
     172            return false; 
     173        } 
    156174        $masterData = new SC_DB_MasterData_Ex(); 
    157175        $arrORDERSTATUS = $masterData->getMasterData("mtb_order_status"); 
    158  
    159         $table = 'dtb_order'; 
    160         $where = 'order_id = ?'; 
    161         $arrUpdate = array('update_date' => 'NOW()'); 
    162  
    163         $delflg  = '1'; // 削除フラグ 
    164         $message = '';  // ステータス変更後にポップアップするメッセージの内容 
    165  
    166         if ( $status_id == 'delete' ) { 
    167             $arrUpdate['del_flg'] = $delflg; 
    168             $message = '削除'; 
    169         } 
    170         // ステータスが発送済みの時は発送日を更新 
    171         elseif ( $status_id == ORDER_DELIV ) { 
    172             $arrUpdate['status'] = $status_id; 
    173             $arrUpdate['commit_date'] = 'NOW()'; 
    174             $message = $arrORDERSTATUS[$status_id] . 'へ移動'; 
    175         } 
    176         else { 
    177             $arrUpdate['status'] = $status_id; 
    178             $message = $arrORDERSTATUS[$status_id] . 'へ移動'; 
    179         } 
    180  
    181         if ( isset($arrMove) ){ 
    182             foreach ( $arrMove as $val ){ 
    183                 if ( $val != "" ) { 
    184                     $objQuery->update($table, $arrUpdate, $where, array($val)); 
    185                 } 
    186  
    187             } 
    188         } 
    189  
    190         $this->tpl_onload = "window.alert('選択項目を" . $message . "しました。');"; 
     176         
     177        $objQuery->begin(); 
     178         
     179        foreach ($arrOrderId as $orderId) { 
     180            SC_Helper_DB_Ex::sfUpdateOrderStatus($orderId, $statusId); 
     181        } 
     182         
     183        $objQuery->commit(); 
     184         
     185        $this->tpl_onload = "window.alert('選択項目を" . $arrORDERSTATUS[$statusId] . "へ移動しました。');"; 
     186        return true; 
     187    } 
     188 
     189    /** 
     190     * 受注テーブルの論理削除 
     191     */ 
     192    function lfDelete($arrOrderId) { 
     193        $objQuery = new SC_Query(); 
     194         
     195        if (!isset($arrOrderId) || !is_array($arrOrderId)) { 
     196            return false; 
     197        } 
     198         
     199        $arrUpdate = array( 
     200             'del_flg' => 1 
     201            ,'update_date' => 'Now()' 
     202        ); 
     203         
     204        $objQuery->begin(); 
     205         
     206        foreach ($arrOrderId as $orderId) { 
     207            $objQuery->update('dtb_order', $arrUpdate, 'order_id = ?', array($orderId)); 
     208        } 
     209         
     210        $objQuery->commit(); 
     211         
     212        $this->tpl_onload = "window.alert('選択項目を削除しました。');"; 
     213        return true; 
    191214    } 
    192215} 
  • branches/comu-ver2/data/class/pages/shopping/LC_Page_Shopping_Complete.php

    r18099 r18100  
    435435    } 
    436436 
    437     // 受注テーブルへ登録 
     437    /** 
     438     * 受注テーブルへ登録 
     439     * 
     440     * @return integer 注文番号 
     441     */ 
    438442    function lfRegistOrder($objQuery, $arrData, $objCampaignSess = null) { 
    439443        $sqlval = $arrData; 
    440444 
    441445        // 受注テーブルに書き込まない列を除去 
    442         unset($sqlval['mailmaga_flg']);     // メルマガチェック 
    443         unset($sqlval['deliv_check']);      // 別のお届け先チェック 
    444         unset($sqlval['point_check']);      // ポイント利用チェック 
    445         unset($sqlval['member_check']);     // 購入時会員チェック 
    446         unset($sqlval['password']);         // ログインパスワード 
    447         unset($sqlval['reminder']);         // リマインダー質問 
    448         unset($sqlval['reminder_answer']);  // リマインダー答え 
    449         unset($sqlval['mail_flag']);        // メールフラグ 
    450         unset($sqlval['session']);          // セッション情報 
     446        unset($sqlval['mailmaga_flg']);     // メルマガチェック 
     447        unset($sqlval['deliv_check']);      // 別のお届け先チェック 
     448        unset($sqlval['point_check']);      // ポイント利用チェック 
     449        unset($sqlval['member_check']);     // 購入時会員チェック 
     450        unset($sqlval['password']);         // ログインパスワード 
     451        unset($sqlval['reminder']);         // リマインダー質問 
     452        unset($sqlval['reminder_answer']);  // リマインダー答え 
     453        unset($sqlval['mail_flag']);        // メールフラグ 
     454        unset($sqlval['session']);          // セッション情報 
     455 
     456        // ポイントは別登録 
     457        $addPoint = $sqlval['add_point']; 
     458        $usePoint = $sqlval['use_point']; 
     459        $sqlval['add_point'] = 0; 
     460        $sqlval['use_point'] = 0; 
    451461 
    452462        // 注文ステータス:指定が無ければ新規受付に設定 
    453         if($sqlval["status"] == ""){ 
    454             $sqlval['status'] = '1'; 
     463        if (strlen($sqlval['status']) == 0) { 
     464            $sqlval['status'] = ORDER_NEW; 
    455465        } 
    456466 
    457467        // 別のお届け先を指定していない場合、配送先に登録住所をコピーする。 
    458         if($arrData["deliv_check"] == "-1") { 
     468        if ($arrData["deliv_check"] == "-1") { 
    459469            $sqlval['deliv_name01'] = $arrData['order_name01']; 
    460470            $sqlval['deliv_name02'] = $arrData['order_name02']; 
     
    471481        } 
    472482 
    473         $order_id = $arrData['order_id'];       // 注文番号 
    474         $sqlval['create_date'] = 'now()';       // 受注日 
     483        $order_id = $arrData['order_id'];       // 注文番号 
     484        $sqlval['create_date'] = 'Now()';       // 受注日 
     485        $sqlval['update_date'] = 'Now()';       // 更新日時 
    475486 
    476487        // キャンペーンID 
    477488        if (!defined("MOBILE_SITE")) { 
    478             if($objCampaignSess->getIsCampaign()) $sqlval['campaign_id'] = $objCampaignSess->getCampaignId(); 
     489            if ($objCampaignSess->getIsCampaign()) $sqlval['campaign_id'] = $objCampaignSess->getCampaignId(); 
    479490        } 
    480491 
     
    482493        //$sqlval = lfGetInsParam($sqlval); 
    483494 
    484         // INSERTの実行 
     495        // 受注テーブルの登録 
    485496        $objQuery->insert("dtb_order", $sqlval); 
     497 
     498        // 受注.対応状況の更新 
     499        SC_Helper_DB_Ex::sfUpdateOrderStatus($order_id, null, $addPoint, $usePoint); 
    486500 
    487501        return $order_id; 
     
    547561 
    548562        $sqlval = $arrOrder[0]; 
    549         $sqlval['create_date'] = 'now()'; 
     563        $sqlval['create_date'] = 'Now()'; 
    550564 
    551565        // INSERTの実行 
     
    619633    /* 購入情報を会員テーブルに登録する */ 
    620634    function lfSetCustomerPurchase($customer_id, $arrData, &$objQuery) { 
    621         $col = "first_buy_date, last_buy_date, buy_times, buy_total, point"; 
     635        $col = "first_buy_date, last_buy_date, buy_times, buy_total"; 
    622636        $where = "customer_id = ?"; 
    623637        $arrRet = $objQuery->select($col, "dtb_customer", $where, array($customer_id)); 
     
    630644        $sqlval['buy_times']++; 
    631645        $sqlval['buy_total']+= $arrData['total']; 
    632         $sqlval['point'] = ($sqlval['point'] + $arrData['add_point'] - $arrData['use_point']); 
    633  
    634         // ポイントが不足している場合 
    635         if($sqlval['point'] < 0) { 
    636             $objQuery->rollback(); 
    637             SC_Utils_Ex::sfDispSiteError(LACK_POINT); 
    638         } 
    639646 
    640647        $objQuery->update("dtb_customer", $sqlval, $where, array($customer_id)); 
  • branches/comu-ver2/data/class/util/SC_Utils.php

    r18052 r18100  
    20622062        print("<strong>**デバッグ中**</strong></div>\n"); 
    20632063    } 
     2064 
     2065    /** 
     2066     * ポイント加算するかの判定 
     2067     *  
     2068     * @param integer $status 対応状況 
     2069     * @return boolean 加算するか 
     2070     */ 
     2071    function sfIsAddPoint($status) { 
     2072        switch ($status) { 
     2073            case ORDER_NEW:         // 新規注文 
     2074            case ORDER_PAY_WAIT:    // 入金待ち 
     2075            case ORDER_PRE_END:     // 入金済み 
     2076            case ORDER_CANCEL:      // キャンセル 
     2077            case ORDER_BACK_ORDER:  // 取り寄せ中 
     2078                return false; 
     2079             
     2080            case ORDER_DELIV:       // 発送済み 
     2081                return true; 
     2082             
     2083            default: 
     2084                break; 
     2085        } 
     2086         
     2087        return false; 
     2088    } 
    20642089} 
    20652090?> 
Note: See TracChangeset for help on using the changeset viewer.