/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom 
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JECH0011C012TPMA
*   ソースファイル名：JECH0011C012TPMA.java
*   作成者          ：富士通
*   日付            ：2011年08月02日
*＜機能概要＞
*   入金登録債権変更顧客独自処理部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/08/02  富士通      新規作成
*   v4.00.00    2013/02/16  FJ)垣内    【債権確定年月null】対応
*   v5.00.00	2013/08/03  FJ)河井    【IT1-2013-0001508】入金登録時の債権内訳更新処理修正
*   v10.00.00	2014/08/27  FJ)江森    【OM-2014-0001880,IT2-2014-000167】支払証明書の消費税不正対応。
*   v32.00.00   2017/05/26  FJ)河邊    【OM-2017-0000488】オープンカーソルエラー
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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.common.util.JACTaxCalcShikibetuCodeUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.CH0011ETMsg;
import eo.ejb.cbm.entity.CH0021ETMsg;
import eo.ejb.cbm.entity.CH0401ETMsg;
import eo.ejb.cbm.entity.CH0431ETMsg;
import eo.ejb.cbm.entity.ZM0321ETMsg;
import eo.ejb.cbm.entity.ZM0321LE;
import eo.ejb.cbs.cbsmsg.ECH0011C012CBSMsg;
import eo.ejb.common.JCHModelCommon;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.db.JCHejbCH0011SecProc;
import eo.ejb.common.db.JCHejbCH0021SecProc;
import eo.ejb.common.db.JCHejbCH0201SecProc;
import eo.ejb.common.db.JCHejbCH0311SecProc;
import eo.ejb.common.edit.JCHejbCH0201NumberParts;
import eo.ejb.common.entity.JCHejbCH0021KRCK;

/**
 * <p>
 * 入金登録時の債権内訳の更新を行う部品
 * </p>
 * @author 富士通
 */
public class JECH0011C012TPMA implements TemplateMainHandler {
	
	/**
	 * 充当種別コード（入金）
	 */
	private static final String JUTO_SBT_CD_NYUKIN ="1";

	/**
	 * コンストラクタです。
	 */
	public JECH0011C012TPMA()
	{
		super();
	}

