/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：DKW03201SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年11月10日
*＜機能概要＞
 * 未返却一覧照会画面を処理するロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/11/10   FJ          新規作成
*   v5.00.00    2013/10/31   FJ          OM-2013-0003814(最大件数指定方法変更に伴う画面ID設定)
*   v5.00.01	2013/11/12	 FJ          OM-2013-0004060 性能改善（タイムアウトエラーのハンドリング追加）
**********************************************************************/
package eo.web.webview.DKW03201SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JPCModelConstant.*;
import static eo.web.webview.DKW03201SF.DKW03201SFConst.*;
import static eo.web.webview.common.JDKScreenConst.*;
import static eo.web.webview.common.JDKWebCommon.*;
import static eo.common.constant.JDKStrConst.*;
import static eo.common.util.JDKCommonUtil.*;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31SRuntimeException;

import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JDKCommonUtil;
import eo.common.util.JPCDateUtil;
import eo.common.util.JPCEditString;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.DKW03202SF.DKW03202SFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.mapping.DKSV0021_DKSV0021OPDBMapper;
import eo.web.webview.mapping.DKSV0022_DKSV0022OPDBMapper;

/**
 * 未返却一覧照会画面を処理するロジッククラスです。
 * @author 富士通
 */
public class DKW03201SFLogic extends JCCWebBusinessLogic
{
	/** シリアル番号 */
	private static final long serialVersionUID = 1L;
	/** ファイル名 */
	private static final String CSV_FILE_NAME = "未返却データ.csv";
	
	/** セッションに保管する文字列データのキー */
	private static final String [] SEARCH_CONDITION_KEIES = {SEARCH_BTRYHOZN_NO
																, SEARCH_HMPIN_DIV
																, SEARCH_HMPIN_UK_YMD_FROM
																, SEARCH_HMPIN_UK_YMD_TO
																, SEARCH_KIKI_SEIZO_NO
																, SEARCH_MDL_NO
																, SEARCH_PRC_GRP_CD
																, SEARCH_SVC_KEI_NO
																};
	
	/** 明細項目と詳細画面項目のひも付け */
	private static final Map<String, String> DETAIL_MAP = new HashMap<String, String>();
	static
	{
		DETAIL_MAP.put(DKW03202SFConst.SVC_KEI_NO, LOAD_OYA_SVKEI_NO_03);
		DETAIL_MAP.put(DKW03202SFConst.PRC_GRP_CD_NM, PRC_GRP_CD_NM_03);
		DETAIL_MAP.put(DKW03202SFConst.SYSID, SYSID_03);
		DETAIL_MAP.put(DKW03202SFConst.KEISHA_NM, KEISHA_NM_03);
		DETAIL_MAP.put(DKW03202SFConst.KEISHA_PCD, PCD_03);
		DETAIL_MAP.put(DKW03202SFConst.KEISHA_TELNO, HISOS_TELNO_03);
		DETAIL_MAP.put(DKW03202SFConst.HMPIN_DIV_NM, HMPIN_DIV_NM_03);
		DETAIL_MAP.put(DKW03202SFConst.BTRYHOZN_NO, BTRYHOZN_NO_03);
		DETAIL_MAP.put(DKW03202SFConst.SHUKKA_LOT_NO, SHUKKA_LOT_NO_03);
		DETAIL_MAP.put(DKW03202SFConst.MODEL_NO, MODEL_NO_03);
		DETAIL_MAP.put(DKW03202SFConst.ITEM_NM, ITEM_NM_03);
		DETAIL_MAP.put(DKW03202SFConst.KIKI_SEIZO_NO, KIKI_SEIZO_NO_03);
		DETAIL_MAP.put(DKW03202SFConst.KKTK_SBT_CD_NM, KKTK_SBT_NM_03);


	}
	
	/** プルダウンの項目名 */
	private static final String [] PULLDOWNS = {HMPIN_DIV_INFO, PRC_GRP_INFO, MODEL_INFO};
	
