/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JCHejbCH0021SecProc
 *	ソースファイル名：JCHejbCH0021SecProc.java
 *	作成者			：富士通
 *	日付			：2011年08月06日
 *＜機能概要＞
 *	債権内訳に対する副次処理を行う部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/08/06	富士通		新規作成
 *	v5.00.00	2013/08/03	FJ)河井    【IT1-2013-0001508】入金取消時の債権内訳削除処理追加
 *	v5.00.01    2013/08/27  FJ) 林     【IT1-2013-0001612】請求取消仕様変更。債権内訳の債権確定年月に請求月を設定するよう変更。
 *	v5.00.02	2013/09/05  FJ)小野    【IT1-2013-0001508】入金取消時の債権内訳の未収額更新処理を修正(債権額を未収額として更新)。
 *	v5.00.03	2013/10/09	FJ)小野    【OM-2013-0003338】金庫移動先が貸倒後入金の場合の債権内訳、督促、督促異動の更新処理を修正。
 *
 **********************************************************************/

package eo.ejb.common.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANFinderException;
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 eo.common.constant.JACStrConst;
import eo.ejb.cbm.entity.CH0011ETMsg;
import eo.ejb.cbm.entity.CH0021ETMsg;
import eo.ejb.cbm.entity.CH0021LE;
import eo.ejb.cbm.entity.CH0401ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0011C012CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0011C013CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0051D011CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0101D011CBSMsg;
import eo.ejb.cbs.mainproc.JECH0011C012TPMA;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCHModelCommon;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.JSYejbSysDate;

/**
 * <p>
 * 債権内訳に対する副次処理を行う部品です。
 * </p>
 * 
 * @author 富士通
 */
public class JCHejbCH0021SecProc extends JCHejbCH0021DBABase {

	/**
	 * コンストラクタです。
	 */
	public JCHejbCH0021SecProc() {
		super();
	}

	/** キー：債権番号 */
	private static final String SAIKEN_NO = "saiken_no";
	/** キー：料金グループコード */
	private static final String PRC_GRP_CD = "prc_grp_cd";
	/** キー：料金コースコード */
	private static final String PCRS_CD = "pcrs_cd";
	/** キー：料金サービスコード */
	private static final String PRC_SVC_CD = "prc_svc_cd";
	/** キー：料金項目コード */
	private static final String PRC_KMK_CD = "prc_kmk_cd";
	/** キー：債権確定年月 */
	private static final String SAIKEN_FIX_YM = "saiken_fix_ym";

	/**
	 * <p>
	 * 債権内訳の金額を更新する。
	 * </p>
	 * 
	 * @param cbsMsg CBSメッセージ
	 * @param inPCRS_CD 料金コースコード
	 * @param inPRC_SVC_CD 料金サービスコード
	 * @param inPRC_KMK_CD 料金項目コード
	 * @param inAmnt 金額
	 */
	public void updateAmnt(CAANMsg cbsMsg, String inPRC_GRP_CD, 
			String inPCRS_CD, String inPRC_SVC_CD, String inPRC_KMK_CD, String inAmnt) {

		try {
			
			// 債権内訳の金額を更新する。
			CAANMsg inETMsgSaikenUwk = new CAANMsg(CH0021ETMsg.class.getName());
			
			// 債権番号の取得
			String sSAIKEN_NO = cbsMsg.getString(ECH0011C012CBSMsg.SAIKEN_NO);
			
			inETMsgSaikenUwk.set(CH0021ETMsg.SAIKEN_NO, sSAIKEN_NO);	// 債権番号
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_GRP_CD, inPRC_GRP_CD);	// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PCRS_CD, inPCRS_CD);		// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_SVC_CD, inPRC_SVC_CD);	// 料金サービスコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_KMK_CD, inPRC_KMK_CD);	// 料金項目コード
			inETMsgSaikenUwk.set(CH0021ETMsg.AMNT, inAmnt);				// 金額
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_OPEACNT, cbsMsg.getString(ECH0011C012CBSMsg.OPERATORID));
			
