/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*   モジュール名    ：JACPcallDtlReHakkoOputCC
*   ソースファイル名：JACPcallDtlReHakkoOputCC.java
*	作成者			：FJ
*	日付			：2011年11月16日
*＜機能概要＞
*	
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/16	FJ		新規作成
*	v5.00.00    2013/09/25  FJ) 林 【OM-2013-0002565】電話番号下4桁マスク不正対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fujitsu.futurity.bp.custom.constant.ACSV0016_ACSV0016OP_ACSV001606SC;
import com.fujitsu.futurity.bp.custom.constant.ACSV0016_ACSV0016OP_ACSV001607SC;
import com.fujitsu.futurity.bp.custom.constant.ACSV0016_ACSV0016OP_ACSV001608SC;
import com.fujitsu.futurity.bp.custom.constant.ACSV0016_ACSV0016OP_ACSV001609SC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.AttachmentFileMapKeys;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JACCommonUtil;
import eo.ejb.cbs.cbsmsg.EAC0391B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECC0041A110CBSMsg;
import eo.ejb.cbs.cbsmsg.ECC0041A110CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;

/**
 * 通話明細再発行出力CC
 * @author FJ
 *
 */
public class JACPcallDtlReHakkoOputCC extends AbstractCommonComponent 
{
	/**
	 * テンプレートID
	 */
	private static final String TEMPLATE_ID = "ECC0041A110";
	
	/**
	 * CCタイトル
	 */
	private static final String CC_TITLE = "ACSV001610CC";
	
	/**
	 * eo光電話通話明細一覧照会SCタイトル
	 */
	private static final String DTL_SC_TITLE = "ACSV001606SC";
	
	/**
	 * eo光電話通話明細合計一覧照会SC1タイトル
	 */
	private static final String GOKEI1_SC_TITLE = "ACSV001607SC";
	
	/**
	 * eo光電話通話明細合計一覧照会SC2タイトル
	 */
	private static final String GOKEI2_SC_TITLE = "ACSV001608SC";
	
	/**
	 * 請求契約一意照会SCタイトル
	 */
	private static final String SEIKY_KEI_SC_TITLE = "ACSV001609SC";
	
	/**
	 * 曜日配列
	 */
	private static final String[] WEEK = {"日", "月", "火", "水", "木", "金", "土"};
	
	/**
	 * CSV形式の区切文字
	 */
	private static final String CSV_DIV = ",";
	
	/**
	 * CSV形式の改行文字
	 */
	private static final String CSV_KAIGYO = "\n";
	
	/**
	 * ダブルコーテーション
	 */
	private static final String DBL_QUOTE = "\"";

	/**
	 * 帳票種別(PDF)
	 */
	private static final String CHOHYO_TRAN_SBT_PDF = "1";

	/**
	 * 帳票出力＿お客様名文字数
	 */
	private static final int CHOHYO_OUT_NM_LENGTH = 15;

