Ignore:
Timestamp:
2011/02/17 19:40:06 (15 years ago)
Author:
nanasess
bzr:base-revision:
svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_5-dev:20179
bzr:committer:
Kentaro Ohkouchi <[email protected]>
bzr:file-ids:

data/Smarty/templates/admin/order/edit.tpl 15732@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2FSmarty%2Ftemplates%2Fdefault%2Fadmin%2Forder%2Fedit.tpl
data/Smarty/templates/admin/order/multiple.tpl multiple.tpl-20110116173102-7dtlp9lt15miha2l-1
data/class/SC_FormParam.php 15078@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2FSC_FormParam.php
data/class/helper/SC_Helper_DB.php 15176@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fhelper%2FSC_Helper_DB.php
data/class/helper/SC_Helper_Purchase.php sc_helper_purchase.p-20101020100530-jyaoa7ch9pdfjqzp-1
data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php 15594@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fpages%2Fadmin%2Forder%2FLC_Page_Admin_Order_Edit.php
data/class/pages/admin/order/LC_Page_Admin_Order_Status.php 15596@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fpages%2Fadmin%2Forder%2FLC_Page_Admin_Order_Status.php
bzr:mapping-version:
v4
bzr:merge:

[email protected]
bzr:repository-uuid:
1e3b908f-19a9-db11-a64c-001125224ba8
bzr:revision-id:
[email protected]
bzr:revno:
2908
bzr:revprop:branch-nick:
branches/version-2_5-dev
bzr:root:
branches/version-2_5-dev
bzr:text-revisions:

data/Smarty/templates/admin/order/edit.tpl [email protected]
data/Smarty/templates/admin/order/multiple.tpl [email protected]
data/class/SC_FormParam.php [email protected]
data/class/helper/SC_Helper_Purchase.php [email protected]
data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php [email protected]
data/class/pages/admin/order/LC_Page_Admin_Order_Status.php [email protected]
bzr:timestamp:
2011-02-17 19:40:03.388000011 +0900
bzr:user-agent:
bzr2.2.1+bzr-svn1.0.4
svn:original-date:
2011-02-17T10:40:03.388000Z
Message:

#975([管理画面]受注管理(受注一覧、登録編集))

  • 受注登録/編集ページ
  • 配送方法を選択できるよう追加カスタマイズ