			// 債権内訳の金額を更新する。
			super.update(inETMsgSaikenUwk);
			
		} catch (CAANException e) {
			
			throw new CAANRuntimeException(e);
			
		} catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 金庫移動登録時に債権内訳を登録する。
	 * </p>
	 * @param cbsMsg CBSメッセージ
	 * @param inSeikyKeiNo 請求契約番号
	 * @param inAmnt 金額
	 */
	public String knkUpDate(CAANMsg cbsMsg, AgentDispatchContext inContext, String inSeikyKeiNo, String inAmnt)
	{

		// 返却値(督促金額)
		String outTokusokuAmnt = "0";

		// (1) 債権番号取得

		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;
		PreparedStatement pstmt1 = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		// 債権番号
		ArrayList<String> saikenNoList = new ArrayList<String>();
		// 債権年月
		ArrayList<String> saikenYmList = new ArrayList<String>();

		// 運用日付
		String opeDate = (String)JPCModelCommon.getOpeDate(cbsMsg, inContext, null);

		// パラメータインデックス
		int i = 1;

		try
		{
			/******************** 
			 * SQL文の作成
			 ********************/
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0011ETMsg.getTableName());

			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("    CH0011.SAIKEN_YM ")
					.append("   ,CH0011.SAIKEN_NO ")
					.append(" FROM ")
					.append("  CH_T_SAIKEN CH0011 ")
					.append(" WHERE ")
					.append("      CH0011.SEIKY_KEI_NO = ? ")
					.append("  AND CH0011.SAIKEN_STAT = '080' ")
					.append("  AND CH0011.MK_FLG = '0' ")
					.append(" ORDER BY ")
					.append("      CH0011.SAIKEN_YM ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
					JCHejbCH0021SecProc.class, sql_Buff);

			// パラメータの設定(請求契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, i++, inSeikyKeiNo);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 戻り値の判定
			while(rsltQuery.next())
			{
				saikenNoList.add(rsltQuery.getString("SAIKEN_NO"));
				saikenYmList.add(rsltQuery.getString("SAIKEN_YM"));
			}
		}
		catch (SQLException e)
		{
			cbsMsg.set(CH0011ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (null != rsltQuery)
				{
					rsltQuery.close();
				}
				if (null != pstmt)
				{
					pstmt.close();
				}
				if (null != con1)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				cbsMsg.set(CH0011ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}

		//----------------------------------------------------
		// 債権内訳.充当額を更新する
		//----------------------------------------------------
		// 債権の副次問合せ
		JCHejbCH0021SecProc CH0021 = new JCHejbCH0021SecProc();
		
		/******************** 
		 * SQL文の作成
		 ********************/
		try
		{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.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("    ,(SELECT ")
					.append("          CH0431.PRC_GRP_CD ")
					.append("         ,CH0431.PCRS_CD ")
					.append("         ,CH0431.PRC_SVC_CD ")
					.append("         ,CH0431.PRC_KMK_CD ")
					.append("         ,CH0431.TRN_JUN ")
					.append("      FROM ")
					.append("          CH_M_KSHKM_JUN_TEIGI CH0431 ")
					.append("      WHERE ")
					.append("          ? BETWEEN CH0431.KSHKM_JUN_TEIGI_TSTAYMD AND CH0431.KSHKM_JUN_TEIGI_TENDYMD ")
					.append("      AND CH0431.RSV_APLY_YMD || CH0431.GENE_ADD_DTM = ")
					.append("              (SELECT ")
					.append("                   MAX(CH0431_GENE.RSV_APLY_YMD || CH0431_GENE.GENE_ADD_DTM) AS CH0431_MAX ")
					.append("               FROM ")
					.append("                   CH_M_KSHKM_JUN_TEIGI CH0431_GENE ")
					.append("               WHERE ")
					.append("                   CH0431_GENE.PRC_GRP_CD = CH0431.PRC_GRP_CD ")
					.append("               AND CH0431_GENE.PCRS_CD = CH0431.PCRS_CD ")
					.append("               AND CH0431_GENE.PRC_SVC_CD = CH0431.PRC_SVC_CD ")
					.append("               AND CH0431_GENE.PRC_KMK_CD = CH0431.PRC_KMK_CD ")
					.append("               AND CH0431_GENE.RSV_APLY_YMD <= ? ")
					.append("               AND CH0431_GENE.MK_FLG = '0' ) ")
					.append("      ) CH0431_SUB ")
					.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_GRP_CD = CH0431_SUB.PRC_GRP_CD ")
					.append(" AND CH0401.PCRS_CD = CH0431_SUB.PCRS_CD ")
					.append(" AND CH0401.PRC_SVC_CD = CH0431_SUB.PRC_SVC_CD ")
					.append(" AND CH0401.PRC_KMK_CD = CH0431_SUB.PRC_KMK_CD ")
					.append(" AND CH0401.PRC_KMK_CS_CHGE_TSTAYMD <= ? ")
					.append(" AND CH0401.PRC_KMK_CS_CHGE_TENDYMD >= ? ")
					.append(" AND CH0401.MK_FLG = '0' ")
					.append(" ORDER BY CH0431_SUB.TRN_JUN ASC ");
			
			
			//prepareStatementにSQL文をセット
			pstmt1 = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JECH0011C012TPMA.class, sql_Buff);
			
			int j = 1;

			CAANJDBCUtil.setParam(pstmt1, j++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, j++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, j++, JACStrConst.KSD_AF_NK);
			CAANJDBCUtil.setParam(pstmt1, j++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, j++, opeDate);
			
			// ResultSetの取得
			rsltQuery = pstmt1.executeQuery();
			
			Long calcJutoAmnt = 0L;

			// 充当額
//			String sJutoAmnt = inAmnt;
			Long wkSeikyMisyuAmnt = Long.valueOf(inAmnt);
			Long wkPrcGrpMisyuAmnt = Long.valueOf(inAmnt);
			
			// 債権内訳より対象の充当額を取得する
			for(int num = 0; num < saikenNoList.size(); num++)
			{
				String saikenNo = saikenNoList.get(num);

				Long lNewJutoAmnt = 0L;
				Long lSerchjutoAmnt = 0L;
				Long lSerchMishuAmnt = 0L;
				
				// 戻り値の判定
				while (rsltQuery.next())
				{
					// 料金グループコードを取得する
					String sPrcGrpCd = rsltQuery.getString(CH0401ETMsg.PRC_GRP_CD);
					// 料金コースコードを取得する
					String sPcrsCd = rsltQuery.getString(CH0401ETMsg.PCRS_CD);
					// 料金サービスコードを取得する
					String sPrcSvcCd = rsltQuery.getString(CH0401ETMsg.PRC_SVC_CD);
					// 料金項目コードを取得する
					String sPrcKmkCd = rsltQuery.getString(CH0401ETMsg.PRC_KMK_CD);
					// 料金グループコードを取得する
					String sOutPrcGrpCd = rsltQuery.getString(CH0401ETMsg.OUTPUT_PRC_GRP_CD);
					// 料金コースコードを取得する
					String sOutPcrsCd = rsltQuery.getString(CH0401ETMsg.OUT_PCRS_CD);
					// 料金サービスコードを取得する
					String sOutPrcSvcCd = rsltQuery.getString(CH0401ETMsg.OUT_PRC_SVC_CD);
					// 料金項目コードを取得する
					String sOutPrcKmkCd = rsltQuery.getString(CH0401ETMsg.OUT_PRC_KMK_CD);
				
					CAANMsg cMsgCH0021 = JCHejbCH0021SecProc.serchSaikenUcwk(saikenNo, sPrcGrpCd, sPcrsCd, sPrcSvcCd, sPrcKmkCd);
					CAANMsg outCMsgCH0021 = JCHejbCH0021SecProc.serchSaikenUcwk(saikenNo, sOutPrcGrpCd, sOutPcrsCd, sOutPrcSvcCd, sOutPrcKmkCd);
					
					if (null != cMsgCH0021)
					{
						// 存在した場合、請求契約単位および料金グループ単位の未収額を更新する
						Long lSerchMisyuAmnt = Long.valueOf(cMsgCH0021.getString("AMNT"));	// 未収額（ＤＢ取得）
						Long lNewMisyuAmnt = 0L;
						
						if ((sPrcGrpCd.trim()).isEmpty())
						{
							// 対象レコードが請求契約単位の場合、未収額−充当額を設定する
							if(wkSeikyMisyuAmnt.compareTo(lSerchMisyuAmnt) >= 0)
							{
								// 対象レコードが料金グループ単位かつ全額充当可能な場合、未収額は0を設定する
								lNewMisyuAmnt = 0L;
								wkSeikyMisyuAmnt = wkSeikyMisyuAmnt - lSerchMisyuAmnt;
							}
							else
							{
								// 対象レコードが料金グループ単位かつ一部充当可能な場合、未収額に残金を設定する
								lNewMisyuAmnt = lSerchMisyuAmnt - wkSeikyMisyuAmnt;
								wkSeikyMisyuAmnt = 0L;
							}
						}
						else
						{
							if (wkPrcGrpMisyuAmnt.compareTo(lSerchMisyuAmnt) >= 0)
							{
								// 対象レコードが料金グループ単位かつ全額充当可能な場合、未収額は0を設定する
								lNewMisyuAmnt = 0L;
								wkPrcGrpMisyuAmnt = wkPrcGrpMisyuAmnt - lSerchMisyuAmnt;
							}
							else
							{
								// 対象レコードが料金グループ単位かつ一部充当可能な場合、未収額に残金を設定する
								lNewMisyuAmnt = lSerchMisyuAmnt - wkPrcGrpMisyuAmnt;
								wkPrcGrpMisyuAmnt = 0L;
							}
						}
						
						String strMisyuAmnt  = lNewMisyuAmnt.toString();
						
						// 債権内訳副次問合せを呼び出し、債権内訳の未収額を更新する
						CH0021.updateKnkIdoAmnt(cbsMsg, saikenNo, sPrcGrpCd, sPcrsCd, sPrcSvcCd, sPrcKmkCd, strMisyuAmnt);
						outTokusokuAmnt = strMisyuAmnt;
					}

					if (null != outCMsgCH0021)
					{
						// 存在した場合、請求契約単位および料金グループ単位の充当額を更新する
						lSerchjutoAmnt = Long.valueOf(outCMsgCH0021.getString("AMNT"));
						lSerchMishuAmnt = Long.valueOf(cMsgCH0021.getString("AMNT"));
						
						if ((sPrcGrpCd.trim()).isEmpty())
						{
//							// 対象レコードが請求契約単位の場合、画面入力した充当額を加算して設定する
//							lNewJutoAmnt = lGamenjutoAmnt + lSerchjutoAmnt;
//							calcJutoAmnt = lGamenjutoAmnt;
							// 対象レコードが請求契約単位の場合、充当は行わず、次レコードの処理を行う
							continue;
						}
						else if (lSerchMishuAmnt > 0)
						{
							// 未収額がある場合、充当処理を行う
							if (calcJutoAmnt.compareTo(lSerchMishuAmnt) >= 0)
							{
								// 対象レコードが料金グループ単位かつ全額充当可能な場合、充当額を設定する
								lNewJutoAmnt = lSerchjutoAmnt + lSerchMishuAmnt;
								calcJutoAmnt = calcJutoAmnt - lSerchMishuAmnt;
							}
							else
							{
								// 対象レコードが料金グループ単位かつ一部充当可能な場合、充当額に残金を設定する
								lNewJutoAmnt = calcJutoAmnt + lSerchjutoAmnt;
								calcJutoAmnt = 0L;
							}
						}
						else
						{
							// 未収額がない場合は、次レコードの処理を行う
							continue;
						}
						
						// 債権内訳副次問合せを呼び出し、債権内訳の充当額を更新する
						CH0021.updateKnkIdoAmnt(cbsMsg, saikenNo, sOutPrcGrpCd, sOutPcrsCd, sOutPrcSvcCd, sOutPrcKmkCd, lNewJutoAmnt.toString());
					}
					else if (null != cMsgCH0021)
					{
						// 存在しなかった場合、未収額があれば充当額のinsertを行う
						lSerchjutoAmnt = Long.valueOf(cMsgCH0021.getString("AMNT"));
						
						if ((sPrcGrpCd.trim()).isEmpty())
						{
//							// 対象レコードが請求契約単位の場合、画面入力した充当額を設定する
//							lNewJutoAmnt = lGamenjutoAmnt;
//							calcJutoAmnt = lGamenjutoAmnt;
							// 対象レコードが請求契約単位の場合、充当は行わず、次レコードの処理を行う
							continue;
						}
						else if (calcJutoAmnt.compareTo(lSerchjutoAmnt) >= 0)
						{
							// 対象レコードが料金グループ単位かつ全額充当可能な場合
							lNewJutoAmnt = lSerchjutoAmnt;
							calcJutoAmnt = calcJutoAmnt - lSerchjutoAmnt;
						}
						else
						{
							// 対象レコードが料金グループ単位かつ一部充当可能な場合
							lNewJutoAmnt = calcJutoAmnt;
							calcJutoAmnt = 0L;
						}
						
						// 充当額が0円の場合は充当額データは作らない
						if (lNewJutoAmnt > 0)
						{
							try
							{
								CAANMsg inETMsgSaikenUcwk = new CAANMsg(CH0021ETMsg.class.getName());
								inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_NO, saikenNo);
								inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_GRP_CD, sOutPrcGrpCd);
								inETMsgSaikenUcwk.set(CH0021ETMsg.PCRS_CD, sOutPcrsCd);
								inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_SVC_CD, sOutPrcSvcCd);
								inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_KMK_CD, sOutPrcKmkCd);
								inETMsgSaikenUcwk.set(CH0021ETMsg.AMNT, lNewJutoAmnt.toString());
		
								// 債権番号を元に債権を検索し、債権確定年月を取得する。
								JCHejbCH0011SecProc CH0011 = new JCHejbCH0011SecProc();
								CAANMsg inETMsgSaiken = new CAANMsg(CH0011ETMsg.class.getName());
								inETMsgSaiken.set(CH0011ETMsg.SAIKEN_NO, saikenNo);
								CAANMsg msgCH0011 = CH0011.findByPrimaryKey(inETMsgSaiken);
		
								String strSaikenFixYm = msgCH0011.getString(CH0011ETMsg.SAIKEN_YM);
								inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_FIX_YM, strSaikenFixYm);
								inETMsgSaikenUcwk.set(CH0021ETMsg.ADD_DTM, JCHModelCommon.getSysDateTimeStamp());
								inETMsgSaikenUcwk.set(CH0021ETMsg.ADD_OPEACNT, cbsMsg.getObject(ECH0011C012CBSMsg.OPERATORID));
								inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
								inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_OPEACNT, cbsMsg.getObject(ECH0011C012CBSMsg.OPERATORID));
								inETMsgSaikenUcwk.set(CH0021ETMsg.MK_FLG, "0");
		
								CH0021.create(inETMsgSaikenUcwk);
							}
							catch (CAANCreateException ce)
							{
								throw new CAANRuntimeException(ce);
							}
							catch (Exception e)
							{
								cbsMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
								throw new CAANRuntimeException(e);
							}
						}
					}
				}
			}
		}
		catch (SQLException e)
		{
			cbsMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (pstmt1 != null)
				{
					pstmt1.close();
				}
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				cbsMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
//XXX ここから既存のやつ 一応置いてるだけであとで消すー
//		try
//		{
//			//コネクション取得
//			con1 = JSYejbConnection.getConnection(CH0021ETMsg.getTableName());
//
//			// 貸倒金額の債権内訳を取得
//			StringBuffer sql_Buff1 = getSQLKsdrSaiken();
//			pstmt1 = con1.prepareStatement(sql_Buff1.toString());
//
//			//ログ出力(SQL文の出力)
//			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JCHejbCH0021SecProc.class, sql_Buff1);
//
//			// 貸倒後入金の債権内訳を取得
//			StringBuffer sql_Buff2 = getSQLKsdrNykinSaiken();
//			pstmt2 = con1.prepareStatement(sql_Buff2.toString());
//			
//			//ログ出力(SQL文の出力)
//			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, JCHejbCH0021SecProc.class, sql_Buff2);
//
//			// (3) 貸倒金額、貸倒後入金の債権内訳を取得
//			for(String sSaikenNo : vSaikenNo)
//			{
//				// 債権年月取得
//				sSaikenYM = vSaikenYM.get(LoopCnt).toString();
//
//				LoopCnt++;
//
//				// 貸倒金額債権内訳取得結果
//				String sKSDORSaikenFIXYM = null;
//				String sKSDORSaikenAmnt = null;
//
//				// 貸倒後入金債権内訳取得結果
//				String sKSDORGNKSaikenFIXYM = null;
//				String sKSDORGNKSaikenAmnt = null;
//
//				/** 貸倒金額の債権内訳取得 */
//				
//				// パラメータインデックス
//				i = 1;
//				
//				// パラメータの指定
//				CAANJDBCUtil.setParam(pstmt1, i++, JACStrConst.WKPARA_CH_WKS_KSHID_SHOKYAK);
//				CAANJDBCUtil.setParam(pstmt1, i++, JCCModelCommon.getOpeDate(cbsMsg, null));
//				CAANJDBCUtil.setParam(pstmt1, i++, JCCModelCommon.getOpeDate(cbsMsg, null));
//				CAANJDBCUtil.setParam(pstmt1, i++, JCCModelCommon.getOpeDate(cbsMsg, null));
//
//				// パラメータの設定(債権番号を指定)
//				CAANJDBCUtil.setParam(pstmt1, i++, sSaikenNo);
//
//				// ResultSetの取得
//				rsltQuery = pstmt1.executeQuery();
//
//				// 戻り値の判定
//				if (rsltQuery.next())
//				{
//					sKSDORSaikenFIXYM = rsltQuery.getString("SAIKEN_FIX_YM");
//					sKSDORSaikenAmnt = rsltQuery.getString("AMNT");
//				}
//
//				// リザルトセット
//				ResultSet rsltQuery_KSDORGNKSaiken = null;
//
//				/** 貸倒後入金の債権内訳取得 */
//				
//				// パラメータインデックス
//				i = 1;
//
//				// パラメータの指定
//				CAANJDBCUtil.setParam(pstmt2, i++, JACStrConst.WKPARA_CH_WKS_KASHIDR_NKIN);
//				CAANJDBCUtil.setParam(pstmt2, i++, JCCModelCommon.getOpeDate(cbsMsg, null));
//				CAANJDBCUtil.setParam(pstmt2, i++, JCCModelCommon.getOpeDate(cbsMsg, null));
//				CAANJDBCUtil.setParam(pstmt2, i++, JCCModelCommon.getOpeDate(cbsMsg, null));
//
//				// パラメータの設定(債権番号を指定)
//				CAANJDBCUtil.setParam(pstmt2, i++, sSaikenNo);
//
//				// ResultSetの取得
//				rsltQuery_KSDORGNKSaiken = pstmt2.executeQuery();
//
//				// 戻り値の判定
//				if (rsltQuery_KSDORGNKSaiken.next())
//				{
//					sKSDORGNKSaikenFIXYM = rsltQuery_KSDORGNKSaiken.getString("SAIKEN_FIX_YM");
//					sKSDORGNKSaikenAmnt = rsltQuery_KSDORGNKSaiken.getString("AMNT");
//				}
//
//				if(null == sKSDORGNKSaikenFIXYM && null == sKSDORGNKSaikenAmnt)
//				{
//					// リザルトセット
//					HashMap<String, String> MapPrc = getPcrsCd(cbsMsg);
//
//					if (null == MapPrc)
//					{
//						return null;
//					}
//
//					// 貸倒後入金が取得できなかった場合、債権内訳を登録する。
//					// 貸倒金額と金庫金額を比較し補填額を算出する。
//					Long lAMNT = Long.valueOf(inAmnt);
//					Long lKSDORSaikenAmnt = Long.valueOf(sKSDORSaikenAmnt);
//
//					lAMNT = lAMNT - lKSDORSaikenAmnt;
//
//					// 補填金額算出
//					Long upAmnt = 0L;
//					if (0 >= lAMNT)
//					{
//						// 0以下の場合、金庫金額全額を補填する。
//						upAmnt = Long.valueOf(inAmnt);
//					}
//					else if (0 < lAMNT)
//					{
//						// 0より大きい場合、貸倒金額分補填する。
//						upAmnt = lKSDORSaikenAmnt;
//					}
//
//					// 補填金額で債権内訳を登録する。※登録更新フラグを"1"登録で呼び出す。
//					inupDateSaikenUchiwake(cbsMsg, rsltQuery, String.valueOf(upAmnt), MapPrc,"1", sSaikenYM);
//
//					// 督促金額を加算する。
//					outTokusokuAmnt = String.valueOf(Long.valueOf(outTokusokuAmnt) + Long.valueOf(upAmnt));
//
//					// 終了判定
//					if (0 >= lAMNT) {
//						return null;
//					}else if(0 < lAMNT){
//						// 金庫金額から補填額を引いた額に設定する。
//						inAmnt = String.valueOf(lAMNT);
//					}
//				}
//				else if(sKSDORSaikenFIXYM.equals(sKSDORGNKSaikenFIXYM))
//				{
//					// 貸倒金額債権の債権確定年月と貸倒後入金債権の債権確定年月が同月か判定する。
//					// 同月の場合
//					Long lKSDORGNKSaikenAmnt = Long.valueOf(sKSDORGNKSaikenAmnt);
//					Long lKSDORSaikenAmnt = Long.valueOf(sKSDORSaikenAmnt);
//					// 貸倒金額 - 貸倒後入金が0になるか判定する。
//					if(0 == lKSDORSaikenAmnt - lKSDORGNKSaikenAmnt){
//						// 次明細の処理へ
//						continue;
//					}
//
//					// 同月内の貸倒金額 - 貸倒後入金が0以外の場合は、貸倒後入金が貸倒金額を満たしていないため
//					// 満たしていない分を金庫金額で補填する。
//
//					// 補填後の金庫金額の判定を行い補填金額を算出する。
//					Long lAMNT = Long.valueOf(inAmnt);
//					lAMNT = lAMNT - (lKSDORSaikenAmnt - lKSDORGNKSaikenAmnt);
//
//					// 補填金額算出
//					Long upAmnt = 0L;
//
//					if (0 >= lAMNT) {
//						// 0以下の場合、金庫金額を全額補填する。
//						upAmnt = Long.valueOf(inAmnt) + lKSDORGNKSaikenAmnt;
//					}
//					else if (0 < lAMNT) {
//						// 0より大きい場合、貸倒金額の差額を補填し差額を0にする。
//						upAmnt = lKSDORGNKSaikenAmnt + (lKSDORSaikenAmnt - lKSDORGNKSaikenAmnt);
//					}
//
//					// 補填金額で債権内訳を更新する。※登録更新フラグを"2"更新で呼び出す。
//					inupDateSaikenUchiwake(cbsMsg, rsltQuery_KSDORGNKSaiken, String.valueOf(upAmnt), null, "2", sSaikenYM);
//
//					// 督促金額を加算する。
//					outTokusokuAmnt = String.valueOf(Long.valueOf(outTokusokuAmnt) + Long.valueOf(upAmnt));
//
//					// 終了判定
//					if (0 >= lAMNT) {
//						return null;
//					} else if (0 < lAMNT) {
//						// 金庫金額から補填額を引いた額に設定する。
//						inAmnt = String.valueOf(lAMNT);
//					}
//				}
//				else{
//					// 同月の貸倒後入金が存在しなかった場合、債権内訳の登録を行う。
//					// 貸倒金額と金庫金額を比較し補填額を算出する。
//					Long lAMNT = Long.valueOf(inAmnt);
//					Long lKSDORSaikenAmnt = Long.valueOf(sKSDORSaikenAmnt);
//
//					lAMNT = lAMNT - lKSDORSaikenAmnt;
//
//					// 補填金額算出
//					Long upAmnt = 0L;
//					if (0 >= lAMNT) {
//						// 0以下の場合、金庫金額全額を補填する。
//						upAmnt = Long.valueOf(inAmnt);
//					}
//					else if (0 < lAMNT) {
//						// 0より大きい場合、貸倒金額分補填する。
//						upAmnt = lKSDORSaikenAmnt;
//					}
//					// リザルトセット
//					HashMap<String, String> MapPrc = getPcrsCd(cbsMsg);
//
//					if (null == MapPrc) {
//						return null;
//					}
//
//					// 補填金額で債権内訳を登録する。※登録更新フラグを"1"登録で呼び出す。
//					inupDateSaikenUchiwake(cbsMsg, rsltQuery, String.valueOf(upAmnt),MapPrc, "1", sSaikenYM);
//
//					// 督促金額を加算する。
//					outTokusokuAmnt = String.valueOf(Long.valueOf(outTokusokuAmnt) + Long.valueOf(upAmnt));
//
//					// 終了判定
//					if (0 >= lAMNT) {
//						return null;
//					} else if (0 < lAMNT) {
//						// 金庫金額から補填額を引いた額に設定する。
//						inAmnt = String.valueOf(lAMNT);
//					}
//				}
//			}
//		}
//		catch (SQLException e){
//			cbsMsg.set(CH0021ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
//			throw new CAANRuntimeException(e);
//		}
//		finally{
//			// 資源の解放
//			try{
//				if (null != rsltQuery) {
//					rsltQuery.close();
//				}
//				if (null != pstmt1) {
//					pstmt1.close();
//				}
//				if (null != pstmt2) {
//					pstmt2.close();
//				}
//				if (null != con1) {
//					CAANConnectionMgr.getInstance().close(con1);
//				}
//			}
//			catch(SQLException e){
//				cbsMsg.set(CH0021ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
//				throw new CAANRuntimeException(e);
//			}
//		}
		//XXX ここまで既存のやつ

		return outTokusokuAmnt;
	}

	/**
	 * <p>
	 * 金庫移動登録時の債権内訳の金額を更新する。
	 * </p>
	 * 
	 * @param cbsMsg CBSメッセージ
	 * @param inPcrsCd 料金コースコード
	 * @param inPrcSvcCd 料金サービスコード
	 * @param inPrcKmnCd 料金項目コード
	 * @param inAmnt 金額
	 */
	public void updateKnkIdoAmnt(CAANMsg cbsMsg, String saikenNo, String inPrcGrpCd, 
			String inPcrsCd, String inPrcSvcCd, String inPrcKmnCd, String inAmnt)
	{
		try
		{
			// 債権内訳の金額を更新する。
			CAANMsg inETMsgSaikenUwk = new CAANMsg(CH0021ETMsg.class.getName());
			
			inETMsgSaikenUwk.set(CH0021ETMsg.SAIKEN_NO, saikenNo);	// 債権番号
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_GRP_CD, inPrcGrpCd);	// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PCRS_CD, inPcrsCd);		// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_SVC_CD, inPrcSvcCd);	// 料金サービスコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_KMK_CD, inPrcKmnCd);	// 料金項目コード
			inETMsgSaikenUwk.set(CH0021ETMsg.AMNT, inAmnt);				// 金額
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_OPEACNT, cbsMsg.getString(ECH0011C012CBSMsg.OPERATORID));
			
			// 債権内訳の金額を更新する。
			super.update(inETMsgSaikenUwk);
			
		}
		catch (CAANException e)
		{
			throw new CAANRuntimeException(e);
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理名：債権内訳充当金額更新副次処理
	 * 処理概要：債権内訳の充当金額を更新する。
	 * </p>
	 * 
	 * @param cbsMsg CBSメッセージ
	 * @param inPCRS_CD 料金コースコード
	 * @param inPRC_SVC_CD 料金サービスコード
	 * @param inPRC_KMK_CD 料金項目コード
	 * @param inAmnt 金額
	 */
	public void updateJutoAmnt(CAANMsg cbsMsg, AgentDispatchContext inContext, 
			String inPRC_GRP_CD, String inPCRS_CD, String inPRC_SVC_CD, String inPRC_KMK_CD) {

		try {
			
			// 債権内訳の金額を更新する。
			CAANMsg inETMsgSaikenUwk = new CAANMsg(CH0021ETMsg.class.getName());

			String inAmnt = serchAmnt(cbsMsg,inContext,inPRC_GRP_CD,inPCRS_CD,inPRC_SVC_CD,inPRC_KMK_CD);

			// 更新対象が存在しない場合、リターンする。
			if (inAmnt == null)
			{
				return;
			}

			// 加算するためにパラメータの金額(テーブルから取得した金額)型を変換する。
			Long motoAmnt = Long.valueOf(inAmnt);
			// 減算するためにCBSメッセージの金額(取消を行う金額)型を変換する。
			Long genAmnt = Long.valueOf(cbsMsg.getString(ECH0011C013CBSMsg.AMNT));
			// 減算。			
			String strAmnt= String.valueOf(motoAmnt - genAmnt);

			inETMsgSaikenUwk.set(CH0021ETMsg.SAIKEN_NO, cbsMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO));	// 債権番号
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_GRP_CD, inPRC_GRP_CD);	// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PCRS_CD, inPCRS_CD);		// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_SVC_CD, inPRC_SVC_CD);	// 料金サービスコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_KMK_CD, inPRC_KMK_CD);	// 料金項目コード
			inETMsgSaikenUwk.set(CH0021ETMsg.AMNT, strAmnt);			// 金額
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_OPEACNT, cbsMsg.getString(ECH0011C013CBSMsg.OPERATORID));
			
			// 債権内訳の金額を更新する。
			super.update(inETMsgSaikenUwk);
			
		} catch (CAANException e) {
			
			throw new CAANRuntimeException(e);
			
		} catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理名：債権内訳未収金額更新副次処理
	 * 処理概要：債権内訳の未収金額を更新する。
	 * </p>
	 * 
	 * @param cbsMsg CBSメッセージ
	 * @param inPCRS_CD 料金コースコード
	 * @param inPRC_SVC_CD 料金サービスコード
	 * @param inPRC_KMK_CD 料金項目コード
	 * @param inAmnt 金額
	 */
	public void updateMisyAmnt(CAANMsg cbsMsg, AgentDispatchContext inContext, 
			String inPRC_GRP_CD, String inPCRS_CD, String inPRC_SVC_CD, String inPRC_KMK_CD) {

		try {
			
			// 債権内訳の金額を更新する。
			CAANMsg inETMsgSaikenUwk = new CAANMsg(CH0021ETMsg.class.getName());
			
			String inAmnt = serchAmnt(cbsMsg,inContext,inPRC_GRP_CD,inPCRS_CD,inPRC_SVC_CD,inPRC_KMK_CD);
			// 加算するためにパラメータの金額(テーブルから取得した金額)型を変換する。
			Long motoAmnt = Long.valueOf(inAmnt);
			// 加算するためにCBSメッセージの金額(取消を行う金額)型を変換する。
			Long genAmnt = Long.valueOf(cbsMsg.getString(ECH0011C013CBSMsg.AMNT));
			// 加算
			String strAmnt= String.valueOf(motoAmnt + genAmnt);

			inETMsgSaikenUwk.set(CH0021ETMsg.SAIKEN_NO, cbsMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO));	// 債権番号
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_GRP_CD, inPRC_GRP_CD);		// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PCRS_CD, inPCRS_CD);		// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_SVC_CD, inPRC_SVC_CD);	// 料金サービスコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_KMK_CD, inPRC_KMK_CD);	// 料金項目コード
			inETMsgSaikenUwk.set(CH0021ETMsg.AMNT, strAmnt);				// 金額
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_OPEACNT, cbsMsg.getString(ECH0011C013CBSMsg.OPERATORID));
			
			// 債権内訳の金額を更新する。
			super.update(inETMsgSaikenUwk);
			
		} catch (CAANException e) {
			
			throw new CAANRuntimeException(e);
			
		} catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理名：債権内訳未収金額更新副次処理
	 * 処理概要：債権内訳の未収金額を更新する。
	 * </p>
	 * 
	 * @param cbsMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param targetMsg CBSメッセージ(更新対象)
	 * @param inPRC_KMK_CD 更新対象料金項目コード
	 * @param inAMnt 更新対象金額
	 */
	public void updateMisyAmnt(CAANMsg cbsMsg, AgentDispatchContext inContext, CAANMsg targetMsg, String inPrcKmkCd, String inAmnt) {

		try {

			// 債権内訳の金額を更新する。
			CAANMsg inETMsgSaikenUwk = new CAANMsg(CH0021ETMsg.class.getName());
			inETMsgSaikenUwk.set(CH0021ETMsg.SAIKEN_NO, targetMsg.getString(CH0021ETMsg.SAIKEN_NO));			// 債権番号
			inETMsgSaikenUwk.set(CH0021ETMsg.SAIKEN_FIX_YM, targetMsg.getString(CH0021ETMsg.SAIKEN_FIX_YM));	// 債権確定年月
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_GRP_CD, targetMsg.getString(CH0021ETMsg.PRC_GRP_CD));			// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PCRS_CD, targetMsg.getString(CH0021ETMsg.PCRS_CD));				// 料金コースコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_SVC_CD, targetMsg.getString(CH0021ETMsg.PRC_SVC_CD));			// 料金サービスコード
			inETMsgSaikenUwk.set(CH0021ETMsg.PRC_KMK_CD, inPrcKmkCd);											// 料金項目コード
			inETMsgSaikenUwk.set(CH0021ETMsg.AMNT, inAmnt);														// 金額
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgSaikenUwk.set(CH0021ETMsg.UPD_OPEACNT, cbsMsg.getString(ECH0011C013CBSMsg.OPERATORID));

			// 債権内訳の金額を更新する。
			super.updateSaikenUcwk(inETMsgSaikenUwk);

		} catch (CAANFinderException e) {
			
			throw new CAANRuntimeException(e);
			
		} catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理概要：債権内訳から金額を取得する。
	 * </p>
	 * 
	 * @param cbsMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inPRC_GRP_CD 料金グループコード
	 * @param inPCRS_CD 料金コースコード
	 * @param inPRC_SVC_CD 料金サービスコード
	 * @param inPRC_KMK_CD 料金項目コード
	 */
	public String serchAmnt(CAANMsg inCBSMsg, AgentDispatchContext inContext, 
			String inPRC_GRP_CD, String inPCRS_CD, String inPRC_SVC_CD, String inPRC_KMK_CD){

		String outAmnt = null;
		// 債権内訳 ロジカルエンティティクラス
		CH0021LE leCH0021 = new CH0021LE();
		
		// 債権内訳のETメッセージを作成
		CAANMsg msgCH0021 = new CAANMsg(CH0021ETMsg.class.getName());
		
		// 債権番号
		msgCH0021.set(CH0021ETMsg.SAIKEN_NO, inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO));
		// 債権確定年月
		msgCH0021.set(CH0021ETMsg.SAIKEN_FIX_YM, inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_FIX_YM));
		msgCH0021.set(CH0021ETMsg.PRC_GRP_CD, inPRC_GRP_CD);
		msgCH0021.set(CH0021ETMsg.PCRS_CD, inPCRS_CD);
		msgCH0021.set(CH0021ETMsg.PRC_SVC_CD, inPRC_SVC_CD);
		msgCH0021.set(CH0021ETMsg.PRC_KMK_CD, inPRC_KMK_CD);

		// 更新対象のレコード取得
		CAANMsg[] arrMsgCH0021;
		try {
			arrMsgCH0021 = leCH0021.findByCondition(msgCH0021);
			if (null != arrMsgCH0021 && arrMsgCH0021.length > 0)
			{
				CAANMsg msg = arrMsgCH0021[0];
				outAmnt = msg.getString(CH0021ETMsg.AMNT);
			}
		} catch (CAANException e) {
			inCBSMsg.set(CH0401ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		return outAmnt;
	}

	/**
	 * エンティティの生成を行います。
	 * @param msg 生成するエンティティの情報を格納したメッセージキャリア
	 * @return CAANMsg 生成した結果を格納したメッセージキャリア
	 * @exception CAANCreateException エンティティ生成時のエラーを通知
	 */
	public CAANMsg create(CAANMsg msg) throws CAANCreateException
	{
		return super.create(msg);
	}
	/**
	 * <p>
	 * 処理概要：債権内訳の取得
	 * </p>
	 * 
	 * @param cbsMsg CBSメッセージ
	 * @param inPCRS_CD 料金コースコード
	 * @param inPRC_SVC_CD 料金サービスコード
	 * @param inPRC_KMK_CD 料金項目コード
	 */
	public static CAANMsg serchSaikenUcwk(String saikenNo, String inPRC_GRP_CD, String inPCRS_CD,
			String inPRC_SVC_CD, String inPRC_KMK_CD){

		// 債権内訳 ロジカルエンティティクラス
		CH0021LE leCH0021 = new CH0021LE();
		
		// ETメッセージを作成
		CAANMsg msgCH0021 = new CAANMsg(CH0021ETMsg.class.getName());
		
		// 債権番号
		msgCH0021.set(CH0021ETMsg.SAIKEN_NO, saikenNo);
		msgCH0021.set(CH0021ETMsg.PRC_GRP_CD, inPRC_GRP_CD);
		msgCH0021.set(CH0021ETMsg.PCRS_CD, inPCRS_CD);
		msgCH0021.set(CH0021ETMsg.PRC_SVC_CD, inPRC_SVC_CD);
		msgCH0021.set(CH0021ETMsg.PRC_KMK_CD, inPRC_KMK_CD);

		
		// 更新対象のレコード取得
		CAANMsg arrMsgCH0021 = null;
		arrMsgCH0021 = leCH0021.findByPrimaryKey(msgCH0021);

		return arrMsgCH0021;
	}

	/**
	 * <p>
	 * 処理概要：債権内訳の取得(債権確定年月指定)
	 * </p>
	 * 
	 * @param saikenNo 債権番号
	 * @param saikenFixYm 債権確定年月
	 * @param inPRC_GRP_CD 料金グループコード
	 * @param inPCRS_CD 料金コースコード
	 * @param inPRC_SVC_CD 料金サービスコード
	 * @param inPRC_KMK_CD 料金項目コード
	 * @return 債権内訳
	 */
	public static CAANMsg[] serchSaikenUcwk(String saikenNo, String saikenFixYm,
			String inPRC_GRP_CD, String inPCRS_CD, String inPRC_SVC_CD, String inPRC_KMK_CD) {

		// 債権内訳 ロジカルエンティティクラス
		CH0021LE leCH0021 = new CH0021LE();

		// ETメッセージを作成
		CAANMsg msgCH0021 = new CAANMsg(CH0021ETMsg.class.getName());

		// 債権番号
		msgCH0021.set(CH0021ETMsg.SAIKEN_NO, saikenNo);
		// 債権確定年月
		msgCH0021.set(CH0021ETMsg.SAIKEN_FIX_YM, saikenFixYm);

		msgCH0021.set(CH0021ETMsg.PRC_GRP_CD, inPRC_GRP_CD);
		msgCH0021.set(CH0021ETMsg.PCRS_CD, inPCRS_CD);
		msgCH0021.set(CH0021ETMsg.PRC_SVC_CD, inPRC_SVC_CD);
		msgCH0021.set(CH0021ETMsg.PRC_KMK_CD, inPRC_KMK_CD);

		// 更新対象のレコード取得
		CAANMsg[] arrMsgCH0021;
		try {
			arrMsgCH0021 = leCH0021.findByCondition(msgCH0021);
		} catch (CAANException e) {
			throw new CAANRuntimeException(e);
		}

		// 取得できた時は1件のみ返す
		return arrMsgCH0021;
	}

	/**
	 * <p>
	 * 随時請求登録副次処理
	 * 随時請求登録時に債権内訳の登録を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inDtMsg 料金計算結果内部データ
	 * @throws CAANException 
	 */
	public void insSaikenUcwk(CAANMsg cbsMsg, AgentDispatchContext inContext, CAANMsg inDtMsg){
		
		// 請求年月
		String sSeikyYm = cbsMsg.getString(ECH0051D011CBSMsg.SEIKY_YM);
		
		// 登録処理を行う。
		CAANMsg inETMsgSaikenUcwk = new CAANMsg(CH0021ETMsg.class.getName());
		
		// 債権番号
		String sSaikenNo = cbsMsg.getString(ECH0051D011CBSMsg.SAIKEN_NO);
		
		// 料金グループコード
		String sPrcGrpCd = inDtMsg.getString(PRC_GRP_CD);
		
		// 料金コースコード
		String sPcrsCd = inDtMsg.getString(PCRS_CD);
		
		// 料金サービスコード
		String sPrcSvcCd = inDtMsg.getString(PRC_SVC_CD);
		
		// 料金項目コード
		String sPrcKmkCd = inDtMsg.getString(PRC_KMK_CD);
		
		// 登録データを設定する。
		inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_NO, sSaikenNo);
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_GRP_CD, sPrcGrpCd);
		inETMsgSaikenUcwk.set(CH0021ETMsg.PCRS_CD, sPcrsCd);
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_SVC_CD, sPrcSvcCd);
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_KMK_CD, sPrcKmkCd);
		inETMsgSaikenUcwk.set(CH0021ETMsg.AMNT, inDtMsg.getString("amnt"));
		inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_FIX_YM, sSeikyYm);
		inETMsgSaikenUcwk.set(CH0021ETMsg.ADD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		inETMsgSaikenUcwk.set(CH0021ETMsg.ADD_OPEACNT, cbsMsg.getObject(ECH0051D011CBSMsg.OPERATORID));
		inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_OPEACNT, cbsMsg.getObject(ECH0051D011CBSMsg.OPERATORID));
		inETMsgSaikenUcwk.set(CH0021ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);
		
		try {
			
			super.create(inETMsgSaikenUcwk);
			
		} catch (CAANException e) {
			
			throw new CAANRuntimeException(e);
			
		} catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 債権内訳取得処理
	 * 業務機能識別コードに紐づく債権内訳を取得する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysParamBunruiCD システムパラメータ分類コード
	 * @param sysParamID システムパラメータID
	 * @throws CAANException 
	 */
	public CAANMsg[] getSaikenUwk(CAANMsg inMsg, AgentDispatchContext inContext, String sysParamBunruiCD, String sysParamID)
	{
		// 返却用リスト
		ArrayList<CAANMsg> retArray = new ArrayList<CAANMsg>();
		
		// コネクション
		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(" 	 CH0021.SAIKEN_NO ")
					.append(" 	,CH0021.PRC_GRP_CD ")
					.append(" 	,CH0021.PCRS_CD ")
					.append(" 	,CH0021.PRC_SVC_CD ")
					.append(" 	,CH0021.PRC_KMK_CD ")
					.append(" 	,CH0021.AMNT ")
					.append(" 	,CH0021.SAIKEN_FIX_YM ")
					.append(" FROM ")
					.append(" 	CH_T_SAIKEN_UCWK CH0021 ")
					.append(" 	INNER JOIN ")
					.append(" 		(SELECT ")
					.append(" 			 CH0401.PRC_GRP_CD ")
					.append(" 			,CH0401.PCRS_CD ")
					.append(" 			,CH0401.PRC_SVC_CD ")
					.append(" 			,CH0401.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 = '1' ")
					.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("				)")
					.append(" 		ORDER BY CH0401.PRC_KMK_CD,CH0401.PRC_GRP_CD ")
					.append(" 		) CH0401")
					.append(" 	ON ")
					.append(" 			CH0021.PRC_GRP_CD = CH0401.PRC_GRP_CD ")
					.append(" 		AND CH0021.PCRS_CD = CH0401.PCRS_CD ")
					.append(" 		AND CH0021.PRC_SVC_CD = CH0401.PRC_SVC_CD ")
					.append(" 		AND CH0021.PRC_KMK_CD = CH0401.PRC_KMK_CD ")
					.append(" WHERE ")
					.append("      	CH0021.SAIKEN_NO = ? ")
					.append("  	AND CH0021.MK_FLG = '0' ");

			//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++, sysParamBunruiCD);
			// パラメータの設定(システムパラメータID)
			CAANJDBCUtil.setParam(pstmt, i++, sysParamID);
			// パラメータの設定(運用日)
			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++, inMsg.getString("saiken_no"));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 取得結果の設定
			while (rsltQuery.next())
			{
				CAANMsg retMsg = new CAANMsg(CH0021ETMsg.class.getName());
				retMsg.set(CH0021ETMsg.SAIKEN_NO, rsltQuery.getString(CH0021ETMsg.SAIKEN_NO));          // 債権番号
				retMsg.set(CH0021ETMsg.PRC_GRP_CD, rsltQuery.getString(CH0021ETMsg.PRC_GRP_CD));        // 料金グループコード
				retMsg.set(CH0021ETMsg.PCRS_CD, rsltQuery.getString(CH0021ETMsg.PCRS_CD));              // 料金コースコード
				retMsg.set(CH0021ETMsg.PRC_SVC_CD, rsltQuery.getString(CH0021ETMsg.PRC_SVC_CD));        // 料金サービスコード
				retMsg.set(CH0021ETMsg.PRC_KMK_CD, rsltQuery.getString(CH0021ETMsg.PRC_KMK_CD));        // 料金項目コード
				retMsg.set(CH0021ETMsg.AMNT, rsltQuery.getString(CH0021ETMsg.AMNT));                    // 金額
				retMsg.set(CH0021ETMsg.SAIKEN_FIX_YM, rsltQuery.getString(CH0021ETMsg.SAIKEN_FIX_YM));  // 債権確定年月

				retArray.add(retMsg);
			}
		}
		catch (SQLException e)
		{
			inMsg.set(CH0021ETMsg.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(CH0021ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		return retArray.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * 債権内訳削除処理
	 * 業務機能識別コードに紐づく債権内訳を削除する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysParamBunruiCD システムパラメータ分類コード
	 * @param sysParamID システムパラメータID
	 * @throws CAANException 
	 */
	public void deleteSaikenUwk(CAANMsg inMsg, AgentDispatchContext inContext, String sysParamBunruiCD, String sysParamID)
	{
		// コネクション
		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 ")
					.append(" 	,CH0401.PCRS_CD ")
					.append(" 	,CH0401.PRC_SVC_CD ")
					.append(" 	,CH0401.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 = '1' ")
					.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 MAX(CH0401_GENE.RSV_APLY_YMD || CH0401_GENE.GENE_ADD_DTM) AS CH0401_MAX ")
					.append("       FROM CH_M_PRC_KMK_CS_CHGE CH0401_GENE ")
					.append("      WHERE 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(" ORDER BY CH0401.PRC_KMK_CD,CH0401.PRC_GRP_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++, sysParamBunruiCD);
			// パラメータの設定(システムパラメータID1)
			CAANJDBCUtil.setParam(pstmt, i++, sysParamID);
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));
			// パラメータの設定(運用日)
			CAANJDBCUtil.setParam(pstmt, i++, JCCModelCommon.getOpeDate(inMsg, null));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 債権番号
			String saikenNo = inMsg.getString("saiken_no");
			
			// 取得結果の設定
			while (rsltQuery.next())
			{
				CAANMsg inETMsgSaiknUcwk = new CAANMsg(CH0021ETMsg.class.getName());
				inETMsgSaiknUcwk.set(CH0021ETMsg.SAIKEN_NO, saikenNo);                                      // 債権番号
				inETMsgSaiknUcwk.set(CH0021ETMsg.PRC_GRP_CD, rsltQuery.getString(CH0401ETMsg.PRC_GRP_CD));  // 料金グループコード
				inETMsgSaiknUcwk.set(CH0021ETMsg.PCRS_CD, rsltQuery.getString(CH0401ETMsg.PCRS_CD));        // 料金コースコード
				inETMsgSaiknUcwk.set(CH0021ETMsg.PRC_SVC_CD, rsltQuery.getString(CH0401ETMsg.PRC_SVC_CD));  // 料金サービスコード
				inETMsgSaiknUcwk.set(CH0021ETMsg.PRC_KMK_CD, rsltQuery.getString(CH0401ETMsg.PRC_KMK_CD));  // 料金項目コード
				
				try {
					CH0021LE leCH0021 = new CH0021LE();
					// 検索
					CAANMsg[] inETMsgTrg = leCH0021.findByCondition(inETMsgSaiknUcwk);
					if (null != inETMsgTrg && inETMsgTrg.length > 0)
					{
						// 削除
						super.remove(inETMsgSaiknUcwk);
					}
				} catch (CAANException e) {
					
					throw new CAANRuntimeException(e);
				} catch (Exception e) {
					
					throw new CAANRuntimeException(e);
				}
			}
		}
		catch (SQLException e)
		{
			inMsg.set(CH0021ETMsg.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(CH0021ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	 * <p>
	 * 債権内訳登録処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysParamBunruiCD システムパラメータ分類コード
	 * @param sysParamID システムパラメータID
	 * @throws CAANException 
	 */
	public void insertSaikenUwk(ArrayList<CAANMsg> saikenUcwkAddList)
	{
		try 
		{
			for (CAANMsg saikenUwk: saikenUcwkAddList)
			{
				super.create(saikenUwk);
			}
		
		} catch (CAANException e) {
			
			throw new CAANRuntimeException(e);
			
		} catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}
	
	/**
	 * <p>
	 * ECH0101D011_料金調整登録、ECH0101D012_料金変更登録、ECH0051D011_随時請求登録
	 * 債権内訳の登録処理を行う。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param caPrcShukReslt 登録対象明細
	 */
	public void executePrcAdjInsert(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg caPrcShukReslt)
	{
		try 
		{
			/** 債権内訳の登録処理を行う */
			CAANMsg inInsMsg = new CAANMsg(CH0021ETMsg.class.getName());
			
			inInsMsg.set(CH0021ETMsg.SAIKEN_NO, inCBSMsg.getString(JACStrConst.ECH0101CBSMSG_SAIKEN_NO));
			inInsMsg.set(CH0021ETMsg.PRC_GRP_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_GRP_CD));
			inInsMsg.set(CH0021ETMsg.PCRS_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PCRS_CD));
			inInsMsg.set(CH0021ETMsg.PRC_SVC_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_SVC_CD));
			inInsMsg.set(CH0021ETMsg.PRC_KMK_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_KMK_CD));
			inInsMsg.set(CH0021ETMsg.AMNT, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_AMNT));
			inInsMsg.set(CH0021ETMsg.SAIKEN_FIX_YM, inCBSMsg.getString(JACStrConst.ECH0101CBSMSG_SEIKY_YM));
			inInsMsg.set(CH0021ETMsg.ADD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
			inInsMsg.set(CH0021ETMsg.ADD_OPEACNT, inCBSMsg.getObject(ECH0101D011CBSMsg.OPERATORID));
			inInsMsg.set(CH0021ETMsg.UPD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
			inInsMsg.set(CH0021ETMsg.UPD_OPEACNT, inCBSMsg.getObject(ECH0101D011CBSMsg.OPERATORID));
			inInsMsg.set(CH0021ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);
			
			super.create(inInsMsg);
		} 
		catch (CAANException e) 
		{
			throw new CAANRuntimeException(e);
		} 
		catch (Exception e) 
		{
			throw new CAANRuntimeException(e);
		}
	}
	
	/**
	 * <p>
	 * ECH0101D011_料金調整登録、ECH0101D012_料金変更登録、ECH0051D011_随時請求登録
	 * 債権内訳の更新処理を行う。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param caPrcShukReslt 登録対象明細
	 */
	public void executePrcAdjUpdate(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg caPrcShukReslt)
	{
		try 
		{
			/** 請求内訳の更新処理を行う */
			CAANMsg inInsMsg = new CAANMsg(CH0021ETMsg.class.getName());
			
			inInsMsg.set(CH0021ETMsg.SAIKEN_NO, inCBSMsg.getString(JACStrConst.ECH0101CBSMSG_SAIKEN_NO));
			inInsMsg.set(CH0021ETMsg.PRC_GRP_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_GRP_CD));
			inInsMsg.set(CH0021ETMsg.PCRS_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PCRS_CD));
			inInsMsg.set(CH0021ETMsg.PRC_SVC_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_SVC_CD));
			inInsMsg.set(CH0021ETMsg.PRC_KMK_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_KMK_CD));
			inInsMsg.set(CH0021ETMsg.AMNT, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_AMNT));
			inInsMsg.set(CH0021ETMsg.UPD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
			inInsMsg.set(CH0021ETMsg.UPD_OPEACNT, inCBSMsg.getObject(ECH0101D011CBSMsg.OPERATORID));
			inInsMsg.set(CH0021ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);
			
			super.update(inInsMsg);
		}
		catch (CAANException e) 
		{
			throw new CAANRuntimeException(e);
		} 
		catch (Exception e) 
		{
			throw new CAANRuntimeException(e);
		}
	}
	
	/**
	 * <p>
	 * ECH0101D011_料金調整登録、ECH0101D012_料金変更登録、ECH0051D011_随時請求登録
	 * 債権内訳の更新処理を行う。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param caPrcShukReslt 登録対象明細
	 */
	public void executePrcAdjDelete(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg caPrcShukReslt)
	{
		try 
		{
			/** 請求内訳の更新処理を行う */
			CAANMsg inInsMsg = new CAANMsg(CH0021ETMsg.class.getName());
			
			inInsMsg.set(CH0021ETMsg.SAIKEN_NO, inCBSMsg.getString(JACStrConst.ECH0101CBSMSG_SAIKEN_NO));
			inInsMsg.set(CH0021ETMsg.PRC_GRP_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_GRP_CD));
			inInsMsg.set(CH0021ETMsg.PCRS_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PCRS_CD));
			inInsMsg.set(CH0021ETMsg.PRC_SVC_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_SVC_CD));
			inInsMsg.set(CH0021ETMsg.PRC_KMK_CD, caPrcShukReslt.getString(JACStrConst.KEY_PRC_SHUK_PRC_KMK_CD));
			
			super.remove(inInsMsg);
		}
		catch (CAANException e) 
		{
			throw new CAANRuntimeException(e);
		} 
		catch (Exception e) 
		{
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理名：債権内訳更新副次処理
	 * 処理概要：債権内訳を更新する。
	 * 性能考慮により、主キー + 債権確定年月による更新メソッドを使用する。
	 * </p>
	 * 
	 * @param inCAANMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param targetMsg CBSメッセージ(更新対象)
	 * @param inPRC_KMK_CD 更新対象料金項目コード
	 * @param inAMnt 更新対象金額
	 */
	public void executeInsert(CAANMsg inCAANMsg)
	{
		try {

			// 債権内訳の金額を更新する。
			CAANMsg inETMsgSaikenUcwk = new CAANMsg(CH0021ETMsg.class.getName());

			// キー項目を設定
			inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_NO, inCAANMsg.getString(CH0021ETMsg.SAIKEN_NO));
			inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_FIX_YM, inCAANMsg.getString(CH0021ETMsg.SAIKEN_FIX_YM));
			inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_GRP_CD, inCAANMsg.getString(CH0021ETMsg.PRC_GRP_CD));
			inETMsgSaikenUcwk.set(CH0021ETMsg.PCRS_CD, inCAANMsg.getString(CH0021ETMsg.PCRS_CD));
			inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_SVC_CD, inCAANMsg.getString(CH0021ETMsg.PRC_SVC_CD));
			inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_KMK_CD, inCAANMsg.getString(CH0021ETMsg.PRC_KMK_CD));

			// 更新項目を設定
			inETMsgSaikenUcwk.set(CH0021ETMsg.AMNT, inCAANMsg.getString(CH0021ETMsg.AMNT));
			inETMsgSaikenUcwk.set(CH0021ETMsg.ADD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgSaikenUcwk.set(CH0021ETMsg.ADD_OPEACNT, inCAANMsg.getString(CH0021ETMsg.ADD_OPEACNT));
			inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_OPEACNT, inCAANMsg.getString(CH0021ETMsg.UPD_OPEACNT));
			inETMsgSaikenUcwk.set(CH0021ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);

			// 債権内訳の金額を更新する。(主キー + 債権確定年月による更新)
			super.create(inETMsgSaikenUcwk);

		} catch (CAANCreateException e) {
			
			throw new CAANRuntimeException(e);
			
		} catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理名：債権内訳更新副次処理
	 * 処理概要：債権内訳を更新する。
	 * 性能考慮により、主キー + 債権確定年月による更新メソッドを使用する。
	 * </p>
	 * 
	 * @param inCAANMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param targetMsg CBSメッセージ(更新対象)
	 * @param inPRC_KMK_CD 更新対象料金項目コード
	 * @param inAMnt 更新対象金額
	 */
	public void executeUpdate(CAANMsg inCAANMsg)
	{
		try {

			// 債権内訳の金額を更新する。
			CAANMsg inETMsgSaikenUcwk = new CAANMsg(CH0021ETMsg.class.getName());

			// キー項目を設定
			inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_NO, inCAANMsg.getString(CH0021ETMsg.SAIKEN_NO));
			inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_FIX_YM, inCAANMsg.getString(CH0021ETMsg.SAIKEN_FIX_YM));
			inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_GRP_CD, inCAANMsg.getString(CH0021ETMsg.PRC_GRP_CD));
			inETMsgSaikenUcwk.set(CH0021ETMsg.PCRS_CD, inCAANMsg.getString(CH0021ETMsg.PCRS_CD));
			inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_SVC_CD, inCAANMsg.getString(CH0021ETMsg.PRC_SVC_CD));
			inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_KMK_CD, inCAANMsg.getString(CH0021ETMsg.PRC_KMK_CD));

			// 更新項目を設定
			inETMsgSaikenUcwk.set(CH0021ETMsg.AMNT, inCAANMsg.getString(CH0021ETMsg.AMNT));
			inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_DTM, JCHModelCommon.getSysDateTimeStamp());
			inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_OPEACNT, inCAANMsg.getString(CH0021ETMsg.UPD_OPEACNT));

			// 債権内訳の金額を更新する。(主キー + 債権確定年月による更新)
			super.updateSaikenUcwk(inETMsgSaikenUcwk);

		} catch (CAANFinderException e) {
			
			throw new CAANRuntimeException(e);
			
		} catch (Exception e) {
			
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理名：債権内訳削除副次処理
	 * 処理概要：債権内訳を削除する。
	 * 性能考慮により、主キー + 債権確定年月による削除メソッドを使用する。
	 * </p>
	 * @param inCAANMsg 処理対象のメッセージキャリア
	 * @param inPrcGrpCd 料金グループコード
	 * @param inPcrsCd 料金コースコード
	 * @param inPrcSvcCd 料金サービスコード
	 * @param inPrcKmkCd 料金項目コード
	 */
	public void executeDelete(CAANMsg inCAANMsg)
	{
		CAANMsg inETMsgSaikenUcwk = new CAANMsg(CH0021ETMsg.class.getName());

		// キー項目を設定
		inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_NO, inCAANMsg.getString(SAIKEN_NO));
		inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_FIX_YM, inCAANMsg.getString(SAIKEN_FIX_YM));
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_GRP_CD, inCAANMsg.getString(PRC_GRP_CD));
		inETMsgSaikenUcwk.set(CH0021ETMsg.PCRS_CD, inCAANMsg.getString(PCRS_CD));
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_SVC_CD, inCAANMsg.getString(PRC_SVC_CD));
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_KMK_CD, inCAANMsg.getString(PRC_KMK_CD));
		
		try
		{
			CH0021LE leCH0021 = new CH0021LE();
			// 検索
			CAANMsg[] inETMsgTrg = leCH0021.findByCondition(inETMsgSaikenUcwk);
			if (null != inETMsgTrg && inETMsgTrg.length > 0)
			{
				// 削除(主キー + 債権確定年月による削除)
				super.removeSaikenUcwk(inETMsgSaikenUcwk);
			}
		}
		catch (CAANException e)
		{
			throw new CAANRuntimeException(e);
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p>
	 * 処理名：債権内訳削除副次処理
	 * 処理概要：債権内訳を削除する。
	 * 性能考慮により、主キー + 債権確定年月による削除メソッドを使用する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inPrcGrpCd 料金グループコード
	 * @param inPcrsCd 料金コースコード
	 * @param inPrcSvcCd 料金サービスコード
	 * @param inPrcKmkCd 料金項目コード
	 */
	public void executeDelete(CAANMsg inCBSMsg, String inPrcGrpCd, String inPcrsCd, String inPrcSvcCd, String inPrcKmkCd)
	{
		CAANMsg inETMsgSaikenUcwk = new CAANMsg(CH0021ETMsg.class.getName());

		// キー項目を設定
		inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_NO, inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_NO));
		inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_FIX_YM, inCBSMsg.getString(ECH0011C013CBSMsg.SAIKEN_FIX_YM));
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_GRP_CD, inPrcGrpCd);
		inETMsgSaikenUcwk.set(CH0021ETMsg.PCRS_CD, inPcrsCd);
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_SVC_CD, inPrcSvcCd);
		inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_KMK_CD, inPrcKmkCd);
		
		try
		{
			CH0021LE leCH0021 = new CH0021LE();
			// 検索
			CAANMsg[] inETMsgTrg = leCH0021.findByCondition(inETMsgSaikenUcwk);
			if (null != inETMsgTrg && inETMsgTrg.length > 0)
			{
				// 削除(主キー + 債権確定年月による削除)
				super.removeSaikenUcwk(inETMsgSaikenUcwk);
			}
		}
		catch (CAANException e)
		{
			throw new CAANRuntimeException(e);
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
	}

}