	/**
	 * <p>
	 * 入金登録時の債権内訳の更新を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @throws Exception 
	 */
	public static void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws Exception
	{
		
		// パラメータの取得
		String inSaikenNo = inCBSMsg.getString(ECH0011C012CBSMsg.SAIKEN_NO);
		String inJutoAmnt = inCBSMsg.getString(ECH0011C012CBSMsg.JUTO_AMNT);
//OM-2014-0001880 ADD START
		String inSaikenYm = inCBSMsg.getString(ECH0011C012CBSMsg.SAIKEN_YM);
//OM-2014-0001880 ADD START
		
		// エラーフラグ
		String errFlag = "EA";
		
		// ステータス
		int rtn = 0;
		
		// 未収額整合性チェック処理結果
		boolean misyuAmntCheckResult = true;
		
		// 運用日付
		String opeDate = (String)JPCModelCommon.getOpeDate(inCBSMsg, inContext, null);

		//----------------------------------------------------
		// 未収額整合性チェック処理
		//----------------------------------------------------
		// チェック条件
		if (!(inCBSMsg.isNull(ECH0011C012CBSMsg.SAIKEN_NO) && inCBSMsg.isNull(ECH0011C012CBSMsg.JUTO_AMNT))) {
			misyuAmntCheckResult = JCHejbCH0021KRCK.isMisyuAmntCheck(inCBSMsg, inContext, inSaikenNo, inJutoAmnt);
			// 未収額整合性チェック処理の結果がNG(False)の場合はエラー
			if (!misyuAmntCheckResult) {
				inCBSMsg.set(ECH0011C012CBSMsg.JUTO_AMNT_ERR, errFlag);
				rtn = StatusCodes.RELATION_ERR;
			}
			//チェック結果によりステータスを設定する
			if (rtn > inCBSMsg.getInt(ECH0011C012CBSMsg.STATUS)) {
				inCBSMsg.set(ECH0011C012CBSMsg.STATUS,rtn);
			}
		}
		// 未収額整合性チェック処理の結果がOK(True)の場合
		if (misyuAmntCheckResult) {
			// 機能コードが"1"（チェック＆更新）の時は充当を登録し、債権内訳を更新する
			if ("1".equals(inCBSMsg.getString(ECH0011C012CBSMsg.FUNC_CODE))) {
				
				//----------------------------------------------------
				// 充当を登録する
				//----------------------------------------------------
				// 充当の副次問合せ
				JCHejbCH0201SecProc CH0201 = new JCHejbCH0201SecProc();
				// 充当番号の取得
				String sJutoNo = JCHejbCH0201NumberParts.getJutoNo(inCBSMsg, inContext);
				
				String jutoSbtCd = JACStrConst.JUTO_SBT_MANUAL_NKIN;
				// 入金経路コード
				String nyukinRouteCd = getNullToStr(inCBSMsg.getString(ECH0011C012CBSMsg.NYUKIN_ROUTE_CD));
				// 入金経路が金庫充当（90）の場合、預り金充当（2）を設定する
				if(JACStrConst.NYKNKEIRCD_JUTO.equals(nyukinRouteCd))
				{
					jutoSbtCd = JACStrConst.JUTO_SBT_AZKIN_JUTO;
				}
				
				// 充当の登録
				CH0201.insertJuto(inCBSMsg, sJutoNo, jutoSbtCd);
				
				//----------------------------------------------------
				// 債権内訳.充当額を更新する
				//----------------------------------------------------
				// コネクション
				Connection con1 = null;
				
				// プリペアステートメント
				PreparedStatement pstmt = null;
				
				// リザルトセット
				ResultSet rsltQuery = null;
				
				// 債権の副次問合せ
				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文をセット
					pstmt = con1.prepareStatement(sql_Buff.toString());
					
					//ログ出力(SQL文の出力)
					JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
							JECH0011C012TPMA.class, sql_Buff);
					
					int i = 1;

					CAANJDBCUtil.setParam(pstmt, i++, opeDate);
					CAANJDBCUtil.setParam(pstmt, i++, opeDate);
					CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.MIS_TO_JT);
					CAANJDBCUtil.setParam(pstmt, i++, opeDate);
					CAANJDBCUtil.setParam(pstmt, i++, opeDate);
					
					// ResultSetの取得
					rsltQuery = pstmt.executeQuery();
					
					Long calcJutoAmnt = new Long(0);
					
					// 戻り値の判定
					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);
						// 料金グループコードを取得する
						String sOUTPUT_PRC_GRP_CD = rsltQuery.getString(CH0401ETMsg.OUTPUT_PRC_GRP_CD);
						// 料金コースコードを取得する
						String sOUTPUT_PCRS_CD = rsltQuery.getString(CH0401ETMsg.OUT_PCRS_CD);
						// 料金サービスコードを取得する
						String sOUTPUT_PRC_SVC_CD = rsltQuery.getString(CH0401ETMsg.OUT_PRC_SVC_CD);
						// 料金項目コードを取得する
						String sOUTPUT_PRC_KMK_CD = rsltQuery.getString(CH0401ETMsg.OUT_PRC_KMK_CD);
						// 充当額を取得する
						String sJUTO_AMNT = inCBSMsg.getString(ECH0011C012CBSMsg.JUTO_AMNT);
						
						// 債権内訳より対象の充当額を取得する
						CAANMsg cMsgCH0021 = JCHejbCH0021SecProc.serchSaikenUcwk(inSaikenNo, sPRC_GRP_CD, sPCRS_CD, sPRC_SVC_CD, sPRC_KMK_CD);
						CAANMsg outCMsgCH0021 = JCHejbCH0021SecProc.serchSaikenUcwk(inSaikenNo, sOUTPUT_PRC_GRP_CD, sOUTPUT_PCRS_CD, sOUTPUT_PRC_SVC_CD, sOUTPUT_PRC_KMK_CD);
						
						Long lGamenjutoAmnt = Long.valueOf(sJUTO_AMNT);
						Long lNewJutoAmnt = 0L;
						Long lSerchjutoAmnt = 0L;
						Long lSerchMishuAmnt = 0L;
						
