<?php
/**
 * コンテナクラス
 *
 * PHP versions 5
 *
 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
 *
 * @package    Magic3 Framework
 * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
 * @copyright  Copyright 2006-2009 Magic3 Project.
 * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
 * @version    SVN: $Id: admin_ec_mainOrderWidgetContainer.php 2260 2009-08-27 05:59:32Z fishbone $
 * @link       http://www.magic3.org
 */
require_once($gEnvManager->getCurrentWidgetContainerPath() . '/admin_ec_mainBaseWidgetContainer.php');
require_once($gEnvManager->getCurrentWidgetDbPath() .	'/ec_mainOrderDb.php');
require_once($gEnvManager->getCurrentWidgetDbPath() .	'/productDb.php');

class admin_ec_mainOrderWidgetContainer extends admin_ec_mainBaseWidgetContainer
{
	private $db;	// DB接続オブジェクト
	private $langId;			// 言語ID
	private $productDb;	// DB接続オブジェクト
	private $serialNo;			// シリアル番号
	private $currency;			// 通貨
	private $orderStatus;		// 受注ステータス
	private $custmState;		// 顧客都道府県
	private $delivState;		// 配送都道府県
	private $billState;		// 請求都道府県
	private $deliveryMethod;		// 配送方法
	private $payMethod;			// 支払い方法
	private $search_status;		// 検索ステータス
	private $serialArray = array();			// シリアル番号の配列
	const STANDARD_PRICE = 'selling';		// 通常価格
	const ORDER_STATUS_CLOSE = 900;			// 受注処理終了
	const PRICE_OBJ_ID = "eclib";		// 価格計算オブジェクトID
	const DEFAULT_COUNTRY_ID = 'JPN';	// デフォルト国ID
	const DEFAULT_LIST_COUNT = 20;			// 最大リスト表示数
	
