/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECH0011C012TPMA
*   ソースファイル名：JECH0011C012TPMA.java
*   作成者          ：富士通
*   日付            ：2011年08月02日
*＜機能概要＞
*   入金取消債権変更顧客独自処理部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/08/02  富士通      新規作成
*   v5.00.00	2013/08/03  FJ)河井    【IT1-2013-0001508】入金取消時の債権内訳削除処理修正
*   v5.00.01	2013/08/20  FJ)小野    【IT1-2013-0001508】入金取消時の債権内訳の未収額更新処理を修正((債権額-前受金充当額)を未収額として更新)。
*   v6.00.00	2013/11/24	FJ)小野    【OM-2013-0003532】入金取消時の債権、債権内訳、請求テーブルの更新処理変更。
*	v9.00.00	2014/06/01	FJ) 中井	【OM-2014-0001880,IT2-2014-000167】支払証明書の消費税不正対応。
*   v25.00.00   2016/06/01  FJ)岡田    【OM-2016-0000751】一時金設定 (請求種別：随時入金)
*	v27.00.00	2016/10/14	FJ)岡田    【OM-2016-0002053】
*	v35.00.00	2017/12/04	FJ)河邊    【OM-2017-0001213】オープンカーソルエラー
**********************************************************************/

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.HashMap;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
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.ejb.cbm.entity.CH0011ETMsg;
import eo.ejb.cbm.entity.CH0021ETMsg;
import eo.ejb.cbm.entity.CH0051ETMsg;
import eo.ejb.cbm.entity.CH0101ETMsg;
import eo.ejb.cbm.entity.CH0401ETMsg;
import eo.ejb.cbm.entity.CH0501ETMsg;
import eo.ejb.cbm.entity.KK0501ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0011C013CBSMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCHModelCommon;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.db.JCHejbAC0171SecProc;
import eo.ejb.common.db.JCHejbCH0021SecProc;
import eo.ejb.common.db.JCHejbCH0051SecProc;
import eo.ejb.common.db.JCHejbCH0101SecProc;

/**
 * <p>
 * 入金取消時の債権内訳の更新を行う部品
 * </p>
 * @author 富士通
 */
public class JECH0011C013TPMA implements TemplateMainHandler {
	
	/**
	 * コンストラクタです。
	 */
	public JECH0011C013TPMA()
	{
		super();
	}

	/**
	 * <p>
	 * 入金取消時の債権内訳の更新を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public static void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// エラーフラグ
		String errFlag = "EA";

		// 債権番号
		String inSaikenNo = inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO);
		
		CAANMsg serchCaanMsg = new CAANMsg(CH0011ETMsg.class.getName());
		serchCaanMsg.set(CH0011ETMsg.SAIKEN_NO, inSaikenNo);
		serchCaanMsg.set(CH0011ETMsg.UPD_DTM, inCBSMsg.getString((ECH0011C013CBSMsg.SAIKEN_UPD_DTM_AF)));
		// 債権排他チェック処理
		if (!JCHModelCommon.succeededExclusiveLock(serchCaanMsg,inContext, "CH0011")) {
			inCBSMsg.set(ECH0011C013CBSMsg.SAIKEN_UPD_DTM_AF_ERR, errFlag);
			inCBSMsg.set(ECH0011C013CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return;
		}

		if (!"1".equals(inCBSMsg.getString(ECH0011C013CBSMsg.FUNC_CODE))) {
			return;
		}
		// ----------------------------------------------------
		// 債権内訳.充当額を物理削除する
		// ----------------------------------------------------
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		// 債権の副次問合せ
		JCHejbCH0021SecProc ch0021SecProc = new JCHejbCH0021SecProc();

		/********************
		 * SQL文の作成
		 ********************/
		try {

			// v27.00.00 MOD START
			for(int j = 0; j < 2; j++)
			{
				// コネクション取得
				con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());

				// SQL文の作成
				StringBuffer sql_Buff = JCHModelCommon.getSQL_CH0401_3();

				// prepareStatementにSQL文をセット
				pstmt = con1.prepareStatement(sql_Buff.toString());

				// ログ出力(SQL文の出力)
				JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JECH0011C013TPMA.class, sql_Buff);