	/**
	 * 初期表示を処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		setNextScreen(SCREEN_ID_DKW03201, SCREEN_NAME_DKW03201);
		X31SDataBeanAccess[] paramBean = {bean};
		
		HashMap<String, String> paramMap = new HashMap<String, String>();
		HashMap<String, String> inputMap = new HashMap<String, String>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "DKSV0021");
		
		DKSV0021_DKSV0021OPDBMapper mapper = new DKSV0021_DKSV0021OPDBMapper();
		mapper.setDKSV002101SC(paramBean, outputMap, FUNC_CD_1);
		mapper.setDKSV002102SC(paramBean, outputMap, FUNC_CD_1);
		mapper.setDKSV002103SC(paramBean, outputMap, FUNC_CD_1);

		invokeService(paramMap, inputMap, outputMap);

		mapper.getDKSV002101SC(paramBean, outputMap);
		mapper.getDKSV002102SC(paramBean, outputMap);
		mapper.getDKSV002103SC(paramBean, outputMap);
		
		//HMPIN_DIV_INFOは必須項目だから空欄を入れない
		for (String pulldown : new String [] {PRC_GRP_INFO, MODEL_INFO})
		{
			pushEmptyToTopOfPulldown(pulldown, CD_LIST_01, NM_LIST_01);
		}
		appendPrefix(getBean(this, HMPIN_DIV_INFO), NM_LIST_01);
		setScreenMode(0);
		
		if (!restoreConditionFromSession())
		{
			//返品年月日の設定
			setStaEndYmd();
			
			return true;
		}
		
		restoreSearchCondition();
		if (!innerSearch(FUNC_CD_1, MIHENKYAKU_LIST))
		{
			return true;
		}
		
		setScreenMode(1);
		
		String selectedNo = getData(this, SELECTED_CD);
		X31SDataBeanAccessArray list = getServiceFormBean().getDataBeanArray(MIHENKYAKU_LIST);
		int length = list.getCount();
		for (int i = 0; i < length; i++)
		{
			String noOnLine = getData(list.getDataBean(i), HMPIN_KIKI_NO_03);
			if (noOnLine.equals(selectedNo))
			{
				setData(this, (long)i, SELECTED_INDEX);
				break;
			}
		}
		
		return true;
	}
	

	/**
	 * 検索ボタンを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean search() throws Exception
	{
		storeSearchCondition();
		JCCWebCommon.clearPageLinkInfo(this, SCREEN_ID_DKW03201);
		boolean gotResults = innerSearch(FUNC_CD_1, MIHENKYAKU_LIST);
		setScreenMode(gotResults ? 1 : 0);
		setNextScreen(SCREEN_ID_DKW03201, SCREEN_NAME_DKW03201);
		return true;
	}

	/**
	 * ページングを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean paging() throws Exception
	{
		innerSearch(FUNC_CD_1, MIHENKYAKU_LIST);
		setNextScreen(SCREEN_ID_DKW03201, SCREEN_NAME_DKW03201);
		return true;
	}


	/**
	 * CSV出力ボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean outputCsv() throws Exception
	{
		innerSearch(FUNC_CD_2, MIHENKYAKU_CSV_LIST);
		JCCWebCommon.setTempDownloadFile(this, buildFile().getBytes(CHAR_SET_WIN31J), CSV_FILE_NAME);
		getServiceFormBean().getDataBeanArray(MIHENKYAKU_CSV_LIST).clearArray();
		return true;
	}
	

	/**
	 * クリアボタン押下イベントを処理します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean clear() throws Exception
	{
		setData(this, "", HMPIN_UK_YMD_FROM, YEAR_02);
		setData(this, "", HMPIN_UK_YMD_FROM, MON_02);
		setData(this, "", HMPIN_UK_YMD_FROM, DAY_02);
		setData(this, "", HMPIN_UK_YMD_TO, YEAR_02);
		setData(this, "", HMPIN_UK_YMD_TO, MON_02);
		setData(this, "", HMPIN_UK_YMD_TO, DAY_02);

		setData(this, "", SVC_KEI_NO);
		setData(this, "", KIKI_SEIZO_NO);
		setData(this, "", BTRYHOZN_NO);

		for (String pulldown : PULLDOWNS)
		{
			setData(this, 0L, pulldown, INDEX_01);
		}
		
		getServiceFormBean().getDataBeanArray(MIHENKYAKU_LIST).clearArray();
		
		storeSearchCondition();
		return init();
	}
	
	
	/**
	 * 未返却機器詳細へ遷移します。
	 * @return 成否
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	public boolean detail() throws Exception
	{
		JCCWebCommon.setScreenId(this, SCREEN_ID_DKW03202, getGamenId());
		
		HashMap detailMap = new HashMap();
		
		JCCWebCommon.setScreenInfo(this, SCREEN_ID_DKW03202, detailMap);
		Set<String> keies = DETAIL_MAP.keySet();
		for (String key : keies)
		{
			detailMap.put(key, getData(getSelectedRecord(), DETAIL_MAP.get(key)));
		}
		detailMap.put(DKW03202SFConst.KEISHA_AD, join("", getData(getSelectedRecord(), ADDRESS_STATE_NM_03),
														getData(getSelectedRecord(), ADDRESS_CITY_NM_03),
														getData(getSelectedRecord(), ADDRESS_OAZTSU_NM_03),
														getData(getSelectedRecord(), ADDRESS_AZCHO_NM_03),
														getData(getSelectedRecord(), ADDRESS_BNCHIGO_03),
														getData(getSelectedRecord(), ADDRESS_ADRTTM_03),
														getData(getSelectedRecord(), ADDRESS_ADRRM_03)));
		detailMap.put(DKW03202SFConst.RETURN_SCREEN_ID, SCREEN_ID_DKW03201);
		detailMap.put(DKW03202SFConst.RETURN_SCREEN_NM, SCREEN_NAME_DKW03201);
		
		HashMap myMap = new HashMap();
		for (String key : SEARCH_CONDITION_KEIES)
		{
			myMap.put(key, getData(this, key));
		}
		myMap.put(SELECTED_CD, getData(getSelectedRecord(), HMPIN_KIKI_NO_03));
		JCCWebCommon.setScreenInfo(this, SCREEN_ID_DKW03201, myMap);

		setNextScreen(SCREEN_ID_DKW03202, SCREEN_NAME_DKW03202);
		
		return true;
	}
	
	/**
	 * 選択されたレコードを取得します。
	 * @return 返品機器番号
	 */
	private X31SDataBeanAccess getSelectedRecord()
	{
		Long index = getDataL(this, SELECTED_INDEX);
		return getServiceFormBean().getDataBeanArray(MIHENKYAKU_LIST).getDataBean(index.intValue());
	}
	