	/**
	 * コンストラクタ
	 */
	function __construct()
	{
		// 親クラスを呼び出す
		parent::__construct();
		
		// DBオブジェクト作成
		$this->db = new ec_mainOrderDb();
		$this->productDb = new productDb();
		
		// 価格計算用オブジェクト取得
		$this->ecObj = $this->gInstance->getObject(self::PRICE_OBJ_ID);
	}
	/**
	 * テンプレートファイルを設定
	 *
	 * _assign()でデータを埋め込むテンプレートファイルのファイル名を返す。
	 * 読み込むディレクトリは、「自ウィジェットディレクトリ/include/template」に固定。
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param object         $param			任意使用パラメータ。そのまま_assign()に渡る
	 * @return string 						テンプレートファイル名。テンプレートライブラリを使用しない場合は空文字列「''」を返す。
	 */
	function _setTemplate($request, &$param)
	{
		$task = $request->trimValueOf('task');
		if ($task == 'order_detail'){		// 詳細画面
			return 'admin_order_detail.tmpl.html';
		} else {
			return 'admin_order.tmpl.html';
		}
	}
	/**
	 * テンプレートにデータ埋め込む
	 *
	 * _setTemplate()で指定したテンプレートファイルにデータを埋め込む。
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param object         $param			任意使用パラメータ。_setTemplate()と共有。
	 * @param								なし
	 */
	function _assign($request, &$param)
	{
		$task = $request->trimValueOf('task');
		if ($task == 'order_detail'){		// 詳細画面
			return $this->createDetail($request);
		} else {			// 一覧画面
			return $this->createList($request);
		}
	}
	/**
	 * 一覧画面作成
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param								なし
	 */
	function createList($request)
	{
		// ユーザ情報、表示言語
		$this->langId = $this->gEnv->getDefaultLanguage();		// デフォルト言語
		$this->userId = $this->gEnv->getCurrentUserId();
		
		// ##### 検索条件 #####
		$pageNo = $request->trimValueOf('page');				// ページ番号
		if (empty($pageNo)) $pageNo = 1;
		// DBの保存設定値を取得
		$maxListCount = self::DEFAULT_LIST_COUNT;				// 表示項目数
		$this->search_status = $request->trimValueOf('status');		// ステータス
		$keyword = $request->trimValueOf('keyword');			// 検索キーワード
		
		$act = $request->trimValueOf('act');
		if ($act == 'search'){		// 検索のとき
			$pageNo = 1;		// ページ番号初期化
		} else if ($act == 'delete'){		// 項目削除の場合
			$listedItem = explode(',', $request->trimValueOf('seriallist'));
			$delItems = array();
			for ($i = 0; $i < count($listedItem); $i++){
				// 項目がチェックされているかを取得
				$itemName = 'item' . $i . '_selected';
				$itemValue = ($request->trimValueOf($itemName) == 'on') ? 1 : 0;
				
				if ($itemValue){		// チェック項目
					$delItems[] = $listedItem[$i];
				}
			}
			if (count($delItems) > 0){
				for ($i = 0; $i < count($delItems); $i++){
					$ret = $this->db->delOrder($delItems[$i], $this->userId);
					if (!$ret) break;
				}
				if ($ret){		// データ削除成功のとき
					$this->setGuidanceMsg('データを削除しました');
				} else {
					$this->setAppErrorMsg('データ削除に失敗しました');
				}
			}
		}
		
		// ###### 検索条件を作成 ######
		// ステータス
		if ($this->search_status == 0){		// 終了、キャンセル以外
			$statusMin = 0;
			$statusMax = self::ORDER_STATUS_CLOSE -1;
		} else {
			$statusMin = 0;
			$statusMax = 0;
		}
		
		// 総数を取得
		$totalCount = $this->db->searchOrderHeaderCount($statusMin, $statusMax);
		$pageCount = (int)(($totalCount -1) / $maxListCount) + 1;		// 総ページ数

		// 表示するページ番号の修正
		if ($pageNo < 1) $pageNo = 1;
		if ($pageNo > $pageCount) $pageNo = $pageCount;

		// 商品リストを表示
		$this->db->searchOrderHeader($statusMin, $statusMax, $maxListCount, ($pageNo -1) * $maxListCount, array($this, 'orderListLoop'));

		// ページング用リンク作成
		$pageLink = '';
		if ($pageCount > 1){	// ページが2ページ以上のときリンクを作成
			for ($i = 1; $i <= $pageCount; $i++){
				$linkUrl = $this->gEnv->getDefaultAdminUrl() . '?' . M3_REQUEST_PARAM_OPERATION_COMMAND . '=' . M3_REQUEST_CMD_CONFIG_WIDGET . 
				'&' . M3_REQUEST_PARAM_WIDGET_ID . '=' . $this->gEnv->getCurrentWidgetId() . '&task=order&status=' . $this->search_status . '&page=' . $i;
				if ($i == $pageNo){
					$link = '&nbsp;' . $i;
				} else {
					$link = '&nbsp;<a href="' . $this->getUrl($linkUrl, true) . '" >' . $i . '</a>';
				}
				$pageLink .= $link;
			}
		}
		// 検出順を作成
		$startNo = ($pageNo -1) * $maxListCount +1;
		$endNo = $pageNo * $maxListCount > $totalCount ? $totalCount : $pageNo * $maxListCount;
		$this->tmpl->addVar("_widget", "page_link", $pageLink);
		$this->tmpl->addVar("_widget", "total_count", $totalCount);
		$this->tmpl->addVar("search_range", "start_no", $startNo);
		$this->tmpl->addVar("search_range", "end_no", $endNo);
		if ($totalCount > 0) $this->tmpl->setAttribute('search_range', 'visibility', 'visible');// 検出範囲を表示
		
		if ($this->search_status == 0){		// 終了、キャンセル以外
			$this->tmpl->addVar("_widget", "status_active_selected", 'selected');
		} else {
			$this->tmpl->addVar("_widget", "status_all_selected", 'selected');
		}
		
		// 埋め込みパラメータの設定
		$this->tmpl->addVar("_widget", "serial_list", implode($this->serialArray, ','));// 表示中の項目のシリアル番号設定
		$this->tmpl->addVar("_widget", "admin_url", $this->getUrl($this->gEnv->getDefaultAdminUrl()));
		//$this->tmpl->addVar('_widget', 'widget_id', $this->gEnv->getCurrentWidgetId());
	}
	/**
	 * 詳細画面作成
	 *
	 * @param RequestManager $request		HTTPリクエスト処理クラス
	 * @param								なし
	 */
	function createDetail($request)
	{
		// ユーザ情報、表示言語
		$this->now = date("Y/m/d H:i:s");	// 現在日時
		$this->langId = $this->gEnv->getDefaultLanguage();		// デフォルト言語
		$this->userId = $this->gEnv->getCurrentUserId();
		
		$act = $request->trimValueOf('act');
		$this->serialNo = $request->trimValueOf('serial');			// 選択項目のシリアル番号
				
		// 入力項目
		$name = $request->trimValueOf('item_name');		// 顧客名
		$nameKana = $request->trimValueOf('item_name_kana');		// 顧客名(カナ)
		$custm_zipcode = $request->trimValueOf('item_custm_zipcode');		// 顧客郵便番号
		$custm_address = $request->trimValueOf('item_custm_address');		// 顧客住所
		$custm_address2 = $request->trimValueOf('item_custm_address2');		// 顧客住所2
		$custm_phone = $request->trimValueOf('item_custm_phone');		// 顧客電話番号
		$custm_fax = $request->trimValueOf('item_custm_fax');		// 顧客FAX
		$custm_email = $request->trimValueOf('item_custm_email');		// 顧客Eメール
		
		$deliv_name = $request->trimValueOf('item_deliv_name');		// 配送先名
		$deliv_name_kana = $request->trimValueOf('item_deliv_name_kana');		// 配送先名(カナ)
		$deliv_zipcode = $request->trimValueOf('item_deliv_zipcode');		// 配送先郵便番号
		$deliv_address = $request->trimValueOf('item_deliv_address');		// 配送先住所
		$deliv_address2 = $request->trimValueOf('item_deliv_address2');		// 配送先住所2
		$deliv_phone = $request->trimValueOf('item_deliv_phone');		// 配送先電話番号
		$deliv_fax = $request->trimValueOf('item_deliv_fax');		// 配送先FAX
		$deliv_email = $request->trimValueOf('item_deliv_email');		// 配送先Eメール
		$bill_name = $request->trimValueOf('item_bill_name');		// 請求先名
		$bill_name_kana = $request->trimValueOf('item_bill_name_kana');		// 請求先名(カナ)
		$bill_zipcode = $request->trimValueOf('item_bill_zipcode');		// 請求先郵便番号
		$bill_address = $request->trimValueOf('item_bill_address');		// 請求先住所
		$bill_address2 = $request->trimValueOf('item_bill_address2');		// 請求先住所2
		$bill_phone = $request->trimValueOf('item_bill_phone');		// 請求先電話番号
		$bill_fax = $request->trimValueOf('item_bill_fax');		// 請求先FAX
		$bill_email = $request->trimValueOf('item_bill_email');		// 請求先Eメール
		$this->deliveryMethod = $request->trimValueOf('item_delivery_method');		// 選択中の配送方法
		$this->payMethod = $request->trimValueOf('item_payment_method');			// 選択中の支払い方法
		$this->custmState = $request->trimValueOf('item_custm_state');		// 顧客都道府県
		$this->delivState = $request->trimValueOf('item_deliv_state');		// 配送都道府県
		$this->billState = $request->trimValueOf('item_bill_state');		// 請求都道府県

		$this->orderStatus = $request->trimValueOf('item_order_status');		// 受注ステータス
		
		$replaceNew = false;		// データを再取得するかどうか
		if ($act == 'update'){		// 項目更新の場合
			// 入力チェック
			$this->checkInput($name,				'顧客名');		
			$this->checkInput($nameKana,			'顧客名(カナ)');
			$this->checkSingleByte($custm_zipcode,	'顧客郵便番号');
			$this->checkNumeric($this->custmState,	'顧客都道府県');
			$this->checkInput($custm_address,		'顧客住所');	
			$this->checkSingleByte($custm_phone,	'顧客電話番号');
			$this->checkSingleByte($custm_fax,		'顧客FAX', true);
			$this->checkMailAddress($custm_email,	'顧客Eメール');
			
			$this->checkInput($deliv_name,			'配送先名', true);		
			$this->checkInput($deliv_name_kana,		'配送先名(カナ)', true);
			$this->checkSingleByte($deliv_zipcode,	'配送先郵便番号', true);
			$this->checkNumeric($this->delivState,	'配送先都道府県', true);
			$this->checkInput($deliv_address,		'配送先住所', true);	
			$this->checkSingleByte($deliv_phone,	'配送先電話番号', true);
			$this->checkSingleByte($deliv_fax,		'配送先FAX', true);
			$this->checkMailAddress($deliv_email,	'配送先Eメール', true);
			
			$this->checkInput($bill_name,			'請求先名', true);		
			$this->checkInput($bill_name_kana,		'請求先名(カナ)', true);
			$this->checkSingleByte($bill_zipcode,	'請求先郵便番号', true);
			$this->checkNumeric($this->billState,	'請求先都道府県', true);
			$this->checkInput($bill_address,		'請求先住所', true);	
			$this->checkSingleByte($bill_phone,		'請求先電話番号', true);
			$this->checkSingleByte($bill_fax,		'請求先FAX', true);
			$this->checkMailAddress($bill_email,	'請求先Eメール', true);
						
			// エラーなしの場合は、データを登録
			if ($this->getMsgCount() == 0){
				// データ取得
				$ret = $this->db->getOrderBySerial($this->serialNo, $row);
				if ($ret){
					// トランザクションスタート
					$this->db->startTransaction();
				
					// 受注ヘッダ作成
					$ret = $this->db->updateOrder($this->serialNo, $this->userId, $this->langId, $row['or_order_no'],
						$row['or_custm_id'], $name, $nameKana, $row['or_custm_person'], $row['or_custm_person_kana'],
						$custm_zipcode, $this->custmState, $custm_address, $custm_address2, $custm_phone, $custm_fax, $custm_email, $row['or_custm_country_id'], 
						$row['or_deliv_id'], $deliv_name, $deliv_name_kana, $row['or_deliv_person'], $row['or_deliv_person_kana'],
						$deliv_zipcode, $this->delivState, $deliv_address, $deliv_address2, $deliv_phone, $deliv_fax, $deliv_email, $row['or_deliv_country_id'],
						$row['or_bill_id'], $bill_name, $bill_name_kana, $row['or_bill_person'], $row['or_bill_person_kana'], 
						$bill_zipcode, $this->billState, $bill_address, $bill_address2, $bill_phone, $bill_fax, $bill_email, $row['or_bill_country_id'],
						$this->deliveryMethod, $this->payMethod, $row['or_card_type'], $row['or_card_owner'], $row['or_card_number'], $row['or_card_expires'],
						$row['or_demand_dt'], $row['or_demand_time'], $row['or_appoint_dt'], $row['or_currency_id'], $row['or_subtotal'], $row['or_discount'], $row['or_deliv_fee'], $row['or_charge'], $row['or_total'],
						$this->orderStatus, $row['or_estimate_dt'], $row['or_regist_dt'], $row['or_order_dt'], $row['or_deliv_dt'], $row['or_close_dt'],
						$this->userId, $this->now, $newOrderId, $newSerial);
						
					// トランザクション終了
					$ret = $this->db->endTransaction();
					if ($ret){
						$this->setGuidanceMsg('データを更新しました');
					
						// 登録済みの受注情報を再取得
						$this->serialNo = $newSerial;
						$replaceNew = true;
					}
				}
			}
		} else if ($act == 'delete'){		// 項目削除の場合
			if (empty($this->serialNo)){
				$this->setUserErrorMsg('削除項目が選択されていません');
			}
			// エラーなしの場合は、データを削除
			if ($this->getMsgCount() == 0){
				$ret = $this->db->delOrder($this->serialNo, $this->userId);
				if ($ret){		// データ削除成功のとき
					$this->setGuidanceMsg('データを削除しました');
				} else {
					$this->setAppErrorMsg('データ削除に失敗しました');
				}
			}
		} else {	// 初期表示
			if (empty($this->serialNo)){		// 新規登録のとき
				// 入力値初期化
				$name = '';		// 顧客名
				$nameKana = '';		// 顧客名(カナ)
				$custm_zipcode = '';		// 顧客郵便番号
				$custm_address = '';		// 顧客住所
				$custm_address2 = '';		// 顧客住所2
				$custm_phone = '';		// 顧客電話番号
				$custm_fax = '';		// 顧客FAX
				$custm_email = '';		// 顧客Eメール
				$deliv_name = '';		// 配送先名
				$deliv_name_kana = '';		// 配送先名(カナ)
				$deliv_zipcode = '';		// 配送先郵便番号
				$deliv_address = '';		// 配送先住所
				$deliv_address2 = '';		// 配送先住所2
				$deliv_phone = '';		// 配送先電話番号
				$deliv_fax = '';		// 配送先FAX
				$deliv_email = '';		// 配送先Eメール
				$bill_name = '';		// 請求先名
				$bill_name_kana = '';		// 請求先名(カナ)
				$bill_zipcode = '';		// 請求先郵便番号
				$bill_address = '';		// 請求先住所
				$bill_address2 = '';		// 請求先住所2
				$bill_phone = '';		// 請求先電話番号
				$bill_fax = '';		// 請求先FAX
				$bill_email = '';		// 請求先Eメール
				$this->deliveryMethod = '';		// 選択中の配送方法
				$this->payMethod = '';			// 選択中の支払い方法
				$this->custmState = 0;		// 顧客都道府県
				$this->delivState = 0;		// 配送都道府県
				$this->billState = 0;		// 請求都道府県
				$this->orderStatus = 0;		// 受注ステータス
			} else {
				$replaceNew = true;		// データ取得
			}
		}
		if ($replaceNew){
			// データ再取得
			$ret = $this->db->getOrderBySerial($this->serialNo, $row);
			if ($ret){
				// 取得値を設定
				$this->langId = $row['or_language_id'];		// 受注時の言語
				$orderNo = $row['or_order_no'];		// 受注番号
				
				$name = $row['or_custm_name'];		// 顧客名
				$nameKana = $row['or_custm_name_kana'];		// 顧客名(カナ)
				$custm_zipcode = $row['or_custm_zipcode'];		// 顧客郵便番号
				$custm_address = $row['or_custm_address1'];		// 顧客住所
				$custm_address2 = $row['or_custm_address2'];		// 顧客住所2
				$custm_phone = $row['or_custm_phone'];		// 顧客電話番号
				$custm_fax = $row['or_custm_fax'];		// 顧客FAX
				$custm_email = $row['or_custm_email'];		// 顧客Eメール
				
				$deliv_name = $row['or_deliv_name'];		// 配送先名
				$deliv_name_kana = $row['or_deliv_name_kana'];		// 配送先名(カナ)
				$deliv_zipcode = $row['or_deliv_zipcode'];		// 配送先郵便番号
				$deliv_address = $row['or_deliv_address1'];		// 配送先住所
				$deliv_address2 = $row['or_deliv_address2'];		// 配送先住所2
				$deliv_phone = $row['or_deliv_phone'];		// 配送先電話番号
				$deliv_fax = $row['or_deliv_fax'];		// 配送先FAX
				$deliv_email = $row['or_deliv_email'];		// 配送先Eメール
				$bill_name = $row['or_bill_name'];		// 請求先名
				$bill_name_kana = $row['or_bill_name_kana'];		// 請求先名(カナ)
				$bill_zipcode = $row['or_bill_zipcode'];		// 請求先郵便番号
				$bill_address = $row['or_bill_address1'];		// 請求先住所
				$bill_address2 = $row['or_bill_address2'];		// 請求先住所2
				$bill_phone = $row['or_bill_phone'];		// 請求先電話番号
				$bill_fax = $row['or_bill_fax'];		// 請求先FAX
				$bill_email = $row['or_bill_email'];		// 請求先Eメール
				$this->deliveryMethod = $row['or_deliv_method_id'];		// 選択中の配送方法
				$this->payMethod = $row['or_pay_method_id'];			// 選択中の支払い方法
				$this->custmState = $row['or_custm_state_id'];		// 顧客都道府県
				$this->delivState = $row['or_deliv_state_id'];		// 配送都道府県
				$this->billState = $row['or_bill_state_id'];		// 請求都道府県

				$this->orderStatus = $row['or_order_status'];		// 受注ステータス
				$this->currency	= $row['or_currency_id'];	// 通貨
				$subtotal = $row['or_subtotal'];		// 商品総額
				$delivFee = $row['or_deliv_fee'];		// 配送料
				$charge = $row['or_charge'];		// 手数料
				$total = $row['or_total'];		// 総額
				
				$demand_dt = $row['or_demand_dt'];	// 希望日
				$demand_time = $row['or_demand_time'];	// 希望時間帯
				if ($demand_dt != $this->gEnv->getInitValueOfDate() || !empty($demand_time)){
					$delivNote = '配達希望日：' . $this->convertToDispDate($demand_dt) . '&nbsp;' . $this->convertToDispString($demand_time);
				}
					
				$updateUser = $this->convertToDispString($row['lu_name']);	// 更新者
				$updateDt = $this->convertToDispDateTime($row['or_create_dt']);	// 更新日時
				
				// 受注商品を取得
				$this->db->getOrderDetailList($row['or_id'], array($this, 'orderItemLoop'));
			}
		}
		
		// 選択中の受注IDを設定
		if (empty($this->serialNo)){		// シリアル番号が空のときは新規とする
			$this->tmpl->addVar("_widget", "order_no", '新規');
			
			$this->tmpl->addVar("_widget", "new_selected", 'checked');// 新規追加をチェック状態にする
		} else {
			$this->tmpl->addVar("_widget", "order_no", $orderNo);
		}

		$this->tmpl->addVar("_widget", "name", $name);		// 顧客名
		$this->tmpl->addVar("_widget", "name_kana", $nameKana);		// 顧客名(カナ)
		$this->tmpl->addVar("_widget", "custm_email", $custm_email);		// Eメールアドレス
		$this->tmpl->addVar("_widget", "custm_zipcode", $custm_zipcode);		// 顧客郵便番号
		$this->tmpl->addVar("_widget", "custm_address", $custm_address);		// 顧客住所
		$this->tmpl->addVar("_widget", "custm_address2", $custm_address2);		// 顧客住所2
		$this->tmpl->addVar("_widget", "custm_phone", $custm_phone);		// 顧客電話番号
		$this->tmpl->addVar("_widget", "custm_fax", $custm_fax);		// 顧客FAX
		$this->tmpl->addVar("_widget", "custm_email", $custm_email);		// 顧客Eメール
		$this->tmpl->addVar("_widget", "deliv_note", $delivNote);		// 配送希望日
		
		$this->tmpl->addVar("_widget", "deliv_name", $deliv_name);		// 配送先名		
		$this->tmpl->addVar("_widget", "deliv_name_kana", $deliv_name_kana);		// 配送先名(カナ)	
		$this->tmpl->addVar("_widget", "deliv_zipcode", $deliv_zipcode);		// 配送先郵便番号
		$this->tmpl->addVar("_widget", "deliv_address", $deliv_address);		// 配送先住所
		$this->tmpl->addVar("_widget", "deliv_address2", $deliv_address2);		// 配送先住所2
		$this->tmpl->addVar("_widget", "deliv_phone", $deliv_phone);		// 配送先電話番号
		$this->tmpl->addVar("_widget", "deliv_fax", $deliv_fax);		// 配送先FAX
		$this->tmpl->addVar("_widget", "deliv_email", $deliv_email);		// 配送先Eメール
		$this->tmpl->addVar("_widget", "bill_name", $bill_name);		// 請求先名		
		$this->tmpl->addVar("_widget", "bill_name_kana", $bill_name_kana);		// 請求先名(カナ)
		$this->tmpl->addVar("_widget", "bill_zipcode", $bill_zipcode);		// 請求先郵便番号
		$this->tmpl->addVar("_widget", "bill_address", $bill_address);		// 請求先住所
		$this->tmpl->addVar("_widget", "bill_address2", $bill_address2);		// 請求先住所2
		$this->tmpl->addVar("_widget", "bill_phone", $bill_phone);		// 請求先電話番号
		$this->tmpl->addVar("_widget", "bill_fax", $bill_fax);		// 請求先FAX
		$this->tmpl->addVar("_widget", "bill_email", $bill_email);		// 請求先Eメール
		
		$subtotalStr = $this->ecObj->convertByCurrencyFormat($this->currency, $this->langId, $subtotal);
		$this->tmpl->addVar("_widget", "subtotal", $subtotalStr);		// 商品総額
		$delivFeeStr = $this->ecObj->convertByCurrencyFormat($this->currency, $this->langId, $delivFee);
		$this->tmpl->addVar("_widget", "delivery_fee", $delivFeeStr);		// 送料
		$chargeStr = $this->ecObj->convertByCurrencyFormat($this->currency, $this->langId, $charge);
		$this->tmpl->addVar("_widget", "charge", $chargeStr);		// 手数料
		$totalStr = $this->ecObj->convertByCurrencyFormat($this->currency, $this->langId, $total);
		$this->tmpl->addVar("_widget", "total", $totalStr);		// 総額
		
		if (!empty($updateUser)) $this->tmpl->addVar("_widget", "update_user", $updateUser);	// 更新者
		if (!empty($updateDt)) $this->tmpl->addVar("_widget", "update_dt", $updateDt);	// 更新日時

		// 受注ステータスメニューを作成
		$this->db->getAllOrderStatus($this->langId, array($this, 'orderStatusLoop'));
		
		// 顧客都道府県を設定
		$this->db->getAllState('JPN', $this->langId, array($this, 'customStateLoop'));
		
		// 配送先都道府県を設定
		$this->db->getAllState('JPN', $this->langId, array($this, 'delivStateLoop'));
		
		// 請求先都道府県を設定
		$this->db->getAllState('JPN', $this->langId, array($this, 'billStateLoop'));
		
		// 配送方法メニューを作成
		$this->db->getAllDelivMethod($this->langId, 0/*デフォルトのセットID*/, array($this, 'delivMethodLoop'));
				
		// 支払い方法メニューを作成
		$this->db->getAllPaymentMethod($this->langId, array($this, 'paymentMethodLoop'));
			
		// ボタンの設定
		if (empty($this->serialNo)){		// 新規追加項目を選択しているとき
			$this->tmpl->setAttribute('add_button', 'visibility', 'visible');// 「新規追加」ボタン
			$this->tmpl->setAttribute('add_button1', 'visibility', 'visible');// 「新規追加」ボタン
			$this->tmpl->setAttribute('add_button2', 'visibility', 'visible');// 「新規追加」ボタン
		} else {
			// データ更新、削除ボタン表示
			$this->tmpl->setAttribute('update_button', 'visibility', 'visible');
			$this->tmpl->setAttribute('update_button1', 'visibility', 'visible');
			$this->tmpl->setAttribute('update_button2', 'visibility', 'visible');
		}
		// 埋め込みパラメータの設定
		$this->tmpl->addVar("_widget", "serial", $this->serialNo);
		$this->tmpl->addVar("_widget", "admin_url", $this->getUrl($this->gEnv->getDefaultAdminUrl()));
		$this->tmpl->addVar('_widget', 'widget_id', $this->gEnv->getCurrentWidgetId());
		//$this->tmpl->addVar('_widget', 'product_widget_id', self::TARGET_PRODUCT_WIDGET);		// 商品表示用
	}
	/**
	 * 取得したデータをテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function orderListLoop($index, $fetchedRow, $param)
	{
		// 項目選択のラジオボタンの状態
		$selected = '';
		if ($fetchedRow['or_serial'] == $this->serialNo){
			$selected = 'checked';
		}

		// 購入金額
		$this->ecObj->setCurrencyType($this->currency, $this->langId);		// 通貨設定
		$this->ecObj->getPriceWithoutTax($fetchedRow['or_total'], $dispPrice);		// 表示文字列作成
		
		// 受注ステータス
		$orderStatus = $fetchedRow['or_order_status'];
		$ret = $this->db->getOrderStatusName($orderStatus, $this->langId, $row);
		if ($ret){
			if ($orderStatus < 400){
				$status = '<font color="red">' . $row['os_name'] . '</font>';		
			} else {// 配送済み、終了、キャンセル
				$status = '<font color="green">' . $row['os_name'] . '</font>';
			}
		}
			
		// 配送日時
		$delibDt = '';
		if ($fetchedRow['or_deliv_dt'] != $this->gEnv->getInitValueOfTimestamp()) $delibDt = $this->convertToDispDateTime($fetchedRow['or_deliv_dt']);
		
		// 会員ID
		$memberId = intval($fetchedRow['or_custm_id']);
		if ($memberId < 0) $memberId = $memberId * (-1);
		
		// 会員情報へのリンク
		$nameLink = $this->convertToDispString($fetchedRow['or_custm_name']);
		if (!empty($memberId)){
			$nameLink = '<a href="#" onclick="selMember(' . $memberId . ');">' . $nameLink . '</a>';
		}
		$row = array(
			'index' => $index,													// 行番号
			'serial' => $this->convertToDispString($fetchedRow['or_serial']),	// シリアル番号
			'id' => $memberId,			// 会員ID
			'order_no' => $this->convertToDispString($fetchedRow['or_order_no']),		// 受注番号
			'name' => $nameLink,		// 顧客名
			'total' => $dispPrice,		// 購入額
			'status' => $status,		// 受注ステータス
			'lang' => $lang,													// 対応言語
			'regist_dt' => $this->convertToDispDateTime($fetchedRow['or_regist_dt']),	// 受付日時
			'deliv_dt' => $delibDt,	// 配送日時
			'update_dt' => $this->convertToDispDateTime($fetchedRow['or_create_dt']),	// 更新日時
			'selected' => $selected												// 項目選択用ラジオボタン
		);
		$this->tmpl->addVars('itemlist', $row);
		$this->tmpl->parseTemplate('itemlist', 'a');
		
		// 表示中の項目のシリアル番号を保存
		$this->serialArray[] = $fetchedRow['or_serial'];
		return true;
	}
	/**
	 * 取得したデータをテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function orderItemLoop($index, $fetchedRow, $param)
	{
		// 行カラーの設定
		$lineColor = '';
		if ($index % 2 != 0){
			$lineColor = 'class="even"';		// 偶数行
		}
		
		$priceStatus = 1;	// 価格が有効であるかどうか
		$id = $fetchedRow['od_product_id'];	// 商品ID
		
		// 商品を取得
		$ret = $this->productDb->getProductByProductId($id, $this->langId, $row, $row2, $row3, $row4, $row5);
		if ($ret){
			$name = $this->convertToDispString($row['pt_name']);		// 名前
			$code = $this->convertToDispString($row['pt_code']);		// 商品コード
			
			// 商品の現在価格を取得
			// 価格を取得
			$priceArray = $this->getPrice($row2, self::STANDARD_PRICE);
			$price = $priceArray['pp_price'];	// 価格
			$currency = $priceArray['pp_currency_id'];	// 通貨
			$taxType = $row['pt_tax_type_id'];					// 税種別
					
			// 価格作成
			$this->ecObj->setCurrencyType($currency, $this->langId);		// 通貨設定
			$this->ecObj->setTaxType($taxType, $this->langId);		// 税種別設定
			$unitPrice = $this->ecObj->getPriceWithTax($price, $dispUnitPrice);	// 税込み価格取得
			
			// 商品が表示不可のときは価格を無効とする
			if (!$row['pt_visible']) $priceStatus = 0;
		} else {
			// 商品情報が取得できないときは価格無効
			$priceStatus = 0;
		}
		
		// 価格が変更のときは、価格を無効にする
		$quantity = $fetchedRow['od_quantity'];
		$subtotal = $fetchedRow['od_total'];
		
		// 通貨情報を取得
		$ret = $this->productDb->getCurrency($this->currency, $this->langId, $row);
		if ($ret){
			$prePrice = $this->convertToDispString($row['cu_symbol']);
			$postPrice = $this->convertToDispString($row['cu_post_symbol']);
		}
		
		// 価格作成
		$this->ecObj->setCurrencyType($this->currency, $this->langId);		// 通貨設定
		$this->ecObj->getPriceWithoutTax($subtotal, $dispPrice);		// 小計の表示文字列作成
		
		// 小計価格
		$available = '';
		if ($priceStatus == 0) $available = '(無効)';
		$price = $prePrice . $dispPrice . $available;
		
		// 商品詳細へのリンク
		$url  = '?' . M3_REQUEST_PARAM_OPERATION_COMMAND . '=' . M3_REQUEST_CMD_FIND_WIDGET;
		//$url .= '&' . M3_REQUEST_PARAM_WIDGET_ID . '=' . $this->gEnv->getCurrentWidgetId();
		$url .= '&' . M3_REQUEST_PARAM_WIDGET_ID . '=' . self::TARGET_PRODUCT_WIDGET;
		$url .= '&' . M3_REQUEST_PARAM_FROM . '=' . $this->gEnv->getCurrentWidgetId();		// 送信元
		$url .= '&' . M3_REQUEST_PARAM_OPERATION_TODO . '=' . urlencode('product=' . $fetchedRow['si_product_id']);
			
		$nameLink = '<a href="' . $this->getUrl($url, true) . '">' . $name . '</a>';
		$row = array(
			'line_color' => $lineColor,											// 行のカラー
			'no' => $index + 1,													// 行番号
			'name' => $name,
			'code' => $code,
			'unit_price' => $dispUnitPrice,			// 税込み単価
			'id' => $id,					// 商品ID
			'price' => $price,
			'quantity' => $quantity,
			'price_status' => $priceStatus		// 商品価格が有効かどうか
		);
		$this->tmpl->addVars('product_list', $row);
		$this->tmpl->parseTemplate('product_list', 'a');
		
		$this->productExists = true;			// カートに商品があるかどうか
		return true;
	}
	/**
	 * 価格取得
	 *
	 * @param array  	$srcRows			価格リスト
	 * @param string	$priceType			価格のタイプ
	 * @return array						取得した価格行
	 */
	function getPrice($srcRows, $priceType)
	{
		for ($i = 0; $i < count($srcRows); $i++){
			if ($srcRows[$i]['pp_price_type_id'] == $priceType){
				return $srcRows[$i];
			}
		}
		return array();
	}
	/**
	 * 取得した配送先都道府県をテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function customStateLoop($index, $fetchedRow, $param)
	{
		$selected = '';
		if ($fetchedRow['gz_id'] == $this->custmState){		// 選択中の都道府県
			$selected = 'selected';
		}

		$row = array(
			'value'    => $this->convertToDispString($fetchedRow['gz_id']),			// ID
			'name'     => $this->convertToDispString($fetchedRow['gz_name']),			// 表示名
			'selected' => $selected														// 選択中かどうか
		);
		$this->tmpl->addVars('custm_state_list', $row);
		$this->tmpl->parseTemplate('custm_state_list', 'a');
		return true;
	}
	/**
	 * 取得した配送先都道府県をテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function delivStateLoop($index, $fetchedRow, $param)
	{
		$selected = '';
		if ($fetchedRow['gz_id'] == $this->delivState){		// 選択中の都道府県
			$selected = 'selected';
		}

		$row = array(
			'value'    => $this->convertToDispString($fetchedRow['gz_id']),			// ID
			'name'     => $this->convertToDispString($fetchedRow['gz_name']),			// 表示名
			'selected' => $selected														// 選択中かどうか
		);
		$this->tmpl->addVars('deliv_state_list', $row);
		$this->tmpl->parseTemplate('deliv_state_list', 'a');
		return true;
	}
	/**
	 * 取得した請求先都道府県をテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function billStateLoop($index, $fetchedRow, $param)
	{
		$selected = '';
		if ($fetchedRow['gz_id'] == $this->billState){		// 選択中の都道府県
			$selected = 'selected';
		}

		$row = array(
			'value'    => $this->convertToDispString($fetchedRow['gz_id']),			// ID
			'name'     => $this->convertToDispString($fetchedRow['gz_name']),			// 表示名
			'selected' => $selected														// 選択中かどうか
		);
		$this->tmpl->addVars('bill_state_list', $row);
		$this->tmpl->parseTemplate('bill_state_list', 'a');
		return true;
	}
	/**
	 * 取得した配送方法をテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	 /*
	function deliveryMethodLoop($index, $fetchedRow, $param)
	{
		$selected = '';
		if ($fetchedRow['dm_id'] == $this->deliveryMethod){		// 選択中の配送方法
			$selected = 'selected';
		}

		$row = array(
			'value'    => $this->convertToDispString($fetchedRow['dm_id']),			// ID
			'name'     => $this->convertToDispString($fetchedRow['dm_name']),			// 表示名
			'selected' => $selected														// 選択中かどうか
		);
		$this->tmpl->addVars('delivery_method_list', $row);
		$this->tmpl->parseTemplate('delivery_method_list', 'a');
		return true;
	}*/
	/**
	 * 取得した配送方法をテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function delivMethodLoop($index, $fetchedRow, $param)
	{
		//$checked = '';
		$selected = '';
		if ($fetchedRow['do_id'] == $this->deliveryMethod){		// 選択中の配送方法
			//$checked = 'checked';
			$selected = 'selected';
		}

		// 配送料金を求める
		$iWidgetId	= $fetchedRow['do_iwidget_id'];	// インナーウィジェットID
		if (!empty($iWidgetId)){
			// パラメータをインナーウィジェットに設定し、計算結果を取得
			if ($this->calcIWidgetParam($iWidgetId, $fetchedRow['do_id'], $fetchedRow['do_param'], $optionParam, $resultObj)){
				$price = $resultObj->price;		// 配送料金
			}
		}
					
		$row = array(
			'value'		=> $this->convertToDispString($fetchedRow['do_id']),			// ID
			'name'		=> $this->convertToDispString($fetchedRow['do_name']),		// 表示名
			'desc'		=> $fetchedRow['do_description'],							// 説明
			'price'		=> $price,							// 配送料金
			'def_content'		=> $content,		// ユーザ選択用コンテンツ
			'selected' => $selected														// 選択中かどうか
		);
		$this->tmpl->addVars('deliv_method_list', $row);
		$this->tmpl->parseTemplate('deliv_method_list', 'a');
		return true;
	}
	/**
	 * 取得した支払い方法をテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function paymentMethodLoop($index, $fetchedRow, $param)
	{
		$selected = '';
		if ($fetchedRow['po_id'] == $this->payMethod){		// 選択中の支払い方法
			$selected = 'selected';
		}

		$row = array(
			'value'    => $this->convertToDispString($fetchedRow['po_id']),			// ID
			'name'     => $this->convertToDispString($fetchedRow['po_name']),			// 表示名
			'selected' => $selected														// 選択中かどうか
		);
		$this->tmpl->addVars('payment_method_list', $row);
		$this->tmpl->parseTemplate('payment_method_list', 'a');
		return true;
	}
	/**
	 * 受注ステータスをテンプレートに設定する
	 *
	 * @param int $index			行番号(0～)
	 * @param array $fetchedRow		フェッチ取得した行
	 * @param object $param			未使用
	 * @return bool					true=処理続行の場合、false=処理終了の場合
	 */
	function orderStatusLoop($index, $fetchedRow, $param)
	{
		$selected = '';
		if ($fetchedRow['os_id'] == $this->orderStatus){		// 受注ステータス
			$selected = 'selected';
		}

		$row = array(
			'value'    => $this->convertToDispString($fetchedRow['os_id']),			// ID
			'name'     => $this->convertToDispString($fetchedRow['os_name']),			// 表示名
			'selected' => $selected														// 選択中かどうか
		);
		$this->tmpl->addVars('order_status_list', $row);
		$this->tmpl->parseTemplate('order_status_list', 'a');
		return true;
	}
}
?>