						if (null != outCMsgCH0021) {
							// 存在した場合、請求契約単位および料金グループ単位の充当額を更新する
							lSerchjutoAmnt = Long.valueOf(outCMsgCH0021.getString("AMNT"));
							lSerchMishuAmnt = Long.valueOf(cMsgCH0021.getString("AMNT"));
							
							if ((sPRC_GRP_CD.trim()).isEmpty()) {
								// 対象レコードが請求契約単位の場合、画面入力した充当額を加算して設定する
								lNewJutoAmnt = lGamenjutoAmnt + lSerchjutoAmnt;
								calcJutoAmnt = lGamenjutoAmnt;
							} else if (lSerchMishuAmnt > 0) {
								// 未収額がある場合、充当処理を行う
								if (calcJutoAmnt.compareTo(lSerchjutoAmnt) >= 0) {
									// 対象レコードが料金グループ単位かつ全額充当可能な場合、充当額を設定する
									lNewJutoAmnt = lSerchjutoAmnt + lSerchMishuAmnt;
									calcJutoAmnt = calcJutoAmnt - lSerchMishuAmnt;
								} else {
									// 対象レコードが料金グループ単位かつ一部充当可能な場合、充当額に残金を設定する
									lNewJutoAmnt = calcJutoAmnt + lSerchjutoAmnt;
									calcJutoAmnt = 0L;
								}
							} else {
								// 未収額がない場合は、次レコードの処理を行う
								continue;
							}
							
							sJUTO_AMNT = lNewJutoAmnt.toString();
							
							// 債権内訳副次問合せを呼び出し、債権内訳の充当額を更新する
							CH0021.updateAmnt(inCBSMsg, sOUTPUT_PRC_GRP_CD, sOUTPUT_PCRS_CD, sOUTPUT_PRC_SVC_CD, sOUTPUT_PRC_KMK_CD, sJUTO_AMNT);
						} else if (null != cMsgCH0021) {
							// 存在しなかった場合、未収額があれば充当額のinsertを行う
							lSerchjutoAmnt = Long.valueOf(cMsgCH0021.getString("AMNT"));
							
							if ((sPRC_GRP_CD.trim()).isEmpty()) {
								// 対象レコードが請求契約単位の場合、画面入力した充当額を設定する
								lNewJutoAmnt = lGamenjutoAmnt;
								calcJutoAmnt = lGamenjutoAmnt;
							} else if (calcJutoAmnt.compareTo(lSerchjutoAmnt) >= 0) {
								// 対象レコードが料金グループ単位かつ全額充当可能な場合
								lNewJutoAmnt = lSerchjutoAmnt;
								calcJutoAmnt = calcJutoAmnt - lSerchjutoAmnt;
							} else {
								// 対象レコードが料金グループ単位かつ一部充当可能な場合
								lNewJutoAmnt = calcJutoAmnt;
								calcJutoAmnt = 0L;
							}
							
							sJUTO_AMNT = lNewJutoAmnt.toString();
							
							// 充当額が0円の場合は充当額データは作らない
							if (lNewJutoAmnt > 0) {
								CAANMsg inETMsgSaikenUcwk = new CAANMsg(CH0021ETMsg.class.getName());
								inETMsgSaikenUcwk.set(CH0021ETMsg.SAIKEN_NO,inSaikenNo);
								inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_GRP_CD,sOUTPUT_PRC_GRP_CD);
								inETMsgSaikenUcwk.set(CH0021ETMsg.PCRS_CD,sOUTPUT_PCRS_CD);
								inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_SVC_CD,sOUTPUT_PRC_SVC_CD);
								inETMsgSaikenUcwk.set(CH0021ETMsg.PRC_KMK_CD,sOUTPUT_PRC_KMK_CD);
								inETMsgSaikenUcwk.set(CH0021ETMsg.AMNT,sJUTO_AMNT);

