/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：ACW01201SFLogic
*	ソースファイル名：ACW01201SFLogic.java
*	作成者			：富士通
*	日付			：2012年01月10日
*＜機能概要＞
*	モバイル事業者間精算照会画面のビューロジック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/01/10	富士通		新規作成
*	v4.00.00	2013/01/30	FJ)垣内		【ST2-2013-0000325】UQ事業者間対応
*	v4.00.00	2013/02/14	FJ)垣内		【ST2-2013-0000853】文字化け対応
*	v6.00.00	2013/12/12	FJ)田内		【OM-2013-0004838】UQ事業者間精算情報出力時に契約者種別（個/法）を出力しない様に修正
*	v7.00.00	2014/02/13	FJ)伊藤		【OM-2014-0000751】精算表ダウンロード時に、金額が編集されていなかったのを修正
*
**********************************************************************/
package eo.web.webview.ACW01201SF;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;

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.JACStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JACScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCHPulldownUtil;
import eo.web.webview.common.JCRWebCommon;
import eo.web.webview.mapping.ACSV0021_ACSV0021OPDBMapper;
import eo.web.webview.mapping.ACSV0022_ACSV0022OPDBMapper;
import eo.web.webview.mapping.ACSV0023_ACSV0023OPDBMapper;


/**
 * モバイル事業者間精算照会画面のビューロジックを提供します。<p>
 * <BR>
 * @author 富士通
 */
public class ACW01201SFLogic extends JCCWebBusinessLogic {

	/** ユースケースID:モバイル事業者間精算照会画面初期表示 */
	private static final String USECASE_ID_ACSV0021 = "ACSV0021";

	/** ユースケースID:モバイル事業者間精算照会画面検索 */
	private static final String USECASE_ID_ACSV0022 = "ACSV0022";

	/** ユースケースID:チェックデータ電子ファイル管理番号取得 */
	private static final String USECASE_ID_ACSV0023 = "ACSV0023";

	/** メッセージＩＤ(検索結果:指定されたデータが存在しません。) */
	private static final String MESSAGE_ID_SSN_TRGT_KMK_NONE = "EKB0330--I";

	/** 処理管理番号（ＥＭ） */
	private static final String TRN_KNRI_NO_EM = "000000000053";

	/** 処理管理番号（ＵＱ） */
	private static final String TRN_KNRI_NO_UQ = "000000000100";

