/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCHSeikyLineShokaiCC
*	ソースファイル名：JCHSeikyLineShokaiCC.java
*	作成者			：FJ)中原
*	日付			：2019年1月24日
*＜機能概要＞
*	請求情報照会(LINE)の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v41.00.00   2019/1/24   FJ)中原     【ANK-3355-00-00】LINE情報連携
*   v41.00.01   2019/02/04  FJ)中原     【IT1-2019-0000014】請求内訳一覧照会(LINE)のその他料金取得誤り
*   v41.00.02   2019/02/15  FJ)中原     【IT1-2019-0000021】卸契約のネット料金出力不正
*	v41.00.03	2019/02/28	FJ)中原		【IT1-2019-0000031】卸料金の計算方法変更対応
*	v41.00.04	2019/03/08	FJ)中原		【IT2-2019-0000020】抽出対象請求年月の当月料金確定済みチェックの方法変更
*	v41.00.05	2019/03/14	FJ)中原		【IT1-2019-0000042】請求金額が「999999999999」の場合システムエラー
*	v43.00.00	2019/05/29	FJ)吉田		【ANK-3629-00-00】LINE-ID連携：認証解除登録対応
*   v44.00.00   2019/05/31  FJ)澤田		【ANK-3561-00-00】一部契約解約時の過去分請求明細表示
*   v44.01.00   2019/08/20  FJ)中原		【IT1-2019-0000060】入力パラメータ.SYSIDに紐づく請求情報以外を返却しないようにする
*   v46.00.00   2019/10/09  FJ)麻生		【ANK-3586-00-00】隔月合算請求
*   v47.00.00   2019/12/16  FJ)澤田		【ANK-3786-00-00】ID連携のコンテンツ個別決済情報の連携
*   v54.00.00   2021/08/26  FJ)上村		【OM-2021-0000604】項目出力不正対応
*   v69.00.00   2023/11/08  FJ)吉田		【ANK-4346-00-00】【eo定期】CCMG再構築対応
*   v69.00.01	2024/01/24  FJ)吉田		【ST-2024-0000001】クレジットカード決済、ISP決済両方計上される
*   v69.01.00   2024/04/08  FJ)中原		【##84394】CHIFE067_請求情報照会(LINE)の返却値不正
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.common.check.DatetimeCheck;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JACStrConst;
import eo.common.constant.JCKStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECH0501B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0501B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECH0891B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0891B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B042CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B042CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B012CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B012CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECH0101B030CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0101B030CBSMsg1List;


/**
 * 請求情報照会(LINE)の共通コンポーネントクラスです。
 * <br>
 * @author FJ
 */
public class JCHSeikyLineShokaiCC extends AbstractCommonComponent
{
	/** CCパラメータ：SYSID */
	public static final String SYSID = "sysid";
	/** CCパラメータ：抽出対象請求年月 */
	public static final String CHSHT_TG_SEIKY_YM = "chsht_tg_seiky_ym";
	/** CCパラメータ：ボディ情報 */
	public static final String BODY_INFO = "BODY_INFO";
	/** CCパラメータ：会員種別コード */
	public static final String MEMBER_SBT_CD = "member_sbt_cd";
	/** CCパラメータ：請求データ */
	public static final String SEIKYULIST = "seikyulist";
	/** CCパラメータ：請求先番号 */
	public static final String SEIKY_KEI_NO = "seiky_kei_no";
	/** CCパラメータ：請求先合計料金 */
	public static final String SEIKY_GOKEI_RYOKIN = "seiky_gokei_ryokin";
	/** CCパラメータ：請求内訳データ */
	public static final String SEIKYUUCHILIST = "seikyuuchilist";
	/** CCパラメータ：契約サービス名称 */
	public static final String KYK_SVC_NM = "kyk_svc_nm";
	/** CCパラメータ：合計料金 */
	public static final String GOKEI_RYOKIN = "gokei_ryokin";
	// ANK-3586-00-00 ADD START
	/** CCパラメータ：請求合算状況 */
	public static final String SEIKY_GASSAN_FLG = "seiky_gassan_flg";
	// ANK-3586-00-00 ADD END

	/** CCパラメータ：エラー情報 */
	public static final String ERROR_INFO = "ERROR_INFO";
	/** CCパラメータ：エラーコード */
	public static final String ERROR_CODE = "errCode";
	/** CCパラメータ：エラーメッセージ */
	public static final String ERROR_MESSAGE = "errMessage";

	 /** テンプレートID：お客様一意照会 */
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	/** テンプレートID：料金スケジュール定義一覧照会 */
	private static final String TEMPLATE_ID_ECH0501B010 = "ECH0501B010";
 	/** テンプレートID：請求契約番号一覧照会(CMP) */
	private static final String TEMPLATE_ID_EKK0321B012 = "EKK0321B012";
 	/** テンプレートID：サービス契約番号(代表)一覧照会(CMP) */
	private static final String TEMPLATE_ID_EKK0081B042 = "EKK0081B042";
	/** テンプレートID：サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";

	/** テンプレートID：月別請求契約_お客様一覧照会 */
	private static final String TEMPLATE_ID_ECH0891B010 = "ECH0891B010";
 	/** テンプレートID：業務パラメータ管理一覧照会 */
	private static final String TEMPLATE_ID_EZM0321B010 = "EZM0321B010";
	/** テンプレートID：請求内訳一覧照会(LINE) */
	private static final String TEMPLATE_ID_ECH0101B030 = "ECH0101B030";
	// ANK-4346-00-00 MOD START
//	// ANK-3786-00-00 ADD START
//	/** テンプレートID：コンテンツクレカ課金分請求書情報照会(PMP連携用) */
//	private static final String TEMPLATE_ID_ECN0071B002 = "ECN0071B002";
//	// ANK-3786-00-00 ADD END
	/** テンプレートID：課金参照(CCMG) */
	private static final String TEMPLATE_ID_ECNA0180001 = "ECNA0180001";
	// ANK-4346-00-00 MOD END
	/** 作業用マップのキー：運用日 */
	private static final String WORK_KEY_OPEDATE = "opeDate";
	/** 作業用マップのキー：お客様一意照会明細 */
	private static final String WORK_KEY_ECK0011A010CBSMSGLIST = "ECK0011A010CBSMsg1List";
	// ANK-3786-00-00 ADD START
	/** 作業用マップのキー：解約後請求書参照可否フラグ */
	private static final String WORK_KEY_DSL_AF_SKSSNS_KH_FLG = "dslAfSkssnsKhFlg";
	// ANK-3786-00-00 ADD END
	/** 業務パラメータ検索キー */
	private static final String GYOMU_PARAM_KEY = "CH_CHIFE067_PKMK*";
	/** 集計・返却区分：ｅｏ光ネット */
	private static final String SYUKEI_RES_DIV_NET = "01";
	/** 集計・返却区分：ｅｏ光電話 */
	private static final String SYUKEI_RES_DIV_TEL = "02";
	/** 集計・返却区分：ｅｏ光テレビ */
	private static final String SYUKEI_RES_DIV_TV = "03";
	/** 集計・返却区分：ｅｏ電気 */
	private static final String SYUKEI_RES_DIV_ELE = "04";
	/** 集計・返却区分：ｍｉｎｅｏ */
	private static final String SYUKEI_RES_DIV_MINEO = "05";
	/** 集計・返却区分：その他料金 */
	private static final String SYUKEI_RES_DIV_ETC = "90";
	// ANK-3786-00-00 ADD START
	/** 集計・返却区分：コンテンツ個別決済 */
	private static final String SYUKEI_RES_DIV_CN = "06";
	/** 集計・業務パラメータID：コンテンツ個別決済 */
	private static final String SYUKEI_WORK_PARAM_ID = "9999999999";
	/** 解約後請求書参照可否フラグ 0 */
	private static final String DSL_AF_SKSSNS_KH_FLG_0 = "0";
	// ANK-3786-00-00 ADD END
	// ANK-3586-00-00 ADD START
	/** 請求合算状況：合算対象外 */
	private static final String SEIKY_GASSAN_FLG_NO_TARGET = "0";
	/** 請求合算状況：合算対象、請求月 */
	private static final String SEIKY_GASSAN_FLG_SEIKY_M = "1";
	/** 請求合算状況：合算対象、請求なし月 */
	private static final String SEIKY_GASSAN_FLG_SKIP_M = "2";
	// ANK-3586-00-00 ADD END
	/** パートナー会員 */
	private static final String PARTNER_CD = "99";
	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";