								// 債権番号を元に債権を検索し、債権確定年月を取得する。
								JCHejbCH0011SecProc CH0011 = new JCHejbCH0011SecProc();
								CAANMsg inETMsgSaiken = new CAANMsg(CH0011ETMsg.class.getName());
								inETMsgSaiken.set(CH0011ETMsg.SAIKEN_NO,inSaikenNo);
								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,inCBSMsg.getObject(ECH0011C012CBSMsg.OPERATORID));
								inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_DTM,JCHModelCommon.getSysDateTimeStamp());
								inETMsgSaikenUcwk.set(CH0021ETMsg.UPD_OPEACNT,inCBSMsg.getObject(ECH0011C012CBSMsg.OPERATORID));
								inETMsgSaikenUcwk.set(CH0021ETMsg.MK_FLG,"0");

								CH0021.create(inETMsgSaikenUcwk);
							}
						}
						
					}
				}
				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);
					}
				}
				
				
				//----------------------------------------------------
				// 債権内訳.未収額を更新する
				//----------------------------------------------------
				// コネクション
				con1 = null;
				
				// プリペアステートメント
				pstmt = null;
				
				// リザルトセット
				rsltQuery = null;
				
				/******************** 
				 * SQL文の作成
				 ********************/
				try
				{
					
					//コネクション取得
					con1 = JSYejbConnection.getConnection(CH0431ETMsg.getTableName());
					
					StringBuffer sql_Buff = new StringBuffer();
					sql_Buff.append(" SELECT ")
							.append("     CH0431.PRC_GRP_CD ")
							.append("    ,CH0431.PCRS_CD ")
							.append("    ,CH0431.PRC_SVC_CD ")
							.append("    ,CH0431.PRC_KMK_CD ")
							.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(" ORDER BY CH0431.TRN_JUN ASC ");
					
					//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++, opeDate);
					CAANJDBCUtil.setParam(pstmt, i++, opeDate);
					
					// ResultSetの取得
					rsltQuery = pstmt.executeQuery();
					
					Long calcMisyuAmnt = 0L;
					
					// 戻り値の判定
					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);
						// 充当額を取得する
						String sJUTO_AMNT = inCBSMsg.getString(ECH0011C012CBSMsg.JUTO_AMNT);
						
						// 債権内訳より対象の未収額を取得する
						CAANMsg cMsgCH0021 = JCHejbCH0021SecProc.serchSaikenUcwk(inSaikenNo,sPRC_GRP_CD,sPCRS_CD,sPRC_SVC_CD,sPRC_KMK_CD);

						if (null != cMsgCH0021) {
							// 存在した場合、請求契約単位および料金グループ単位の未収額を更新する
							Long lGamenJuoAmnt = Long.valueOf(sJUTO_AMNT);						// 充当額（画面入力）
							Long lSerchMisyuAmnt = Long.valueOf(cMsgCH0021.getString("AMNT"));	// 未収額（ＤＢ取得）
							Long lNewMisyuAmnt = 0L;
							
							if ((sPRC_GRP_CD.trim()).isEmpty()) {
								// 対象レコードが請求契約単位の場合、未収額−充当額を設定する
								lNewMisyuAmnt   = lSerchMisyuAmnt - lGamenJuoAmnt;
								calcMisyuAmnt = lGamenJuoAmnt;
							} else if (calcMisyuAmnt.compareTo(lSerchMisyuAmnt) >= 0) {
								// 対象レコードが料金グループ単位かつ全額充当可能な場合、未収額は0を設定する
								lNewMisyuAmnt = 0L;
								calcMisyuAmnt = calcMisyuAmnt - lSerchMisyuAmnt;
							} else {
								// 対象レコードが料金グループ単位かつ一部充当可能な場合、未収額に残金を設定する
								lNewMisyuAmnt = lSerchMisyuAmnt - calcMisyuAmnt;
								calcMisyuAmnt = 0L;
							}
							
							String strMisyuAmnt  = lNewMisyuAmnt.toString();
							
							// 債権内訳副次問合せを呼び出し、債権内訳の未収額を更新する
							CH0021.updateAmnt(inCBSMsg, sPRC_GRP_CD, sPCRS_CD, sPRC_SVC_CD, sPRC_KMK_CD, strMisyuAmnt);
						}
					}
				}
				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);
					}
				}