	/**
	 * 通話明細再発行帳票出力
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	public IRequestParameterReadWrite createList(SessionHandle handle, 
			IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 実行判定処理
		if(!reqCheck(param))
		{
			return param;
		}
		
		// CSV編集処理
		byte[] csvData = makeCSVData(param);

		// 帳票生成処理
		IRequestParameterReadWrite rtnParam = createList(handle, param, csvData);
		
		return rtnParam;
	}

	/**
	 * 
	 * 通話明細再発行の実行判定処理を行う
	 * @param param
	 * @return boolean
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private boolean reqCheck(IRequestParameterReadWrite param) throws Exception
	{
		boolean rtnChk = true;
		
		// 明細取得結果判定
		HashMap<String, Object> parentMapSC = (HashMap<String, Object>)param.getData(DTL_SC_TITLE);
		Object search_err_flg = parentMapSC.get("search_err_flg");
		//検索エラーフラグが設定されている場合、後続処理を行わない
		if(search_err_flg != null && !"".equals(search_err_flg.toString()))
		{
			rtnChk = false;
		}
		
		// 合計1取得結果判定
		parentMapSC = (HashMap<String, Object>)param.getData(GOKEI1_SC_TITLE);
		search_err_flg = parentMapSC.get("search_err_flg");
		//検索エラーフラグが設定されている場合、後続処理を行わない
		if(search_err_flg != null && !"".equals(search_err_flg.toString()))
		{
			rtnChk = false;
		}
		
		// 合計2取得結果判定
		parentMapSC = (HashMap<String, Object>)param.getData(GOKEI2_SC_TITLE);
		search_err_flg = parentMapSC.get("search_err_flg");
		//検索エラーフラグが設定されている場合、後続処理を行わない
		if(search_err_flg != null && !"".equals(search_err_flg.toString()))
		{
			rtnChk = false;
		}
		
		// 合計1取得結果判定
		parentMapSC = (HashMap<String, Object>)param.getData(SEIKY_KEI_SC_TITLE);
		search_err_flg = parentMapSC.get("search_err_flg");
		//検索エラーフラグが設定されている場合、後続処理を行わない
		if(search_err_flg != null && !"".equals(search_err_flg.toString()))
		{
			rtnChk = false;
		}
		
		return rtnChk;
	}

	
	/**
	 * 通話明細再発行情報をCSV形式のバイナリデータに変換する。
	 * @param param
	 * @return byte[]
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private byte[] makeCSVData(IRequestParameterReadWrite param) throws Exception
	{
		// 情報取得
		HashMap<String, Object> parentMapCC = (HashMap<String, Object>)param.getData(CC_TITLE);
		HashMap<String, Object> dtlSC = (HashMap<String, Object>)param.getData(DTL_SC_TITLE);
		HashMap<String, Object> gokei1SC = (HashMap<String, Object>)param.getData(GOKEI1_SC_TITLE);
		HashMap<String, Object> gokei2SC = (HashMap<String, Object>)param.getData(GOKEI2_SC_TITLE);
		HashMap<String, Object> seikyKeiSC = (HashMap<String, Object>)param.getData(SEIKY_KEI_SC_TITLE);
		
		// 請求契約情報を取得
		List seikyuKeiList = (List) seikyKeiSC.get(ACSV0016_ACSV0016OP_ACSV001609SC.EKK0491A010CBSMSG1LIST);
		Map seikyuKeiMap = (HashMap)seikyuKeiList.get(0);
		// 明細一覧を取得
		List dtlList = (List) dtlSC.get(ACSV0016_ACSV0016OP_ACSV001606SC.EAC0391B010CBSMSG1LIST);
		List gokei1List = (List) gokei1SC.get(ACSV0016_ACSV0016OP_ACSV001607SC.EAC0391B020CBSMSG1LIST);
		List gokei2List = (List) gokei2SC.get(ACSV0016_ACSV0016OP_ACSV001608SC.EAC0391B020CBSMSG1LIST);
		
		String seiky_kei_no = parentMapCC.get("seiky_kei_no").toString();
		String telno = parentMapCC.get("telno").toString();
		String seiky_ym = parentMapCC.get("seiky_ym").toString();

		String headerYear = seiky_ym.substring(0, 4);
		String headerMonth = seiky_ym.substring(4, 6);
		
		//ヘッダ編集
		StringBuffer headerSb = new StringBuffer("");
		ArrayList<String> nameList = new ArrayList<String>();
		String sohusNm = (String)seikyuKeiMap.get(EKK0491A010CBSMsg1List.SOHUS_NM);
		String sohusBkm = (String)seikyuKeiMap.get(EKK0491A010CBSMsg1List.SOHUS_BKM);
		String sohusTntshaNm = (String)seikyuKeiMap.get(EKK0491A010CBSMsg1List.SOHUS_TNTSHA_NM);
		nameList.add(JACCommonUtil.editStrLength(sohusNm, CHOHYO_OUT_NM_LENGTH));
		nameList.add(JACCommonUtil.editStrLength(sohusBkm, CHOHYO_OUT_NM_LENGTH));
		nameList.add(JACCommonUtil.editStrLength(sohusTntshaNm, CHOHYO_OUT_NM_LENGTH));
		ArrayList resultNameList = JACCommonUtil.editNameList(nameList);
		headerSb.append(getDblQuote(resultNameList.get(0)))
				.append(CSV_DIV + getDblQuote(resultNameList.get(1)))
				.append(CSV_DIV + getDblQuote(resultNameList.get(2)))
				.append(CSV_DIV + getDblQuote(seiky_kei_no))
				.append(CSV_DIV + getDblQuote(telno))
				.append(CSV_DIV + getDblQuote(headerYear))
				.append(CSV_DIV + getDblQuote(headerMonth));
		
		// データ編集
		ArrayList<String> bodyList = new ArrayList<String>();
		for (Object object : dtlList)
		{
			HashMap dtlMap = (HashMap) object;
			bodyList.add(getLineData(dtlMap));
		}
		
		// 課税・非課税の合計数・料金を算出する
		BigDecimal kazeiGokeiCnt = new BigDecimal(0);
		BigDecimal hikazeiGokeiCnt = new BigDecimal(0);
		BigDecimal kazeiGokeiPrc = new BigDecimal(0);
		BigDecimal hikazeiGokeiPrc = new BigDecimal(0);
		String funcCode = (String)dtlSC.get("func_code");
		List gokeiList = gokei1List;
		if ("2".equals(funcCode))
		{
			// 課税分 + 非課税分
			gokeiList.addAll(gokei2List);
		}
		// 対象レコードの繰り返し
		for (Object object : gokeiList)
		{
			HashMap gokei1Map = (HashMap) object;

			String kazeiHikazeiCd = (String) gokei1Map.get("eoh_tel_tw_dtl_kazei_hikazei_cd");
			BigDecimal prc = new BigDecimal((String) gokei1Map.get("eoh_tel_tw_dtl_pcall_prc_gokei"));
			BigDecimal cnt = new BigDecimal((String) gokei1Map.get("eoh_tel_tw_dtl_gokei"));
			
			if ("1".equals(kazeiHikazeiCd))
			{
				// 課税の場合
				kazeiGokeiCnt = kazeiGokeiCnt.add(cnt);
				kazeiGokeiPrc = kazeiGokeiPrc.add(prc);
			}
			else
			{
				// 非課税の場合
				hikazeiGokeiCnt = hikazeiGokeiCnt.add(cnt);
				hikazeiGokeiPrc = hikazeiGokeiPrc.add(prc);
			}
		}
		
		//フッター編集
		StringBuffer footerSb = new StringBuffer("");
		footerSb.append(getDblQuote(String.valueOf(kazeiGokeiCnt.intValue())))
				.append(CSV_DIV + getDblQuote(String.valueOf(kazeiGokeiPrc.intValue())))
				.append(CSV_DIV + getDblQuote(String.valueOf(hikazeiGokeiCnt.intValue())))
				.append(CSV_DIV + getDblQuote(String.valueOf(hikazeiGokeiPrc.intValue())));
		
		//UTF-8のバイト配列に変換して返す
		return createCSV(headerSb.toString(), bodyList, footerSb.toString()).getBytes("UTF-8");
	}
	
	/**
	 * CSVデータの明細行を取得
	 * @param dtlMap 明細マップ
	 * @return CSV文字列
	 */
	private String getLineData(HashMap dtlMap)
	{
		StringBuffer sb = new StringBuffer();
		//フォーマット編集
		String staYmd = (String) dtlMap.get(EAC0391B010CBSMsg1List.PCALL_STAYMD);
		String staMonth = staYmd.substring(4, 6);
		String staDay = staYmd.substring(6, 8);
		String staHms = (String) dtlMap.get(EAC0391B010CBSMsg1List.PCALL_STA_HMS);
		BigDecimal staH = new BigDecimal(staHms.substring(0, 2));
		BigDecimal staM = new BigDecimal(staHms.substring(2, 4));
		BigDecimal staS = new BigDecimal(staHms.substring(4, 7)).divide(new BigDecimal(10));
		BigDecimal pcallSecCnt = new BigDecimal((String)dtlMap.get(EAC0391B010CBSMsg1List.PCALL_SEC_CNT));
		BigDecimal pcallH = pcallSecCnt.divideToIntegralValue(new BigDecimal(3600));
		pcallSecCnt = pcallSecCnt.remainder(new BigDecimal(3600));
		BigDecimal pcallM = pcallSecCnt.divideToIntegralValue(new BigDecimal(60));
		BigDecimal pcallS = pcallSecCnt.remainder(new BigDecimal(60));
		String telNo = (String)dtlMap.get(EAC0391B010CBSMsg1List.INCOMING_TELNO);
		String kazeiHikazeiCd = (String)dtlMap.get(EAC0391B010CBSMsg1List.KAZEI_HIKAZEI_CD);
		String menzeiChar = "";
		if ("2".equals(kazeiHikazeiCd))
		{
			menzeiChar = "*";
		}
		BigDecimal pcallPrc = new BigDecimal((String)dtlMap.get(EAC0391B010CBSMsg1List.PCALL_PRC));
		String pcallSbt = (String)dtlMap.get(EAC0391B010CBSMsg1List.TUWA_SBT_ALI);
		Calendar cl = new GregorianCalendar(Integer.parseInt(staYmd.substring(0, 4)), Integer.parseInt(staYmd.substring(4, 6)) -1, Integer.parseInt(staYmd.substring(6, 8)));
		int iWeek = cl.get(Calendar.DAY_OF_WEEK);
		
		DecimalFormat dfH = new DecimalFormat("00");
		DecimalFormat dfM = new DecimalFormat("00");
		DecimalFormat dfS = new DecimalFormat("00.0");
		DecimalFormat dfPrc = new DecimalFormat("###,###,##0.00");
		sb.append(getDblQuote(staMonth + "/" + staDay))
				.append(CSV_DIV + getDblQuote("(" + WEEK[iWeek - 1] + ")"))
				.append(CSV_DIV + getDblQuote(dfH.format(staH)))
				.append(CSV_DIV + getDblQuote(dfM.format(staM)))
				.append(CSV_DIV + getDblQuote(dfS.format(staS)))
				.append(CSV_DIV + getDblQuote(dfH.format(pcallH)))
				.append(CSV_DIV + getDblQuote(dfM.format(pcallM)))
				.append(CSV_DIV + getDblQuote(dfS.format(pcallS)))
				.append(CSV_DIV + getDblQuote(getTellMask(telNo.trim())))
				.append(CSV_DIV + getDblQuote(menzeiChar))
				.append(CSV_DIV + getDblQuote(dfPrc.format(pcallPrc)))
				.append(CSV_DIV + getDblQuote(pcallSbt));
		return sb.toString();
	}
	

	
	/**
	 * 帳票生成処理
	 * @param handle
	 * @param param
	 * @param csvData
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite createList(SessionHandle handle, 
			IRequestParameterReadWrite param, byte[] csvData) throws Exception
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// リクエストパラメータ作成
		HashMap<String, Object> parentMapCC = (HashMap<String, Object>)param.getData(CC_TITLE);

		String userId = parentMapCC.get("user_id").toString();

		parentMapCC.put("data_file", csvData);
		parentMapCC.put("user_id", userId);
		
		/*
		 * 上りマッピング処理
		 */
		paramMap = editInMsg(param);
		