	/**
	 * 契約情報から請求情報を照会する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite searchSeikyLine(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// 請求情報照会(LINE)CCマップ
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		// 作業用マップ
		Map<String, Object> work = new HashMap<String, Object>();

		try
		{
			// 運用日
			work.put(WORK_KEY_OPEDATE, JPCBPCommon.getOpeDate(null));
			// 単項目チェック
			if (!checkUnitParam(handle, param, fixedText, ccMsg, work))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}

			// 関連チェック
			if (!checkParameter(handle, param, fixedText, ccMsg, work))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}

			// 請求情報検索処理
			searchSeikyInfo(handle, param, fixedText, ccMsg, work);

			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		catch (Throwable throwable)
		{
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_9000, "");
			throw throwable;
		}

		return param;
	}

	/**
	 * 単項目チェック
	 * @param param
	 * @param ccMsg
	 * @param ekk0081b043Msg
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			Map<String, Object> ccMsg, Map<String, Object> work)
	throws Exception
	{
		// 請求データリスト
		List<Map<String, Object>> seikyList = new ArrayList<Map<String, Object>>();
		// 請求内訳データリスト
		List<Map<String, Object>> seikyUwList = new ArrayList<Map<String, Object>>();
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		Map<String, Object> bodyMap = new HashMap<String, Object>();
		Map<String, Object> seikyMap = new HashMap<String, Object>();
		Map<String, Object> seikyUwMap = new HashMap<String, Object>();
		String itemName = null;
		String itemValue = null;

		// SYSID
		itemName = SYSID;
		itemValue = (String)ccMsg.get(itemName);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap());
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap());
		}
		else if (!LengthCheck.isLength1Check(itemValue, 10))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap());
		}

		// 抽出対象請求年月
		itemName = CHSHT_TG_SEIKY_YM;
		itemValue = (String)ccMsg.get(itemName);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap());
		}
		else if (!DatetimeCheck.isYearMonthCheck(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap());
		}
		else if (!LengthCheck.isLength1Check(itemValue, 6))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap());
		}

		// エラーが存在する場合
		if (errList.size() > 0)
		{
			// 会員種別コード
			bodyMap.put(MEMBER_SBT_CD, "");
			// 抽出対象請求年月
			bodyMap.put(CHSHT_TG_SEIKY_YM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM));
			// 請求先番号
			seikyMap.put(SEIKY_KEI_NO, "");
			// 請求先合計料金
			seikyMap.put(SEIKY_GOKEI_RYOKIN, "");
			// 契約サービス名称
			seikyUwMap.put(KYK_SVC_NM, "");
			// 合計料金
			seikyUwMap.put(GOKEI_RYOKIN, "");

			// ボディ部の設定
			seikyUwList.add(seikyUwMap);
			seikyMap.put(SEIKYUUCHILIST, seikyUwList);
			seikyList.add(seikyMap);
			bodyMap.put(SEIKYULIST, seikyList);
			ccMsg.put(BODY_INFO, bodyMap);

			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		return true;

	}

	/**
	 * 関連チェックを行います。<br>
	 * ※後続処理に必要な情報の取得も行う。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg 請求情報照会(LINE)CCマップ
	 * @param work 作業用マップ
	 * @return チェックエラーの場合はfalse、チェックOKの場合はtrue
	 * @throws Throwable 例外が発生した場合
	 */
	private boolean checkParameter(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			Map<String, Object> ccMsg, Map<String, Object> work)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// お客様一意照会明細
		CAANMsg[] eck0011a010MsgList = null;
		// 料金スケジュール定義一覧照会明細
		CAANMsg[] ech0501b010MsgList = null;

