/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKSvcKeiHzkIfShkKjKapOpsCC
*	ソースファイル名：JKKSvcKeiHzkIfShkKjKapOpsCC.java
*	作成者			：FJ）王
*	日付			：2019年03月11日
*＜機能概要＞
*	サービス契約付属情報照会（工事・割賦）（オペレータ支援）の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v42.00.00	2019/04/09	FJ) 王		【ANK-3593-00-00】オペレータ支援対応に伴うeo顧客機能改修（お客さまカルテ）
*	v51.00.00	2020/10/29	FJ) 謝		【ANK-3927-00-00】オペレータ支援向けAPI機能変更(2020年12月中旬リリース)
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
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.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0081B553CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B553CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B037CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B037CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2521B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2521B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2541B006CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2541B006CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3131B050CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3131B050CBSMsg1List;


/**
 * サービス契約付属情報照会（工事・割賦）（オペレータ支援）の共通コンポーネントクラスです。
 * <BR>
 * @author FJ
 */
public class JKKSvcKeiHzkIfShkKjKapOpsCC extends AbstractCommonComponent
{
	/** テンプレートID　"EKK0081B553" */
	private static final String TEMPLATE_ID_EKK0081B553 = "EKK0081B553";
	/** テンプレートID　"EKK0341B037" */
	private static final String TEMPLATE_ID_EKK0341B037 = "EKK0341B037";
	/** テンプレートID　"EKK2521B002" */
	private static final String TEMPLATE_ID_EKK2521B002 = "EKK2521B002";
	/** テンプレートID　"EKK2541B006" */
	private static final String TEMPLATE_ID_EKK2541B006 = "EKK2541B006";
	/** テンプレートID　"EKK3131B050" */
	private static final String TEMPLATE_ID_EKK3131B050 = "EKK3131B050";
	/** CCパラメータ：エラー情報 */
	private static final String ERROR_INFO = "ERROR_INFO";
	/** CCパラメータ：エラーコード */
	private static final String ERROR_CODE = "errCode";
	/** CCパラメータ：エラーメッセージ */
	private static final String ERROR_MESSAGE = "errMessage";
	