		/*
		 * ＳＣ呼出実行
		 */
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		/*
		 * 下りマッピング処理
		 */
		IRequestParameterReadWrite rtnParam = editOutMsg(result, param);
		
		//取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		String status = (String)rtnParam.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == Integer.parseInt(status))) 
		{
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCode, Integer.parseInt(status));
			throw scCallEx;
		}
		
		return rtnParam;
	}
	
	
	
	/**
	 * 帳票生成処理チェック処理
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle
			, IRequestParameterReadWrite param, String fixedText) throws RequestParameterException 
	{
		// コード名称管理取得処理用メッセージ設定処理
		HashMap<String, Object> paramMap = editInMsg(param);
		
		return paramMap;
	}
	
	
	/**
	 * 帳票生成処理用メッセージ設定処理
	 * @param param
	 * @param csvData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));


		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)param.getData(CC_TITLE);
		
		CAANMsg template = new CAANMsg(ECC0041A110CBSMsg.class.getName());
		// テンプレートID
		template.set(ECC0041A110CBSMsg.TEMPLATEID, TEMPLATE_ID);
		
		// 機能コード
		template.set(ECC0041A110CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);

		// 検索処理パターン
		template.setNull(ECC0041A110CBSMsg.SEARCH_TYPE);

		// 最大検索件数
		template.setNull(ECC0041A110CBSMsg.MAX_SEARCH_NUM);
		
		// 表示件数
		template.setNull(ECC0041A110CBSMsg.DISPLAY_NUM);

		// 表示ページ番号
		template.setNull(ECC0041A110CBSMsg.DISPLAY_PAGE_NUM);
		
		// オペレータID
		template.set(ECC0041A110CBSMsg.OPERATORID, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// 運用日付
		template.set(ECC0041A110CBSMsg.OPERATEDATE, param.getControlMapData(SCControlMapKeys.OPE_DATE));

		// 運用日時
		template.set(ECC0041A110CBSMsg.OPERATEDATETIME,  param.getControlMapData(SCControlMapKeys.OPE_TIME));


		// ◇業務データの設定
		// 帳票定義体の電子ファイル管理番号
		template.set(ECC0041A110CBSMsg.CHOHYO_TEIGI_NO, JACStrConst.PCALL_DTL_CHOHYO_TEIGI_NO);
		// データファイル番号
		template.setNull(ECC0041A110CBSMsg.DATA_FILE_NO);
		// データファイル
		if ("".equals(inMap.get("data_file"))) 
		{
			template.setNull(ECC0041A110CBSMsg.DATA_FILE);
		}
		else
		{
			template.set(ECC0041A110CBSMsg.DATA_FILE, inMap.get("data_file"));
		}

		// ユーザーID
		if ("".equals(inMap.get("user_id"))) 
		{
			template.setNull(ECC0041A110CBSMsg.USER_ID);
		}
		else
		{
			template.set(ECC0041A110CBSMsg.USER_ID, inMap.get("user_id"));
		}
		
		// 処理種別
		template.set(ECC0041A110CBSMsg.TRAN_SBT, CHOHYO_TRAN_SBT_PDF);
		// 帳票出力環境識別コード
		template.setNull(ECC0041A110CBSMsg.CHOHYO_OPUT_ENV_SKBT_CD);
	
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}

	/**
	 * 帳票生成処理用メッセージ取得処理
	 * @param msgList
	 * @param param
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsg(Map<?, ?> msgList,
			IRequestParameterReadWrite param) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 結果を詰めるマップを取得。
		HashMap<String, Object> dataMap = null;
		ArrayList dataList = null;

		/* 業務データ設定 */
		dataMap = (HashMap<String, Object>)param.getData(CC_TITLE);
		
		if(dataMap == null) 
		{
			dataMap = new HashMap<String, Object>();
			param.setData(CC_TITLE, dataMap);
		}
		
		// 検索系 共通部
		dataMap.put("total_search_num", parentTemplate.getString("total_search_num"));
		dataMap.put("total_page_num", parentTemplate.getString("total_page_num"));
		dataMap.put("search_err_flg", parentTemplate.getString("search_err_flg"));
		
		templateArray = parentTemplate.getCAANMsgList(ECC0041A110CBSMsg.ECC0041A110CBSMSG1LIST);
		dataList = (ArrayList)dataMap.get("ECC0041A110CBSMsg1List");

		if (dataList == null) 
		{
			dataList = new ArrayList();
		}

		if (templateArray != null) 
		{
			for(int i = 0; i < templateArray.length; i++) 
			{
				CAANMsg childTemplate = templateArray[i];
				if(i >= dataList.size())
				{
					dataList.add(new HashMap<String, Object>());
				}
				HashMap<String, Object> childMap = (HashMap<String, Object>)dataList.get(i);

				if (childTemplate.isNull(ECC0041A110CBSMsg1List.OUTPUT_CHOHYO)) 
				{
					childMap.put("output_chohyo", new byte[0]);
				} 
				else 
				{
					//childMap.put("output_chohyo", (byte[])childTemplate.getObject(ECC0041A110CBSMsg1List.OUTPUT_CHOHYO));
					// byte配列の場合は添付ファイルエリアに格納する
					HashMap<Object, Object> map = new HashMap<Object, Object>();
					ArrayList<HashMap> list = new  ArrayList<HashMap>();
					map.put(AttachmentFileMapKeys.IDENTIFY_CD, "TUSV0041CC");
					map.put(AttachmentFileMapKeys.LIST_NAME, "ECC0041A110CBSMsg1List");
					map.put(AttachmentFileMapKeys.ITEM_NAME, "output_chohyo");
					map.put(AttachmentFileMapKeys.INDEX, Integer.toString(i));
					map.put(AttachmentFileMapKeys.FILE, childTemplate.getObject(ECC0041A110CBSMsg1List.OUTPUT_CHOHYO));
					list.add(map);
					param.setControlMapData(SCControlMapKeys.ATTACHMENT_FILE_DOWN, list);
				}
				
				
				if (childTemplate.isNull(ECC0041A110CBSMsg1List.OUTPUT_CHOHYO_NM)) 
				{
					childMap.put("output_chohyo_nm", "");
				} 
				else 
				{
					childMap.put("output_chohyo_nm", childTemplate.getString(ECC0041A110CBSMsg1List.OUTPUT_CHOHYO_NM));
				}
				
				if (childTemplate.isNull(ECC0041A110CBSMsg1List.SEND_RESULT_CD)) 
				{
					childMap.put("send_result_cd", "");
				} 
				else 
				{
					childMap.put("send_result_cd", childTemplate.getString(ECC0041A110CBSMsg1List.SEND_RESULT_CD));
				}
			}
		}
		dataMap.put("ECC0041A110CBSMsg1List", dataList);

		// エラー情報の設定
		IRequestParameterReadWrite rtnParam = editErrorInfo(param, templates, (Integer)return_code);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)rtnParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		rtnParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return rtnParam;
	}
		
	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode) throws RequestParameterException
	{
//		CAANMsg template = templates[0];
//
//		int templateStatus = template.getInt(ECC0041A110CBSMsg.STATUS);
//		if (returnCode != 0) 
//		{
//			templateStatus = 9000;
//		}
//		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null) 
//		{
//			templateStatus = 0;
//		}
//		
//		int bpStatus = 0;
//		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
//		if (obj == null)
//		{
//			bpStatus = -1;
//		}
//		else 
//		{
//			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
//		}
//
//		if (templateStatus > bpStatus) 
//		{
//			// BPにサービスコンポーネントのステータスを設定する。
//			String formatStatus = String.format("%1$04d", templateStatus);
//			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
//			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
//			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
//		}
//		
//		HashMap<String, Object> inMap = null;
//		
//		/* ユーザデータ情報 */
//		inMap = (HashMap<String, Object>)param.getData(CC_TITLE);
//		
//		// 帳票生成.帳票定義体の電子ファイル管理番号→ 帳票定義体の電子ファイル管理番号 のエラー情報返却
//		if (!template.isNull(ECC0041A110CBSMsg.CHOHYO_TEIGI_NO_ERR)) 
//		{
//			if (!inMap.containsKey("chohyo_teigi_no_err")) 
//			{
//				inMap.put("chohyo_teigi_no_err", template.getString(ECC0041A110CBSMsg.CHOHYO_TEIGI_NO_ERR));
//			}
//		}
//		// 帳票生成.データファイルの電子ファイル管理番号→ データファイルの電子ファイル管理番号 のエラー情報返却
//		if (!template.isNull(ECC0041A110CBSMsg.DATA_FILE_NO_ERR)) 
//		{
//			if (!inMap.containsKey("data_file_no_err")) 
//			{
//				inMap.put("data_file_no_err", template.getString(ECC0041A110CBSMsg.DATA_FILE_NO_ERR));
//			}
//		}
//		// 帳票生成.データファイル→ データファイル のエラー情報返却
//		if (!template.isNull(ECC0041A110CBSMsg.DATA_FILE_ERR)) 
//		{
//			if (!inMap.containsKey("data_file_err")) 
//			{
//				inMap.put("data_file_err", template.getString(ECC0041A110CBSMsg.DATA_FILE_ERR));
//			}
//		}
//		// 帳票生成.ユーザーID→ ユーザーID のエラー情報返却
//		if (!template.isNull(ECC0041A110CBSMsg.USER_ID_ERR)) 
//		{
//			if (!inMap.containsKey("user_id_err")) 
//			{
//				inMap.put("user_id_err", template.getString(ECC0041A110CBSMsg.USER_ID_ERR));
//			}
//		}
//		// 帳票生成.処理種別→ 処理種別 のエラー情報返却
//		if (!template.isNull(ECC0041A110CBSMsg.TRAN_SBT_ERR)) 
//		{
//			if (!inMap.containsKey("tran_sbt_err")) 
//			{
//				inMap.put("tran_sbt_err", template.getString(ECC0041A110CBSMsg.TRAN_SBT_ERR));
//			}
//		}
//		
//		// 帳票生成.FAX送信先コード区分→ FAX送信先コード区分 のエラー情報返却
//		if (!template.isNull(ECC0041A110CBSMsg.CHOHYO_OPUT_ENV_SKBT_CD_ERR)) 
//		{
//			if (!inMap.containsKey("chohyo_oput_env_skbt_cd_err")) 
//			{
//				inMap.put("chohyo_oput_env_skbt_cd_err", template.getString(ECC0041A110CBSMsg.CHOHYO_OPUT_ENV_SKBT_CD_ERR));
//			}
//		}

		return param;
	}
	
	/**
	 * CSV文字列を作成する
	 * 
	 * @param header ヘッダー文字列
	 * @param bodyList 明細文字列リスト
	 * @param footer フッター文字列
	 * @return CSV文字列
	 */
	private String createCSV(String header, ArrayList<String> bodyList, String footer)
	{
		StringBuilder csvSb = new StringBuilder();
		for(String body : bodyList)
		{
			csvSb.append(header);
			csvSb.append(CSV_DIV);
			csvSb.append(body);
			csvSb.append(CSV_DIV);
			csvSb.append(footer);
			csvSb.append(CSV_KAIGYO);
		}
		return csvSb.toString();
	}

	/**
	 * 文字列にダブルコーテーションを付加する
	 * 
	 * @param value 文字列
	 * @return 出力後文字列
	 */
	private String getDblQuote(Object value)
	{
		return DBL_QUOTE + value + DBL_QUOTE; 
	}
	
	/**
	 * 電話番号マスク処理
	 * @param telNo 電話番号
	 * @return String マスク後の電話暗号
	 */
	private String getTellMask(String telNo)
	{
		if(telNo.length() < 5)
		{
			return telNo;
		}
		else if(telNo.length() < 9)
		{
			if("0".equals(telNo.substring(0, 1)))
			{
				if("0".equals(telNo.substring(1, 2)))
				{
					return getMaskLast4(telNo);
				}
				else
				{
					return telNo;
				}
			}
			else
			{
				return getMaskLast4(telNo);
			}
		}
		else if(telNo.length() < 11)
		{
			return getMaskLast4(telNo);
		}
		else
		{
			return getMask8_11(telNo);
		}
		
	}
	
	/**
	 * 下4桁マスク処理
	 * @param telNo
	 * @return String マスク後の電話暗号
	 */
	private String getMaskLast4(String telNo)
	{
		return telNo.substring(0, telNo.length() - 4) + "****";
	}

	/**
	 * 8桁から11桁マスク処理
	 * @param telNo
	 * @return String マスク後の電話暗号
	 */
	private String getMask8_11(String telNo)
	{
		return telNo.substring(0, 7) + "****" + telNo.substring(11);
	}
	
	/**
	 * 文字の空白チェック。<BR>
	 * @param val 検査文字
	 * @return boolean 空白またはNullのときtrue
	 */
	private boolean nullOrEmpty(String val)
	{
		if (val == null)
		{
			return true;
		}
		return "".equals(val);
	}


}
