/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECH0011C014TPMA
*   ソースファイル名：JECH0011C014TPMA.java
*   作成者          ：富士通
*   日付            ：2012年06月28日
*＜機能概要＞
*   債権償却登録独自処理部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2012/06/28  富士通      新規作成
*   v6.00.00	2013/12/06	FJ)江森		【OM-2013-0004748】督促ステータスを「"90"（貸倒登録済）」から「"99"（督促保留）」に変更した場合の対応
*   v8.00.00	2014/03/12	FJ)伊藤		【IT2-2014-0000163】免税項目の税額内訳登録を廃止、及び税率対応
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.constant.JACStrConst;
import eo.common.util.JACTaxCalcShikibetuCodeUtil;
import eo.ejb.cbm.entity.AC0271ETMsg;
import eo.ejb.cbm.entity.CH0011ETMsg;
import eo.ejb.cbm.entity.CH0021ETMsg;
import eo.ejb.cbm.entity.CH0401ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0011C014CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0011C014CBSMsg1List;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCHModelCommon;
import eo.ejb.common.db.JCHejbCH0011SecProc;
import eo.ejb.common.db.JCHejbCH0021SecProc;
import eo.ejb.common.entity.JCHejbCH0021KRCK;

/**
 * <p>
 * 債権償却時、債権を更新し債権内訳の登録を行う部品
 * </p>
 * @author 富士通
 */
public class JECH0011C014TPMA implements TemplateMainHandler {
	

	/**
	 * コンストラクタです。
	 */
	public JECH0011C014TPMA()
	{
		super();
	}