				int i = 1;
				// パラメータの設定(SYS_CDを指定)
				CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.SYS_CD_CH);
				switch (j)
				{
					case 0 :
						// パラメータの設定(充当額＿業務機能識別コードを指定)
						CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.JUTO_AMNT);
						break;
					case 1 :
						// パラメータの設定(リアル充当額・仮充当額＿業務機能識別コードを指定)
						CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.KR_JTO_AT);
						break;
				}
				// パラメータの設定(抽出変換コード 1)
				CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.CHSHT_CHG_CD_1);
				// パラメータの設定(運用日を指定)
				CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOnlineOpeDate(inCBSMsg, null));

				// ResultSetの取得
				rsltQuery = pstmt.executeQuery();

				// 戻り値の判定
				while (rsltQuery.next()) {
					// 料金グループコードを取得する
					String sPRC_GRP_CD = rsltQuery.getString(CH0401ETMsg.PRC_GRP_CD);
					// 料金コースコードを取得する
					String sPCRS_CD = rsltQuery.getString(CH0401ETMsg.PCRS_CD);
					// 料金サービスコードを取得する
					String sPRC_SVC_CD = rsltQuery.getString(CH0401ETMsg.PRC_SVC_CD);
					// 料金項目コードを取得する
					String sPRC_KMK_CD = rsltQuery.getString(CH0401ETMsg.PRC_KMK_CD);

					// 債権内訳副次問合せを呼び出し、債権内訳の充当額を物理削除する
					ch0021SecProc.executeDelete(inCBSMsg, sPRC_GRP_CD, sPCRS_CD, sPRC_SVC_CD, sPRC_KMK_CD);

				}
// OM-2017-0001213 2017/12/04 ADD START
				if (rsltQuery != null) {
					rsltQuery.close();
				}
				if (pstmt != null) {
					pstmt.close();
				}
				if (con1 != null) {
					CAANConnectionMgr.getInstance().close(con1);
				}
// OM-2017-0001213 2017/12/04 ADD END
			}
