/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：DKW00306SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年07月20日
*＜機能概要＞
 * 返品エラーリスト一覧照会画面を処理するロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/20   FJ          新規作成
*
**********************************************************************/
package eo.web.webview.DKW00306SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JDKStrConst;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import static eo.web.webview.common.JDKScreenConst.*;
import static eo.web.webview.common.JDKWebCommon.*;
import eo.web.webview.mapping.DKSV0085_DKSV0085OPDBMapper;
import static eo.web.webview.DKW00306SF.DKW00306SFConst.*;
import static eo.common.constant.JPCModelConstant.*;
import static eo.common.util.JDKCommonUtil.join;


/**
 * 返品エラーリスト一覧照会画面を処理するロジッククラスです。
 * @author 富士通
 */
public class DKW00306SFLogic extends JCCWebBusinessLogic
{
	/** シリアル番号 */
	private static final long serialVersionUID = 1L;
	// CSV関連
	/** データ行 */
	private static final String RECORD_TRAILER = "83";
	/** トレーラー */
	private static final String RECORD_DATA = "81";
	
	/** ファイル名 */
	private static final String CSV_FILE_NAME = "返品エラーリスト.csv";
	
	// サービス
	/** 返品エラーリスト一覧照会 */
	private static final String DKSV0085 = "DKSV0085";
	/** CC名 */
	private static final String DKSV008501CC = "DKSV008501CC";
	