	/**
	 * モバイル事業者間精算照会画面の初期表示処理を行います。
	 * <br>
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean init() throws Exception {

		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面IDを判定して画面IDに対応する初期表示処理を呼び出す
		String screenId = commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);
		if (screenId.equals(JACScreenConst.SCREEN_ID_ACW01201))
		{
			// メニューからの遷移時は画面定数クラスの値を指定する
			commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_ACW01201);
			commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_ACW01201);

			initScreen();
		}

		return true;
	}

	/**
	 * モバイル事業者間精算照会画面の検索処理を行います。
	 * <br>
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean search() throws Exception {

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = {bean};

		// 選択位置のコード値を設定
		// 精算事業者
		String jgyoshaCd = JCHPulldownUtil.getSelectedValue(paramBeans, ACW01201SFConst.SSN_JGYOSHA_INFO, ACW01201SFConst.SSN_JGYOSHA_CD_LIST_01, ACW01201SFConst.SSN_JGYOSHA_CD_SEL_01);
		paramBeans[0].sendMessageString(ACW01201SFConst.SSN_JGYOSHA_CD, X31CWebConst.DATABEAN_SET_VALUE, jgyoshaCd);
		// 精算対象年月
		String trgtYm = JCHPulldownUtil.getSelectedValue(paramBeans, ACW01201SFConst.SSN_TRGT_YM_INFO, ACW01201SFConst.SSN_TRGT_YM_LIST_02, ACW01201SFConst.SSN_TRGT_YM_SEL_02);
		paramBeans[0].sendMessageString(ACW01201SFConst.SSN_TRGT_YM, X31CWebConst.DATABEAN_SET_VALUE, trgtYm.replace("/", JACStrConst.KARA_MOJI));

		// Bean初期化
		paramBeans[0].getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO).clearArray();

		// サービス実行
		this.execACSV0022(paramBeans, jgyoshaCd);

		return true;
	}

	/**
	 * 精算表ダウンロード処理します。
	 * <br>
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean ssnDL() throws Exception {
		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = {bean};
		// 検索した時の対象事業者コード
		String targetJgCd = paramBeans[0].sendMessageString(ACW01201SFConst.SSN_JGYOSHA_CD, X31CWebConst.DATABEAN_GET_VALUE);
		// UQ事業者コードの場合
		if(JACStrConst.JGYOSHA_CD_UQ.equals(targetJgCd))
		{
			// 生成データをバイトでセット
			byte[] downloadData = seikyKssiFileUQ(bean).getBytes("Shift_JIS");
			JCCWebCommon.setTempDownloadFile(this, downloadData, JACStrConst.FILE_NM_UQ_JGSHAKSSN_INFO);
		}
		else
		{
			// 生成データをバイトでセット
			byte[] downloadData = seikyKssiFile(bean).getBytes("Shift_JIS");
			JCCWebCommon.setTempDownloadFile(this, downloadData, JACStrConst.FILE_NM_EM_JGSHAKSSN_KMK);
		}
		
		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面を設定する
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_ACW01201);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_ACW01201);

		return true;
	}

	/**
	 * チェックデータダウンロード処理します。
	 * <br>
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean chkDataDL() throws Exception {
		
		// TODO:保留（電子ファイル管理番号？）
		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = {bean};

		// サービス実行
		this.execACSV0023(paramBeans);

		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面を設定する
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_ACW01201);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_ACW01201);

		return true;
	}

	/**
	 * モバイル事業者間精算照会画面の初期表示処理を行います。
	 * <br>
	 */
	private void initScreen(){

		// 画面間引継情報を設定する
		JCCWebCommon.getScreenInfo(this);

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = {bean};

		// モバイル事業者間精算照会サービス実行
		this.execACSV0021(paramBeans);

		// 精算対象年月情報作成
		this.makeSsnTrgtYm(paramBeans);
	}

	/**
	 * モバイル事業者間精算照会画面初期表示サービスを実行します。
	 * <br>
	 * @param paramBeans モバイル事業者間精算照会画面サービスフォームBean
	 */
	private void execACSV0021(X31SDataBeanAccess[] paramBeans) {

		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_ACSV0021);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		ACSV0021_ACSV0021OPDBMapper mapper = new ACSV0021_ACSV0021OPDBMapper();
		mapper.setACSV002101SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// 業務パラメータ一意照会[EZM0321A010]
		mapper.setACSV002102SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// 事業者一覧照会[ECH0261B010]

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 下りマッピング
		mapper.getACSV002102SC(paramBeans, outputMap);		// 事業者一覧照会[ECH0261B010]