//			// コネクション取得
//			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
//
//			// SQL文の作成
//			StringBuffer sql_Buff = JCHModelCommon.getSQL_CH0401_3();
//
//			// prepareStatementにSQL文をセット
//			pstmt = con1.prepareStatement(sql_Buff.toString());
//
//			// ログ出力(SQL文の出力)
//			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JECH0011C013TPMA.class, sql_Buff);
//
//			int i = 1;
//			// パラメータの設定(SYS_CDを指定)
//			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.SYS_CD_CH);
//			// パラメータの設定(充当額＿業務機能識別コードを指定)
//			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.JUTO_AMNT);
//			// パラメータの設定(抽出変換コード 1)
//			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.CHSHT_CHG_CD_1);
//			// パラメータの設定(運用日を指定)
//			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOnlineOpeDate(inCBSMsg, null));
//
//			// ResultSetの取得
//			rsltQuery = pstmt.executeQuery();
//
//			// 戻り値の判定
//			while (rsltQuery.next()) {
//				// 料金グループコードを取得する
//				String sPRC_GRP_CD = rsltQuery.getString(CH0401ETMsg.PRC_GRP_CD);
//				// 料金コースコードを取得する
//				String sPCRS_CD = rsltQuery.getString(CH0401ETMsg.PCRS_CD);
//				// 料金サービスコードを取得する
//				String sPRC_SVC_CD = rsltQuery.getString(CH0401ETMsg.PRC_SVC_CD);
//				// 料金項目コードを取得する
//				String sPRC_KMK_CD = rsltQuery.getString(CH0401ETMsg.PRC_KMK_CD);
//
//				// 債権内訳副次問合せを呼び出し、債権内訳の充当額を物理削除する
//				ch0021SecProc.executeDelete(inCBSMsg, sPRC_GRP_CD, sPCRS_CD, sPRC_SVC_CD, sPRC_KMK_CD);
//			}
			// v27.00.00 MOD END
		} catch (SQLException e) {
			inCBSMsg.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) 
			{
				inCBSMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}

		// 請求種別コード
		String seikySbtCd = inCBSMsg.getString(ECH0011C013CBSMsg.SEIKY_SBT_CD);

		// 随時入金の場合
		if (JACStrConst.SIKYSHBTS_JUIJ_JNYUKIN.equals(seikySbtCd))
		{
			// 随時入金の場合
			// ----------------------------------------------------
			// 債権内訳.債権額、債権額うち消費税、請求金額、未収額を更新する
			// 請求を更新する
			// ----------------------------------------------------
			updDbByZuijiNyukinCl(inCBSMsg, inContext);
		}
		else
		{
			// それ以外の場合
			// ----------------------------------------------------
			// 債権内訳.未収額を更新する
			// ----------------------------------------------------
			updDbByNyukinCl(inCBSMsg, inContext);
		}

	}
	
	/**
	 * 料金項目コード変換マップ取得
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param workKinoSkbtCd 業務機能識別コード
	 * @param keyFlg キーフラグ
	 * @return
	 */
	private static HashMap<String,String> getCnvCdMap(CAANMsg inCBSMsg, AgentDispatchContext inContext,
			String workKinoSkbtCd, boolean keyFlg)
	{
		HashMap<String,String> map = new HashMap<String,String>();
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
		
		StringBuffer sql_Buff = new StringBuffer();
		sql_Buff.append(" SELECT ")
				.append("     CH0401.PRC_KMK_CD ")
				.append("    ,CH0401.OUT_PRC_KMK_CD ")
				.append(" FROM ")
				.append("     CH_M_PRC_KMK_CS_CHGE CH0401 ")
				.append(" WHERE ")
				.append("     CH0401.SYS_CD = 'CH' ")
				.append(" AND CH0401.WORK_KINO_SKBT_CD = ? ")
				.append(" AND CH0401.CHSHT_CHG_CD = '2' ")
				.append(" AND CH0401.PRC_KMK_CS_CHGE_TSTAYMD <= ? ")
				.append(" AND CH0401.PRC_KMK_CS_CHGE_TENDYMD >= ? ")
				.append(" AND CH0401.MK_FLG = '0' ");

		try 
		{
			
			// 運用日付を取得
			String opeDate = (String)JPCModelCommon.getOnlineOpeDate(inCBSMsg, inContext, null);

			// 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++, workKinoSkbtCd);
			CAANJDBCUtil.setParam(pstmt, i++, opeDate);
			CAANJDBCUtil.setParam(pstmt, i++, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 戻り値の判定
			while (rsltQuery.next())
			{
				String prcKmkCd = rsltQuery.getString(CH0401ETMsg.PRC_KMK_CD);
				String outPrcKmkCd = rsltQuery.getString(CH0401ETMsg.OUT_PRC_KMK_CD);

				// キーフラグがtrueの時、料金項目コードをキーにマップを作成する
				if (keyFlg)
				{
					map.put(prcKmkCd, outPrcKmkCd);
				}
				else
				{
					// キーフラグがtrueの時、出力料金項目コードをキーにマップを作成する
					map.put(outPrcKmkCd, prcKmkCd);
				}
			}
		}
		catch (SQLException e)
		{
			inCBSMsg.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)
			{
				inCBSMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		return map;
	}

	/**
	 * 入金取消によるテーブル更新処理。
	 * 入金取消により、債権内訳の債権額、債権額うち消費税、請求金額、未収額を更新する。
	 * また、請求、入金を更新する。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	private static void updDbByZuijiNyukinCl(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		// 債権の副次問合せ
		JCHejbCH0021SecProc ch0021SecProc = new JCHejbCH0021SecProc();

		// 債権番号
		String inSaikenNo = inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO);
		// 債権年月（債権確定年月と同値）
		String inSaikenYm = inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_FIX_YM);

		try
		{
			// ----------------------------------------------------
			// 債権内訳.債権額、債権額うち消費税、請求金額、未収額を更新する
			// ----------------------------------------------------
			// コネクション取得
			con1 = JSYejbConnection.getConnection(CH0021ETMsg.getTableName());

			// SQL文の作成
			StringBuffer sql_Buff = JCHModelCommon.getSaikenUcwkSql();

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JECH0011C013TPMA.class, sql_Buff);

			int i = 1;
			// パラメータの設定(債権年月)
			CAANJDBCUtil.setParam(pstmt, i++, inSaikenYm);
			// パラメータの設定(債権番号)
			CAANJDBCUtil.setParam(pstmt, i++, inSaikenNo);
			// パラメータの設定(SYS_CDを指定)
			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.SYS_CD_CH);
			// パラメータの設定(入金取消ゼロ円更新用債権内訳料金項目を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.SAIKE_NTS);
			// パラメータの設定(抽出変換コード 1)
			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.CHSHT_CHG_CD_1);
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOnlineOpeDate(inCBSMsg, null));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 債権内訳から料金項目コードが入金取消ゼロ円更新用債権内訳料金項目であるレコードを取得する。
			while (rsltQuery.next()) {

				// 料金グループコードを取得する
				String sPRC_GRP_CD = rsltQuery.getString(CH0021ETMsg.PRC_GRP_CD);
				// 料金コースコードを取得する
				String sPCRS_CD = rsltQuery.getString(CH0021ETMsg.PCRS_CD);
				// 料金サービスコードを取得する
				String sPRC_SVC_CD = rsltQuery.getString(CH0021ETMsg.PRC_SVC_CD);
				// 料金項目コードを取得する
				String sPRC_KMK_CD = rsltQuery.getString(CH0021ETMsg.PRC_KMK_CD);

				// 債権内訳の金額を更新する。
				CAANMsg inETMsgSaikenUcwk = new CAANMsg(CH0021ETMsg.class.getName());

				// キー項目を設定
				inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_NO, inSaikenNo);
				inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_FIX_YM, inSaikenYm);
				inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_GRP_CD, sPRC_GRP_CD);
				inETMsgSaikenUcwk.set(CH0021ETMsg.PCRS_CD, sPCRS_CD);
				inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_SVC_CD, sPRC_SVC_CD);
				inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_KMK_CD, sPRC_KMK_CD);

				// 更新項目を設定
				inETMsgSaikenUcwk.set(CH0021ETMsg.AMNT, "0");
				inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_OPEACNT, inCBSMsg.getString(ECH0011C013CBSMsg.OPERATORID));

				// 債権内訳副次問合せを呼び出し、債権内訳の未収額を更新する
				ch0021SecProc.executeUpdate(inETMsgSaikenUcwk);
			}

			// ----------------------------------------------------
			// 請求を更新する
			// ----------------------------------------------------
			// 請求の副次処理部品
			JCHejbCH0051SecProc ch0051SecProc = new JCHejbCH0051SecProc();

			// 請求
			CAANMsg inETMsgSeiky = new CAANMsg(CH0051ETMsg.class.getName());

			// キー項目を設定
			// 請求番号
			inETMsgSeiky.set(CH0051ETMsg.SEIKY_NO, inCBSMsg.getString(ECH0011C013CBSMsg.SEIKY_NO));
			// 請求年月（値は債権年月と同値）
			inETMsgSeiky.set(CH0051ETMsg.SEIKY_YM, inSaikenYm);

			// 更新項目を設定
			inETMsgSeiky.set(CH0051ETMsg.SEIKY_STAT, JACStrConst.SIKY_STAT_SIKY_CL);
			inETMsgSeiky.set(CH0051ETMsg.SEIKY_CL_YMD, JCCModelCommon.getOnlineOpeDate(inCBSMsg, null));
			inETMsgSeiky.set(CH0051ETMsg.UPD_OPEACNT, inCBSMsg.getString(ECH0011C013CBSMsg.OPERATORID));

			// 請求更新副次処理（入金取消）を呼び出し、請求を更新する
			ch0051SecProc.executeNyukinCl(inETMsgSeiky);

			// ----------------------------------------------------
			// 入金を更新する
			// ----------------------------------------------------
			
			// v25.00.00 ADD START
			// ----------------------------------------------------
			// 一時金設定
			// ----------------------------------------------------
			// スケジュール定義
			CAANMsg msgCH0501 = new CAANMsg(KK0501ETMsg.class.getName());
			
			// 請求内訳の副次問合せ
			JCHejbCH0101SecProc CH0101 = new JCHejbCH0101SecProc();
			
			// 一時金の副次問合わせ
			JCHejbAC0171SecProc AC0171 = new JCHejbAC0171SecProc();
			
			// 運用日（入金取消日）
			String opeDate = (String)JPCModelCommon.getOpeDate(inCBSMsg, inContext, null);
			
			// 請求番号
			String seikyNo = inCBSMsg.getString(ECH0011C013CBSMsg.SEIKY_NO);
			
			// 請求年月(債権年月)
			String seikyYm = inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_FIX_YM);
			
			// 会計処理日
			msgCH0501 = JCHModelCommon.getEventYmd(inCBSMsg, seikyYm, JACStrConst.EVENT_CD_KAIK_SHORI_YMD);
			String kaikShoriDate = msgCH0501.getString(CH0501ETMsg.EVENT_YMD);
			
			// 請求処理日
			msgCH0501 = JCHModelCommon.getEventYmd(inCBSMsg, seikyYm, JACStrConst.EVENT_CD_SEIKY_SHORI_YMD);
			String seikyShoriDate = msgCH0501.getString(CH0501ETMsg.EVENT_YMD);
			
			// ------------------------------ //
			// 請求内訳の一覧照会
			// ------------------------------ //
			CAANMsg[] alIcjknExecuteList = CH0101.seikyUcwkExecuteList(inCBSMsg, inContext, seikyNo);
			
			// 調整期間として一時金を設定
			if(!(alIcjknExecuteList.length == 0) && (seikyShoriDate.compareTo(opeDate) >= 0) && (kaikShoriDate.compareTo(opeDate) < 0))
			{
				for(CAANMsg caIcjknExecute : alIcjknExecuteList)
				{
					//  売掛金変更差額連携チェック
					if(!ArChgdiffCheck(caIcjknExecute))
					{
						continue;
					}
					
					// 料金項目コードを設定
					String firstPrcKmkCd = caIcjknExecute.getString(CH0101ETMsg.PRC_KMK_CD).substring(0,9);
					String lastPrcKmkCd = JACStrConst.PRC_KMK_CD_ADJ_SAGAKU;
					String prcKmkCd = firstPrcKmkCd + lastPrcKmkCd;
					
					// 一時金.一時金種別コード(手動(料金調整))
					String icjknSbtCd = JACStrConst.ICJKN_SBT_CD_MANUAL_PRC_ADJ;
					
					AC0171.PaymentCansellationIcjknIns(inCBSMsg, inContext, caIcjknExecute, prcKmkCd, icjknSbtCd);
				}
			}
			// 変更期間として一時金を設定
			else if( !(alIcjknExecuteList.length == 0) && (seikyShoriDate.compareTo(opeDate) < 0) )
			{
				for(CAANMsg caIcjknExecute : alIcjknExecuteList)
				{
				//  売掛金変更差額連携チェック
					if(!ArChgdiffCheck(caIcjknExecute))
					{
						continue;
					}
					
					// 料金項目コードを設定
					String firstPrcKmkCd = caIcjknExecute.getString(CH0101ETMsg.PRC_KMK_CD).substring(0,9);
					String lastPrcKmkCd = JACStrConst.PRC_KMK_CD_CHG_SAGAKU;
					String prcKmkCd = firstPrcKmkCd + lastPrcKmkCd;
					
					// 一時金.一時金種別コード(手動(料金変更))
					String icjknSbtCd = JACStrConst.ICJKN_SBT_CD_MANUAL_PRC_CHG;
					
					AC0171.PaymentCansellationIcjknIns(inCBSMsg, inContext, caIcjknExecute, prcKmkCd, icjknSbtCd);
				}
			}
			// v25.00.00 ADD END
		}
		catch (SQLException e)
		{
			inCBSMsg.set("status", StatusCodes.UPDATE_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)
			{
				inCBSMsg.set("status", StatusCodes.UPDATE_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	// v25.00.00 ADD START
	/**
	 * 売掛金変更差額連携チェック処理。
	 * 
	 * @param caIcjknExecute 一時金登録用一覧明細データ
	 */
	private static boolean ArChgdiffCheck(CAANMsg caIcjknExecute) {
		
		// 数量の料金項目は一時金登録対象外
		if (caIcjknExecute.getString(CH0101ETMsg.PRC_KMK_CD).substring(9, 11).equals("02"))
		{
			return false;
		}
		
		return true;
	}
	// v25.00.00 ADD END

	/**
	 * 入金取消によるテーブル更新処理。
	 * 入金取消により、債権内訳の未収額を更新する。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	private static void updDbByNyukinCl(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 料金項目コード変換マップ（債権額＿未収額）取得
		// key:未収額、value:債権額となるようにマップを取得する
		HashMap<String, String> cnvMishuMap = getCnvCdMap(inCBSMsg, inContext, JACStrConst.SIK_TO_MS, false);

		// 料金項目コード変換マップ（債権額＿前受金充当額）取得
		// key:債権額、value:前受金充当額となるようにマップを取得する
		HashMap<String, String> cnvMaeukekinMap = getCnvCdMap(inCBSMsg, inContext, JACStrConst.SIK_TO_MK, true);

		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		// 債権の副次問合せ
		JCHejbCH0021SecProc ch0021SecProc = new JCHejbCH0021SecProc();

		// 債権番号
		String inSaikenNo = inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO);
		// 債権年月（債権確定年月と同値）
		String inSaikenYm = inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_FIX_YM);

		try
		{
			// コネクション取得
			con1 = JSYejbConnection.getConnection(CH0021ETMsg.getTableName());

			// SQL文の作成
			StringBuffer sql_Buff = JCHModelCommon.getSaikenUcwkSql();

			// prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			// ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JECH0011C013TPMA.class, sql_Buff);

			int i = 1;
			// パラメータの設定(債権年月)
			CAANJDBCUtil.setParam(pstmt, i++, inSaikenYm);
			// パラメータの設定(債権番号)
			CAANJDBCUtil.setParam(pstmt, i++, inSaikenNo);
			// パラメータの設定(SYS_CDを指定)
			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.SYS_CD_CH);
			// パラメータの設定(未収額＿業務機能識別コードを指定)
			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.MISYU_NTK);
			// パラメータの設定(抽出変換コード 1)
			CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.CHSHT_CHG_CD_1);
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOnlineOpeDate(inCBSMsg, null));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 債権内訳から料金項目コードが未収額であるレコードを取得する。
			while (rsltQuery.next()) {

				// 料金グループコードを取得する
				String sPRC_GRP_CD = rsltQuery.getString(CH0021ETMsg.PRC_GRP_CD);
				// 料金コースコードを取得する
				String sPCRS_CD = rsltQuery.getString(CH0021ETMsg.PCRS_CD);
				// 料金サービスコードを取得する
				String sPRC_SVC_CD = rsltQuery.getString(CH0021ETMsg.PRC_SVC_CD);
				// 料金項目コードを取得する
				String sPRC_KMK_CD = rsltQuery.getString(CH0021ETMsg.PRC_KMK_CD);

				// 未収額の料金項目コードを元に債権額の料金項目コードを取得
				String saikenPrcKmkCd = (String)cnvMishuMap.get(sPRC_KMK_CD);

				// 債権額
				BigDecimal saikenGaku = BigDecimal.ZERO;

				// 料金項目コードが債権額である債権内訳取得(データが取得できない場合は、サイズが0の配列を返す)
				CAANMsg[] saikenGakuCh0021 =
					JCHejbCH0021SecProc.serchSaikenUcwk(inSaikenNo, inSaikenYm, sPRC_GRP_CD, sPCRS_CD, sPRC_SVC_CD, saikenPrcKmkCd);

				// 債権額を取得 
				// 料金項目コード"10900916601"削除対応、データが取得できない場合は債権内訳の未収額更新を呼ばない
				if (saikenGakuCh0021.length > 0)
				{
					saikenGaku = new BigDecimal(saikenGakuCh0021[0].getString(CH0021ETMsg.AMNT));

					// 債権額の料金項目コードを元に前受金充当額の料金項目コードを取得
					String maeukePrcKmkCd = (String)cnvMaeukekinMap.get(saikenPrcKmkCd);
	
					// 前受金充当額
					BigDecimal maeukeGaku = BigDecimal.ZERO;
	
					// 料金項目コードが債権額である債権内訳取得(データが取得できない場合は、サイズが0の配列を返す)
					CAANMsg[] maeukeCh0021 =
						JCHejbCH0021SecProc.serchSaikenUcwk(inSaikenNo, inSaikenYm, sPRC_GRP_CD, sPCRS_CD, sPRC_SVC_CD, maeukePrcKmkCd);
	
					// 前受金充当額を取得
					if (maeukeCh0021.length > 0)
					{
						maeukeGaku = new BigDecimal(maeukeCh0021[0].getString(CH0021ETMsg.AMNT));
					}
	
					// 未収額
					BigDecimal mishuGaku = saikenGaku.subtract(maeukeGaku);
	
					// 債権内訳副次問合せを呼び出し、債権内訳の未収額を更新する
					ch0021SecProc.updateMisyAmnt(inCBSMsg, inContext, saikenGakuCh0021[0], sPRC_KMK_CD, mishuGaku.toString());
				}
			}
		}
		catch (SQLException e)
		{
			inCBSMsg.set("status", StatusCodes.UPDATE_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)
			{
				inCBSMsg.set("status", StatusCodes.UPDATE_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

}