//OM-2014-0001880 ADD START
				//----------------------------------------------------
				// 領収.未収額を更新する
				//----------------------------------------------------
				// 債権の副次問合せ
				JCHejbCH0311SecProc CH0311 = new JCHejbCH0311SecProc();

				/******************** 
				 * SQL文の作成
				 ********************/
			
				// リザルトセット
				ResultSet rsltQuery1 = null;
	
				try
				{
					//コネクション取得
					con1 = JSYejbConnection.getConnection(CH0401ETMsg.getTableName());
					
					StringBuffer sql_Buff = new StringBuffer();
					int i = 1;
					// 業務機能識別コード取得
					String workParam[] = getWorkParam();
					
// OM-2017-0000488 2017/05/26 ADD START
					if (con1 != null)
					{
						CAANConnectionMgr.getInstance().close(con1);
					}
// OM-2017-0000488 2017/05/26 ADD END
					
					//コネクション取得
					con1 = JSYejbConnection.getConnection(CH0011ETMsg.getTableName());
					
					// SQL文_基本部1
					sql_Buff.append(" SELECT ")
							.append("       CH0011.SAIKEN_NO ")
							.append("       ,CH0011.SAIKEN_STAT ")
							.append("       ,CH0011.SEIKY_WAY_CD ")
							.append("       ,CH0011.SEIKY_SBT_CD ")
							.append("       ,( ")
							.append("          SELECT ")
							.append("              CH0021.AMNT ")
							.append("          FROM ")
							.append("              CH_T_SAIKEN_UCWK CH0021 ")
							.append("              INNER JOIN ")
							.append("              ( ")
							.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("                  WHERE ")
							.append("                      CH0401.SYS_CD = 'CH' ")
							.append("                      AND CH0401.WORK_KINO_SKBT_CD = ? ")
							.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("              ) CH0401 ")
							.append("              ON  CH0401.PRC_GRP_CD = CH0021.PRC_GRP_CD ")
							.append("              AND CH0401.PCRS_CD = CH0021.PCRS_CD ")
							.append("              AND CH0401.PRC_SVC_CD = CH0021.PRC_SVC_CD ")
							.append("              AND CH0401.PRC_KMK_CD = CH0021.PRC_KMK_CD ")
							.append("          WHERE ")
							.append("              CH0021.SAIKEN_NO = CH0011.SAIKEN_NO ")
							.append("              AND CH0021.MK_FLG = '0' ")
							.append("              AND ROWNUM = 1 ")
							.append("       ) SAIKEN_AMNT ")         // 債権額       : SAIK_AMNT(00900910601)
							.append("       ,( ")
							.append("          SELECT ")
							.append("              CH0021.AMNT ")
							.append("          FROM ")
							.append("              CH_T_SAIKEN_UCWK CH0021 ")
							.append("              INNER JOIN ")
							.append("              ( ")
							.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("                  WHERE ")
							.append("                      CH0401.SYS_CD = 'CH' ")
							.append("                      AND CH0401.WORK_KINO_SKBT_CD = ? ")
							.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("              ) CH0401 ")
							.append("              ON  CH0401.PRC_GRP_CD = CH0021.PRC_GRP_CD ")
							.append("              AND CH0401.PCRS_CD = CH0021.PCRS_CD ")
							.append("              AND CH0401.PRC_SVC_CD = CH0021.PRC_SVC_CD ")
							.append("              AND CH0401.PRC_KMK_CD = CH0021.PRC_KMK_CD ")
							.append("          WHERE ")
							.append("              CH0021.SAIKEN_NO = CH0011.SAIKEN_NO ")
							.append("              AND CH0021.MK_FLG = '0' ")
							.append("              AND ROWNUM = 1 ")
							.append("       ) MINOU_AMNT ")          // 未収金額     : MISH_AMNT(00900950601)
							.append(" 	,( ")
							.append(" 		SELECT ")
							.append(" 			SUM(CH0021.AMNT) ")
							.append(" 		FROM ")
							.append(" 			CH_T_SAIKEN_UCWK CH0021 ")
							.append(" 			INNER JOIN ")
							.append(" 			( ")
							.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(" 				WHERE ")
							.append(" 					CH0401.SYS_CD = 'CH' ")
							.append(" 					AND CH0401.WORK_KINO_SKBT_CD = ? ")
							.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(" 			) CH0401 ")
							.append(" 			ON  CH0401.PRC_GRP_CD = CH0021.PRC_GRP_CD ")
							.append(" 			AND CH0401.PCRS_CD = CH0021.PCRS_CD ")
							.append(" 			AND CH0401.PRC_SVC_CD = CH0021.PRC_SVC_CD ")
							.append(" 			AND CH0401.PRC_KMK_CD = CH0021.PRC_KMK_CD ")
							.append(" 		WHERE ")
							.append(" 			CH0021.SAIKEN_NO = CH0011.SAIKEN_NO ")
							.append(" 			AND CH0021.SAIKEN_FIX_YM = CH0011.SAIKEN_YM ")
							.append(" 			AND CH0021.MK_FLG = '0' ")
							.append(" 	) SAIKEN_STAX ")      // うち消費税額 : SAIKE_STX(00900910201, 10900910201)
							.append(" FROM CH_T_SAIKEN CH0011 ")
			 				.append(" WHERE ")
							.append(" CH0011.SAIKEN_NO = ? ")
							.append(" AND CH0011.MK_FLG = '0' ");
					
					//prepareStatementにSQL文をセット
					pstmt = con1.prepareStatement(sql_Buff.toString());
					
					//ログ出力(SQL文の出力)
					JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS,
							JECH0011C012TPMA.class, sql_Buff);
					

					i = 1;
					CAANJDBCUtil.setParam(pstmt, i++, workParam[0]);   // 債権額       : SAIK_AMNT(00900910601)
					CAANJDBCUtil.setParam(pstmt, i++, opeDate);
					CAANJDBCUtil.setParam(pstmt, i++, workParam[1]);   // 未収金額     : MISH_AMNT(00900950601)
					CAANJDBCUtil.setParam(pstmt, i++, opeDate);
					CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.WKS_CH_SAIKE_STX);   // うち消費税額 : SAIKE_STX(00900910201, 10900910201)
					CAANJDBCUtil.setParam(pstmt, i++, opeDate);
					CAANJDBCUtil.setParam(pstmt, i++, inSaikenNo);

					// ResultSetの取得
					rsltQuery1 = pstmt.executeQuery();
					
					// 戻り値の判定
					while (rsltQuery1.next())
					{
						// 戻り値の判定
						// 債権額うち消費税を取得する。
						String sSAIKEN_STAX = rsltQuery1.getString("SAIKEN_STAX");
						// 債権額を取得する。
						String sSAIKEN_AMNT = rsltQuery1.getString("SAIKEN_AMNT");
						// 請求方法コードを取得する。
						String sSEIKY_WAY_CD = rsltQuery1.getString("SEIKY_WAY_CD");
						// 請求種別コードを取得する。
						String sSEIKY_SBT_CD = rsltQuery1.getString("SEIKY_SBT_CD");
						
						// 充当額と債権額が異なる場合
						if (!inJutoAmnt.equals(sSAIKEN_AMNT))
						{
							// 割戻し金額を充当金額より求める
							/** 税計算識別コード管理クラス */
							JACTaxCalcShikibetuCodeUtil jACTaxCalcShikibetuCodeUtil = new JACTaxCalcShikibetuCodeUtil(JACStrConst.CALLER_SCREEN);
							// 税計算識別コード取得
							String taxSkbtCd = jACTaxCalcShikibetuCodeUtil.getTaxSkbtCdStaMax(JACStrConst.UZEI_SZEI_SKBT_UCHI, inSaikenYm.concat("01"));
							
							sSAIKEN_STAX = JCHModelCommon.getTaxAmnt(inCBSMsg, inContext, inJutoAmnt, taxSkbtCd);
							
						}
						
						// 債権内訳副次問合せを呼び出し、領収を登録する
						CH0311.insRyoshu(inCBSMsg, inContext, inJutoAmnt, sSAIKEN_STAX, sSEIKY_WAY_CD, sSEIKY_SBT_CD, sJutoNo);

					}
		
				}
				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);
					}
				}
			}
	
		}
	}
	
	/**
	*   ECH0011B010_SQLF<br>
	*   @return String[]
	*/
	private static String[] getWorkParam(){

		String[] workParam = new String[4];

		// 業務パラメータ管理より業務機能識別コード：料金項目コード（債権額）を取得する
		CAANMsg msgZM0321 = new CAANMsg(ZM0321ETMsg.class.getName());
		ZM0321LE le = new ZM0321LE();

		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, JACStrConst.WKPRA_CH_WKS_SAIKEN_AMNT);
		msgZM0321.set(ZM0321ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);

		CAANMsg retZM0321 = le.findByPrimaryKey(msgZM0321);

		workParam[0] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);              // SAIK_AMNT(00900910601)

		// 業務パラメータ管理より業務機能識別コード：料金項目コード（未収金額））取得する
		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, JACStrConst.WKPARA_CH_WKS_MISYU_KINGAKU);

		retZM0321 = le.findByPrimaryKey(msgZM0321);

		workParam[1] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);              // MISH_AMNT(00900950601)


		return workParam;
	}
	
	/**
	 * <p>
	 * パラメタの後ろの空白削除
	 * Nullの場合空白を返却します。
	 * </p>
	 * @param str 文字列
	 * @return str
	 */
	private static String getNullToStr(Object str)
	{
		return JPCUtilCommon.Rtrim((String)str);
	}
//OM-2014-0001880 ADD END
}