	/**
	 * 初期化処理を行います。
	 * @return 処理実行結果
	 */
	public boolean init() 
	{
		setNextScreen(SCREEN_ID_DKW00306, SCREEN_NAME_DKW00306);
		getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST).clearArray();
		innerSearch(FUNC_CD_1, SEARCH_RSLT_LIST, true);
		return true;
	}
	
	/**
	 * ページング処理を行います。
	 * @return 処理実行結果
	 */
	public boolean paging()
	{

		getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST).clearArray();
		innerSearch(FUNC_CD_1, SEARCH_RSLT_LIST, true);
		return true;
	}
	
	/**
	 * CSV出力ボタン押下処理を行います。
	 * @return 処理実行結果
	 */
	public boolean outputCsv() throws Exception
	{
		innerSearch(FUNC_CD_2, SEARCH_RSLT_LIST_CSV, false);
		JCCWebCommon.setTempDownloadFile(this, buildCsvFile().getBytes(JDKStrConst.CHAR_SET_WIN31J), CSV_FILE_NAME);
		
		getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST_CSV).clearArray();
		return true;
	}
	

	
	/**
	 * 返品エラーリストを検索します。
	 * @param functionCode 機能コード
	 * @param listName 取得先のデータビーン項目名称
	 * @return エラーが起こった場合:true エラーがない場合:false
	 */
	@SuppressWarnings("unchecked")
	private boolean innerSearch(String functionCode, String listName, boolean withPaging)
	{
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		X31SDataBeanAccess[] paramBean = {bean};
		
		HashMap paramMap = new HashMap();
		HashMap inputMap = new HashMap();
		HashMap outputMap = new HashMap();

		bean.getDataBeanArray(listName).clearArray();

		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, DKSV0085);
		
		DKSV0085_DKSV0085OPDBMapper mapper = new DKSV0085_DKSV0085OPDBMapper();
		mapper.setDKSV008501CC(paramBean, inputMap, functionCode);
		if (withPaging)
		{
			JCCWebCommon.upmapperPageLinkInfo(this, DKSV008501CC, inputMap);
		}

		X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);
		
		if(msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return true;
		}

		mapper.getDKSV008501CC(paramBean, outputMap, listName, functionCode);
		if (withPaging)
		{
			JCCWebCommon.downmapperPageLinkInfo(this, DKSV008501CC, outputMap);
		}
		
		String searchErrFlg = JCCWebCommon.getSearchErrFlg(DKSV008501CC, outputMap);
		if (SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
		{
			JCCWebCommon.setMessageInfo(this, "EKB0330--I");
			return true;
		}
		else if (SEARCH_ERR_FLG_OVERMAX.equals(searchErrFlg))
		{
			// 最大件数越えはエラーではなくメッセージを表示するだけ
			JCCWebCommon.setMessageInfo(this, "EKB0870-KW", new String [] {"エラー情報",
																			"最大表示",
																			((HashMap)outputMap.get("DKSV008501CC")).get("total_count").toString()});
		}
		
		if (withPaging)
		{
			JCCWebCommon.setSearchCommand(this, "L_PAG");
		}
		initLineMetaDatas();
		
		return false;
	}

	
	
	/**
	 * 返品エラーリストファイルを組み立てます。
	 * @return CSVファイル内容
	 */
	private String buildCsvFile()
	{
		X31SDataBeanAccessArray datas = getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST_CSV);
		
		StringBuffer bodyRecords = new StringBuffer();
		int size = datas.getCount();
		for (int i = 0 ; i < size ; i++)
		{
			if (bodyRecords.length() > 0)
			{
				bodyRecords.append(JDKStrConst.LINE_SEPARATOR);
			}
			bodyRecords.append(buildDataRecord(datas.getDataBean(i), i + 1));
		}
		
		return join(JDKStrConst.LINE_SEPARATOR,
				buildHeaderRecord(),
				bodyRecords.toString(),
				buildTrailerRecord());
	}

	/**
	 * 返品データ.csvのヘッダ行を生成します。
	 * @return CSVのヘッダ
	 */
	private String buildHeaderRecord()
	{
		return join(",",
					dqot("レコード種別"),
					dqot("レコード通番"),
					dqot("返品種別"),
					dqot("返品日付"),
					dqot("型番号"),
					dqot("製造番号"),
					dqot("出荷ロット番号"),
					dqot("サービス契約番号"),
					dqot("案件番号"),
					dqot("返品理由"),
					dqot("返品詳細"),
					dqot("商品状態"),
					dqot("送付者郵便番号"),
					dqot("送付者住所（都道府県）"),
					dqot("送付者住所（市区町村）"),
					dqot("送付者住所（大字通称名）"),
					dqot("送付者住所（字丁目）"),
					dqot("送付者住所（番地・号）"),
					dqot("送付者住所（建物名）"),
					dqot("送付者住所（部屋番号）"),
					dqot("送付者電話番号"),
					dqot("送付者氏名"),
					dqot("レンタル解約申込書"),
					dqot("返品番号"),
					dqot("枝番号"),
					dqot("エラー区分"),
					dqot("エラー内容"));
	}


	/**
	 * 返品データファイルのデータレコードを生成します。
	 * @param data データ
	 * @param index 行数
	 * @return 返品データファイルのデータレコード
	 */
	private String buildDataRecord(X31SDataBeanAccess data, int index) 
	{
		return join(",",
					dqot(RECORD_DATA),
					dqot(getData(data, L_REC_SEQ_01)),
					dqot(getData(data, L_HMPIN_SBT_CD_01)),
					dqot(getData(data, L_HMPIN_YMD_01)),
					dqot(getData(data, L_MDL_NO_01)),
					dqot(getData(data, L_SEIZO_NO_01)),
					dqot(getData(data, L_SHKA_LOT_NO_01)),
					dqot(getData(data, L_SVKEI_NO_01)),
					dqot(getData(data, L_ANKEN_NO_01)),
					dqot(getData(data, L_HMPIN_RSN_CD_01)),
					dqot(getData(data, L_HMPIN_DTL_01)),
					dqot(getData(data, L_GDS_STAT_CD_01)),
					dqot(getData(data, L_SOHUSHA_PCD_01)),
					dqot(getData(data, L_SOHUSHA_STATE_NM_01)),
					dqot(getData(data, L_SOHUSHA_CITY_NM_01)),
					dqot(getData(data, L_SOHUSHA_OAZTSU_NM_01)),
					dqot(getData(data, L_SOHUSHA_AZCHO_NM_01)),
					dqot(getData(data, L_SOHUSHA_BNCHIGO_01)),
					dqot(getData(data, L_SOHUSHA_ADRTTM_01)),
					dqot(getData(data, L_SOHUSHA_ADRRM_01)),
					dqot(getData(data, L_SOHUSHA_TELNO_01)),
					dqot(getData(data, L_SOHUSHA_NM_01)),
					dqot(getData(data, L_RENT_DSL_NM_01)),
					dqot(getData(data, L_HMPIN_NO_01)),
					dqot(getData(data, L_BRA_NO_01)),
					dqot(getData(data, L_ERR_CD_01)),
					dqot(getData(data, L_ERR_NAIYO_01)));
	}

	
	/**
	 * 入力情報から返品情報受信データファイルのトレーラーレコードを生成します。
	 * @return 返品情報受信データファイルのトレーラーレコード
	 */
	private String buildTrailerRecord() 
	{
		return String.format("\"%s\",\"%d\"", RECORD_TRAILER, getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST_CSV).getCount());
	}
	
	
	
	/**
	 * 文字列をダブルクォーテッドする
	 * @param src 囲まれる文字列
	 * @return \"囲まれる文字列\"
	 */
	private String dqot(String src)
	{
		return String.format("\"%s\"", src);
	}
	
	
	/**
	 * データ行の番号、色を設定します。
	 */
	private void initLineMetaDatas()
	{
		X31SDataBeanAccessArray list = getServiceFormBean().getDataBeanArray(SEARCH_RSLT_LIST);
		int size = list.getCount();
		for (int i = 0 ; i < size ; i++)
		{
			X31SDataBeanAccess data = list.getDataBean(i);
			setData(data, (i + 1L), L_NO_01);
			setData(data, i % 2 == 0 ? "odd" : "even", L_COLOR_01);
			setData(data, substr(getData(data, L_KSH_NM_01), 0, 7), L_KSH_NM_DISP_01);
		}
	}

	/**
	 * 画面遷移先を設定します。
	 * @author 富士通
	 * @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));
	}
}