	/**
	 * 検索処理を実行します。
	 * @param functionCode 機能コード
	 * @param listName サービスからの返り値を受ける項目名
	 * @return 検索処理の成功:true 失敗:false
	 * @throws Exception 例外
	 */
	private boolean innerSearch(String functionCode, String listName) throws Exception 
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = {bean};
		
		HashMap<String, String> paramMap = new HashMap<String, String>();
		HashMap<String, String> inputMap = new HashMap<String, String>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		inputMap.put("gamenId", SCREEN_ID_DKW03201);
		
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "DKSV0022");

		DKSV0022_DKSV0022OPDBMapper mapper = new DKSV0022_DKSV0022OPDBMapper();
		mapper.setDKSV002201SC(paramBean, inputMap, functionCode);

		JCCWebCommon.upmapperPageLinkInfo(this, "DKSV002201CC", inputMap, SCREEN_ID_DKW03201);
		
		// 処理前の時間を取得
		long searchStartTime = System.currentTimeMillis();
		
		try {
			// 検索処理呼出
			invokeService(paramMap, inputMap, outputMap);
		} catch (X31SRuntimeException ex) {
			if (System.currentTimeMillis() - searchStartTime > 240000)
			{
				JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBD840__I);
				return false;
			}
			else
			{
				throw ex;
			}
		}
		
		JCCWebCommon.downmapperPageLinkInfo(this, "DKSV002201CC", outputMap, SCREEN_ID_DKW03201);
		
		mapper.getDKSV002201SC(paramBean, outputMap, listName);

		String searchErrFlg = JCCWebCommon.getSearchErrFlg("DKSV002201CC", outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
		{
			DEBUG_LOG.debug("検索結果0件");
			JCCWebCommon.setMessageInfo(this, "EKB0330--I");
			return false;
		}
		else if (JPCModelConstant.SEARCH_ERR_FLG_OVERMAX.equals(searchErrFlg))
		{
			DEBUG_LOG.debug(String.format("検索結果%s件以上", JCCWebCommon.getSearchConst("DKW03201_MAX_SHOW_CNT")));
			JCCWebCommon.setMessageInfo(this, "EKB0340--I", new String [] {JCCWebCommon.getSearchConst("DKW03201_MAX_SHOW_CNT")});
			return false;
		}
		else if (JPCModelConstant.SEARCH_ERR_FLG_NODATA.equals(searchErrFlg))
		{
			DEBUG_LOG.debug(String.format("データが見つからない"));
			if (getCommonInfoBean().getDataBeanArray(CommonInfoCFConst.MESSAGES_LIST).getCount() == 0)
			{
				JCCWebCommon.setMessageInfo(this, "EKB0350--I");
			}
		}
		
		JCCWebCommon.setSearchCommand(this, "L_PAG");
		setData(this, 0L, SELECTED_INDEX);
		adjustList();
		
		return true;
	}
	

	
	/**
	 * 検索結果の一覧の表示調整をします。
	 * @throws Exception 例外
	 */
	private void adjustList() throws Exception
	{
		X31SDataBeanAccessArray list = getServiceFormBean().getDataBeanArray(MIHENKYAKU_LIST);
		int size = list.getCount();
		for (int i = 0 ; i < size ; i++) 
		{
			X31SDataBeanAccess data = list.getDataBean(i);

			setData(data, Integer.toString(i + 1), NO_03);
			setData(data, ((i + 1) % 2 == 0) ? "even" : "odd", COLOR_03);

			setData(data, substr(getData(data, KEISHA_NM_03), 0, 5), DISP_KEISHA_NM_03);
			setData(data, substr(getData(data, PRC_GRP_CD_NM_03), 0, 12), DISP_PRC_GRP_CD_NM_03);
			
			setData(data, isNull(getData(data, DSL_SOD_SEND_YMD_03)) ? "未発行" : "発行済", DSL_SOD_03);
		}
	}
	
	
	/**
	 * 画面入力値を検索条件に設定します。
	 */
	private void storeSearchCondition()
	{
		for (String pulldown : PULLDOWNS)
		{
			storePullDown(this, pulldown, INDEX_01, CD_01, NM_01, CD_LIST_01, NM_LIST_01);
		}

		setData(this,	getData(this, HMPIN_UK_YMD_FROM, YEAR_02) + 
						getData(this, HMPIN_UK_YMD_FROM, MON_02) + 
						getData(this, HMPIN_UK_YMD_FROM, DAY_02), SEARCH_HMPIN_UK_YMD_FROM);
		setData(this, 	getData(this, HMPIN_UK_YMD_TO, YEAR_02) + 
						getData(this, HMPIN_UK_YMD_TO, MON_02) + 
						getData(this, HMPIN_UK_YMD_TO, DAY_02), SEARCH_HMPIN_UK_YMD_TO);
		
		setData(this, getData(this, HMPIN_DIV_INFO, CD_01), SEARCH_HMPIN_DIV);
		setData(this, getData(this, PRC_GRP_INFO, CD_01), SEARCH_PRC_GRP_CD);
		setData(this, getData(this, MODEL_INFO, CD_01), SEARCH_MDL_NO);

		setData(this, getData(this, KIKI_SEIZO_NO), SEARCH_KIKI_SEIZO_NO);
		setData(this, getData(this, SVC_KEI_NO), SEARCH_SVC_KEI_NO);
		setData(this, getData(this, BTRYHOZN_NO), SEARCH_BTRYHOZN_NO);
	}
	

	/**
	 * セッションに格納した検索条件を復元します。
	 * @return 成否
	 */
	@SuppressWarnings("unchecked")
	private boolean restoreConditionFromSession()
	{
		HashMap map = JCCWebCommon.getScreenInfo(this);
		if (map == null)
		{
			return false;
		}

		for (String key : SEARCH_CONDITION_KEIES)
		{
			setData(this, (String)map.get(key), key);
		}
		if (map.containsKey(SELECTED_CD))
		{
			setData(this, map.get(SELECTED_CD).toString(), SELECTED_CD);
		}
		
		return true;
	}
	
	
	/**
	 * 前回検索時の検索条件を復元します。
	 */
	private void restoreSearchCondition()
	{
		initCalendar(SEARCH_HMPIN_UK_YMD_FROM, HMPIN_UK_YMD_FROM);
		initCalendar(SEARCH_HMPIN_UK_YMD_TO, HMPIN_UK_YMD_TO);

		setData(this, getData(this, SEARCH_SVC_KEI_NO), SVC_KEI_NO);
		setData(this, getData(this, SEARCH_KIKI_SEIZO_NO), KIKI_SEIZO_NO);
		setData(this, getData(this, SEARCH_BTRYHOZN_NO), BTRYHOZN_NO);

		initPulldownIndexByCode(MODEL_INFO, getData(this, SEARCH_MDL_NO));
		initPulldownIndexByCode(HMPIN_DIV_INFO, getData(this, SEARCH_HMPIN_DIV));
		initPulldownIndexByCode(PRC_GRP_INFO, getData(this, SEARCH_PRC_GRP_CD));
	}
	
	
	/**
	 * 検索条件からカレンダの入力を初期化します
	 * @param searchKeyLabel 日付情報が格納された検索キー
	 * @param calendarLabel 入力データを格納するキー
	 */
	private void initCalendar(String searchKeyLabel, String calendarLabel)
	{
		String ymd = getData(this, searchKeyLabel);
		if (JDKCommonUtil.isNull(ymd))
		{
			return;
		}

		setData(this, substr(ymd, 0, 4), calendarLabel, YEAR_02);
		setData(this, substr(ymd, 4, 6), calendarLabel, MON_02);
		setData(this, substr(ymd, 6, 8), calendarLabel, DAY_02);
	}
	
	
	/**
	 * 検索条件からプルダウンの初期値を設定します。
	 * @param pulldownLabel プルダウンの項目名
	 * @param code 初期化するコード値
	 */
	private void initPulldownIndexByCode(String pulldownLabel, String code)
	{
		if (JDKCommonUtil.isNull(code))
		{
			return;
		}
		
		X31SDataBeanAccess pulldown = getServiceFormBean().getDataBeanArray(pulldownLabel).getDataBean(0);
		int length = (Integer)pulldown.sendMessage(CD_LIST_01, X31CWebConst.DATABEAN_GET_COUNT);
		for (int i = 0; i < length; i++)
		{
			String test = pulldown.sendMessageString(CD_LIST_01, X31CWebConst.DATABEAN_GET_VALUE, i);
			if (test.equals(code))
			{
				setData(this, (long)i, pulldownLabel, INDEX_01);
				return;
			}
		}
	}
	
	

	/**
	 * 画面遷移先を設定します。
	 * @param nextScreenId 遷移先画面ＩＤ
	 * @param nextScreenName 遷移先画面名
	 */
	private void setNextScreen(String nextScreenId, String nextScreenName)
	{
		X31SDataBeanAccess  commoninfoBean = super.getCommonInfoBean();
	
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		DEBUG_LOG.debug(String.format("遷移先 CD：%s NM：%s", nextScreenId, nextScreenName));
	}
	

	/**
	 * プルダウンの０番目の項目に空白を挿入します。
	 * @param pulldown プルダウンを指す項目ID
	 * @param cdList プルダウン中でコード一覧をさす項目ID
	 * @param nmList プルダウン中で名称一覧をさす項目ID
	 * @param pushString 追加する文字列
	 */
	private void pushEmptyToTopOfPulldown(String pulldown, String cdList, String nmList)
	{
		X31SDataBeanAccess pulldownBean = super.getServiceFormBean().getDataBeanArray(pulldown).getDataBean(0);

		appendPrefix(getBean(this, pulldown), nmList);
		
		slideArrayOnDatabean(pulldownBean, cdList, "");
		slideArrayOnDatabean(pulldownBean, nmList, "");
	}
	
	
	/**
	 * データビーンの配列要素をインデックスが増加する方向に１つずらす
	 * @param bean データビーン
	 * @param listName 対象項目ID
	 * @param pushString 追加する文字列
	 */
	private void slideArrayOnDatabean(X31SDataBeanAccess bean, String listName, String pushString)
	{
		int size = (Integer)(bean.sendMessage(listName, X31CWebConst.DATABEAN_GET_COUNT));
		
		bean.sendMessageString(listName, X31CWebConst.DATABEAN_ADD_VALUE, "");
		
		for (int i = size ; i > 0 ; i--)
		{
			String target = bean.sendMessageString(listName, X31CWebConst.DATABEAN_GET_VALUE, i - 1);
			bean.sendMessageString(listName, X31CWebConst.DATABEAN_SET_VALUE, i, target);
		}
		
		bean.sendMessageString(listName, X31CWebConst.DATABEAN_SET_VALUE, 0, pushString);
	}
	

	/**
	 * スクリーンモードを設定します。
	 * @param mode スクリーンモード
	 */
	private void setScreenMode(long mode)
	{
		setData(this, mode, SCREEN_MODE);
		DEBUG_LOG.debug(String.format("画面モードを %d に設定します", mode));
	}
	
	
	
	/**
	 * 返品データファイルを生成します。
	 * @return 返品データファイル
	 * @throws Exception 例外
	 */
	private String buildFile() throws Exception
	{
		X31SDataBeanAccessArray datas = getServiceFormBean().getDataBeanArray(MIHENKYAKU_CSV_LIST);
		
		StringBuffer bodyRecords = new StringBuffer();
		int size = datas.getCount();
		for (int i = 0 ; i < size ; i++)
		{
			if (bodyRecords.length() > 0)
			{
				bodyRecords.append(LINE_SEPARATOR);
			}
			bodyRecords.append(buildDataRecord(datas.getDataBean(i), i + 1));
		}
		
		String file = join(LINE_SEPARATOR,
							buildHeaderRecord(),
							bodyRecords.toString());

		DEBUG_LOG.debug(String.format("ファイル内容：%s", file));
		
		return file;
	}
	
	
	/**
	 * 返品データ.csvのヘッダ行を生成します。
	 * @return ヘッダ文字列
	 */
	private String buildHeaderRecord()
	{
		return join(",",
					dqot("作成日"),
					dqot("サービス契約番号"),
					dqot("契約者名"),
					dqot("契約サービス"),
					dqot("返品区分"),
					dqot("型番号"),
					dqot("製造番号"),
					dqot("修理受付番号"),
					dqot("STBID"),
					dqot("連絡先TEL"));
	}
	
	
	/**
	 * 返品データファイルのデータレコードを生成します。
	 * @param data 行データ
	 * @param index 行番号
	 * @return 返品データファイルのデータレコード
	 */
	private String buildDataRecord(X31SDataBeanAccess data, int index) 
	{
		return join(",",
					dqot(getData(data, HMPIN_UK_YMD_03)),			//作成日
					dqot(getData(data, LOAD_OYA_SVKEI_NO_03)),		//サービス契約番号
					dqot(getData(data, KEISHA_NM_03)),				//契約者名
					dqot(getData(data, PRC_GRP_CD_NM_03)),			//契約サービス
					dqot(getData(data, HMPIN_DIV_NM_03)),			//返品区分(返品区分名称)
					dqot(getData(data, MODEL_NO_03)),				//型番号
					dqot(getData(data, KIKI_SEIZO_NO_03)),			//製造番号
					dqot(getData(data, BTRYHOZN_NO_03)),			//修理受付番号
					dqot(getData(data, STBID_03)),					//STBID
					dqot(getData(data, HISOS_TELNO_03)));			//連絡先TEL
	}
	
	/**
	 * 返品年月日の設定を行う。
	 */
	private void setStaEndYmd()
	{
		// 運用日付を取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		
		// 運用日付−３０日を取得
		String shuriUkYmdFrom = JPCDateUtil.addDay(opeDate, -30);
		
		//返品受付年月日ＦＲＯＭ、返品受付年月日ＴＯの設定
		setData(this, JPCEditString.toYearFromYmd(shuriUkYmdFrom), HMPIN_UK_YMD_FROM, YEAR_02);
		setData(this, JPCEditString.toMonthFromYmd(shuriUkYmdFrom), HMPIN_UK_YMD_FROM, MON_02);
		setData(this, JPCEditString.toDayFromYmd(shuriUkYmdFrom), HMPIN_UK_YMD_FROM, DAY_02);
		setData(this, JPCEditString.toYearFromYmd(opeDate), HMPIN_UK_YMD_TO, YEAR_02);
		setData(this, JPCEditString.toMonthFromYmd(opeDate), HMPIN_UK_YMD_TO, MON_02);
		setData(this, JPCEditString.toDayFromYmd(opeDate), HMPIN_UK_YMD_TO, DAY_02);
	}
	
	/**
	 * 文字列をダブルクォーテッドする
	 * @param src 囲まれる文字列
	 * @return \"囲まれる文字列\"
	 */
	private String dqot(String src)
	{
		return String.format("\"%s\"", src);
	}
}