		// ボタン制御値の設定
		this.setJsfDisabledCntrlValue(paramBeans);
	}

	/**
	 * モバイル事業者間精算照会画面検索サービスを実行します。
	 * <br>
	 * @param paramBeans モバイル事業者間精算照会画面サービスフォームBean
	 */
	private void execACSV0022(X31SDataBeanAccess[] paramBeans, String jgyoshaCd) {

		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_ACSV0022);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		ACSV0022_ACSV0022OPDBMapper mapper = new ACSV0022_ACSV0022OPDBMapper();
		mapper.setACSV002201SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// 個人支払取得[EZM0321A010]
		mapper.setACSV002202SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// 個人請求取得[EZM0321A010]
		mapper.setACSV002203SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// 法人支払取得[EZM0321A010]
		mapper.setACSV002204SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// 法人請求取得[EZM0321A010]
		mapper.setACSV002205SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// モバイル事業者間精算照会[ECH0271B501]

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
	
		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 下りマッピング
		mapper.getACSV002205SC(paramBeans, outputMap, jgyoshaCd);		// モバイル事業者間精算照会[ECH0271B501]

		// 個人法人区分が変わった場合、空行を挿入する。
		this.karaRowInsert(paramBeans);

		// 発行対象情報の表示色設定
		this.setDspCtrlValue(paramBeans);

		// ボタン制御値の設定
		this.setJsfDisabledCntrlValue(paramBeans);

		// メッセージ設定
		this.setErrorMessage(paramBeans);
	}

	/**
	 * チェックデータ電子ファイル管理番号取得サービスを実行します。
	 * <br>
	 * @param paramBeans モバイル事業者間精算照会画面サービスフォームBean
	 */
	private void execACSV0023(X31SDataBeanAccess[] paramBeans) {

		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_ACSV0023);

		// 検索した時の対象事業者コード
		String targetJgCd = paramBeans[0].sendMessageString(ACW01201SFConst.SSN_JGYOSHA_CD, X31CWebConst.DATABEAN_GET_VALUE);
		// 検索した時の対象年月
		String targetYm = paramBeans[0].sendMessageString(ACW01201SFConst.SSN_TRGT_YM, X31CWebConst.DATABEAN_GET_VALUE);

		// ファイル名を編集
		String fileNm = JACStrConst.KARA_MOJI;
		// 処理管理番号
		String trnKnriNo = JACStrConst.KARA_MOJI;
		
		// UQ事業者コードの場合
		if(JACStrConst.JGYOSHA_CD_UQ.equals(targetJgCd))
		{
			fileNm = JACStrConst.FILE_NM_UQ_JGSHAKSSN_CHK_DATA + "_" + targetYm + ".csv";
			trnKnriNo = TRN_KNRI_NO_UQ;
		}
		else
		{
			fileNm = JACStrConst.FILE_NM_EM_JGSHAKSSN_CHK_DATA + "_" + targetYm + ".csv";
			trnKnriNo = TRN_KNRI_NO_EM;
		}
		// ファイル名を設定
		paramBeans[0].sendMessageString(ACW01201SFConst.FILE_NM, X31CWebConst.DATABEAN_SET_VALUE, fileNm);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		ACSV0023_ACSV0023OPDBMapper mapper = new ACSV0023_ACSV0023OPDBMapper();
		mapper.setACSV002301SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1, trnKnriNo);		// ダウンロードファイル管理ファイル名一覧照会[EZM0261B020]

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 下りマッピング
		mapper.getACSV002301SC(paramBeans, outputMap);		// ダウンロードファイル管理ファイル名一覧照会[EZM0261B020]

		// 取得した電子ファイル管理情報を元にダウンロードを開始する。
		X31SDataBeanAccessArray efileKanriInfo = paramBeans[0].getDataBeanArray(ACW01201SFConst.EFILE_KANRI_INFO);

		// 複数取得できた場合は、ファイル登録年月日の最新を取得
		X31SDataBeanAccess wkBean = efileKanriInfo.getDataBean(efileKanriInfo.getCount() - 1);

		// ファイル連番[電子ファイル管理番号]
		String fileKey = wkBean.sendMessageString(ACW01201SFConst.EFILE_KANRI_NO_04, X31CWebConst.DATABEAN_GET_VALUE);

		// 電子ファイル管理されているファイルをダウンロード
		JCRWebCommon.setDownloadFile(this, fileKey, fileNm);

	}

	/**
	 * 精算対象年月情報Beanを作成します。
	 * <br>
	 * @param bean モバイル事業者間精算照会画面Bean
	 */
	private void makeSsnTrgtYm(X31SDataBeanAccess[] bean) {

		X31SDataBeanAccessArray ssnYmInfo = bean[0].getDataBeanArray(ACW01201SFConst.SSN_TRGT_YM_INFO);
		X31SDataBeanAccess subBean = ssnYmInfo.getDataBean(0);

		// Beanクリア
		subBean.sendMessage(ACW01201SFConst.SSN_TRGT_YM_LIST_02, X31CWebConst.DATABEAN_CLEAR);
		// 空行を設定
		subBean.sendMessageString(ACW01201SFConst.SSN_TRGT_YM_LIST_02, X31CWebConst.DATABEAN_ADD_VALUE, JACStrConst.KARA_MOJI);

		// オンライン運用日
		String opeDate = JCCWebCommon.getOpeDate(this, JACStrConst.SYS_CD_CH);

		try {
			// 精算対象年月リストを作成
			for (int i = 0; i < 24; i++)
			{
				// オンライン運用日から1ずつ減算
				String ssnTrgtYm = JPCUtilCommon.addMonth(opeDate, -(i + 1)).substring(0, 6);

				// 算出した年月をyyyy/MM形式に編集し、Beanに設定
				subBean.sendMessageString(ACW01201SFConst.SSN_TRGT_YM_LIST_02, X31CWebConst.DATABEAN_ADD_VALUE, JPCUtilCommon.formatYears(ssnTrgtYm));
			}

		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 精算対象項目情報に空行を設定します。
	 * <br>
	 * @param bean モバイル事業者間精算照会画面Bean
	 */
	private void karaRowInsert(X31SDataBeanAccess[] bean) {

		X31SDataBeanAccessArray ssnKmkInfo = bean[0].getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO);

		if (ssnKmkInfo.getCount().intValue() > 0){
			ArrayList<HashMap<String, Object>> dataList = new ArrayList<HashMap<String, Object>>();

			int iCntUp = 0;

			// 1件目の法人個人区分を取得
			X31SDataBeanAccess fstBean = ssnKmkInfo.getDataBean(0);
			String fstCustDiv = fstBean.sendMessageString(ACW01201SFConst.CUST_DIV_03, X31CWebConst.DATABEAN_GET_VALUE);

			for (int i = 0; i < ssnKmkInfo.getCount(); i++)
			{
				dataList.add(new HashMap<String, Object>());
				HashMap<String, Object> childMap = (HashMap<String, Object>)dataList.get(i + iCntUp);

				X31SDataBeanAccess wkBean = ssnKmkInfo.getDataBean(i);

				// 法人個人区分
				childMap.put(ACW01201SFConst.CUST_DIV_03, wkBean.sendMessageString(ACW01201SFConst.CUST_DIV_03, X31CWebConst.DATABEAN_GET_VALUE));
				// 精算内容
				childMap.put(ACW01201SFConst.SSN_NAIYO_03, wkBean.sendMessageString(ACW01201SFConst.SSN_NAIYO_03, X31CWebConst.DATABEAN_GET_VALUE));
				// 精算項目
				childMap.put(ACW01201SFConst.SSN_KMK_03, wkBean.sendMessageString(ACW01201SFConst.SSN_KMK_03, X31CWebConst.DATABEAN_GET_VALUE));
				// 精算金額
				childMap.put(ACW01201SFConst.SSN_AMNT_03, wkBean.sendMessageString(ACW01201SFConst.SSN_AMNT_03, X31CWebConst.DATABEAN_GET_VALUE));
				// 精算対象件数
				childMap.put(ACW01201SFConst.SSN_CNT_03, wkBean.sendMessageString(ACW01201SFConst.SSN_CNT_03, X31CWebConst.DATABEAN_GET_VALUE));
				// 税区分
				childMap.put(ACW01201SFConst.STAX_KBN_03, wkBean.sendMessageString(ACW01201SFConst.STAX_KBN_03, X31CWebConst.DATABEAN_GET_VALUE));

				// 最終行でない場合
				if(i != ssnKmkInfo.getCount() - 1){
					// 次件の法人個人区分を取得
					X31SDataBeanAccess nextBean = ssnKmkInfo.getDataBean(i + 1);
					String nextCustDiv = nextBean.sendMessageString(ACW01201SFConst.CUST_DIV_03, X31CWebConst.DATABEAN_GET_VALUE);

					// 法人個人区分が変わった場合、空行をセットする
					if (!fstCustDiv.equals(nextCustDiv)){
						iCntUp++;
						dataList.add(new HashMap<String, Object>());
						childMap = (HashMap<String, Object>)dataList.get(i + iCntUp);

						childMap.put(ACW01201SFConst.CUST_DIV_03, JACStrConst.KARA_MOJI);
						childMap.put(ACW01201SFConst.SSN_NAIYO_03, JACStrConst.KARA_MOJI);
						childMap.put(ACW01201SFConst.SSN_KMK_03, JACStrConst.KARA_MOJI);
						childMap.put(ACW01201SFConst.SSN_AMNT_03, JACStrConst.KARA_MOJI);
						childMap.put(ACW01201SFConst.SSN_CNT_03, JACStrConst.KARA_MOJI);
						childMap.put(ACW01201SFConst.STAX_KBN_03, JACStrConst.KARA_MOJI);
					}
					fstCustDiv = nextCustDiv;
				}
			}

			bean[0].getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO).clearArray();
			X31SDataBeanAccessArray kmkInfo = bean[0].getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO);
			X31SDataBeanAccess subBean = null;

			for(int i = 0; i < dataList.size(); i++)
			{
				subBean = null;

				HashMap<String, Object> wkMap = (HashMap<String, Object>)dataList.get(i);

				if (wkMap.size() > 0)
				{
					subBean = kmkInfo.addDataBean();
					// 精算対象項目情報.法人個人区分 ← 法人個人区分
					subBean.sendMessageString(ACW01201SFConst.CUST_DIV_03, X31CWebConst.DATABEAN_SET_VALUE, (String)wkMap.get(ACW01201SFConst.CUST_DIV_03));
					// 精算対象項目情報.精算内容 ← 精算内容
					subBean.sendMessageString(ACW01201SFConst.SSN_NAIYO_03, X31CWebConst.DATABEAN_SET_VALUE, (String)wkMap.get(ACW01201SFConst.SSN_NAIYO_03));
					// 精算対象項目情報.精算項目 ← 精算項目
					subBean.sendMessageString(ACW01201SFConst.SSN_KMK_03, X31CWebConst.DATABEAN_SET_VALUE, (String)wkMap.get(ACW01201SFConst.SSN_KMK_03));
					// 精算対象項目情報.精算金額 ← 精算金額
					subBean.sendMessageString(ACW01201SFConst.SSN_AMNT_03, X31CWebConst.DATABEAN_SET_VALUE, (String)wkMap.get(ACW01201SFConst.SSN_AMNT_03));
					// 精算対象項目情報.精算対象件数 ← 精算対象件数
					subBean.sendMessageString(ACW01201SFConst.SSN_CNT_03, X31CWebConst.DATABEAN_SET_VALUE, (String)wkMap.get(ACW01201SFConst.SSN_CNT_03));
					// 精算対象項目情報.税区分 ← 税区分
					subBean.sendMessageString(ACW01201SFConst.STAX_KBN_03, X31CWebConst.DATABEAN_SET_VALUE, (String)wkMap.get(ACW01201SFConst.STAX_KBN_03));
				}
			}
		}
	}

	/**
	 * ＥＭ事業者間精算項目表.csvのヘッダ行を生成します。
	 * @return ヘッダ行
	 */
	private String seikyKssiHeader()
	{
		String haedData = separatEdit(",",
				addDubleQ("法人個人区分"),
				addDubleQ("精算内容"),
				addDubleQ("精算項目"),
				addDubleQ("精算金額"),
				addDubleQ("精算対象件数"),
				addDubleQ("税区分")
				);
		return haedData;
	}

	/**
	 * ＥＭ事業者間精算項目表のデータファイルを生成します。
	 * @param serviceBean モバイル事業者間精算照会画面Bean
	 * @return ＥＭ事業者間精算項目表データファイル
	 */
	private String seikyKssiFile(X31SDataBeanAccess serviceBean)
	{
		X31SDataBeanAccessArray csvList = serviceBean.getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO);

		StringBuilder csvRecord = new StringBuilder();
		int size = csvList.getCount();
		for (int i=0; i<size; i++)
		{
			if (csvRecord.length() > 0)
			{
				csvRecord.append("\r\n");
			}

			csvRecord.append(seikyKssiDblQuotEdit(csvList.getDataBean(i)));
		}

		String csvBody = separatEdit("\r\n", seikyKssiHeader(), csvRecord.toString()).concat("\r\n");

		return csvBody;
	}

	/**
	 * ＥＭ事業者間精算項目表のレコードをダブルクォーテーションで囲み結合します。
	 * @param dataBean 請求決済情報Bean
	 * @return 結合された文字列
	 */
	private String seikyKssiDblQuotEdit(X31SDataBeanAccess dataBean)
	{

		String str1 = dataBean.sendMessageString(ACW01201SFConst.CUST_DIV_03, X31CWebConst.DATABEAN_GET_VALUE);
		String str2 = dataBean.sendMessageString(ACW01201SFConst.SSN_NAIYO_03, X31CWebConst.DATABEAN_GET_VALUE);
		String str3 = dataBean.sendMessageString(ACW01201SFConst.SSN_KMK_03, X31CWebConst.DATABEAN_GET_VALUE);
		String str4 = JACStrConst.YEN_SIGN.concat(JPCUtilCommon.formatNumber(dataBean.sendMessageString(ACW01201SFConst.SSN_AMNT_03, X31CWebConst.DATABEAN_GET_VALUE)));
		String str5 = JPCUtilCommon.formatNumber(dataBean.sendMessageString(ACW01201SFConst.SSN_CNT_03, X31CWebConst.DATABEAN_GET_VALUE));
		String str6 = dataBean.sendMessageString(ACW01201SFConst.STAX_KBN_03, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 空行対策
		if(JACStrConst.YEN_SIGN.equals(str4))
		{
			str4 = JACStrConst.KARA_MOJI;
		}
		
		// 課税の場合は出力しない
		if(JACStrConst.STAX_CD_NM_KAZEI.equals(str6))
		{
			str6 = JACStrConst.KARA_MOJI;
		}

		return separatEdit(",",
					addDubleQ(str1),
					addDubleQ(str2),
					addDubleQ(str3),
					addDubleQ(str4),
					addDubleQ(str5),
					addDubleQ(str6)
					);
	}

	/**
	 * UQ事業者間精算情報.csvのヘッダ行を生成します。
	 * @return ヘッダ行
	 */
	private String seikyKssiUQHeader()
	{
		String haedData = separatEdit(",",
				addDubleQ("精算項目"),
				addDubleQ("精算金額"),
				addDubleQ("件数"),
				addDubleQ("税区分")
				);
		return haedData;
	}

	/**
	 * UQ事業者間精算情報のデータファイルを生成します。
	 * @param serviceBean モバイル事業者間精算照会画面Bean
	 * @return ＥＭ事業者間精算項目表データファイル
	 */
	private String seikyKssiFileUQ(X31SDataBeanAccess serviceBean)
	{
		X31SDataBeanAccessArray csvList = serviceBean.getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO);

		StringBuilder csvRecord = new StringBuilder();
		int size = csvList.getCount();
		for (int i=0; i<size; i++)
		{
			if (csvRecord.length() > 0)
			{
				csvRecord.append("\r\n");
			}

			csvRecord.append(seikyKssiUQDblQuotEdit(csvList.getDataBean(i)));
		}

		String csvBody = separatEdit("\r\n", seikyKssiUQHeader(), csvRecord.toString()).concat("\r\n");

		return csvBody;
	}

	/**
	 * UQ事業者間精算情報のレコードをダブルクォーテーションで囲み結合します。
	 * @param dataBean 請求決済情報Bean
	 * @return 結合された文字列
	 */
	private String seikyKssiUQDblQuotEdit(X31SDataBeanAccess dataBean)
	{

		String str1 = dataBean.sendMessageString(ACW01201SFConst.SSN_KMK_03, X31CWebConst.DATABEAN_GET_VALUE);
		String str2 = JACStrConst.YEN_SIGN.concat(JPCUtilCommon.formatNumber(dataBean.sendMessageString(ACW01201SFConst.SSN_AMNT_03, X31CWebConst.DATABEAN_GET_VALUE)));
		String str3 = JPCUtilCommon.formatNumber(dataBean.sendMessageString(ACW01201SFConst.SSN_CNT_03, X31CWebConst.DATABEAN_GET_VALUE));
		String str4 = dataBean.sendMessageString(ACW01201SFConst.STAX_KBN_03, X31CWebConst.DATABEAN_GET_VALUE);

		// 空行対策
		if(JACStrConst.YEN_SIGN.equals(str2))
		{
			str2 = JACStrConst.KARA_MOJI;
		}
		
		// 課税の場合は出力しない
		if(JACStrConst.STAX_CD_NM_KAZEI.equals(str4))
		{
			str4 = JACStrConst.KARA_MOJI;
		}

		return separatEdit(",",
					addDubleQ(str1),
					addDubleQ(str2),
					addDubleQ(str3),
					addDubleQ(str4)
					);
	}

	/**
	 * 指定された文字列の配列をseparatorで結合します。
	 * @param separator 結合文字列
	 * @param strs 結合する文字列
	 * @return 結合された文字列
	 */
	private String separatEdit(String separator, String...strs)
	{
		StringBuffer sb = new StringBuffer();

		boolean isFirst = true;
		for (String str : strs)
		{
			if (!isFirst)
			{
				sb.append(separator);
			}

			sb.append(str);
			isFirst = false;
		}

		return sb.toString();
	}

	/**
	 * 文字列をダブルクォーテーションで囲む
	 * @param src 囲まれる文字列
	 * @return \"囲まれる文字列\"
	 */
	private String addDubleQ(String src)
	{
		return String.format("\"%s\"", src);
	}

	/**
	 * エラーメッセージ設定処理。
	 * <br>
	 * @param bean モバイル事業者間精算照会画面Bean
	 */
	private void setErrorMessage(X31SDataBeanAccess[] bean)
	{
		if (isExistSeikyuIcrnInfo(bean) == false)
		{
			JCCWebCommon.setMessageInfo(this, MESSAGE_ID_SSN_TRGT_KMK_NONE);
		}
	}

	/**
	 * 精算対象項目情報の存在を判定します。
	 * <br>
	 * @param bean モバイル事業者間精算照会画面Bean
	 */
	private boolean isExistSeikyuIcrnInfo(X31SDataBeanAccess[] bean)
	{
		boolean isExist = false;

		X31SDataBeanAccessArray ssnKmkInfo = bean[0].getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO);
		if (ssnKmkInfo.getCount().intValue() > 0)
		{
			isExist = true;
		}

		return isExist;
	}

	/**
	 * 精算対象項目情報の背景色を設定します。
	 * <br>
	 * @param bean モバイル事業者間精算照会画面Bean
	 */
	private void setDspCtrlValue(X31SDataBeanAccess[] bean) {

		X31SDataBeanAccessArray ssnKmkInfo = bean[0].getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO);
		for (int i = 0; i < ssnKmkInfo.getCount().intValue(); i++)
		{
			X31SDataBeanAccess subBean = ssnKmkInfo.getDataBean(i);
			// 表示制御値
			String dspCntrlValue = JACStrConst.DSP_BG_COLOR_ODD;
			if (i % 2 == 0)
			{
				dspCntrlValue = JACStrConst.DSP_BG_COLOR_EVEN;
			} 
			subBean.sendMessageString(ACW01201SFConst.DSP_CNTRL_VALUE_03, X31CWebConst.DATABEAN_SET_VALUE, dspCntrlValue);
		}
	}

	/**
	 * 精算対象項目情報の有無により各ボタンの制御値を設定します。
	 * <br>
	 * @param bean モバイル事業者間精算照会画面Bean
	 */
	private void setJsfDisabledCntrlValue(X31SDataBeanAccess[] bean) {
		String jsfDisabledCntrlValue = JACStrConst.CTL_VALUE_TRUE;

		X31SDataBeanAccessArray ssnKmkInfo = bean[0].getDataBeanArray(ACW01201SFConst.SSN_TRGT_KMK_INFO);
		if (0 < ssnKmkInfo.getCount().intValue())
		{
			jsfDisabledCntrlValue = JACStrConst.CTL_VALUE_FALSE;
		}

		// 精算表ダウンロードボタン
		bean[0].sendMessageString(ACW01201SFConst.DISABLED_CNTRL_VALUE_BTNSSNDL, X31CWebConst.DATABEAN_SET_VALUE, jsfDisabledCntrlValue);
		// チェックデータダウンロードボタン
		bean[0].sendMessageString(ACW01201SFConst.DISABLED_CNTRL_VALUE_BTNCHKDATADL, X31CWebConst.DATABEAN_SET_VALUE, jsfDisabledCntrlValue);
	}
}