	/**
	 * <p>
	 * 債権償却時、債権内訳の登録を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @throws Exception 
	 */
	public static void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws Exception
	{
		// システムパラメータ分類コード
		String sysParamBunruiCD = inCBSMsg.getString(ECH0011C014CBSMsg.SYS_PARAM_BUNRUI_CD);
		// システムパラメータID1
		String sysParamID1 = inCBSMsg.getString(ECH0011C014CBSMsg.SYS_PARAM_ID_1);
		// システムパラメータID2
		String sysParamID2 = inCBSMsg.getString(ECH0011C014CBSMsg.SYS_PARAM_ID_2);
		// システムパラメータID3
		String sysParamID3 = inCBSMsg.getString(ECH0011C014CBSMsg.SYS_PARAM_ID_3);

		// 債権内訳存在チェック
		if (!JCHejbCH0021KRCK.isExistCheck(inCBSMsg, inContext, sysParamBunruiCD, sysParamID1))
		{
			inCBSMsg.set(ECH0011C014CBSMsg.SAIKEN_NO_ERR, "EC");
			inCBSMsg.set(ECH0011C014CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return;
		}
		else
		{
			// 機能コードが"1"（チェック＆更新）の時は、債権内訳を登録する
			if ("1".equals(inCBSMsg.getString(ECH0011C014CBSMsg.FUNC_CODE))) 
			{
				// 債権内訳登録副次処理
				JCHejbCH0021SecProc CH0021 = new JCHejbCH0021SecProc();

				// 債権内訳取得処理
				CAANMsg[] saikenUwkList = CH0021.getSaikenUwk(inCBSMsg, inContext, sysParamBunruiCD, sysParamID1);

				// 債権内訳削除処理
				CH0021.deleteSaikenUwk(inCBSMsg, inContext, sysParamBunruiCD, sysParamID2);

				// 債権内訳削除処理
				CH0021.deleteSaikenUwk(inCBSMsg, inContext, sysParamBunruiCD, sysParamID3);
				
				if (inCBSMsg.getString(ECH0011C014CBSMsg.SAIKEN_STAT).equals(JACStrConst.SAIKEN_STAT_FIX_SEIKY))
				{
					// 債権ステータスが"020"(請求確定)の場合は該当内訳を削除して終了
					return;
				}

				// 債権番号
				String saikenNo = inCBSMsg.getString(ECH0011C014CBSMsg.SAIKEN_NO);

				// 債権情報取得
				JCHejbCH0011SecProc CH0011 = new JCHejbCH0011SecProc();
				CAANMsg inETMsgSaiken = new CAANMsg(CH0011ETMsg.class.getName());
				inETMsgSaiken.set(CH0011ETMsg.SAIKEN_NO, saikenNo);
				CAANMsg msgCH0011 = CH0011.findByPrimaryKey(inETMsgSaiken);
				String saikenYm = msgCH0011.getString("SAIKEN_YM");          // 債権年月
				String seikyKeiNo = msgCH0011.getString("SEIKY_KEI_NO");     // 請求契約番号

				// 税率計算用データ取得
				HashMap<String, HashMap<String, String>> taxRtMast = getTaxRt(inCBSMsg, inContext, saikenYm);
				
				// 税計算識別コード管理クラス
				JACTaxCalcShikibetuCodeUtil tcscUtil = new JACTaxCalcShikibetuCodeUtil(JACStrConst.CALLER_SCREEN);

				// 債権内訳登録用データ生成処理
				ArrayList<CAANMsg> saikenUcwkAddList = new ArrayList<CAANMsg>();

				for (CAANMsg saikenUwk: saikenUwkList)
				{
					// 抽出変換コード取得
					HashMap<String, String> prcKmkCsChge = getPrcKmkCsChge(inCBSMsg, inContext, saikenUwk);

					if (null != prcKmkCsChge && prcKmkCsChge.size() != 0)
					{
						CAANMsg saikenUcwk2 = new CAANMsg(CH0021ETMsg.class.getName());
						saikenUcwk2.set(CH0021ETMsg.SAIKEN_NO, saikenNo);
						saikenUcwk2.set(CH0021ETMsg.PRC_GRP_CD, prcKmkCsChge.get("PRC_GRP_CD_2"));
						saikenUcwk2.set(CH0021ETMsg.PCRS_CD, prcKmkCsChge.get("PCRS_CD_2"));
						saikenUcwk2.set(CH0021ETMsg.PRC_SVC_CD, prcKmkCsChge.get("PRC_SVC_CD_2"));
						saikenUcwk2.set(CH0021ETMsg.PRC_KMK_CD, prcKmkCsChge.get("PRC_KMK_CD_2"));
						saikenUcwk2.set(CH0021ETMsg.AMNT, saikenUwk.getString(CH0021ETMsg.AMNT));
						saikenUcwk2.set(CH0021ETMsg.SAIKEN_FIX_YM, saikenYm);
						saikenUcwk2.set(CH0021ETMsg.ADD_DTM,JCHModelCommon.getSysDateTimeStamp());
						saikenUcwk2.set(CH0021ETMsg.ADD_OPEACNT,inCBSMsg.getObject(ECH0011C014CBSMsg.OPERATORID));
						saikenUcwk2.set(CH0021ETMsg.UPD_DTM,JCHModelCommon.getSysDateTimeStamp());
						saikenUcwk2.set(CH0021ETMsg.UPD_OPEACNT,inCBSMsg.getObject(ECH0011C014CBSMsg.OPERATORID));
						saikenUcwk2.set(CH0021ETMsg.MK_FLG,"0");

						saikenUcwkAddList.add(saikenUcwk2);

						String prcKmkCd3 = prcKmkCsChge.get("PRC_KMK_CD_3");
						
						if(!JACStrConst.KARA_MOJI.equals(prcKmkCd3) && prcKmkCd3 != null)
						{
							String taxRateCd = prcKmkCsChge.get("PRC_KMK_CD_3").substring(0, 1);
							String taxSkbtCd = tcscUtil.getTaxSkbtCd(taxRateCd, JACStrConst.UZEI_SZEI_SKBT_UCHI, JCCModelCommon.getOpeDate(inCBSMsg, null));
							HashMap<String, String> taxRtMap = taxRtMast.get(taxSkbtCd);
							
							CAANMsg saikenUcwk3 = new CAANMsg(CH0021ETMsg.class.getName());
							saikenUcwk3.set(CH0021ETMsg.SAIKEN_NO, saikenNo);
							saikenUcwk3.set(CH0021ETMsg.PRC_GRP_CD, prcKmkCsChge.get("PRC_GRP_CD_3"));
							saikenUcwk3.set(CH0021ETMsg.PCRS_CD, prcKmkCsChge.get("PCRS_CD_3"));
							saikenUcwk3.set(CH0021ETMsg.PRC_SVC_CD, prcKmkCsChge.get("PRC_SVC_CD_3"));
							saikenUcwk3.set(CH0021ETMsg.PRC_KMK_CD, prcKmkCsChge.get("PRC_KMK_CD_3"));
							saikenUcwk3.set(CH0021ETMsg.AMNT, calcTax(taxRtMap, saikenUwk.getString(CH0021ETMsg.AMNT)));
							saikenUcwk3.set(CH0021ETMsg.SAIKEN_FIX_YM, saikenYm);
							saikenUcwk3.set(CH0021ETMsg.ADD_DTM,JCHModelCommon.getSysDateTimeStamp());
							saikenUcwk3.set(CH0021ETMsg.ADD_OPEACNT,inCBSMsg.getObject(ECH0011C014CBSMsg.OPERATORID));
							saikenUcwk3.set(CH0021ETMsg.UPD_DTM,JCHModelCommon.getSysDateTimeStamp());
							saikenUcwk3.set(CH0021ETMsg.UPD_OPEACNT,inCBSMsg.getObject(ECH0011C014CBSMsg.OPERATORID));
							saikenUcwk3.set(CH0021ETMsg.MK_FLG,"0");

							saikenUcwkAddList.add(saikenUcwk3);
						}
					}
				}
				
				if (saikenUcwkAddList.size() != 0)
				{
					// 債権内訳登録処理
					CH0021.insertSaikenUwk(saikenUcwkAddList);

					// 債権内訳登録結果をマッピング
					ArrayList<CAANMsg> saikenUcwkList = new ArrayList<CAANMsg>();
					
					for (CAANMsg saikenUwk: saikenUcwkAddList)
					{
						CAANMsg saikenUcwk = new CAANMsg(ECH0011C014CBSMsg1List.class.getName());
						saikenUcwk.set(ECH0011C014CBSMsg1List.SAIKEN_NO_UW, saikenUwk.getString(CH0021ETMsg.SAIKEN_NO));       // 債権番号
						saikenUcwk.set(ECH0011C014CBSMsg1List.PRC_GRP_CD, saikenUwk.getString(CH0021ETMsg.PRC_GRP_CD));        // 料金グループコード
						saikenUcwk.set(ECH0011C014CBSMsg1List.PCRS_CD, saikenUwk.getString(CH0021ETMsg.PCRS_CD));              // 料金コースコード
						saikenUcwk.set(ECH0011C014CBSMsg1List.PRC_SVC_CD, saikenUwk.getString(CH0021ETMsg.PRC_SVC_CD));        // 料金サービスコード
						saikenUcwk.set(ECH0011C014CBSMsg1List.PRC_KMK_CD, saikenUwk.getString(CH0021ETMsg.PRC_KMK_CD));        // 料金項目コード
						saikenUcwk.set(ECH0011C014CBSMsg1List.AMNT, saikenUwk.getString(CH0021ETMsg.AMNT));                    // 金額
						saikenUcwk.set(ECH0011C014CBSMsg1List.SAIKEN_FIX_YM, saikenUwk.getString(CH0021ETMsg.SAIKEN_FIX_YM));  // 債権確定年月
						saikenUcwk.set(ECH0011C014CBSMsg1List.SEIKY_KEI_NO, seikyKeiNo);                                       // 請求契約番号
						saikenUcwk.set(ECH0011C014CBSMsg1List.SAIKEN_YM, saikenYm);                                            // 債権年月

						saikenUcwkList.add(saikenUcwk);
					}
					inCBSMsg.set("ECH0011C014CBSMsg1List", saikenUcwkList.toArray(new CAANMsg[0]));
				}
				
			}
		}

	}

	/**
	 * <p>
	 * 抽出変換コード取得
	 * 料金項目抽出変換マスタから変換用のコードを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param saikenYm 債権年月
	 * @throws CAANException 
	 */
	private static HashMap<String, String> getPrcKmkCsChge(CAANMsg inMsg, AgentDispatchContext inContext, CAANMsg saikenUwk)
	{
		HashMap<String, String> prcKmkCsChge = new HashMap<String, String>();
		
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		/******************** 
		 * SQL文の作成
		 ********************/
		try{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append(" SELECT ")
					.append(" 	 CH0401.PRC_GRP_CD          AS PRC_GRP_CD_1 ")
					.append(" 	,CH0401.PCRS_CD             AS PCRS_CD_1 ")
					.append(" 	,CH0401.PRC_SVC_CD          AS PRC_SVC_CD_1 ")
					.append(" 	,CH0401.PRC_KMK_CD          AS PRC_KMK_CD_1 ")
					.append(" 	,CH0401.OUTPUT_PRC_GRP_CD   AS PRC_GRP_CD_2 ")
					.append(" 	,CH0401.OUT_PCRS_CD         AS PCRS_CD_2 ")
					.append(" 	,CH0401.OUT_PRC_SVC_CD      AS PRC_SVC_CD_2 ")
					.append(" 	,CH0401.OUT_PRC_KMK_CD      AS PRC_KMK_CD_2 ")
					.append(" 	,CH0401_2.OUTPUT_PRC_GRP_CD AS PRC_GRP_CD_3 ")
					.append(" 	,CH0401_2.OUT_PCRS_CD       AS PCRS_CD_3 ")
					.append(" 	,CH0401_2.OUT_PRC_SVC_CD    AS PRC_SVC_CD_3 ")
					.append(" 	,CH0401_2.OUT_PRC_KMK_CD    AS PRC_KMK_CD_3 ")
					.append(" FROM  ")
					.append(" 	CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append(" 	INNER JOIN  ")
					.append(" 		ZM_M_SYS_PARAM_KNRI ZM0311 ")
					.append(" 	ON      ")
					.append(" 			CH0401.WORK_KINO_SKBT_CD = ZM0311.SYS_PARAM_SETTE_VALUE_1 ")
					.append(" 		AND ZM0311.SYS_PARAM_BUNRUI_CD = ? ")
					.append(" 		AND ZM0311.SYS_PARAM_ID = ? ")
					.append(" 		AND ? BETWEEN ZM0311.SYS_PARAM_TSTAYMD AND ZM0311.SYS_PARAM_TENDYMD ")
					.append(" 		AND ZM0311.MK_FLG = '0' ")
					.append(" 	LEFT JOIN  ")
					.append(" 		(SELECT  ")
					.append(" 			 CH0401.PRC_GRP_CD ")
					.append(" 			,CH0401.PCRS_CD ")
					.append(" 			,CH0401.PRC_SVC_CD ")
					.append(" 			,CH0401.PRC_KMK_CD ")
					.append(" 			,CH0401.OUTPUT_PRC_GRP_CD  ")
					.append(" 			,CH0401.OUT_PCRS_CD ")
					.append(" 			,CH0401.OUT_PRC_SVC_CD  ")
					.append(" 			,CH0401.OUT_PRC_KMK_CD  ")
					.append(" 		FROM  ")
					.append(" 			CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append(" 			INNER JOIN  ")
					.append(" 				ZM_M_SYS_PARAM_KNRI ZM0311 ")
					.append(" 			ON      ")
					.append(" 				CH0401.WORK_KINO_SKBT_CD = ZM0311.SYS_PARAM_SETTE_VALUE_1 ")
					.append(" 			AND ZM0311.SYS_PARAM_BUNRUI_CD = ? ")
					.append(" 			AND ZM0311.SYS_PARAM_ID = ? ")
					.append(" 			AND ? BETWEEN ZM0311.SYS_PARAM_TSTAYMD AND ZM0311.SYS_PARAM_TENDYMD ")
					.append(" 			AND ZM0311.MK_FLG = '0' ")
					.append(" 		WHERE  ")
					.append(" 				CH0401.SYS_CD = 'CH' ")
					.append(" 			AND CH0401.CHSHT_CHG_CD = '2'  ")
					.append(" 			AND ? BETWEEN CH0401.PRC_KMK_CS_CHGE_TSTAYMD AND CH0401.PRC_KMK_CS_CHGE_TENDYMD ")
					.append(" 			AND CH0401.MK_FLG = '0' ")
					.append(" 			AND CH0401.RSV_APLY_YMD || CH0401.GENE_ADD_DTM =  ")
					.append(" 				(SELECT  ")
					.append(" 					MAX(CH0401_GENE.RSV_APLY_YMD || CH0401_GENE.GENE_ADD_DTM) AS CH0401_MAX ")
					.append(" 				FROM  ")
					.append(" 					CH_M_PRC_KMK_CS_CHGE CH0401_GENE  ")
					.append(" 				WHERE  ")
					.append(" 					CH0401_GENE.SYS_CD = CH0401.SYS_CD  ")
					.append(" 				AND CH0401_GENE.WORK_KINO_SKBT_CD = CH0401.WORK_KINO_SKBT_CD  ")
					.append(" 				AND CH0401_GENE.CHSHT_CHG_CD = CH0401.CHSHT_CHG_CD  ")
					.append(" 				AND CH0401_GENE.PRC_GRP_CD = CH0401.PRC_GRP_CD  ")
					.append(" 				AND CH0401_GENE.PCRS_CD = CH0401.PCRS_CD  ")
					.append(" 				AND CH0401_GENE.PRC_SVC_CD = CH0401.PRC_SVC_CD  ")
					.append(" 				AND CH0401_GENE.PRC_KMK_CD = CH0401.PRC_KMK_CD  ")
					.append(" 				AND CH0401_GENE.OUTPUT_PRC_GRP_CD = CH0401.OUTPUT_PRC_GRP_CD ")
					.append(" 				AND CH0401_GENE.OUT_PCRS_CD = CH0401.OUT_PCRS_CD ")
					.append(" 				AND CH0401_GENE.OUT_PRC_SVC_CD = CH0401.OUT_PRC_SVC_CD ")
					.append(" 				AND CH0401_GENE.OUT_PRC_KMK_CD = CH0401.OUT_PRC_KMK_CD ")
					.append(" 				AND CH0401_GENE.RSV_APLY_YMD <= ? ")
					.append(" 				AND CH0401_GENE.MK_FLG = '0') ")
					.append(" 		) CH0401_2 ")
					.append(" 	ON		CH0401.OUTPUT_PRC_GRP_CD = CH0401_2.PRC_GRP_CD ")
					.append(" 		AND  CH0401.OUT_PCRS_CD = CH0401_2.PCRS_CD ")
					.append(" 		AND  CH0401.OUT_PRC_SVC_CD = CH0401_2.PRC_SVC_CD ")
					.append(" 		AND  CH0401.OUT_PRC_KMK_CD = CH0401_2.PRC_KMK_CD  ")
					.append(" WHERE  ")
					.append(" 		CH0401.SYS_CD = 'CH' ")
					.append(" 	AND CH0401.CHSHT_CHG_CD = '2'  ")
					.append(" 	AND ? BETWEEN CH0401.PRC_KMK_CS_CHGE_TSTAYMD AND CH0401.PRC_KMK_CS_CHGE_TENDYMD ")
					.append(" 	AND CH0401.MK_FLG = '0' ")
					.append(" 	AND CH0401.RSV_APLY_YMD || CH0401.GENE_ADD_DTM =  ")
					.append(" 		(SELECT  ")
					.append(" 			MAX(CH0401_GENE.RSV_APLY_YMD || CH0401_GENE.GENE_ADD_DTM) AS CH0401_MAX  ")
					.append(" 		FROM  ")
					.append(" 			CH_M_PRC_KMK_CS_CHGE CH0401_GENE  ")
					.append(" 		WHERE  ")
					.append(" 			CH0401_GENE.SYS_CD = CH0401.SYS_CD  ")
					.append(" 		AND CH0401_GENE.WORK_KINO_SKBT_CD = CH0401.WORK_KINO_SKBT_CD  ")
					.append(" 		AND CH0401_GENE.CHSHT_CHG_CD = CH0401.CHSHT_CHG_CD  ")
					.append(" 		AND CH0401_GENE.PRC_GRP_CD = CH0401.PRC_GRP_CD  ")
					.append(" 		AND CH0401_GENE.PCRS_CD = CH0401.PCRS_CD  ")
					.append(" 		AND CH0401_GENE.PRC_SVC_CD = CH0401.PRC_SVC_CD  ")
					.append(" 		AND CH0401_GENE.PRC_KMK_CD = CH0401.PRC_KMK_CD  ")
					.append(" 		AND CH0401_GENE.OUTPUT_PRC_GRP_CD = CH0401.OUTPUT_PRC_GRP_CD ")
					.append(" 		AND CH0401_GENE.OUT_PCRS_CD = CH0401.OUT_PCRS_CD ")
					.append(" 		AND CH0401_GENE.OUT_PRC_SVC_CD = CH0401.OUT_PRC_SVC_CD ")
					.append(" 		AND CH0401_GENE.OUT_PRC_KMK_CD = CH0401.OUT_PRC_KMK_CD ")
					.append(" 		AND CH0401_GENE.RSV_APLY_YMD <= ? ")
					.append(" 		AND CH0401_GENE.MK_FLG = '0') ")
					.append(" 	AND CH0401.PRC_GRP_CD = ? ")
					.append(" 	AND CH0401.PCRS_CD = ? ")
					.append(" 	AND CH0401.PRC_SVC_CD = ?  ")
					.append(" 	AND CH0401.PRC_KMK_CD = ? ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JECH0011C012TPMA.class, sql_Buff);

			// パラメータインデックス
			int i = 1;

			// パラメータの設定(システムパラメータ分類コード)
			CAANJDBCUtil.setParam(pstmt, i++, inMsg.getString(ECH0011C014CBSMsg.SYS_PARAM_BUNRUI_CD));
			// パラメータの設定(システムパラメータID2)
			CAANJDBCUtil.setParam(pstmt, i++, inMsg.getString(ECH0011C014CBSMsg.SYS_PARAM_ID_2));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(システムパラメータ分類コード)
			CAANJDBCUtil.setParam(pstmt, i++, inMsg.getString(ECH0011C014CBSMsg.SYS_PARAM_BUNRUI_CD));
			// パラメータの設定(システムパラメータID3)
			CAANJDBCUtil.setParam(pstmt, i++, inMsg.getString(ECH0011C014CBSMsg.SYS_PARAM_ID_3));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(料金グループコード)
			CAANJDBCUtil.setParam(pstmt, i++, saikenUwk.getString(CH0021ETMsg.PRC_GRP_CD));
			// パラメータの設定(料金コースコード)
			CAANJDBCUtil.setParam(pstmt, i++, saikenUwk.getString(CH0021ETMsg.PCRS_CD));
			// パラメータの設定(料金サービスコード)
			CAANJDBCUtil.setParam(pstmt, i++, saikenUwk.getString(CH0021ETMsg.PRC_SVC_CD));
			// パラメータの設定(料金項目コード)
			CAANJDBCUtil.setParam(pstmt, i++, saikenUwk.getString(CH0021ETMsg.PRC_KMK_CD));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 戻り値の判定
			if (null != rsltQuery && rsltQuery.next()) {
				prcKmkCsChge.put("PRC_GRP_CD_2", rsltQuery.getString("PRC_GRP_CD_2"));        // 料金グループコード2
				prcKmkCsChge.put("PCRS_CD_2", rsltQuery.getString("PCRS_CD_2"));              // 料金コースコード2
				prcKmkCsChge.put("PRC_SVC_CD_2", rsltQuery.getString("PRC_SVC_CD_2"));        // 料金サービスコード2
				prcKmkCsChge.put("PRC_KMK_CD_2", rsltQuery.getString("PRC_KMK_CD_2"));        // 料金項目コード2
				prcKmkCsChge.put("PRC_GRP_CD_3", rsltQuery.getString("PRC_GRP_CD_3"));        // 出力料金グループコード3
				prcKmkCsChge.put("PCRS_CD_3", rsltQuery.getString("PCRS_CD_3"));              // 出力料金コースコード3
				prcKmkCsChge.put("PRC_SVC_CD_3", rsltQuery.getString("PRC_SVC_CD_3"));        // 出力料金サービスコード3
				prcKmkCsChge.put("PRC_KMK_CD_3", rsltQuery.getString("PRC_KMK_CD_3"));        // 出力料金項目コード3
			}

			return prcKmkCsChge;
		}
		catch (SQLException e)
		{
			inMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				inMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
	
	/**
	 * <p>
	 * 税率計算用データ取得
	 * 税率マスタと料金スケジュール定義から税率計算用のデータを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param saikenYm 債権年月
	 * @return 
	 */
	private static HashMap<String, HashMap<String, String>> getTaxRt(CAANMsg inMsg, AgentDispatchContext inContext, String saikenYm){
		
		HashMap<String, HashMap<String, String>> retMap = new HashMap<String, HashMap<String, String>>();
		HashMap<String, String> inMap = new HashMap<String, String>();
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/
		
		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(AC0271ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append(" 	 AC0271.TAX_CALC_SKBT_CD ")
					.append(" 	,AC0271.TAX_RT ")
					.append(" 	,AC0271.ROUND_WAY_CD ")
					.append(" FROM ")
					.append(" 	AC_M_TAX_RT AC0271 ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JECH0011C014TPMA.class, sql_Buff);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			while (rsltQuery.next() )
			{
				inMap = new HashMap<String, String>();
				
				String taxRt = rsltQuery.getString("TAX_RT");
				String roundWayCd = rsltQuery.getString("ROUND_WAY_CD");
				String taxCalcSkbtCd = rsltQuery.getString("TAX_CALC_SKBT_CD");
				
				inMap.put(AC0271ETMsg.TAX_RT, taxRt);
				inMap.put(AC0271ETMsg.ROUND_WAY_CD, roundWayCd);
				retMap.put(taxCalcSkbtCd, inMap);
			}
		}
		catch (SQLException e)
		{
			inMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				inMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		return retMap;
	}

	/**
	 * <p>
	 * うち消費税額計算
	 * 税率計算用データと消費税込金額からうち消費税額を計算します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param saikenYm 債権年月
	 * @return 
	 */
	private static String calcTax(HashMap<String, String> taxRtMap, String Amnt)
	{
		// 丸め方法コード
		String roundWayCd = taxRtMap.get(AC0271ETMsg.ROUND_WAY_CD);
		// 税率
		String taxRt = taxRtMap.get(AC0271ETMsg.TAX_RT);

		// 消費税の計算を行う。
		BigDecimal bdTax = new BigDecimal(0);
		BigDecimal bdAmnt = new BigDecimal(Amnt);
		BigDecimal bdtaxRt = new BigDecimal(taxRt);
		BigDecimal bdtaxRtFull = bdtaxRt.add(new BigDecimal(100));

		// 丸め方法コード判定
		if(JACStrConst.ROUND_NON.equals(roundWayCd)){
			// 丸めなし
			bdTax = bdAmnt.multiply(bdtaxRt).divide(bdtaxRtFull);
		}
		else if(JACStrConst.ROUND_OFF.equals(roundWayCd)){
			// 四捨五入
			bdTax = bdAmnt.multiply(bdtaxRt).divide(bdtaxRtFull, BigDecimal.ROUND_HALF_EVEN);
		}
		else if(JACStrConst.ROUND_UP.equals(roundWayCd)){
			// 切上げ
			bdTax = bdAmnt.multiply(bdtaxRt).divide(bdtaxRtFull, BigDecimal.ROUND_UP);
		}
		else if(JACStrConst.ROUND_DOWN.equals(roundWayCd)){
			// 切捨て
			bdTax = bdAmnt.multiply(bdtaxRt).divide(bdtaxRtFull, BigDecimal.ROUND_DOWN);
		}

		return String.valueOf(bdTax);
	}
	
}