	/**
	 * サービス契約付属情報照会（工事・割賦）を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getSvcKeiHzkIfShkKjKapOps(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		try
		{
			Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);

			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			// 単項目チェック
			if (!checkResult(ccMsg))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				
				return param;
			}

			// 回線単位契約情報リスト
			List<Map<String, Object>> kisnTaniKeiIfList = (List<Map<String, Object>>)ccMsg.get("kisn_tani_kei_if_list");
			
			// 割賦情報編集フラグ
			boolean kapIfEditFlg = false;

			for (int i = 0; i < kisnTaniKeiIfList.size(); i++)
			{
				// 回線単位契約情報
				Map<String, Object> kisnTaniKeiIf = kisnTaniKeiIfList.get(i);
				
				// 工事費割賦契約リスト
				List<Map<String, String>> kojihiKapKeiList = new ArrayList<Map<String, String>>();	
				
				// サービス契約回線内訳番号
				String svcKeiKaisenUcwkNo = (String)kisnTaniKeiIf.get("svc_kei_kaisen_ucwk_no");
				
				// 工事費割賦情報取得の上りマッピング
				Object[][] ekk3131b050In =
				{
					{EKK3131B050CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3131B050},
					{EKK3131B050CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
					{EKK3131B050CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo},
				};

				// サービスIF実行(工事費割賦情報取得)
				CAANMsg ekk3131b050Msg = callSC(handle, scCall, param, fixedText, ekk3131b050In, new EKK3131B050CBSMsg().getContents());
				
				// 工事費割賦情報明細
				CAANMsg[] ekk3131b050Msg1List = ekk3131b050Msg.getCAANMsgList(EKK3131B050CBSMsg.EKK3131B050CBSMSG1LIST);
				
				// 対象データが存在する場合
				if (ekk3131b050Msg1List != null && ekk3131b050Msg1List.length != 0)
				{
					for (int j = 0; j < ekk3131b050Msg1List.length; j++)
					{
						// 工事費割賦契約情報
						Map<String, String> kojihiKapKeiIf = new HashMap<String, String>();
						
						// 工事費割賦プランコード
						String kojihiKapPlanCd = nullToStr(ekk3131b050Msg1List[j].getString(EKK3131B050CBSMsg1List.KAP_PLAN_CD));
						// サービス契約番号(初期請求)
						String svcKeiNoFst = nullToStr(ekk3131b050Msg1List[j].getString(EKK3131B050CBSMsg1List.FIRST_SEIKY_SVC_KEI_NO));
						// 工事費割賦支払い残回数
						int kojihiKapPayZanCnt = Integer.parseInt(nullToZero(ekk3131b050Msg1List[j].getString(EKK3131B050CBSMsg1List.KAP_PAY_ZAN_CNT)));
						// 工事費割賦請求開始年月
						String kojihiKapSeikyStaYm = nullToStr(ekk3131b050Msg1List[j].getString(EKK3131B050CBSMsg1List.KAP_SEIKY_STA_YM));
						
						// 割賦プラン情報取得の上りマッピング
						Object[][] ekk2521b002In =
						{
							{EKK2521B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2521B002},
							{EKK2521B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
							{EKK2521B002CBSMsg.KEY_KAP_PLAN_CD, kojihiKapPlanCd},
						};
						
						// サービスIF実行(割賦プラン情報取得)
						CAANMsg ekk2521b002Msg = callSC(handle, scCall, param, fixedText, ekk2521b002In, new EKK2521B002CBSMsg().getContents());
						
						// 割賦プラン情報明細
						CAANMsg[] ekk2521b002Msg1List = ekk2521b002Msg.getCAANMsgList(EKK2521B002CBSMsg.EKK2521B002CBSMSG1LIST);
						
						// 対象データが存在する場合
						if (ekk2521b002Msg1List != null && ekk2521b002Msg1List.length != 0)
						{
							// 工事費割賦プラン名
							String kojihiKapPlanNm = nullToStr(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_PLAN_NM));
							// 割賦販売形態コード
							String kapHambaiFormCd = nullToStr(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_HAMBAI_FORM_CD));
							// 割賦プラン総金額
							BigDecimal kapPlanTtlAmnt = new BigDecimal(nullToZero(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_PLAN_TTL_AMNT)));
							// 割賦プラン料金額１
							BigDecimal kapPlanPrcAmnt1 = new BigDecimal(nullToZero(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_PLAN_PRC_AMNT_1)));
							// 割賦プラン料金額２
							BigDecimal kapPlanPrcAmnt2 = new BigDecimal(nullToZero(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_PLAN_PRC_AMNT_2)));
							
							// 工事費割賦残金額
							String kojihiKapZanAmnt = getKapZanAmnt(kapHambaiFormCd, kojihiKapSeikyStaYm, kapPlanTtlAmnt,
									kojihiKapPayZanCnt, kapPlanPrcAmnt1, kapPlanPrcAmnt2);
							
							// 工事費割賦契約情報編集
							kojihiKapKeiIf.put("svc_kei_no", svcKeiNoFst);
							kojihiKapKeiIf.put("kojihi_kap_plan_cd", kojihiKapPlanCd);
							kojihiKapKeiIf.put("kojihi_kap_pay_zan_cnt", String.valueOf(kojihiKapPayZanCnt));
							kojihiKapKeiIf.put("kojihi_kap_plan_nm", kojihiKapPlanNm);
							kojihiKapKeiIf.put("kojihi_kap_zan_amnt", kojihiKapZanAmnt);
							
							kojihiKapKeiList.add(kojihiKapKeiIf);
							
							kapIfEditFlg = true;
						}
					}
				}
				// 回線単位契約情報編集
				kisnTaniKeiIf.put("kojihi_kap_plan_list", kojihiKapKeiList);
				
				// 回線内サービス契約番号リスト
				List<Map<String, Object>> kisnNaiSvcKeiNoList = (List<Map<String, Object>>)kisnTaniKeiIf.get("kisn_nai_svc_kei_no_list");
				
				for (int j = 0; j < kisnNaiSvcKeiNoList.size(); j++)
				{
					// 回線内サービス契約情報
					Map<String, Object> kisnNaiSvcKeiIf = kisnNaiSvcKeiNoList.get(j);
					
					// サービス契約番号
					String svcKeiNo = (String)kisnNaiSvcKeiIf.get("svc_kei_no");
					// サービスコード
					String svcCd = (String)kisnNaiSvcKeiIf.get("svc_cd");
					
					// 工事案件実施情報取得の上りマッピング
					Object[][] ekk0081b553In =
					{
						{EKK0081B553CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B553},
						{EKK0081B553CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
						{EKK0081B553CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
					};
					
					// サービスIF実行(工事案件実施情報取得)
					CAANMsg ekk0081b553Msg = callSC(handle, scCall, param, fixedText, ekk0081b553In, new EKK0081B553CBSMsg().getContents());
					
					// 工事案件実施情報明細
					CAANMsg[] ekk0081b553Msg1List = ekk0081b553Msg.getCAANMsgList(EKK0081B553CBSMsg.EKK0081B553CBSMSG1LIST);
					
					// 対象データが存在する場合
					if (ekk0081b553Msg1List != null && ekk0081b553Msg1List.length != 0)
					{
						// 工事案件実施情報編集
						kisnNaiSvcKeiIf.put("kojiak_jssi_chu_um", nullToStr(ekk0081b553Msg1List[0].getString(EKK0081B553CBSMsg1List.KOJIAK_JSSI_CHU_UM)));
						kisnNaiSvcKeiIf.put("svc_pause_ymd", nullToStr(ekk0081b553Msg1List[0].getString(EKK0081B553CBSMsg1List.SVC_PAUSE_YMD)));
						kisnNaiSvcKeiIf.put("svc_pause_rls_ymd", nullToStr(ekk0081b553Msg1List[0].getString(EKK0081B553CBSMsg1List.SVC_PAUSE_RLS_YMD)));
						
						kapIfEditFlg = true;
					}
					else
					{
						// 工事案件実施情報編集
						kisnNaiSvcKeiIf.put("kojiak_jssi_chu_um", "");
						kisnNaiSvcKeiIf.put("svc_pause_ymd", "");
						kisnNaiSvcKeiIf.put("svc_pause_rls_ymd", "");
					}
					
					// 割賦契約リスト
					List<Map<String, String>> kapKeiList = new ArrayList<Map<String, String>>();
					
					// タブレット機器割賦契約編集
					if (JKKStrConst.CD00130_01.equals(svcCd))
					{
						// サービスコードが"01"(ネット)の場合
						// タブレット機器サービス契約照会の上りマッピング
						Object[][] ekk0341b037In =
						{
							{EKK0341B037CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0341B037},
							{EKK0341B037CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
							{EKK0341B037CBSMsg.KEY_SVC_KEI_NO, svcKeiNo},
						};
						
						// サービスIF実行(タブレット機器サービス契約照会)
						CAANMsg ekk0341b037Msg = callSC(handle, scCall, param, fixedText, ekk0341b037In, new EKK0341B037CBSMsg().getContents());
						
						// タブレット機器サービス契約照会明細
						CAANMsg[] ekk0341b037Msg1List = ekk0341b037Msg.getCAANMsgList(EKK0341B037CBSMsg.EKK0341B037CBSMSG1LIST);
						
						// タブレット機器サービス契約が存在する場合
						if (ekk0341b037Msg1List != null && ekk0341b037Msg1List.length != 0)
						{
							for (int k = 0; k < ekk0341b037Msg1List.length; k++)
							{
								// 割賦契約情報
								Map<String, String> kapKeiIf = new HashMap<String, String>();
								
								// 機器提供サービス契約番号
								String kktkSvcKeiNo = nullToStr(ekk0341b037Msg1List[k].getString(EKK0341B037CBSMsg1List.KKTK_SVC_KEI_NO));
								
								// 割賦契約一覧照会の上りマッピング
								Object[][] ekk2541b006In =
								{
									{EKK2541B006CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2541B006},
									{EKK2541B006CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
									{EKK2541B006CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo},
								};
								
								// サービスIF実行(割賦契約一覧照会)
								CAANMsg ekk2541b006Msg = callSC(handle, scCall, param, fixedText, ekk2541b006In, new EKK2541B006CBSMsg().getContents());
								
								// 割賦契約一覧照会明細
								CAANMsg[] ekk2541b006Msg1List = ekk2541b006Msg.getCAANMsgList(EKK2541B006CBSMsg.EKK2541B006CBSMSG1LIST);
								
								// タブレット機器割賦契約が存在する場合
								if (ekk2541b006Msg1List != null && ekk2541b006Msg1List.length != 0)
								{
									// 割賦プランコード
									String kapPlanCd = nullToStr(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_PLAN_CD));
									// 割賦支払い残回数
									int kapPayZanCnt = Integer.parseInt(nullToZero(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_PAY_ZAN_CNT)));
									// 割賦請求開始年月
									String kapSeikyStaYm = nullToStr(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_SEIKY_STA_YM));
									
									// 割賦プラン情報取得の上りマッピング
									Object[][] ekk2521b002In =
									{
										{EKK2521B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK2521B002},
										{EKK2521B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
										{EKK2521B002CBSMsg.KEY_KAP_PLAN_CD, kapPlanCd},
									};
									
									// サービスIF実行(割賦プラン情報取得)
									CAANMsg ekk2521b002Msg = callSC(handle, scCall, param, fixedText, ekk2521b002In, new EKK2521B002CBSMsg().getContents());
									
									// 割賦プラン情報明細
									CAANMsg[] ekk2521b002Msg1List = ekk2521b002Msg.getCAANMsgList(EKK2521B002CBSMsg.EKK2521B002CBSMSG1LIST);
									
									// 割賦プラン情報が存在する場合
									if (ekk2521b002Msg1List != null && ekk2521b002Msg1List.length != 0)
									{
										// 割賦プラン名
										String kapPlanNm = nullToStr(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_PLAN_NM));
										// 割賦販売形態コード
										String kapHambaiFormCd = nullToStr(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_HAMBAI_FORM_CD));
										// 割賦プラン総金額
										BigDecimal kapPlanTtlAmnt = new BigDecimal(nullToZero(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_PLAN_TTL_AMNT)));
										// 割賦プラン料金額１
										BigDecimal kapPlanPrcAmnt1 = new BigDecimal(nullToZero(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_PLAN_PRC_AMNT_1)));
										// 割賦プラン料金額２
										BigDecimal kapPlanPrcAmnt2 = new BigDecimal(nullToZero(ekk2521b002Msg1List[0].getString(EKK2521B002CBSMsg1List.KAP_PLAN_PRC_AMNT_2)));
										
										// 割賦契約残金額
										String kapKeiZanAmnt = getKapZanAmnt(kapHambaiFormCd, kapSeikyStaYm, kapPlanTtlAmnt,
												kapPayZanCnt, kapPlanPrcAmnt1, kapPlanPrcAmnt2);
										
										// 割賦契約情報編集
										kapKeiIf.put("kap_kei_trgt_kiki_nm", nullToStr(ekk0341b037Msg1List[k].getString(EKK0341B037CBSMsg1List.KAP_KEI_TRGT_KIKI_NM)));
										kapKeiIf.put("taknkiki_model_cd", nullToStr(ekk0341b037Msg1List[k].getString(EKK0341B037CBSMsg1List.TAKNKIKI_MODEL_CD)));
										kapKeiIf.put("kiki_seizo_no", nullToStr(ekk0341b037Msg1List[k].getString(EKK0341B037CBSMsg1List.KIKI_SEIZO_NO)));
										kapKeiIf.put("kap_plan_cd", kapPlanCd);
										kapKeiIf.put("kap_kei_zan_cnt", String.valueOf(kapPayZanCnt));
										kapKeiIf.put("kap_plan_nm", kapPlanNm);
										kapKeiIf.put("kap_kei_zan_amnt", kapKeiZanAmnt);
// ANK-3927-00-00 ADD START
										kapKeiIf.put("kap_kei_stat", nullToStr(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_KEI_STAT)));
										kapKeiIf.put("kap_seiky_sta_ym", nullToStr(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_SEIKY_STA_YM)));
										kapKeiIf.put("kap_ikt_siky_swch_ym", nullToStr(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_IKT_SIKY_SWCH_YM)));
										kapKeiIf.put("kap_kei_chrg_staymd", nullToStr(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_KEI_CHRG_STAYMD)));
										kapKeiIf.put("kap_seiky_endymd", nullToStr(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_SEIKY_ENDYMD)));
										kapKeiIf.put("kap_kei_dsl_ymd", nullToStr(ekk2541b006Msg1List[0].getString(EKK2541B006CBSMsg1List.KAP_KEI_DSL_YMD)));
// ANK-3927-00-00 ADD END
										
										// 割賦契約リスト編集
										kapKeiList.add(kapKeiIf);
										
										kapIfEditFlg = true;
									}
								}
							}
						}
					}
					// 回線内サービス契約情報編集
					kisnNaiSvcKeiIf.put("kap_kei_list", kapKeiList);
				}
			}
			
			// 工事費割賦契約リスト、割賦契約リスト、及び工事案件実施情報取得（オペレータ支援）サービスIFの実行結果が0件の場合は、
			if (!kapIfEditFlg) 
			{
				// 業務エラーリスト
				List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
				
				Map<String, String> resultErrMap = new HashMap<String, String>();

				resultErrMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_2001);
				resultErrMap.put(ERROR_MESSAGE, "");
				
				errList.add(resultErrMap);
				
				ccMsg.put(ERROR_INFO, errList);
				
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

				return param;
			}

			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		catch (SCCallException scCallEx)
		{
			// システムエラーを設定する
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
		}
		return param;
	}
	
	
	/**
	 * 割賦残金額取得処理
	 * @param kapHambaiFormCd 割賦販売形態コード
	 * @param kapSeikyStaYm 割賦請求開始年月
	 * @param kapPlanTtlAmnt 割賦プラン総金額
	 * @param kapPayZanCnt 割賦支払い残回数
	 * @param kapPlanPrcAmnt1 割賦プラン料金額１
	 * @param kapPlanPrcAmnt2 割賦プラン料金額２
	 * 
	 * @return 割賦残金額
	 */
	private String getKapZanAmnt(String kapHambaiFormCd, String kapSeikyStaYm, BigDecimal kapPlanTtlAmnt,
			int kapPayZanCnt, BigDecimal kapPlanPrcAmnt1, BigDecimal kapPlanPrcAmnt2)
	{
		// 割賦残金額
		BigDecimal kapZanAmnt = new BigDecimal(0);
		
		// 割賦残金額取得
		if (JKKStrConst.CD01467_IKKATSU.equals(kapHambaiFormCd))
		{
			// 割賦販売形態コードが"01"(一括)の場合
			kapZanAmnt = kapPlanTtlAmnt.multiply(new BigDecimal(kapPayZanCnt));
		}
		else
		{
			// 上記以外の場合
			if (kapSeikyStaYm == null || "".equals(kapSeikyStaYm))
			{
				// 割賦請求開始年月が未設定の場合
				kapZanAmnt = kapPlanPrcAmnt2.add(kapPlanPrcAmnt1.multiply(new BigDecimal(kapPayZanCnt - 1)));
			}
			else
			{
				// 割賦請求開始年月が設定済の場合
				kapZanAmnt = kapPlanPrcAmnt1.multiply(new BigDecimal(kapPayZanCnt));
			}
		}
		
		return String.valueOf(kapZanAmnt);
	}
	