		// 関連チェック(SYSID存在チェック、会員種別コードチェック、退会済チェック)
		// お客様一意照会
		Object[][] eck0011a010In =
		{
			{ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010}
			// 機能コード
			, {ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {ECK0011A010CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
			// ＫＥＹ＿予約適用年月日
			, {ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}
		};
		// サービスIF実行
		eck0011a010MsgList = callSC(handle, scCall, param, fixedText, eck0011a010In)
				.getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);

		// SYSIDが取得できない場合
		String memberSbtCd = "";
		if (eck0011a010MsgList == null || eck0011a010MsgList.length == 0)
		{
			// SYSID存在チェックエラー
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2001, "");
			return false;
		}
		else 
		{
			// 会員種別コードのチェック
			memberSbtCd = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
			// 非会員:00の場合
			if ( memberSbtCd != null && JCKStrConst.CD00039_NOT_EO_MMB.equals(memberSbtCd) )
			{
				// 会員種別コードチェックエラー
				setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2006, "");
				return false;
			}
			// 最終収納後照会可能期間のチェック
			String custNTaikai = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.CUST_NTAIKAI_CD);
			String dslAfSkssnsKh = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.DSL_AF_SKSSNS_KH);
			// 退会済かつ解約後請求書参照可否：「否」もしくはnullの場合、
			// もしくはファミリー会員（個人）:11、ファミリー会員（法人）:21かつ解約後請求書参照可否：「否」もしくはnullの場合、
			// もしくはオープン会員：30かつ解約後請求書参照可否：「否もしくはnull」の場合
			if ( custNTaikai != null && JCKStrConst.CD00260_TAIKAI.equals(custNTaikai) )
			{
				if 	( dslAfSkssnsKh == null  || ( dslAfSkssnsKh != null && JCKStrConst.CD00003_FAIL.equals(dslAfSkssnsKh) ) )
				{
					// ANK-3786-00-00 DEL START
//					// 最終収納後照会可能期間チェックエラー
//					setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2005, "");
//					return false;
					// ANK-3786-00-00 DEL END
					// ANK-3786-00-00 ADD START
					//workパラメータの解約後請求書参照可否フラグを設定する。
					work.put("dslAfSkssnsKhFlg", DSL_AF_SKSSNS_KH_FLG_0);
					// ANK-3786-00-00 ADD END
				}
			}
			if ( memberSbtCd != null && ( dslAfSkssnsKh == null  || ( dslAfSkssnsKh != null && JCKStrConst.CD00003_FAIL.equals(dslAfSkssnsKh) ) )  )
			{
				if 	( JCKStrConst.CD00039_FAMILY_KOJIN.equals(memberSbtCd) || JCKStrConst.CD00039_FAMILY_HOJIN.equals(memberSbtCd) ||
					 JCKStrConst.CD00039_OPEN.equals(memberSbtCd)
					)
				{
					// ANK-3786-00-00 DEL START
//					// 最終収納後照会可能期間チェックエラー
//					setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2005, "");
//					return false;
					// ANK-3786-00-00 DEL END
					// ANK-3786-00-00 ADD START
					//workパラメータの解約後請求書参照可否フラグを設定する。
					work.put("dslAfSkssnsKhFlg", DSL_AF_SKSSNS_KH_FLG_0);
					// ANK-3786-00-00 ADD END
				}
			}
		}

		// 関連チェック(抽出対象請求年月のチェック）
		// 抽出対象請求年月の未来日チェック
		// 抽出対象請求年月がオンライン運用日・年月より未来の場合エラー
		if ( opeDate.substring(0, 6).compareTo((String)ccMsg.get(CHSHT_TG_SEIKY_YM)) < 0 )
		{
			// 抽出対象請求年月の未来日チェックエラー
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2002, "");
			return false;
		}
			
		// 抽出対象請求年月の当月料金確定済みチェック
		// 抽出対象請求年月とオンライン運用日・年月が同月の場合以下のチェック
		// IT2-2019-0000020 DEL START
		//if ( opeDate.substring(0, 6).equals((String)ccMsg.get(CHSHT_TG_SEIKY_YM)) )
		//{
		// IT2-2019-0000020 DEL END
		// 料金スケジュール定義一覧照会
		Object[][] ech0501b010In =
		{
			{ECH0501B010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0501B010}
			// 機能コード
			// IT2-2019-0000020 MOD START
			, {ECH0501B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿イベントコード(請求処理日)
			//, {ECH0501B010CBSMsg.KEY_EVENT_CD, JACStrConst.EVENT_CD_PRC_CALC_DAY}
			, {ECH0501B010CBSMsg.KEY_EVENT_CD, JACStrConst.EVENT_CD_SIKY_TRN_DAY}
			// IT2-2019-0000020 MOD END
			// ＫＥＹ＿基準年月日
			, {ECH0501B010CBSMsg.KEY_STDARDYMD, opeDate}
		};
		// サービスIF実行
		ech0501b010MsgList = callSC(handle, scCall, param, fixedText, ech0501b010In)
				.getCAANMsgList(ECH0501B010CBSMsg.ECH0501B010CBSMSG1LIST);			
		if(ech0501b010MsgList != null && ech0501b010MsgList.length > 0)
		{
			// IT2-2019-0000020 MOD START
			//String eventYmd = ech0501b010MsgList[0].getString(ECH0501B010CBSMsg1List.EVENT_YMD);
			//// イベント年月日・年月が当月以外
			//if ( !opeDate.substring(0, 6).equals(eventYmd.substring(0, 6)) )
			String seikyYmd = ech0501b010MsgList[0].getString(ECH0501B010CBSMsg1List.SEIKY_YM);
			// 抽出対象年月が請求年月より未来の場合
			if ( seikyYmd.compareTo((String)ccMsg.get(CHSHT_TG_SEIKY_YM)) < 0 )
			// IT2-2019-0000020 MOD END
			{
				// 抽出対象請求年月の当月料金確定済みチェックエラー
				setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2003, "" );
				return false;
			}
		}
		// IT2-2019-0000020 DEL START
		//}
		// IT2-2019-0000020 DEL END
		// 抽出対象請求年月の過去日範囲チェック
		// 抽出対象請求年月がオンライン運用日・年月を基準に25ヶ月以上過去の場合エラー
		if (JCCBPCommon.subtractMonth(opeDate.substring(0, 6) + "01", (String)ccMsg.get(CHSHT_TG_SEIKY_YM) + "01") >= 25 )
		{
			// 抽出対象請求年月の過去日範囲チェックエラー
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2004, "" );
			return false;
		}

		// お客様一意照会明細を作業用マップに設定
		work.put(WORK_KEY_ECK0011A010CBSMSGLIST, eck0011a010MsgList);

		return true;
	}

	/**
	 * 請求情報検索処理を行います。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg 請求情報照会(LINE)CCマップ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	private void searchSeikyInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			Map<String, Object> ccMsg, Map<String, Object> work)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// お客様一意照会明細
		CAANMsg eck0011a010MsgList = ((CAANMsg[])work.get(WORK_KEY_ECK0011A010CBSMSGLIST))[0];
		// 請求契約番号リスト
		ArrayList<String> seikyList = new ArrayList<String>();
		// 業務パラメータ取得結果リスト
		ArrayList<String[]> gyomuParaGetList = new ArrayList<String[]>();

		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		// 請求データリスト
		List<Map<String, Object>> seikyDataList = new ArrayList<Map<String, Object>>();
		Map<String, Object> bodyMap = new HashMap<String, Object>();
		// IT1-2019-0000014 DEL START
		//Map<String, Object> seikyMap = new HashMap<String, Object>();
		// IT1-2019-0000014 DEL END
		Map<String, String> errMap = new HashMap<String, String>();
		
		// 請求契約番号一覧照会(CMP)明細
		CAANMsg[] ekk0321b012MsgList = null;
		// サービス契約番号(代表)一覧照会(CMP)
		CAANMsg[] ekk0081b042MsgList = null;
		// サービス契約一意照会
		CAANMsg[] ekk0081a010MsgList = null;
		// 月別請求契約_お客様一覧照会
		CAANMsg[] ech0891b010MsgList = null;
		// 業務パラメータ管理一覧照会
		CAANMsg[] ezm0321b010MsgList = null;
		// 請求内訳一覧照会(LINE)
		CAANMsg[] ech0101b030MsgList = null;
		// 請求内訳一覧照会(LINE)卸用
		CAANMsg[] ech0101b030MsgList2 = null;
		
		
		// ANK-3786-00-00 ADD START
		// 請求情報の取得
		// 業務パラメータ管理一覧照会
		Object[][] ezm0321b010In =
		{
			{EZM0321B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321B010}
			// 機能コード
			, {EZM0321B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿業務パラメータID
			, {EZM0321B010CBSMsg.KEY_WORK_PARAM_ID, GYOMU_PARAM_KEY}
		};
		// サービスIF実行
		ezm0321b010MsgList = callSC(handle, scCall, param, fixedText, ezm0321b010In)
				.getCAANMsgList(EZM0321B010CBSMsg.EZM0321B010CBSMSG1LIST);

		// 業務パラメータのレコードが取得出来た場合
		if(ezm0321b010MsgList != null && ezm0321b010MsgList.length > 0)
		{
			for(int l = 0; l < ezm0321b010MsgList.length; l++)
			{
				String[] list = ezm0321b010MsgList[l].getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE).split(",");
				gyomuParaGetList.add(list);
			}
		}
		String dslAfSkssnsKhFlg = (String)work.get(WORK_KEY_DSL_AF_SKSSNS_KH_FLG);
		// ANK-3786-00-00 ADD END

		// 請求契約番号の取得判定
		String memberSbtCd = eck0011a010MsgList.getString(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
		String orsJgsCd = eck0011a010MsgList.getString(ECK0011A010CBSMsg1List.ORSJGS_CD);
		String custNTaikai = eck0011a010MsgList.getString(ECK0011A010CBSMsg1List.CUST_NTAIKAI_CD);
		// ANK-3786-00-00 ADD START
		// 最終収納後照会可能期間外の場合、コンテンツ個別決済の設定を行う
		if (!DSL_AF_SKSSNS_KH_FLG_0.equals(dslAfSkssnsKhFlg))
		{
		// ANK-3786-00-00 ADD END
			if ( memberSbtCd != null )
			{
				// 会員種別が「マスター会員(個人／法人)、パートナー会員」でかつ、お客様入退会コードが退会済「1」以外の場合
				if ( (JCKStrConst.MMB_SBT_CD_MASTER_KOJIN.equals(memberSbtCd) || JCKStrConst.MMB_SBT_CD_MASTER_HOJIN.equals(memberSbtCd) ) &&
					 ( custNTaikai == null || ( custNTaikai != null && JCKStrConst.CD00260_JOIN.equals(custNTaikai) ) ) )
				{
					// 請求契約番号一覧照会(CMP)
					Object[][] ekk0321b012In =
					{
						{EKK0321B012CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321B012}
						// 機能コード
						, {EKK0321B012CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
						// ＫＥＹ＿ＳＹＳＩＤ
						, {EKK0321B012CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
					};
					// サービスIF実行
					ekk0321b012MsgList = callSC(handle, scCall, param, fixedText, ekk0321b012In)
							.getCAANMsgList(EKK0321B012CBSMsg.EKK0321B012CBSMSG1LIST);
	
					// 請求契約のレコードが取得出来た場合
					if(ekk0321b012MsgList != null && ekk0321b012MsgList.length > 0)
					{
						for(int i = 0; i < ekk0321b012MsgList.length; i++)
						{
							String seikyKeiNo = ekk0321b012MsgList[i].getString(EKK0321B012CBSMsg1List.SEIKY_KEI_NO);
							// サービス契約番号(代表)一覧照会(CMP)
							Object[][] ekk0081b042In =
							{
								{EKK0081B042CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B042}
								// 機能コード
								, {EKK0081B042CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
								// ＫＥＹ＿請求契約番号
								, {EKK0081B042CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo}
							};
							// サービスIF実行
							ekk0081b042MsgList = callSC(handle, scCall, param, fixedText, ekk0081b042In)
									.getCAANMsgList(EKK0081B042CBSMsg.EKK0081B042CBSMSG1LIST);
							if(ekk0081b042MsgList != null && ekk0081b042MsgList.length > 0)
							{
								for(int j = 0; j < ekk0081b042MsgList.length; j++)
								{
									//ワーク領域設定用サービス契約番号
									String svcKeiNo = ekk0081b042MsgList[j].getString(EKK0081B042CBSMsg1List.SVC_KEI_NO);
									// サービス契約一意照会
									Object[][] ekk0081a010In =
									{
										{EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010}
										// 機能コード
										, {EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
										// ＫＥＹ＿サービス契約番号
										, {EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}
										// ＫＥＹ＿予約適用年月日
										, {EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}
									};
									// サービスIF実行
									ekk0081a010MsgList = callSC(handle, scCall, param, fixedText, ekk0081a010In)
											.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
	
									// サービス契約が取得できた場合
									if (ekk0081a010MsgList != null && ekk0081a010MsgList.length > 0)
									{
										String svcKeiStat = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
										// IT1-2019-0000060 ADD START
										String sysIdWork = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.SYSID);
										// IT1-2019-0000060 ADD END
										// IT1-2019-0000060 MOD START
										// 入力パラメータのSYSIDと一致するもののみを返却(別SYSIDの請求契約番号は取得しない)
										//if ( JKKStrConst.CD00037_SVCTK_CHU.equals(svcKeiStat) ||  JKKStrConst.CD00037_STAT_PAUSE.equals(svcKeiStat) ) 
										if ( (JKKStrConst.CD00037_SVCTK_CHU.equals(svcKeiStat) ||  JKKStrConst.CD00037_STAT_PAUSE.equals(svcKeiStat)) &&
												sysIdWork.equals((String)ccMsg.get(SYSID)) ) 
										// IT1-2019-0000060 MOD END
										{
											seikyList.add(seikyKeiNo);
											break;
										}
									}
								}
							}
						}
					}
					// ANK-3561-00-00 ADD START
					// 月別請求契約_お客様一覧照会
					Object[][] ech0891b010In =
					{
						{ECH0891B010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0891B010}
						// 機能コード
						, {ECH0891B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
						// ＫＥＹ＿ＳＹＳＩＤ
						, {ECH0891B010CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
						// ＫＥＹ＿請求年月FROM
						, {ECH0891B010CBSMsg.KEY_SEIKYU_YM_FROM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM)}
						// ＫＥＹ＿請求年月TO
						, {ECH0891B010CBSMsg.KEY_SEIKYU_YM_TO, (String)ccMsg.get(CHSHT_TG_SEIKY_YM)}
					};
					// サービスIF実行
					ech0891b010MsgList = callSC(handle, scCall, param, fixedText, ech0891b010In)
							.getCAANMsgList(ECH0891B010CBSMsg.ECH0891B010CBSMSG1LIST);
	
					// 月別請求契約_お客様一覧照会のレコードが取得出来た場合
					if(ech0891b010MsgList != null && ech0891b010MsgList.length > 0)
					{
						for(int k = 0; k < ech0891b010MsgList.length; k++)
						{
							String seikyKeiNo = ech0891b010MsgList[k].getString(ECH0891B010CBSMsg1List.SEIKY_KEI_NO);
							//取得した請求契約番号の中に上記のサービスIFの取得結果に含まれないものがある場合、処理対象の請求契約番号に追加する。
							if (!seikyList.contains(seikyKeiNo))
							{
								seikyList.add(seikyKeiNo);
							}
						}
					}
					// ANK-3561-00-00 ADD END
				}
				else
				{
					// 月別請求契約_お客様一覧照会
					Object[][] ech0891b010In =
					{
						{ECH0891B010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0891B010}
						// 機能コード
						, {ECH0891B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
						// ＫＥＹ＿ＳＹＳＩＤ
						, {ECH0891B010CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
						// ＫＥＹ＿請求年月FROM
						, {ECH0891B010CBSMsg.KEY_SEIKYU_YM_FROM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM)}
						// ＫＥＹ＿請求年月TO
						, {ECH0891B010CBSMsg.KEY_SEIKYU_YM_TO, (String)ccMsg.get(CHSHT_TG_SEIKY_YM)}
					};
					// サービスIF実行
					ech0891b010MsgList = callSC(handle, scCall, param, fixedText, ech0891b010In)
							.getCAANMsgList(ECH0891B010CBSMsg.ECH0891B010CBSMSG1LIST);
	
					// 月別請求契約_お客様一覧照会のレコードが取得出来た場合
					if(ech0891b010MsgList != null && ech0891b010MsgList.length > 0)
					{
						for(int k = 0; k < ech0891b010MsgList.length; k++)
						{
							String seikyKeiNo = ech0891b010MsgList[k].getString(ECH0891B010CBSMsg1List.SEIKY_KEI_NO);
							seikyList.add(seikyKeiNo);
						}
					}
				}
				// 請求契約存在チェック 対象データが存在しない場合はＮＵＬＬで返却する
				if ( seikyList.size() == 0 )
				{
					// ANK-3786-00-00 ADD START
					// コンテンツ個別決済の設定を行う
					boolean bol = cnKobetsuKessaiSet(handle, param, fixedText, ccMsg, work, gyomuParaGetList);
					// コンテンツ個別決済が未設定の場合、0件リストを作成する。
					if (!bol)
					{
					// ANK-3786-00-00 ADD END
						// ANK-3629-00-00 MOD START
		//				setResponse(param, ccMsg, "", "");
						setResponse(param, ccMsg, "", "", memberSbtCd, orsJgsCd);
						// ANK-3629-00-00 MOD END
					// ANK-3786-00-00 ADD START
					}
					// OM-2021-0000604 ADD START
					else
					{
						// コンテンツ個別決済にて設定されたBODY情報を取得
						bodyMap = (Map<String, Object>)ccMsg.get(BODY_INFO);
						
						// 会員種別コードがパートナー会員の場合、９９を設定する
						if ( memberSbtCd != null && (JCKStrConst.MMB_SBT_CD_MASTER_KOJIN.equals(memberSbtCd) ) && orsJgsCd != null )
						{
							bodyMap.put(MEMBER_SBT_CD, PARTNER_CD);
						}
						else
						{
							bodyMap.put(MEMBER_SBT_CD, memberSbtCd);
						}
						// 抽出対象請求年月
						bodyMap.put(CHSHT_TG_SEIKY_YM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM));
						
						// 出力用BODY情報を上書き
						ccMsg.put(BODY_INFO, bodyMap);
						
						// エラーコード
						errMap.put(ERROR_CODE, "");
						// エラーメッセージ
						errMap.put(ERROR_MESSAGE, "");
						errList.add(errMap);
						ccMsg.put(ERROR_INFO, errList);
					}
					// OM-2021-0000604 ADD END
					// ANK-3786-00-00 ADD END
					return;
				}
			}
			// ANK-3786-00-00 ADD START
	//		// 請求情報の取得
	//		// 業務パラメータ管理一覧照会
	//		Object[][] ezm0321b010In =
	//		{
	//			{EZM0321B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321B010}
	//			// 機能コード
	//			, {EZM0321B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
	//			// ＫＥＹ＿業務パラメータID
	//			, {EZM0321B010CBSMsg.KEY_WORK_PARAM_ID, GYOMU_PARAM_KEY}
	//		};
	//		// サービスIF実行
	//		ezm0321b010MsgList = callSC(handle, scCall, param, fixedText, ezm0321b010In)
	//				.getCAANMsgList(EZM0321B010CBSMsg.EZM0321B010CBSMSG1LIST);
	//
	//		// 業務パラメータのレコードが取得出来た場合
	//		if(ezm0321b010MsgList != null && ezm0321b010MsgList.length > 0)
	//		{
	//			for(int l = 0; l < ezm0321b010MsgList.length; l++)
	//			{
	//				String[] list = ezm0321b010MsgList[l].getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE).split(",");
	//				gyomuParaGetList.add(list);
	//			}
	//		}
			// ANK-3786-00-00 ADD END
			// 請求契約リスト
			for (String seikyKeiNoTmp : seikyList)
			{
				// IT1-2019-0000014 ADD START
				Map<String, Object> seikyMap = new HashMap<String, Object>();
				// IT1-2019-0000014 ADD END
	
				// 請求先合計料金
				// IT1-2019-0000042 MOD START
				//int seikyGokeiRyokinOut = 0;
				long seikyGokeiRyokinOut = 0;
				// IT1-2019-0000042 MOD END
				// 契約サービス名称
				String kykSvcNmNet = "";
				// 合計料金
				// IT1-2019-0000042 MOD START
				//int gokeiRyokinNet = 0;
				long gokeiRyokinNet = 0;
				// IT1-2019-0000042 MOD END
				// 契約サービス名称
				String kykSvcNmTel = "";
				// 合計料金
				// IT1-2019-0000042 MOD START
				//int gokeiRyokinTel = 0;
				long gokeiRyokinTel = 0;
				// IT1-2019-0000042 MOD END
				// 契約サービス名称
				String kykSvcNmTv = "";
				// 合計料金
				// IT1-2019-0000042 MOD START
				//int gokeiRyokinTv = 0;
				long gokeiRyokinTv = 0;
				// IT1-2019-0000042 MOD END
				// 契約サービス名称
				String kykSvcNmEle = "";
				// 合計料金
				// IT1-2019-0000042 MOD START
				//int gokeiRyokinEle = 0;
				long gokeiRyokinEle = 0;
				// IT1-2019-0000042 MOD END
				// 契約サービス名称
				String kykSvcNmMineo = "";
				// 合計料金
				// IT1-2019-0000042 MOD START
				//int gokeiRyokinMineo = 0;
				long gokeiRyokinMineo = 0;
				// IT1-2019-0000042 MOD END
				// 契約サービス名称
				String kykSvcNmEtc = "";
				// 合計料金
				// IT1-2019-0000042 MOD START
				//int gokeiRyokinEtc = 0;
				long gokeiRyokinEtc = 0;
				// IT1-2019-0000042 MOD END
				// ANK-3586-00-00 ADD START
				// 請求合算状況
				String seikyGassanFlg = "";
				// ANK-3586-00-00 ADD END
				// 請求内訳データリスト
				List<Map<String, Object>> seikyUwList = new ArrayList<Map<String, Object>>();
	
				// 請求内訳一覧照会(LINE)
				Object[][] ech0101b030In =
				{
					{ECH0101B030CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0101B030}
					// 機能コード
					, {ECH0101B030CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
					// ＫＥＹ＿請求契約番号
					, {ECH0101B030CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNoTmp}
					// ＫＥＹ＿請求年月
					, {ECH0101B030CBSMsg.KEY_SEIKY_YM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM)}
				};
				// サービスIF実行
				ech0101b030MsgList = callSC(handle, scCall, param, fixedText, ech0101b030In)
						.getCAANMsgList(ECH0101B030CBSMsg.ECH0101B030CBSMSG1LIST);
	
				// 請求契約のレコードが取得出来た場合
				if(ech0101b030MsgList != null && ech0101b030MsgList.length > 0)
				{
					for(int m = 0; m < ech0101b030MsgList.length; m++)
					{
						String prcPrpCd = ech0101b030MsgList[m].getString(ECH0101B030CBSMsg1List.PRC_GRP_CD);
						String prcKmkCd = ech0101b030MsgList[m].getString(ECH0101B030CBSMsg1List.PRC_KMK_CD);
						// IT1-2019-0000042 MOD START
						//int amnt = Integer.parseInt(nullToZero(ech0101b030MsgList[m].getString(ECH0101B030CBSMsg1List.AMNT)));
					 	long amnt = Long.parseLong(nullToZero(ech0101b030MsgList[m].getString(ECH0101B030CBSMsg1List.AMNT)));
						// IT1-2019-0000042 MOD START
	
						for (String[] gyomuParaList : gyomuParaGetList)
						{
							// 請求内訳から取得した料金グループ、料金項目コードが業務パラメータの値と一致した場合
							// ｅｏ光ネット
							if ( gyomuParaList[0].equals(prcKmkCd) &&  gyomuParaList[1].equals(prcPrpCd) &&  SYUKEI_RES_DIV_NET.equals(gyomuParaList[2]) )
							{
								// IT1-2019-0000021 MOD START
								// 卸契約の場合、ネット料金は返却しない
								if ( orsJgsCd == null || "".equals(orsJgsCd) )
								{
									kykSvcNmNet = gyomuParaList[3];
									gokeiRyokinNet = gokeiRyokinNet + amnt;
									seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
									break;
								}
								// IT1-2019-0000021 MOD END
								// IT1-2019-0000031 MOD START
								// 卸契約の場合、その他料金に設定
								else
								{
									kykSvcNmEtc = "その他料金";
									gokeiRyokinEtc = gokeiRyokinEtc + amnt;
									seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
									break;
								}
								// IT1-2019-0000031 MOD END
							}
							// 請求内訳から取得した料金グループ、料金項目コードが業務パラメータの値と一致した場合
							// ｅｏ光電話
							else if ( gyomuParaList[0].equals(prcKmkCd) &&  gyomuParaList[1].equals(prcPrpCd) &&  SYUKEI_RES_DIV_TEL.equals(gyomuParaList[2]) )
							{
								kykSvcNmTel = gyomuParaList[3];
								gokeiRyokinTel = gokeiRyokinTel + amnt;
								seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
								break;
							}
							// 請求内訳から取得した料金グループ、料金項目コードが業務パラメータの値と一致した場合
							// ｅｏ光テレビ
							else if ( gyomuParaList[0].equals(prcKmkCd) &&  gyomuParaList[1].equals(prcPrpCd) &&  SYUKEI_RES_DIV_TV.equals(gyomuParaList[2]) )
							{
								kykSvcNmTv = gyomuParaList[3];
								gokeiRyokinTv = gokeiRyokinTv + amnt;
								seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
								break;
							}
							// 請求内訳から取得した料金グループ、料金項目コードが業務パラメータの値と一致した場合
							// ｅｏ電気
							else if ( gyomuParaList[0].equals(prcKmkCd) &&  gyomuParaList[1].equals(prcPrpCd) &&  SYUKEI_RES_DIV_ELE.equals(gyomuParaList[2]) )
							{
								kykSvcNmEle = gyomuParaList[3];
								gokeiRyokinEle = gokeiRyokinEle + amnt;
								seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
								break;
							}
							// 請求内訳から取得した料金グループ、料金項目コードが業務パラメータの値と一致した場合
							// ｍｉｎｅｏ
							else if ( gyomuParaList[0].equals(prcKmkCd) &&  gyomuParaList[1].equals(prcPrpCd) &&  SYUKEI_RES_DIV_MINEO.equals(gyomuParaList[2]) )
							{
								kykSvcNmMineo = gyomuParaList[3];
								gokeiRyokinMineo  = gokeiRyokinMineo + amnt;
								seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
								break;
							}
							// 請求内訳から取得した料金グループ、料金項目コードが業務パラメータの値と一致した場合
							// その他料金
							else if ( gyomuParaList[0].equals(prcKmkCd) &&  gyomuParaList[1].equals(prcPrpCd) &&  SYUKEI_RES_DIV_ETC.equals(gyomuParaList[2]) )
							{
								kykSvcNmEtc = gyomuParaList[3];
								gokeiRyokinEtc = gokeiRyokinEtc + amnt;
								seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
								break;
							}
							// 対象外の組み合わせについては処理しない
							else
							{
								;
							}
						}
					}
					// ANK-3586-00-00 ADD START
					// 隔月請求スキップフラグから請求合算状況を設定
					String kakgtSeikySkipFlg = ech0101b030MsgList[0].getString(ECH0101B030CBSMsg1List.KAKGT_SEIKY_SKIP_FLG);
					if (JACStrConst.KAKGT_SEIKY_SKIP_FLG_GASSAN_M.equals(kakgtSeikySkipFlg))
					{
						seikyGassanFlg = SEIKY_GASSAN_FLG_SEIKY_M;
					}
					else if (JACStrConst.KAKGT_SEIKY_SKIP_FLG_SKIP_M.equals(kakgtSeikySkipFlg))
					{
						seikyGassanFlg = SEIKY_GASSAN_FLG_SKIP_M;
					}
					else
					{
						seikyGassanFlg = SEIKY_GASSAN_FLG_NO_TARGET;
					}
					// ANK-3586-00-00 ADD END
				}
	
				// 卸先事業者コードが存在する場合以下の処理を実施する
				if ( orsJgsCd != null && !"".equals(orsJgsCd) )
				{
					// 請求内訳一覧照会(LINE)
					Object[][] ech0101b030In2 =
					{
						{ECH0101B030CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0101B030}
						// 機能コード
						, {ECH0101B030CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
						// ＫＥＹ＿請求契約番号
						, {ECH0101B030CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNoTmp}
						// ＫＥＹ＿請求年月
						, {ECH0101B030CBSMsg.KEY_SEIKY_YM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM)}
					};
					// サービスIF実行
					ech0101b030MsgList2 = callSC(handle, scCall, param, fixedText, ech0101b030In2)
							.getCAANMsgList(ECH0101B030CBSMsg.ECH0101B030CBSMSG1LIST);
	
					// 請求契約のレコードが取得出来た場合
					if(ech0101b030MsgList2 != null && ech0101b030MsgList2.length > 0)
					{
						for(int n = 0; n < ech0101b030MsgList2.length; n++)
						{
							// その他合計料金
							// IT1-2019-0000042 MOD START
							// IT1-2019-0000014 MOD START
						 	//int amntOrs = Integer.parseInt(nullToZero(ech0101b030MsgList[n].getString(ECH0101B030CBSMsg1List.AMNT)));
						 	//int amntOrs = Integer.parseInt(nullToZero(ech0101b030MsgList2[n].getString(ECH0101B030CBSMsg1List.AMNT)));
							// IT1-2019-0000014 MOD END
						 	long amntOrs = Long.parseLong(nullToZero(ech0101b030MsgList2[n].getString(ECH0101B030CBSMsg1List.AMNT)));
							// IT1-2019-0000042 MOD END
							kykSvcNmEtc = "その他料金";
							// IT1-2019-0000031 MOD START
	//						gokeiRyokinEtc = gokeiRyokinEtc + amntOrs;
	//						seikyGokeiRyokinOut = seikyGokeiRyokinOut + amntOrs;
							gokeiRyokinEtc = gokeiRyokinEtc - amntOrs;
							seikyGokeiRyokinOut = seikyGokeiRyokinOut - amntOrs;
							// IT1-2019-0000031 MOD END
						}
					}
				}
				
				// 契約サービス名称のマッピング
				if ( !"".equals(kykSvcNmNet) )
				{
					// IT1-2019-0000042 MOD START
					//seikyUwList.add(setSeikyUwMap( kykSvcNmNet, Integer.toString(gokeiRyokinNet)) );
					seikyUwList.add(setSeikyUwMap( kykSvcNmNet, Long.toString(gokeiRyokinNet)) );
					// IT1-2019-0000042 MOD END
				}
				if ( !"".equals(kykSvcNmTel) )
				{
					// IT1-2019-0000042 MOD START
					//seikyUwList.add(setSeikyUwMap( kykSvcNmTel, Integer.toString(gokeiRyokinTel)) );
					seikyUwList.add(setSeikyUwMap( kykSvcNmTel, Long.toString(gokeiRyokinTel)) );
					// IT1-2019-0000042 MOD END
				}
				if ( !"".equals(kykSvcNmTv) )
				{
					// IT1-2019-0000042 MOD START
					//seikyUwList.add(setSeikyUwMap( kykSvcNmTv, Integer.toString(gokeiRyokinTv)) );
					seikyUwList.add(setSeikyUwMap( kykSvcNmTv, Long.toString(gokeiRyokinTv)) );
					// IT1-2019-0000042 MOD END
				}
				if ( !"".equals(kykSvcNmEle) )
				{
					// IT1-2019-0000042 MOD START
					//seikyUwList.add(setSeikyUwMap( kykSvcNmEle, Integer.toString(gokeiRyokinEle)) );
					seikyUwList.add(setSeikyUwMap( kykSvcNmEle, Long.toString(gokeiRyokinEle)) );
					// IT1-2019-0000042 MOD END
				}
				if ( !"".equals(kykSvcNmMineo) )
				{
					// IT1-2019-0000042 MOD START
					//seikyUwList.add(setSeikyUwMap( kykSvcNmMineo, Integer.toString(gokeiRyokinMineo)) );
					seikyUwList.add(setSeikyUwMap( kykSvcNmMineo, Long.toString(gokeiRyokinMineo)) );
					// IT1-2019-0000042 MOD END
				}
				if ( !"".equals(kykSvcNmEtc) )
				{
					// IT1-2019-0000042 MOD START
					//seikyUwList.add(setSeikyUwMap( kykSvcNmEtc, Integer.toString(gokeiRyokinEtc)) );
					seikyUwList.add(setSeikyUwMap( kykSvcNmEtc, Long.toString(gokeiRyokinEtc)) );
					// IT1-2019-0000042 MOD END
				}
	
				seikyMap.put(SEIKYUUCHILIST, seikyUwList);
				// 請求先合計料金
				// IT1-2019-0000042 MOD START
				//seikyMap.put(SEIKY_GOKEI_RYOKIN, Integer.toString(seikyGokeiRyokinOut));
				seikyMap.put(SEIKY_GOKEI_RYOKIN, Long.toString(seikyGokeiRyokinOut));
				// IT1-2019-0000042 MOD END
				// ANK-3586-00-00 ADD START
				// 請求合算状況
				seikyMap.put(SEIKY_GASSAN_FLG, seikyGassanFlg);
				// ANK-3586-00-00 ADD END
				// 請求先番号
				seikyMap.put(SEIKY_KEI_NO, seikyKeiNoTmp);
				seikyDataList.add(seikyMap);
			
			}
			bodyMap.put(SEIKYULIST, seikyDataList);
		// ANK-3786-00-00 ADD START
		}
		// ANK-3786-00-00 ADD END
		
		// 会員種別コードがパートナー会員の場合、９９を設定する
		if ( memberSbtCd != null && (JCKStrConst.MMB_SBT_CD_MASTER_KOJIN.equals(memberSbtCd) ) && orsJgsCd != null )
		{
			bodyMap.put(MEMBER_SBT_CD, PARTNER_CD);
		}
		else
		{
			bodyMap.put(MEMBER_SBT_CD, memberSbtCd);
		}
		// 抽出対象請求年月
		bodyMap.put(CHSHT_TG_SEIKY_YM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM));
		ccMsg.put(BODY_INFO, bodyMap);

		// コンテンツ個別決済の設定を行う
		cnKobetsuKessaiSet(handle, param, fixedText, ccMsg, work, gyomuParaGetList);
		
		// エラーコード
		errMap.put(ERROR_CODE, "");
		// エラーメッセージ
		errMap.put(ERROR_MESSAGE, "");
		errList.add(errMap);
		ccMsg.put(ERROR_INFO, errList);

		return;
	}

	/**
	 * レスポンス項目を設定します。
	 * <br>
	 * @param ccMsg 請求情報照会(LINE)CCマップ
	 * @param returnCode リターンコード
	 * @param returnMessage リターンメッセージ
	 */
	private void setResponse(IRequestParameterReadWrite param,  Map<String, Object> ccMsg, String errCode, String errMessage)
	throws Exception
	{
		// 請求データリスト
		List<Map<String, Object>> seikyList = new ArrayList<Map<String, Object>>();
		// 請求内訳データリスト
		List<Map<String, Object>> seikyUwList = new ArrayList<Map<String, Object>>();
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		Map<String, Object> bodyMap = new HashMap<String, Object>();
		Map<String, Object> seikyMap = new HashMap<String, Object>();
		Map<String, Object> seikyUwMap = new HashMap<String, Object>();
		Map<String, String> errMap = new HashMap<String, String>();

		// 会員種別コード
		bodyMap.put(MEMBER_SBT_CD, "");
		// 抽出対象請求年月
		bodyMap.put(CHSHT_TG_SEIKY_YM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM));
		// 請求先番号
		seikyMap.put(SEIKY_KEI_NO, "");
		// 請求先合計料金
		seikyMap.put(SEIKY_GOKEI_RYOKIN, "");
		// 契約サービス名称
		seikyUwMap.put(KYK_SVC_NM, "");
		// 合計料金
		seikyUwMap.put(GOKEI_RYOKIN, "");

		// ボディ部の設定
		seikyUwList.add(seikyUwMap);
		seikyMap.put(SEIKYUUCHILIST, seikyUwList);
		seikyList.add(seikyMap);
		bodyMap.put(SEIKYULIST, seikyList);
		ccMsg.put(BODY_INFO, bodyMap);

		// エラーコード
		errMap.put(ERROR_CODE, errCode);
		// エラーメッセージ
		errMap.put(ERROR_MESSAGE, errMessage);
		errList.add(errMap);
		ccMsg.put(ERROR_INFO, errList);
		

	}
	
	// ANK-3629-00-00 ADD START
	/**
	 * レスポンス項目を設定します。
	 * <br>
	 * @param ccMsg 請求情報照会(LINE)CCマップ
	 * @param returnCode リターンコード
	 * @param returnMessage リターンメッセージ
	 */
	private void setResponse(IRequestParameterReadWrite param,  Map<String, Object> ccMsg, String errCode, String errMessage, String memberSbtCd, String orsJgsCd)
	throws Exception
	{
		// 請求データリスト
		List<Map<String, Object>> seikyList = new ArrayList<Map<String, Object>>();
		// 請求内訳データリスト
		List<Map<String, Object>> seikyUwList = new ArrayList<Map<String, Object>>();
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		Map<String, Object> bodyMap = new HashMap<String, Object>();
		Map<String, Object> seikyMap = new HashMap<String, Object>();
		Map<String, Object> seikyUwMap = new HashMap<String, Object>();
		Map<String, String> errMap = new HashMap<String, String>();

		// 会員種別コード
		// 会員種別コードがパートナー会員の場合、９９を設定する
		if ( memberSbtCd != null && (JCKStrConst.MMB_SBT_CD_MASTER_KOJIN.equals(memberSbtCd) ) && orsJgsCd != null )
		{
			bodyMap.put(MEMBER_SBT_CD, PARTNER_CD);
		}
		else
		{
			bodyMap.put(MEMBER_SBT_CD, memberSbtCd);
		}
		// 抽出対象請求年月
		bodyMap.put(CHSHT_TG_SEIKY_YM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM));
		// 請求先番号
		seikyMap.put(SEIKY_KEI_NO, "");
		// 請求先合計料金
		seikyMap.put(SEIKY_GOKEI_RYOKIN, "");
		// 契約サービス名称
		seikyUwMap.put(KYK_SVC_NM, "");
		// 合計料金
		seikyUwMap.put(GOKEI_RYOKIN, "");

		// ボディ部の設定
		seikyUwList.add(seikyUwMap);
		seikyMap.put(SEIKYUUCHILIST, seikyUwList);
		seikyList.add(seikyMap);
		bodyMap.put(SEIKYULIST, seikyList);
		ccMsg.put(BODY_INFO, bodyMap);

		// エラーコード
		errMap.put(ERROR_CODE, errCode);
		// エラーメッセージ
		errMap.put(ERROR_MESSAGE, errMessage);
		errList.add(errMap);
		ccMsg.put(ERROR_INFO, errList);
		
	}
	// ANK-3629-00-00 ADD END
	
	/**
	 * 請求内訳リストをマッピング
	 * 
	 * @param kykSvcNm 契約サービス名称
	 * @param gokeiRyokin 合計料金
	 * @return seikyUwMap
	 */
	public static Map<String, Object> setSeikyUwMap(String kykSvcNm, String gokeiRyokin)
	{
		Map<String, Object> seikyUwMap =  new HashMap<String, Object>();
		// 請求内訳データリスト
		seikyUwMap.put(KYK_SVC_NM, kykSvcNm);
		seikyUwMap.put(GOKEI_RYOKIN, gokeiRyokin);

		return seikyUwMap;
	}
		

	/**
	 * SC(サービスインターフェイス）を呼び出します。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @return サービスインターフェイス実行結果
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData) throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);

		CAANMsg msg = templates[0];

		// リターンコード取得
		Object RETURN_CODE = result.get(JCMConstants.RET_CD_INT_KEY);

		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, (Integer)RETURN_CODE, dataMapKey);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));

		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(RETURN_CODE.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", RETURN_CODE.toString(), status);
		}

		return msg;
	}

	/**
	 * 共通項目のメッセージを作成します。
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) 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));

		String svcIf = (String)mappingData[0][1];

		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));

		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				if ("".equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * エラー情報を取得します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param errorCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int errorCode,
														String dataMapKey) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != errorCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;

		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(dataMapKey);

		HashMap map = template.getHashMap();
		Iterator it = map.keySet().iterator();
		while (it.hasNext())
		{
			String key = (String)it.next();
			Object value = map.get(key);
			if (value instanceof HashMap[])
			{
				HashMap[] childMapList = (HashMap[])value;
				for (HashMap childMap : childMapList)
				{
					Iterator childIt = childMap.keySet().iterator();
					while (childIt.hasNext())
					{
						String childKey = (String)childIt.next();
						if (childKey.endsWith(ERRITEM_SUFFIX))
						{
							int keyIdx = childKey.lastIndexOf(ERRITEM_SUFFIX);
							if (inMap.containsKey(childKey.substring(0, keyIdx)))
							{
								inMap.put(childKey, childMap.get(childKey));
							}
						}
					}
				}
			}
			else
			{
				if (key.endsWith(ERRITEM_SUFFIX))
				{
					int keyIdx = key.lastIndexOf(ERRITEM_SUFFIX);
					if (inMap.containsKey(key.substring(0, keyIdx)))
					{
						inMap.put(key, map.get(key));
					}
				}
			}
		}

		return param;
	}

	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @return returnMap
	 */
	public static Map<String, String> getReqErrInfMap()
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, "");
		
		return returnMap;
	}
	
	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @return returnMap
	 */
	public static Map<String, String> getFormErrInfMap()
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, "");
		
		return returnMap;
	}
	
	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @return returnMap
	 */
	public static Map<String, String> getLenErrInfMap()
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, "");
		
		return returnMap;
	}

	/**
	 * nullを"0"に置き換え
	 * 
	 * @param str 置き換え対象文字列
	 * @return
	 */
	public static String nullToZero(String str)
	{
		if (str == null)
		{
			return "0";
		}
		return str;
	}
	// ANK-3786-00-00 ADD START
	/**
	 * コンテンツ個別決済の設定を行う。<br>
	 * ※後続処理に必要な情報の取得も行う。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg 請求情報照会(LINE)CCマップ
	 * @param work 作業用マップ
	 * @return チェックエラーの場合はfalse、チェックOKの場合はtrue
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private boolean cnKobetsuKessaiSet(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			Map<String, Object> ccMsg, Map<String, Object> work, ArrayList<String[]> gyomuParaGetList)
	throws Throwable
	{
		
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<String, Object> bodyMap = new HashMap<String, Object>();
		Map<String, Object> seikyMap = new HashMap<String, Object>();
		Map<String, Object> seikyUwMap = new HashMap<String, Object>();
		// 請求データリスト
		List<Map<String, Object>> seikyList = new ArrayList<Map<String, Object>>();
		// 請求内訳データリスト
		List<Map<String, Object>> seikyUwList = new ArrayList<Map<String, Object>>();
		// お客様一意照会明細
		CAANMsg[] eck0011a010MsgList = null;
		// ANK-4346-00-00 MOD START
//		// コンテンツクレカ課金分請求書情報照会(PMP連携用)
//		CAANMsg[] ecn0071b002MsgList = null;
		// 課金参照(CCMG)
		CAANMsg ecna0180001Msg = null;
		// ANK-4346-00-00 MOD END
		
		// お客様一意照会明細を作業用マップに設定
		eck0011a010MsgList = (CAANMsg[])work.get(WORK_KEY_ECK0011A010CBSMSGLIST);
		// 会員種別コードのチェック
		String memberSbtCd = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
		String orsJgsCd = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.ORSJGS_CD);
		
		// 会員種別コードがパートナー会員の場合、(返却しない）
		if ( memberSbtCd != null && (JCKStrConst.MMB_SBT_CD_MASTER_KOJIN.equals(memberSbtCd) ) && orsJgsCd != null )
		{
			// 返却しない
			return false;
		}
		
		// ANK-4346-00-00 MOD START
//		// コンテンツクレカ課金分請求書情報照会(PMP連携用)
//		Object[][] ecn0071b002In =
//		{
//			{ECN0071B002CBSMsg.TEMPLATEID, TEMPLATE_ID_ECN0071B002}
//			// 機能コード
//			, {ECN0071B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
//			// ＫＥＹ＿ＳＹＳＩＤ
//			, {ECN0071B002CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
//			// ＫＥＹ＿課金対象年月
//			, {ECN0071B002CBSMsg.KEY_CHRG_TRGT_YM, (String)ccMsg.get(CHSHT_TG_SEIKY_YM)}
//		};
//		// サービスIF実行
//		ecn0071b002MsgList = callSC(handle, scCall, param, fixedText, ecn0071b002In)
//				.getCAANMsgList(ECN0071B002CBSMsg.ECN0071B002CBSMSG1LIST);
		// コンテンツクレカ課金分請求書情報照会(PMP連携用)
		Object[][] ecn0071b002In =
		{
			{ECNA0180001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0180001}
			// 機能コード
			, {ECNA0180001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {ECNA0180001CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
			// ＫＥＹ＿課金対象年月
			, {ECNA0180001CBSMsg.KEY_TARGET_DATE, (String)ccMsg.get(CHSHT_TG_SEIKY_YM)}
			// ST-2024-0000001 ADD START
			// ＫＥＹ＿決済方法番号
			, {ECNA0180001CBSMsg.KEY_SETTLEMENT_WAY_NUMBER, "1"}
			// ST-2024-0000001 ADD END
		};
		// サービスIF実行
		ecna0180001Msg = callSC(handle, scCall, param, fixedText, ecn0071b002In);
		// ANK-4346-00-00 MOD END

		//請求料金
		long amnt = 0;
		//請求先番号
		String seikyKeiNo = "";
		//請求先合計料金
		long seikyGokeiRyokinOut = 0;
		// 請求合算状況 0：合算対象外
		String seikyGassanFlg = "0";
		//契約サービス名称
		String kykSvcNm = "";

		//業務パラメータから請求契約番号（9999999999）・名称を取得する
		for (String[] gyomuParaList : gyomuParaGetList)
		{
			// 料金項目コードが業務パラメータの値と一致した場合
			// コンテンツ個別決済
			if ( gyomuParaList[0].equals(SYUKEI_WORK_PARAM_ID) && SYUKEI_RES_DIV_CN.equals(gyomuParaList[2]) )
			{
				seikyKeiNo = gyomuParaList[0];
				kykSvcNm = gyomuParaList[3];
				break;
			}
		}
		
		// ANK-4346-00-00 MOD START
//		// コンテンツクレカ課金分請求書情報照会(PMP連携用)のレコードが取得出来た場合
//		if(ecn0071b002MsgList != null && ecn0071b002MsgList.length > 0)
//		{
//			// 金額を集計する。
//			for(int k = 0; k < ecn0071b002MsgList.length; k++)
//			{
//			 	amnt = Long.parseLong(nullToZero(ecn0071b002MsgList[k].getString(ECN0071B002CBSMsg1List.AMNT)));
//			 	seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
//			}
//		}
		// 課金参照のレコードが取得出来た場合
		// #84394 DEL START
		//if(ecna0180001Msg != null)
		//{
		// #84394 DEL END
		CAANMsg[] ecna0180001Msg1List = ecna0180001Msg.getCAANMsgList(ECNA0180001CBSMsg.ECNA0180001CBSMSG1LIST);
		
		// 課金情報があれば集計する。
		if (ecna0180001Msg1List != null && ecna0180001Msg1List.length > 0)
		{
			// 金額を集計する。
			for(CAANMsg ecna0180001Msg1Map : ecna0180001Msg1List)
			{
				// 課金参照.課金額を加算する。
				amnt = Long.parseLong(nullToZero(ecna0180001Msg1Map.getString(ECNA0180001CBSMsg1List.CHARGE_AMOUNT)));
				// ANK-4346-00-00 DEL START
//					seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
				// ANK-4346-00-00 DEL END
				
				// 課金訂正情報あれば、値引き額を減算する。
				CAANMsg[] ecna0180001Msg2List = ecna0180001Msg1Map.getCAANMsgList(ECNA0180001CBSMsg1List.ECNA0180001CBSMSG2LIST);
				if (ecna0180001Msg2List != null && ecna0180001Msg2List.length > 0)
				{
					CAANMsg ecna0180001Msg2Map = ecna0180001Msg2List[0];
					
					// ANK-4346-00-00 MOD START
//						// 値引き額を減算する。
//						amnt = Long.parseLong(nullToZero(ecna0180001Msg2Map.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)));
//						seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
					// 訂正区分
					String correctedDivision = ecna0180001Msg2Map.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION);
					
					// 訂正区分が"2":売上減の場合
					if("2".equals(correctedDivision))
					{
						// 課金額から訂正額を引いた金額を加算額とする。
						Long discountAmnt = Long.parseLong(nullToZero(ecna0180001Msg2Map.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)));
						amnt = amnt - discountAmnt;
					}
					// 訂正区分が"1":取消の場合
					else
					{
					 	// 加算額を0円とする
						amnt = 0;
					}
					// ANK-4346-00-00 MOD END
				}
				// ANK-4346-00-00 ADD START
				seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
				// ANK-4346-00-00 ADD END
			}
		}
		// #84394 DEL START
		//}
		// #84394 DEL END
		// ANK-4346-00-00 MOD END
		//データが存在しない場合
		else
		{
			// 会員種別コード(マスター会員（個人）) または 会員種別コード(マスター会員（法人）) 
			if 	( JCKStrConst.CD00039_MASTER_KOJIN.equals(memberSbtCd) || JCKStrConst.CD00039_MASTER_HOJIN.equals(memberSbtCd))
			{
				// 返却しない
				return false;
			}
			// 会員種別コード(ファミリー会員（個人）) または 会員種別コード(ファミリー会員（法人）) または会員種別コード(オープン会員) 
			else if ( JCKStrConst.CD00039_FAMILY_KOJIN.equals(memberSbtCd) || JCKStrConst.CD00039_FAMILY_HOJIN.equals(memberSbtCd)
					|| JCKStrConst.CD00039_OPEN.equals(memberSbtCd))
			{
				// 請求先合計料金・合計料金を"0"固定で返却する
				seikyGokeiRyokinOut = 0; 
			}
		}
		// 請求先合計料金
		seikyMap.put(SEIKY_GOKEI_RYOKIN, Long.toString(seikyGokeiRyokinOut));
		// 請求合算状況
		seikyMap.put(SEIKY_GASSAN_FLG, seikyGassanFlg);
		// 請求先番号
		seikyMap.put(SEIKY_KEI_NO, seikyKeiNo);
		// 契約サービス名称
		seikyUwMap.put(KYK_SVC_NM, kykSvcNm);
		// 合計料金
		seikyUwMap.put(GOKEI_RYOKIN, Long.toString(seikyGokeiRyokinOut));
		
		// ボディ部の設定
		seikyUwList.add(seikyUwMap);
		seikyMap.put(SEIKYUUCHILIST, seikyUwList);
		
		bodyMap = (Map<String, Object>)ccMsg.get(BODY_INFO);
		// ボディ部が未設定の場合
		if (bodyMap == null)
		{
			bodyMap = new HashMap<String, Object>();
			seikyList.add(seikyMap);
			bodyMap.put(SEIKYULIST, seikyList);
			ccMsg.put(BODY_INFO, bodyMap);
		}
		// ボディ部が設定されている場合は、末尾に設定する。
		else
		{
			seikyList = (List<Map<String, Object>>)bodyMap.get(SEIKYULIST);
			if (seikyList == null)
			{
				seikyList = new ArrayList<Map<String, Object>>();
				seikyList.add(seikyMap);
				bodyMap.put(SEIKYULIST, seikyList);
			}
			else
			{
				seikyList.add(seikyMap);
			}
		}
		
		return true;
	}
	// ANK-3786-00-00 ADD END
}