#642(共通ロジックの機能向上)

  • SC_FormParam の処理を多次元配列へ対応
  • SC_Helper_DB::sfUpdateOrderNameCol(), SC_Helper_DB::sfUpdateOrderStatus() を SC_Helper_Purchase へ移動
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_5-dev/data/class/helper/SC_Helper_Purchase.php

    r20167 r20180  
    7272 
    7373        $orderTemp['status'] = $orderStatus; 
    74         $orderId = $this->registerOrder($orderTemp, $objCartSession, 
    75                                         $objCartSession->getKey()); 
     74        $orderId = $this->registerOrderComplete($orderTemp, $objCartSession, 
     75                                                $objCartSession->getKey()); 
    7676        $shippingTemp =& $this->getShippingTemp(); 
    7777        if (count($shippingTemp) > 1) { 
     
    529529     * $arrParam のうち, dtb_shipping テーブルに存在するカラムのみを登録する. 
    530530     * 
     531     * TODO UPDATE/INSERT にする 
     532     * 
    531533     * @param integer $order_id 受注ID 
    532534     * @param array $arrParams 配送情報の連想配列 
     535     * @param boolean $convert_shipping_date yyyy/mm/dd(EEE) 形式の配送日付を変換する場合 true 
    533536     * @return void 
    534537     */ 
    535     function registerShipping($order_id, $arrParams) { 
     538    function registerShipping($order_id, $arrParams, $convert_shipping_date = true) { 
    536539        $objQuery =& SC_Query::getSingletonInstance(); 
    537540        $table = 'dtb_shipping'; 
     541        $where = 'order_id = ?'; 
     542        $objQuery->delete($table, $where, array($order_id)); 
    538543 
    539544         foreach ($arrParams as $arrShipping) { 
     
    542547 
    543548            // 配送日付を timestamp に変換 
    544             if (!SC_Utils_Ex::isBlank($arrValues['shipping_date'])) { 
     549            if (!SC_Utils_Ex::isBlank($arrValues['shipping_date']) 
     550                && $convert_shipping_date) { 
    545551                $d = mb_strcut($arrValues["shipping_date"], 0, 10); 
    546552                $arrDate = split("/", $d); 
     
    564570     * @return void 
    565571     */ 
    566     function registerShipmentItem($orderId, $shippingId, $params) { 
    567         $objQuery =& SC_Query::getSingletonInstance(); 
     572    function registerShipmentItem($order_id, $shipping_id, $arrParams) { 
     573        $objQuery =& SC_Query::getSingletonInstance(); 
     574        $table = 'dtb_shipment_item'; 
     575        $where = 'order_id = ? AND shipping_id = ?'; 
     576        $objQuery->delete($table, $where, array($order_id, $shipping_id)); 
     577 
    568578        $objProduct = new SC_Product(); 
    569         foreach ($params as $productClassId => $val) { 
    570             $d = $objProduct->getDetailAndProductsClass($productClassId); 
    571             $sqlval['order_id'] = $orderId; 
    572             $sqlval['shipping_id'] = $shippingId; 
    573             $sqlval['product_class_id'] = $productClassId; 
    574             $sqlval['product_name'] = $d['name']; 
    575             $sqlval['product_code'] = $d['product_code']; 
    576             $sqlval['classcategory_name1'] = $d['classcategory_name1']; 
    577             $sqlval['classcategory_name2'] = $d['classcategory_name2']; 
    578             $sqlval['price'] = $d['price02']; 
    579             $sqlval['quantity'] = $val['quantity']; 
    580             $objQuery->insert("dtb_shipment_item", $sqlval); 
    581         } 
    582     } 
    583  
    584     /** 
    585      * 受注情報を登録する. 
     579        foreach ($arrParams as $arrValues) { 
     580            if (SC_Utils_Ex::isBlank($arrValues['product_class_id'])) { 
     581                continue; 
     582            } 
     583            $d = $objProduct->getDetailAndProductsClass($arrValues['product_class_id']); 
     584            $name = SC_Utils_Ex::isBlank($arrValues['product_name']) 
     585                ? $d['name'] 
     586                : $arrValues['product_name']; 
     587 
     588            $code = SC_Utils_Ex::isBlank($arrValues['product_code']) 
     589                ? $d['code'] 
     590                : $arrValues['product_code']; 
     591 
     592            $cname1 = SC_Utils_Ex::isBlank($arrValues['classcategory_name1']) 
     593                ? $d['classcategory_name1'] 
     594                : $arrValues['classcategory_name1']; 
     595 
     596            $cname2 = SC_Utils_Ex::isBlank($arrValues['classcategory_name2']) 
     597                ? $d['classcategory_name2'] 
     598                : $arrValues['classcategory_name2']; 
     599 
     600            $price = SC_Utils_Ex::isBlank($arrValues['price']) 
     601                ? $d['price02'] 
     602                : $arrValues['price']; 
     603 
     604            $arrValues['order_id'] = $order_id; 
     605            $arrValues['shipping_id'] = $shipping_id; 
     606            $arrValues['product_name'] = $name; 
     607            $arrValues['product_code'] = $code; 
     608            $arrValues['classcategory_name1'] = $cname1; 
     609            $arrValues['classcategory_name2'] = $cname2; 
     610            $arrValues['price'] = $price; 
     611 
     612            $arrExtractValues = $objQuery->extractOnlyColsOf($table, $arrValues); 
     613            $objQuery->insert($table, $arrExtractValues); 
     614        } 
     615    } 
     616 
     617    /** 
     618     * 受注登録を完了する. 
    586619     * 
    587620     * 引数の受注情報を受注テーブル及び受注詳細テーブルに登録する. 
    588621     * 登録後, 受注一時テーブルに削除フラグを立て, カートの内容を削除する. 
    589      * 
    590      * TODO ダウンロード商品の場合の扱いを検討 
    591622     * 
    592623     * @param array $orderParams 登録する受注情報の配列 
     
    595626     * @param integer 受注ID 
    596627     */ 
    597     function registerOrder($orderParams, &$objCartSession, $cartKey) { 
     628    function registerOrderComplete($orderParams, &$objCartSession, $cartKey) { 
    598629        $objQuery =& SC_Query::getSingletonInstance(); 
    599630 
     
    619650        $orderParams['update_date'] = 'Now()'; 
    620651 
    621         $objQuery->insert("dtb_order", $orderParams); 
    622  
    623         // 受注.対応状況の更新 
    624         SC_Helper_DB_Ex::sfUpdateOrderStatus($orderParams['order_id'], 
    625                                              null, $addPoint, $usePoint); 
     652        $this->registerOrder($orderParams['order_id'], $orderParams); 
    626653 
    627654        // 詳細情報を取得 
    628655        $cartItems = $objCartSession->getCartList($cartKey); 
    629656 
    630         // 既に存在する詳細レコードを消しておく。 
    631         $objQuery->delete("dtb_order_detail", "order_id = ?", 
    632                           array($orderParams['order_id'])); 
    633  
     657        // 詳細情報を生成 
    634658        $objProduct = new SC_Product(); 
     659        $i = 0; 
    635660        foreach ($cartItems as $item) { 
    636661            $p =& $item['productsClass']; 
    637             $detail['order_id'] = $orderParams['order_id']; 
    638             $detail['product_id'] = $p['product_id']; 
    639             $detail['product_class_id'] = $p['product_class_id']; 
    640             $detail['product_name'] = $p['name']; 
    641             $detail['product_code'] = $p['product_code']; 
    642             $detail['classcategory_name1'] = $p['classcategory_name1']; 
    643             $detail['classcategory_name2'] = $p['classcategory_name2']; 
    644             $detail['point_rate'] = $item['point_rate']; 
    645             $detail['price'] = $item['price']; 
    646             $detail['quantity'] = $item['quantity']; 
     662            $arrDetail[$i]['order_id'] = $orderParams['order_id']; 
     663            $arrDetail[$i]['product_id'] = $p['product_id']; 
     664            $arrDetail[$i]['product_class_id'] = $p['product_class_id']; 
     665            $arrDetail[$i]['product_name'] = $p['name']; 
     666            $arrDetail[$i]['product_code'] = $p['product_code']; 
     667            $arrDetail[$i]['classcategory_name1'] = $p['classcategory_name1']; 
     668            $arrDetail[$i]['classcategory_name2'] = $p['classcategory_name2']; 
     669            $arrDetail[$i]['point_rate'] = $item['point_rate']; 
     670            $arrDetail[$i]['price'] = $item['price']; 
     671            $arrDetail[$i]['quantity'] = $item['quantity']; 
    647672 
    648673            // 在庫の減少処理 
     
    651676                SC_Utils_Ex::sfDispSiteError(SOLD_OUT, "", true); 
    652677            } 
    653             $objQuery->insert("dtb_order_detail", $detail); 
    654         } 
     678            $i++; 
     679        } 
     680        $this->registerOrderDetail($orderParams['order_id'], $arrDetail); 
    655681 
    656682        $objQuery->update("dtb_order_temp", array('del_flg' => 1), 
     
    661687        SC_SiteSession::unsetUniqId(); 
    662688        return $orderParams['order_id']; 
     689    } 
     690 
     691    /** 
     692     * 受注情報を登録する. 
     693     * 
     694     * 既に受注IDが存在する場合は, 受注情報を更新する. 
     695     * 引数の受注IDが, 空白又は null の場合は, 新しく受注IDを発行して登録する. 
     696     * 
     697     * @param integer $order_id 受注ID 
     698     * @param array $arrParams 受注情報の連想配列 
     699     * @return integer 受注ID 
     700     */ 
     701    function registerOrder($order_id, $arrParams) { 
     702        $table = 'dtb_order'; 
     703        $where = 'order_id = ?'; 
     704        $objQuery = SC_Query::getSingletonInstance(); 
     705        $arrValues = $objQuery->extractOnlyColsOf($table, $arrParams); 
     706 
     707        $exists = $objQuery->count($table, $where, array($order_id)); 
     708        if ($exists > 0) { 
     709 
     710            $this->sfUpdateOrderStatus($order_id, $arrValues['status'], 
     711                                       $arrValues['add_point'], 
     712                                       $arrValues['use_point'], 
     713                                       $arrValues); 
     714            $this->sfUpdateOrderNameCol($order_id); 
     715 
     716            $arrValues['update_date'] = 'now()'; 
     717            $objQuery->update($table, $arrValues, $where, array($order_id)); 
     718        } else { 
     719            if (SC_Utils_Ex::isBlank($order_id)) { 
     720                $order_id = $objQuery->nextVal('dtb_order_order_id'); 
     721            } 
     722            $arrValues['order_id'] = $order_id; 
     723            $arrValues['customer_id'] = 
     724                    SC_Utils_Ex::isBlank($arrValues['customer_id']) 
     725                    ? 0 : $arrValues['customer_id']; 
     726            $arrValues['create_date'] = 'now()'; 
     727            $arrValues['update_date'] = 'now()'; 
     728            $objQuery->insert($table, $arrValues); 
     729 
     730            $this->sfUpdateOrderStatus($order_id, $arrValues['status'], 
     731                                       $arrValues['add_point'], 
     732                                       $arrValues['use_point'], 
     733                                       $arrValues); 
     734            $this->sfUpdateOrderNameCol($order_id); 
     735 
     736        } 
     737        return $order_id; 
     738    } 
     739 
     740    /** 
     741     * 受注詳細情報を登録する. 
     742     * 
     743     * 既に, 該当の受注が存在する場合は, 受注情報を削除し, 登録する. 
     744     * 
     745     * @param integer $order_id 受注ID 
     746     * @param array $arrParams 受注情報の連想配列 
     747     * @return void 
     748     */ 
     749    function registerOrderDetail($order_id, $arrParams) { 
     750        $table = 'dtb_order_detail'; 
     751        $where = 'order_id = ?'; 
     752        $objQuery = SC_Query::getSingletonInstance(); 
     753 
     754        $objQuery->delete($table, $where, array($order_id)); 
     755        foreach ($arrParams as $arrDetail) { 
     756            $arrValues = $objQuery->extractOnlyColsOf($table, $arrDetail); 
     757            $arrValues['order_id'] = $order_id; 
     758            $objQuery->insert($table, $arrValues); 
     759        } 
    663760    } 
    664761 
     
    685782     * 
    686783     * @param integer $order_id 受注ID 
     784     * @param boolean $has_order_status 受注ステータス, 入金日も含める場合 true 
    687785     * @return array 受注詳細の配列 
    688786     */ 
    689     function getOrderDetail($order_id) { 
     787    function getOrderDetail($order_id, $has_order_status = true) { 
    690788        $objQuery =& SC_Query::getSingletonInstance(); 
    691789        $dbFactory  = SC_DB_DBFactory_Ex::getInstance(); 
     
    701799            T2.quantity, 
    702800            T2.point_rate, 
    703             T1.status AS status, 
    704             T1.payment_date AS payment_date, 
     801__EOS__; 
     802        if ($has_order_status) { 
     803            $col .= 'T1.status AS status, T1.payment_date AS payment_date,'; 
     804 
     805        } 
     806        $col .= <<< __EOS__ 
     807 
    705808            CASE WHEN EXISTS( 
    706809                    SELECT 1 FROM dtb_products 
     
    772875 
    773876            foreach ($arrItem as $detailKey => $detailVal) { 
    774                 $arrResults[$product_class_id][$detailKey] = $detailVal; 
     877                $arrResults[$key][$detailKey] = $detailVal; 
    775878            } 
    776879            // 商品詳細を関連づける 
    777880            if ($has_detail) { 
    778                 $arrResults[$product_class_id]['productsClass'] 
     881                $arrResults[$key]['productsClass'] 
    779882                    =& $objProduct->getDetailAndProductsClass($product_class_id); 
    780883            } 
     
    797900                                     SC_MobileUserAgent::isMobile() ? 2 : 1); 
    798901    } 
     902 
     903    /** 
     904     * 受注.対応状況の更新 
     905     * 
     906     * ・必ず呼び出し元でトランザクションブロックを開いておくこと。 
     907     * 
     908     * @param integer $orderId 注文番号 
     909     * @param integer|null $newStatus 対応状況 (null=変更無し) 
     910     * @param integer|null $newAddPoint 加算ポイント (null=変更無し) 
     911     * @param integer|null $newUsePoint 使用ポイント (null=変更無し) 
     912     * @param array $sqlval 更新後の値をリファレンスさせるためのパラメータ 
     913     * @return void 
     914     */ 
     915    function sfUpdateOrderStatus($orderId, $newStatus = null, $newAddPoint = null, $newUsePoint = null, &$sqlval) { 
     916        $objQuery =& SC_Query::getSingletonInstance(); 
     917 
     918        $arrOrderOld = $objQuery->getRow('status, add_point, use_point, customer_id', 'dtb_order', 'order_id = ?', array($orderId)); 
     919 
     920        // 対応状況が変更無しの場合、DB値を引き継ぐ 
     921        if (is_null($newStatus)) { 
     922            $newStatus = $arrOrderOld['status']; 
     923        } 
     924 
     925        // 使用ポイント、DB値を引き継ぐ 
     926        if (is_null($newUsePoint)) { 
     927            $newUsePoint = $arrOrderOld['use_point']; 
     928        } 
     929 
     930        // 加算ポイント、DB値を引き継ぐ 
     931        if (is_null($newAddPoint)) { 
     932            $newAddPoint = $arrOrderOld['add_point']; 
     933        } 
     934 
     935        if (USE_POINT !== false) { 
     936            // 顧客.ポイントの加減値 
     937            $addCustomerPoint = 0; 
     938 
     939            // ▼使用ポイント 
     940            // 変更前の対応状況が利用対象の場合、変更前の使用ポイント分を戻す 
     941            if (SC_Utils_Ex::sfIsUsePoint($arrOrderOld['status'])) { 
     942                $addCustomerPoint += $arrOrderOld['use_point']; 
     943            } 
     944 
     945            // 変更後の対応状況が利用対象の場合、変更後の使用ポイント分を引く 
     946            if (SC_Utils_Ex::sfIsUsePoint($newStatus)) { 
     947                $addCustomerPoint -= $newUsePoint; 
     948            } 
     949            // ▲使用ポイント 
     950 
     951            // ▼加算ポイント 
     952            // 変更前の対応状況が加算対象の場合、変更前の加算ポイント分を戻す 
     953            if (SC_Utils_Ex::sfIsAddPoint($arrOrderOld['status'])) { 
     954                $addCustomerPoint -= $arrOrderOld['add_point']; 
     955            } 
     956 
     957            // 変更後の対応状況が加算対象の場合、変更後の加算ポイント分を足す 
     958            if (SC_Utils_Ex::sfIsAddPoint($newStatus)) { 
     959                $addCustomerPoint += $newAddPoint; 
     960            } 
     961            // ▲加算ポイント 
     962 
     963            if ($addCustomerPoint != 0) { 
     964                // ▼顧客テーブルの更新 
     965                $sqlval = array(); 
     966                $where = ''; 
     967                $arrVal = array(); 
     968                $arrRawSql = array(); 
     969                $arrRawSqlVal = array(); 
     970 
     971                $sqlval['update_date'] = 'Now()'; 
     972                $arrRawSql['point'] = 'point + ?'; 
     973                $arrRawSqlVal[] = $addCustomerPoint; 
     974                $where .= 'customer_id = ?'; 
     975                $arrVal[] = $arrOrderOld['customer_id']; 
     976 
     977                $objQuery->update('dtb_customer', $sqlval, $where, $arrVal, $arrRawSql, $arrRawSqlVal); 
     978                // ▲顧客テーブルの更新 
     979 
     980                // 顧客.ポイントをマイナスした場合、 
     981                if ($addCustomerPoint < 0) { 
     982                    $sql = 'SELECT point FROM dtb_customer WHERE customer_id = ?'; 
     983                    $point = $objQuery->getOne($sql, array($arrOrderOld['customer_id'])); 
     984                    // 変更後の顧客.ポイントがマイナスの場合、 
     985                    if ($point < 0) { 
     986                        // ロールバック 
     987                        $objQuery->rollback(); 
     988                        // エラー 
     989                        SC_Utils_Ex::sfDispSiteError(LACK_POINT); 
     990                    } 
     991                } 
     992            } 
     993        } 
     994 
     995        // ▼受注テーブルの更新 
     996        if (empty($sqlval)) { 
     997            $sqlval = array(); 
     998        } 
     999 
     1000        if (USE_POINT !== false) { 
     1001            $sqlval['add_point'] = $newAddPoint; 
     1002            $sqlval['use_point'] = $newUsePoint; 
     1003        } 
     1004        // ステータスが発送済みに変更の場合、発送日を更新 
     1005        if ($arrOrderOld['status'] != ORDER_DELIV && $newStatus == ORDER_DELIV) { 
     1006            $sqlval['commit_date'] = 'Now()'; 
     1007        } 
     1008        // ステータスが入金済みに変更の場合、入金日を更新 
     1009        elseif ($arrOrderOld['status'] != ORDER_PRE_END && $newStatus == ORDER_PRE_END) { 
     1010            $sqlval['payment_date'] = 'Now()'; 
     1011        } 
     1012 
     1013        $sqlval['status'] = $newStatus; 
     1014        $sqlval['update_date'] = 'Now()'; 
     1015 
     1016        $cols = $objQuery->listTableFields('dtb_order'); 
     1017        $dest = array(); 
     1018        foreach ($sqlval as $key => $val) { 
     1019            if (in_array($key, $cols)) { 
     1020                $dest[$key] = $val; 
     1021            } 
     1022        } 
     1023 
     1024        $objQuery->update('dtb_order', $dest, 'order_id = ?', array($orderId)); 
     1025        // ▲受注テーブルの更新 
     1026    } 
     1027 
     1028    /** 
     1029     * 受注の名称列を更新する 
     1030     * 
     1031     * @param integer $order_id 更新対象の注文番号 
     1032     * @param boolean $temp_table 更新対象は「受注_Temp」か 
     1033     * @static 
     1034     */ 
     1035    function sfUpdateOrderNameCol($order_id, $temp_table = false) { 
     1036        $objQuery =& SC_Query::getSingletonInstance(); 
     1037 
     1038        if ($temp_table) { 
     1039            $tgt_table = 'dtb_order_temp'; 
     1040            $sql_where = 'order_temp_id = ?'; 
     1041        } else { 
     1042            $tgt_table = 'dtb_order'; 
     1043            $sql_where = 'order_id = ?'; 
     1044 
     1045            $objQuery->update('dtb_shipping', array(), 
     1046                              $sql_where, 
     1047                              array($order_id), 
     1048                              array('shipping_time' => 
     1049                                    "(SELECT deliv_time FROM dtb_delivtime WHERE time_id = dtb_shipping.time_id AND deliv_id = dtb_shipping.deliv_id)")); 
     1050 
     1051        } 
     1052 
     1053        $objQuery->update($tgt_table, array(), 
     1054                          $sql_where, 
     1055                          array($order_id), 
     1056                          array('payment_method' => 
     1057                                "(SELECT payment_method FROM dtb_payment WHERE payment_id = " . $tgt_table . ".payment_id)")); 
     1058    } 
    7991059} 
Note: See TracChangeset for help on using the changeset viewer.