	/**
	 * 項目名がnullかチェックする
	 * @param str 項目名
	 * @return 項目名
	 */
	private String nullToStr(String str)
	{
		if(str == null)
		{
			str = "";
		}
		return str;
	}
	
	/**
	 * nullを"0"に置き換え
	 * @param str 項目名
	 * @return 項目名
	 */
	private String nullToZero(String str)
	{
		if(str == null)
		{
			str = "0";
		}
		return str;
	}

	/**
	 * 単項目チェック
	 * @param ccMsg
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkResult(Map<String, Object> ccMsg)
	throws Exception
	{
		// 業務エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		String keySysid = (String)ccMsg.get("sysid");
		
		// SYSIDチェック
		if (keySysid == null || "".equals(keySysid))
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap("sysid"));
		}
		else if (!HalfCharCheck.isEnNumber1Check(keySysid))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap("sysid"));
		}
		else if (!LengthCheck.isLength1Check(keySysid, 10))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap("sysid"));
		}
		
		// 回線単位契約情報リスト
		List<Map<String, Object>> kisnTaniKeiIfList =  (List<Map<String, Object>>)ccMsg.get("kisn_tani_kei_if_list");
		
		// サービス契約回線内訳番号チェック
		if (kisnTaniKeiIfList != null && kisnTaniKeiIfList.size() != 0)
		{
			for (int i = 0; i < kisnTaniKeiIfList.size(); i++)
			{
				// 回線単位契約情報
				Map<String, Object> kisnTaniKeiIf = kisnTaniKeiIfList.get(i);
				
				if (kisnTaniKeiIf != null)
				{
					// サービス契約回線内訳番号
					String keySvcKeiKaisenUcwkNo = (String)kisnTaniKeiIf.get("svc_kei_kaisen_ucwk_no");
					
					if (keySvcKeiKaisenUcwkNo == null || "".equals(keySvcKeiKaisenUcwkNo))
					{
						// 必須チェックエラー
						errList.add(getReqErrInfMap("svc_kei_kaisen_ucwk_no"));
					}
					else if (!HalfCharCheck.isEnNumber1Check(keySvcKeiKaisenUcwkNo))
					{
						// 属性チェックエラー
						errList.add(getFormErrInfMap("svc_kei_kaisen_ucwk_no"));
					}
					else if (!LengthCheck.isLength1Check(keySvcKeiKaisenUcwkNo, 12))
					{
						// 桁数チェックエラー
						errList.add(getLenErrInfMap("svc_kei_kaisen_ucwk_no"));
					}
					
					// 回線内サービス契約番号チェック
					// 回線内サービス契約番号リスト
					List<Map<String, Object>> kisnNaiSvcKeiNoList = (List<Map<String, Object>>)kisnTaniKeiIf.get("kisn_nai_svc_kei_no_list");
					
					if (kisnNaiSvcKeiNoList != null && kisnNaiSvcKeiNoList.size() != 0)
					{
						for (int j = 0; j < kisnNaiSvcKeiNoList.size(); j++)
						{
							// 回線内サービス契約情報
							Map<String, Object> kisnNaiSvcKeiIf = kisnNaiSvcKeiNoList.get(j);
							
							if (kisnNaiSvcKeiIf != null)
							{
								// サービス契約番号
								String keySvcKeiNo = (String)kisnNaiSvcKeiIf.get("svc_kei_no");
								
								if (keySvcKeiNo == null || "".equals(keySvcKeiNo))
								{
									// 必須チェックエラー
									errList.add(getReqErrInfMap("svc_kei_no"));
								}
								else if (!HalfCharCheck.isEnNumber1Check(keySvcKeiNo))
								{
									// 属性チェックエラー
									errList.add(getFormErrInfMap("svc_kei_no"));
								}
								else if (!LengthCheck.isLength1Check(keySvcKeiNo, 10))
								{
									// 桁数チェックエラー
									errList.add(getLenErrInfMap("svc_kei_no"));
								}
								
								// サービスコード
								String keySvcCd = (String)kisnNaiSvcKeiIf.get("svc_cd");
								
								if (keySvcCd == null || "".equals(keySvcCd))
								{
									// 必須チェックエラー
									errList.add(getReqErrInfMap("svc_cd"));
								}
								else if (!HalfCharCheck.isEnNumber1Check(keySvcCd))
								{
									// 属性チェックエラー
									errList.add(getFormErrInfMap("svc_cd"));
								}
								else if (!LengthCheck.isLength1Check(keySvcCd, 2))
								{
									// 桁数チェックエラー
									errList.add(getLenErrInfMap("svc_cd"));
								}
							}
							else
							{
								// 必須チェックエラー
								errList.add(getReqErrInfMap("kisn_nai_svc_kei_no_list"));
							}
						}
					}
					else
					{
						// 必須チェックエラー
						errList.add(getReqErrInfMap("kisn_nai_svc_kei_no_list"));
					}
					
					// 回線内請求契約番号チェック
					// 回線内請求契約番号リスト
					List<Map<String, String>> kisnNaiSeikyKeiNoList = (List<Map<String, String>>)kisnTaniKeiIf.get("kisn_nai_seiky_kei_no_list");
					if (kisnNaiSeikyKeiNoList != null && kisnNaiSeikyKeiNoList.size() != 0)
					{
						// 回線内請求契約番号リストが存在する場合
						for (int j = 0; j < kisnNaiSeikyKeiNoList.size(); j++)
						{
							// 回線内請求契約番号情報
							Map<String, String> kisnNaiSeikyKeiNoIf = kisnNaiSeikyKeiNoList.get(j);
							
							// 回線内請求契約番号情報が存在する場合
							if (kisnNaiSeikyKeiNoIf != null)
							{
								// 請求契約番号
								String seikyKeiNo = kisnNaiSeikyKeiNoIf.get("seiky_kei_no");
								
								if (seikyKeiNo != null && !"".equals(seikyKeiNo))
								{
									// 請求契約番号が存在する場合
									if (!HalfCharCheck.isEnNumber1Check(seikyKeiNo))
									{
										// 属性チェックエラー
										errList.add(getFormErrInfMap("seiky_kei_no"));
									}
									else if (!LengthCheck.isLength1Check(seikyKeiNo, 10))
									{
										// 桁数チェックエラー
										errList.add(getLenErrInfMap("seiky_kei_no"));
									}
								}
							}
						}
					}
				}
				else
				{
					// 必須チェックエラー
					errList.add(getReqErrInfMap("kisn_tani_kei_if_list"));
				}
			}
		}
		else
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap("kisn_tani_kei_if_list"));
		}
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}

		return true;
	}
	
	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	private static Map<String, String> getReqErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, "");
		
		return returnMap;
	}
	
	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	private static Map<String, String> getFormErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, "");
		
		return returnMap;
	}
	
	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	private static Map<String, String> getLenErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, "");
		
		return returnMap;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey,
			Object[][] mappingData, Object[][] contents)
	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);

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData, contents);

		//エラー情報のマップを取得
		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はスローしない

		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 ("".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 returnCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String dataMapKey,
			Object[][] mappingData, Object[][] contents)
	throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", 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("%1$04d", templateStatus);
			
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		Map<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (Map<String, String>)param.getData(dataMapKey);

		for (int i = 0; null != contents && i < contents.length ; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith("_err"))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JKKStringUtil.isNullBlank(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}
		return param;
	}
}
