/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbECH0051B010TPDA
*	ソースファイル名：JSYejbECH0051B010TPDA.java
*	作成者			：EK908604
*	日付			：2012年12月11日
*＜機能概要＞
*	請求一覧照会テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ5.00.00   2013/07/02  FJ)垣内     【LT-2013-0000207】請求種別コード条件追加
*	ｖ5.00.01   2013/07/12  FJ)近藤     【LT-2013-0000446】機能コード:2の場合のソート条件変更
*	ｖ5.00.02   2013/07/15  FJ)文元     【ST追加テスト_Ph2試験 No.292】機能コード:1,3,4,5,6,7の場合のソート条件変更
*	ｖ5.00.03	2013/07/28  FJ) 林      【LT-2013-0000600】請求金額の取得内容変更
*                                                         ・変更前請求額合計(00900900630)が存在すれば 変更前請求額合計(00900900630)
*                                                         ・変更前請求額合計(00900900630)が存在しなければ 請求単位料金合計(00900900601)
*	ｖ5.00.04   2013/09/20  FJ)林       【OM-2013-0002340】機能コード1,4,5,6,7の場合、料金調整可能期間を迎えていない仮計算中/仮確定の請求は抽出しないよう修正                                     
*	ｖ5.00.05	2013/10/17  FJ)小野     【OM-2013-0003186】うち消費税額の料金項目コードを00900910201に変更。
*	ｖ5.00.06	2013/11/23  FJ)田内     【OM-2013-0004586】直近の料金計算実施済の請求年月を取得する際の使用コードを変更
*	ｖ8.00.00	2014/02/24  FJ)小野     【ANK-1589-00-00】消費税に伴う料金施策により、債権額うち消費税額をサマリして取得するように変更。
*	ｖ9.00.00	2014/07/11  FJ)小野     【ST4-2014-0000040】性能改善（カウント取得のSQL削除、請求年月のレンジ指定を追加、不要出力項目を削除）。
*	ｖ10.00.00	2014/09/09  FJ)沖田     【IT2-2014-0000304】請求年月のレンジ指定を修正。
*	v46.00.00   2019/10/14  FJ)星野     【ANK-3586-00-00】
*   v58.00.00	2022/04/12  FJ)北村		【ANK-3846-00-00】クリアパス→ペイジェント移行
*   v67.00.00	2023/07/26  FJ)中川		【ANK-4415-00-00】口振請求及びWeb申込システム移行 STEP1
*   v68.00.00	2023/10/25  FJ)寺田		【ANK-4475-00-00】インボイス対応 STEP2
********************************************************************************/

package eo.ejb.cbs.sqlf;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

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.base.CAANSQLFacility;
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.TemplateDBAccessHandler;

import eo.common.constant.JACStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCRUtilCommon;
import eo.common.util.JPCDateUtil;
import eo.ejb.cbm.entity.CH0051ETMsg;
import eo.ejb.cbm.entity.CH0501ETMsg;
import eo.ejb.cbm.entity.ZM0321ETMsg;
import eo.ejb.cbm.entity.ZM0321LE;
import eo.ejb.cbs.cbsmsg.ECH0051B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0051B010CBSMsg1List;
import eo.ejb.common.JPCModelCommon;

/**
*
*  テンプレートDBアクセス部品　ECH0051B010_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbECH0051B010TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbECH0051B010TPDA()	{
	}
	
	/**
	*   ECH0051B010_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt1 = null;
		PreparedStatement pstmt2 = null;
		
		// リザルトセット
		ResultSet rsltQuery1 = null;
		ResultSet rsltQuery2 = null;

		// パラメータ設定リスト
		List<Object> replaceListCnt = new ArrayList<Object>();

		/******************** 
		 * SQL文の作成
		 ********************/

		try{

			// 業務機能識別コード取得
			String workParam[] = getWorkParam();

			// 運用日付
			String opeDate = (String)JPCModelCommon.getOpeDate(inMsg, inContext, null);

	 		// スケジュール定義請求年月取得
	 		String sctSeikyYm = getSeikyYm(inMsg, inContext, opeDate);

			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0051ETMsg.getTableName());

			// -------------------------------------------------- //
			// 課金先適用開始年月日（最小）取得
			// -------------------------------------------------- //
			StringBuilder sql_Buff = new StringBuilder();
			sql_Buff.append(" SELECT ")
					.append("   MIN(KK0321.KAKINS_TSTAYMD) KAKINS_TSTAYMD ")
					.append(" FROM ")
					.append("   KK_T_KAKINS KK0321 ")
					.append(" WHERE ")
					.append("   KK0321.SEIKY_KEI_NO = ? ")
					.append("   AND KK0321.MK_FLG = '0' ");

			//prepareStatementにSQL文をセット
			pstmt1 = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// WHERE句のパラメータ設定
			// パラメータインデックス
			int i = 1;
			// パラメータの設定(ＫＥＹ＿請求契約番号を指定)
			CAANJDBCUtil.setParam(pstmt1, i++, inMsg.getObject(ECH0051B010CBSMsg.KEY_SEIKY_KEI_NO));

			// ResultSetの取得
			rsltQuery1 = pstmt1.executeQuery();

			// 課金先適用開始年月日（最小）
			String kakinsTstaYmdMin = "";
			if (rsltQuery1.next()){
				kakinsTstaYmdMin = rsltQuery1.getString("KAKINS_TSTAYMD");
			}

			// -------------------------------------------------- //
			// データ取得
			// -------------------------------------------------- //
			sql_Buff = new StringBuilder();
			sql_Buff.append(" SELECT ")
					.append(" 	CH0051.SEIKY_NO ")
					.append(" 	,CH0051.SEIKY_YM ")
					.append(" 	,CH0051.SEIKY_SBT_CD ")
					.append(" 	,(SELECT ZM0171.CD_DIV_NM ")
					.append(" 	  FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" 	  WHERE  ZM0171.CD_SBT_CD = 'CD00164' ")
					.append(" 	  AND	ZM0171.CD_DIV = CH0051.SEIKY_SBT_CD ")
					.append(" 	  AND	? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append(" 	  AND	ZM0171.MK_FLG = '0' ")
					.append(" 	) AS SEIKY_SBT_CD_NM ")
					.append(" 	,(SELECT ZM0171.CD_DIV_ALI ")
					.append(" 	  FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" 	  WHERE  ZM0171.CD_SBT_CD = 'CD00164' ")
					.append(" 	  AND	ZM0171.CD_DIV = CH0051.SEIKY_SBT_CD ")
					.append(" 	  AND	? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append(" 	  AND	ZM0171.MK_FLG = '0' ")
					.append(" 	) AS SEIKY_SBT_CD_ALI ")
					.append(" 	,CH0051.KEI_SEIKY_WAY_CD ")
					.append(" 	,(SELECT ZM0171.CD_DIV_NM ")
					.append(" 	  FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" 	  WHERE  ZM0171.CD_SBT_CD = 'CD00166' ")
					.append(" 	  AND	ZM0171.CD_DIV = CH0051.KEI_SEIKY_WAY_CD ")
					.append(" 	  AND	? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append(" 	  AND	ZM0171.MK_FLG = '0' ")
					.append(" 	) AS KEI_SEIKY_WAY_CD_NM ")
					.append(" 	,(SELECT ZM0171.CD_DIV_ALI ")
					.append(" 	  FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" 	  WHERE  ZM0171.CD_SBT_CD = 'CD00166' ")
					.append(" 	  AND	ZM0171.CD_DIV = CH0051.KEI_SEIKY_WAY_CD ")
					.append(" 	  AND	? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append(" 	  AND	ZM0171.MK_FLG = '0' ")
					.append(" 	) AS KEI_SEIKY_WAY_CD_ALI ")
					.append(" 	,CH0051.SEIKY_WAY_CD ")
					.append(" 	,(SELECT ZM0171.CD_DIV_NM ")
					.append(" 	  FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" 	  WHERE  ZM0171.CD_SBT_CD = 'CD00166' ")
					.append(" 	  AND	ZM0171.CD_DIV = CH0051.SEIKY_WAY_CD ")
					.append(" 	  AND	? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append(" 	  AND	ZM0171.MK_FLG = '0' ")
					.append(" 	) AS SEIKY_WAY_CD_NM ")
					.append(" 	,(SELECT ZM0171.CD_DIV_ALI ")
					.append(" 	  FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" 	  WHERE  ZM0171.CD_SBT_CD = 'CD00166' ")
					.append(" 	  AND	ZM0171.CD_DIV = CH0051.SEIKY_WAY_CD ")
					.append(" 	  AND	? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append(" 	  AND	ZM0171.MK_FLG = '0' ")
					.append(" 	) AS SEIKY_WAY_CD_ALI ")
					.append(" 	,CH0051.SEIKY_STAT ")
					.append(" 	,(SELECT ZM0171.CD_DIV_NM ")
					.append(" 	  FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" 	  WHERE  ZM0171.CD_SBT_CD = 'CD00163' ")
					.append(" 	  AND	ZM0171.CD_DIV = CH0051.SEIKY_STAT ")
					.append(" 	  AND	? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append(" 	  AND	ZM0171.MK_FLG = '0' ")
					.append(" 	) AS SEIKY_STAT_NM ")
					.append(" 	,(SELECT ZM0171.CD_DIV_ALI ")
					.append(" 	  FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append(" 	  WHERE  ZM0171.CD_SBT_CD = 'CD00163' ")
					.append(" 	  AND	ZM0171.CD_DIV = CH0051.SEIKY_STAT ")
					.append(" 	  AND	? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append(" 	  AND	ZM0171.MK_FLG = '0' ")
					.append(" 	) AS SEIKY_STAT_ALI ")
					.append(" 	, NVL( ") // 変更前請求額合計: CHG_SEIKG(00900900630)が存在すれば、変更前請求額合計: CHG_SEIKG(00900900630)
					.append(" 	 	 ( ")
					.append(" 	 		SELECT ")
					.append(" 	 			AMNT ")
					.append(" 	 		FROM ")
					.append(" 	 			CH_T_SEIKY_UCWK CH0101_1 ")
					.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 = CH0101_1.PRC_GRP_CD ")
					.append(" 	 			AND CH0401.PCRS_CD = CH0101_1.PCRS_CD ")
					.append(" 	 			AND CH0401.PRC_SVC_CD = CH0101_1.PRC_SVC_CD ")
					.append(" 	 			AND CH0401.PRC_KMK_CD = CH0101_1.PRC_KMK_CD ")
					.append(" 	 		WHERE ")
					.append(" 	 			CH0101_1.SEIKY_YM = CH0051.SEIKY_YM ")
					.append(" 	 			AND CH0101_1.SEIKY_NO = CH0051.SEIKY_NO ")
					.append(" 	 			AND CH0101_1.MK_FLG = '0' ")
					.append(" 	 			AND ROWNUM <= 1 ")
					.append(" 	 	 ), ")
					.append(" 	 	 ( ")
					.append(" 	 		SELECT ")
					.append(" 	 			AMNT ")
					.append(" 	 		FROM ")
					.append(" 				CH_T_SEIKY_UCWK CH0101_1 ")
					.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 = CH0101_1.PRC_GRP_CD ")
					.append(" 	 			AND CH0401.PCRS_CD = CH0101_1.PCRS_CD ")
					.append(" 	 			AND CH0401.PRC_SVC_CD = CH0101_1.PRC_SVC_CD ")
					.append(" 	 			AND CH0401.PRC_KMK_CD = CH0101_1.PRC_KMK_CD ")
					.append(" 	 		WHERE ")
					.append(" 	 			CH0101_1.SEIKY_YM = CH0051.SEIKY_YM ")
					.append(" 	 			AND CH0101_1.SEIKY_NO = CH0051.SEIKY_NO ")
					.append(" 	 			AND CH0101_1.MK_FLG = '0' ")
					.append(" 	 			AND ROWNUM <= 1 ")
					.append(" 	 	 ) ")
					.append(" 	 ) SEIKY_AMNT ")             // 変更前請求額合計: CHG_SEIKG(00900900630)が存在しなければ 請求単位料金合計: SEITAN_GK(00900900601)
					.append(" 	,CH0051.SEIKY_FIX_YMD ")
					.append(" 	,CH0051.SEIKYUS_HAKKO_YMD AS SEIKY_HAKKO_YMD ")
					.append(" 	,( ")
					.append(" 		SELECT ")
					.append(" 			COUNT(1) ")
					.append(" 		FROM ")
					.append(" 			CH_T_SEIKY_UCWK CH0101_0 ")
					.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 = CH0101_0.PRC_GRP_CD ")
					.append(" 			AND CH0401.PCRS_CD = CH0101_0.PCRS_CD ")
					.append(" 			AND CH0401.PRC_SVC_CD = CH0101_0.PRC_SVC_CD ")
					.append(" 			AND CH0401.PRC_KMK_CD = CH0101_0.PRC_KMK_CD ")
					.append(" 		WHERE ")
					.append(" 			CH0101_0.SEIKY_YM = CH0051.SEIKY_YM ")
					.append(" 			AND CH0101_0.SEIKY_NO = CH0051.SEIKY_NO ")
					.append(" 			AND CH0101_0.MK_FLG = '0' ")
					.append(" 			AND ROWNUM <= 1 ")
					.append(" 	) GSAN_FLG ")   // 当月以前ご請求料金 : BF_TG_SEI(00900704601)
					.append(" 	,CH0051.PAY_KIGEN_YMD ")
					.append(" 	,CH0051.SEIKYUS_HIKINUKI_FLG AS SEIKYUS_HIKNK_FLG ")
					.append(" 	,CH0051.SEIKYUS_HAKKO_TG_FLG AS SEIKY_HAKKO_FLG ")
					.append(" 	,CH0051.SHANAIUSE_SKBT_FLG ")
// 20191014 ANK-3586-00-00 星野 ADD START
					.append(" 	,CH0051.KAKGT_SEIKY_SKIP_FLG ")
// 20191014 ANK-3586-00-00 星野 ADD END
// ANK-3846-00-00 ADD START
					.append(" 	,CH0051.KSSAI_ID ")
// ANK-3846-00-00 ADD END
// ANK-4415-00-00 ADD START
					.append(" 	,CH0051.KOZA_NO ")
					.append(" 	,CH0051.TSUCHO_NO ")
// ANK-4415-00-00 ADD END
					.append(" FROM ")
					.append(" 	CH_T_SEIKY CH0051 ");

			replaceListCnt.add(opeDate);
			replaceListCnt.add(opeDate);
			replaceListCnt.add(opeDate);
			replaceListCnt.add(opeDate);
			replaceListCnt.add(opeDate);
			replaceListCnt.add(opeDate);
			replaceListCnt.add(opeDate);
			replaceListCnt.add(opeDate);
			replaceListCnt.add(workParam[2]);  // 変更前請求額合計   : CHG_SEIKG(00900900630)
			replaceListCnt.add(opeDate);
			replaceListCnt.add(workParam[0]);  // 請求単位料金合計   : SEITAN_GK(00900900601)
			replaceListCnt.add(opeDate);
			replaceListCnt.add(workParam[1]);  // 当月以前ご請求料金 : BF_TG_SEI(00900704601)
			replaceListCnt.add(opeDate);

			// 条件1 追加
			sql_Buff.append(getCondition1(inMsg, opeDate, replaceListCnt));

			// 条件2 追加
			sql_Buff.append(getCondition2(inMsg, kakinsTstaYmdMin, opeDate, replaceListCnt));

			// ソート条件 追加
			sql_Buff.append(getSortCondition(inMsg));

			//prepareStatementにSQL文をセット
			pstmt2 = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			for (int idx = 0; idx < replaceListCnt.size(); idx++ )
			{
				CAANJDBCUtil.setParam(pstmt2, idx+1, replaceListCnt.get(idx));
			}

			// ResultSetの取得
			rsltQuery2 = pstmt2.executeQuery();
			
			// ECH0051B010CBSMsgの明細にセットする項目
			String[] msgKeyList2 = {
					  ECH0051B010CBSMsg1List.SEIKY_NO
					, ECH0051B010CBSMsg1List.SEIKY_YM
					, ECH0051B010CBSMsg1List.SEIKY_SBT_CD
					, ECH0051B010CBSMsg1List.SEIKY_SBT_CD_NM
					, ECH0051B010CBSMsg1List.SEIKY_SBT_CD_ALI
					, ECH0051B010CBSMsg1List.KEI_SEIKY_WAY_CD
					, ECH0051B010CBSMsg1List.KEI_SEIKY_WAY_CD_NM
					, ECH0051B010CBSMsg1List.KEI_SEIKY_WAY_CD_ALI
					, ECH0051B010CBSMsg1List.SEIKY_WAY_CD
					, ECH0051B010CBSMsg1List.SEIKY_WAY_CD_NM
					, ECH0051B010CBSMsg1List.SEIKY_WAY_CD_ALI
					, ECH0051B010CBSMsg1List.SEIKY_STAT
					, ECH0051B010CBSMsg1List.SEIKY_STAT_NM
					, ECH0051B010CBSMsg1List.SEIKY_STAT_ALI
					, ECH0051B010CBSMsg1List.SEIKY_AMNT
					, ECH0051B010CBSMsg1List.SEIKY_FIX_YMD
					, ECH0051B010CBSMsg1List.SEIKY_HAKKO_YMD
					, ECH0051B010CBSMsg1List.GSAN_FLG
					, ECH0051B010CBSMsg1List.PAY_KIGEN_YMD
					, ECH0051B010CBSMsg1List.SEIKYUS_HIKNK_FLG
					, ECH0051B010CBSMsg1List.SEIKY_HAKKO_FLG
					, ECH0051B010CBSMsg1List.SHANAIUSE_FLG
// 20191014 ANK-3586-00-00 星野 ADD START
					, ECH0051B010CBSMsg1List.KAKGT_SEIKY_SKIP_FLG
// 20191014 ANK-3586-00-00 星野 ADD END
// ANK-3846-00-00 ADD START
					, ECH0051B010CBSMsg1List.KSSAI_ID
// ANK-3846-00-00 ADD END
// ANK-4415-00-00 ADD START
					, ECH0051B010CBSMsg1List.KOZA_NO
					, ECH0051B010CBSMsg1List.TSUCHO_NO
// ANK-4415-00-00 ADD END
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery2,msgKeyList2,"eo.ejb.cbs.cbsmsg.ECH0051B010CBSMsg1List",0);
			
			// 処理結果の編集
			ArrayList<CAANMsg> outAyList = editOutMsg(inMsg, outMsg1, opeDate, sctSeikyYm);
			
			CAANMsg[] outMsg1edit = (CAANMsg[]) outAyList.toArray(new CAANMsg[0]);
			
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECH0051B010CBSMsg1List", outMsg1edit);

		} catch(SQLException e) {
			inMsg.set(ECH0051B010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery1 != null){
					rsltQuery1.close();
				}
				if(rsltQuery2 != null){
					rsltQuery2.close();
				}
				if(pstmt1 != null){
					pstmt1.close();
				}
				if(pstmt2 != null){
					pstmt2.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(ECH0051B010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	*   ECH0051B010_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @param opeDate 運用日付<br>
	*   @param replaceListCnt パラメータ設定リスト<br>
	*   @return StringBuilder
	*/
	private StringBuilder getCondition1(CAANMsg inMsg, String opeDate, List<Object> replaceListCnt){

		String funcCode = inMsg.getString(ECH0051B010CBSMsg.FUNC_CODE);
		String saikenNo = inMsg.getString(ECH0051B010CBSMsg.KEY_SAIKEN_NO);

		StringBuilder sql_Buff = new StringBuilder();

		// 機能コードが2の場合
		if (JPCModelConstant.FUNC_CD_2.equals(funcCode))
		{
			sql_Buff.append("		INNER JOIN  ")
					.append("			CH_T_SEIKY_SKN_KNRN CH0041_JOIN ")
					.append("				ON CH0041_JOIN.SEIKY_NO = CH0051.SEIKY_NO ")
					.append("				AND CH0041_JOIN.SAIKEN_NO = ? ")
					.append("				AND CH0041_JOIN.MK_FLG = '0' ");
			replaceListCnt.add(saikenNo);
		}
		else if(JPCModelConstant.FUNC_CD_8.equals(funcCode))
		{
			// 機能コードが8の場合
			sql_Buff.append("		INNER JOIN ")
					.append("		(SELECT ")
					.append("			MAX(CH0501.SEIKY_YM) AS MAX_SEIKY_YM ")
					.append("		FROM ")
					.append("			CH_M_PRC_SCHDL_TEIGI CH0501 ")
					.append("		WHERE ")
					.append("			CH0501.EVENT_CD = ? ")
					.append("			AND CH0501.EVENT_YMD <= ? ")
					.append("			AND CH0501.MK_FLG = '0' ")
					.append("		) CH0501_JOIN ")
					.append("			ON CH0501_JOIN.MAX_SEIKY_YM = CH0051.SEIKY_YM ");
			replaceListCnt.add(JACStrConst.EVENT_CD_IDO_CALC_STAYMD);
			replaceListCnt.add(opeDate);
		}

		return sql_Buff;
	}

	/**
	*   ECH0051B010_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @param kakinsTstaYmdMin 課金先適用開始年月日（最小）<br>
	*   @param opeDate 運用日付<br>
	*   @param replaceListCnt パラメータ設定リスト<br>
	*   @return StringBuilder
	*/
	private StringBuilder getCondition2(CAANMsg inMsg, String kakinsTstaYmdMin, String opeDate, List<Object> replaceListCnt){

		String funcCode = inMsg.getString(ECH0051B010CBSMsg.FUNC_CODE);
		String seikyKeiNo = inMsg.getString(ECH0051B010CBSMsg.KEY_SEIKY_KEI_NO);
		String seikyYm = inMsg.getString(ECH0051B010CBSMsg.KEY_SEIKY_YM);
		String seikySbtCd = inMsg.getString(ECH0051B010CBSMsg.KEY_SEIKY_SBT_CD);

		StringBuilder sql_Buff = new StringBuilder();
		sql_Buff.append(" WHERE 1=1");

		if (inMsg.getObject(ECH0051B010CBSMsg.KEY_SEIKY_YM) != null){
			sql_Buff.append("	AND CH0051.SEIKY_YM = ? ");
			replaceListCnt.add(seikyYm);
		}
		else if (!JCRUtilCommon.isNull(kakinsTstaYmdMin))
		{
			sql_Buff.append("	AND CH0051.SEIKY_YM BETWEEN ? AND ? ");

			// IT2-2014-0000304 MOD START
//			replaceListCnt.add(kakinsTstaYmdMin.substring(0, 6));
			try {
				replaceListCnt.add(JPCDateUtil.addMonth(kakinsTstaYmdMin, -1).substring(0, 6));
			} catch (ParseException e) {
				throw new CAANRuntimeException(e);
			}
			// IT2-2014-0000304 MOD END
			replaceListCnt.add(opeDate.substring(0, 6));
		}

		if (JPCModelConstant.FUNC_CD_2.equals(funcCode))
		{
			sql_Buff.append("	AND CH0051.SEIKY_SBT_CD IN ('0', '1', '2', '3') ");
		}
		else if (JPCModelConstant.FUNC_CD_3.equals(funcCode))
		{
			sql_Buff.append(" 	AND CH0051.SEIKY_KEI_NO = ? ");
			replaceListCnt.add(seikyKeiNo);
		}
		else if (JPCModelConstant.FUNC_CD_8.equals(funcCode))
		{
			sql_Buff.append("	AND CH0051.SEIKY_KEI_NO = ? ")
					.append("	AND CH0051.SEIKY_SBT_CD = ? ")
					.append("	AND CH0051.SEIKY_STAT IN (?, ?) ");

			replaceListCnt.add(seikyKeiNo);
			replaceListCnt.add(JACStrConst.SIKYSHBTS_TEIGK_SEIKY);
			replaceListCnt.add(JACStrConst.SEIKY_STAT_KR_CALC);
			replaceListCnt.add(JACStrConst.SEIKY_STAT_KR_FIX);
		}
		else if (JPCModelConstant.FUNC_CD_9.equals(funcCode))
		{
			sql_Buff.append("	AND CH0051.SEIKY_KEI_NO = ? ")
					.append("	AND CH0051.SEIKY_SBT_CD IN ('0','1','2') ")
					.append("	AND CH0051.SEIKY_STAT <> ? ")
					.append("	AND CH0051.SEIKY_STAT <> ? ");
			
			replaceListCnt.add(seikyKeiNo);
			replaceListCnt.add(JACStrConst.SEIKY_STAT_KR_CALC);
			replaceListCnt.add(JACStrConst.SEIKY_STAT_KR_FIX);
		}
// ANK-4475-00-00 ADD START
		else if ("10".equals(funcCode))
		{
			sql_Buff.append("	AND CH0051.SEIKY_KEI_NO = ? ")
					.append("	AND CH0051.SEIKY_SBT_CD IN ('0','1') ")
					.append("	AND CH0051.SEIKY_STAT <> '000' ");
			
			replaceListCnt.add(seikyKeiNo);
		}
// ANK-4475-00-00 ADD END
		else
		{
			sql_Buff.append(" 	AND CH0051.SEIKY_KEI_NO = ? ");
			replaceListCnt.add(seikyKeiNo);

			if (inMsg.getObject(ECH0051B010CBSMsg.KEY_SEIKY_SBT_CD) != null){
				sql_Buff.append("	AND CH0051.SEIKY_SBT_CD = ? ");
				replaceListCnt.add(seikySbtCd);
			}

		}

		sql_Buff.append(" 	AND CH0051.MK_FLG = '0' ");

		return sql_Buff;
	}

	/**
	*   ECH0051B010_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return StringBuilder
	*/
	private StringBuilder getSortCondition(CAANMsg inMsg){

		String funcCode = inMsg.getString(ECH0051B010CBSMsg.FUNC_CODE);

		StringBuilder sql_Buff = new StringBuilder();
		sql_Buff.append(" ORDER BY ");

		if (JPCModelConstant.FUNC_CD_1.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_YM DESC, ")
					.append(" 	CH0051.SEIKY_FIX_YMD DESC, ")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
		else if (JPCModelConstant.FUNC_CD_2.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_FIX_YMD DESC, ")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
		else if (JPCModelConstant.FUNC_CD_3.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_FIX_YMD DESC, ")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
		else if (JPCModelConstant.FUNC_CD_4.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_FIX_YMD, ")
					.append(" 	CH0051.SEIKY_YM DESC, ")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
		else if (JPCModelConstant.FUNC_CD_5.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_FIX_YMD DESC, ")
					.append(" 	CH0051.SEIKY_YM DESC, ")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
		else if (JPCModelConstant.FUNC_CD_6.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_YM, ")
					.append(" 	CH0051.SEIKY_FIX_YMD DESC,")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
		else if (JPCModelConstant.FUNC_CD_7.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_YM DESC, ")
					.append(" 	CH0051.SEIKY_FIX_YMD DESC,")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
		else if (JPCModelConstant.FUNC_CD_8.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_YM DESC, ")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
		else if (JPCModelConstant.FUNC_CD_9.equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_YM DESC, ")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
// ANK-4475-00-00 ADD START
		else if ("10".equals(funcCode))
		{
			sql_Buff.append(" 	CH0051.SEIKY_YM, ")
					.append(" 	CH0051.SEIKY_SBT_CD ");
		}
// ANK-4475-00-00 ADD END
		return sql_Buff;
	}

	/**
	*   ECH0051B010_SQLF<br>
	*   @return String[]
	*/
	private String[] getWorkParam(){

		String[] workParam = new String[3];

		// 業務パラメータ管理より業務機能識別コード：料金項目コード（請求単位料金合計）を取得する
		CAANMsg msgZM0321 = new CAANMsg(ZM0321ETMsg.class.getName());
		ZM0321LE le = new ZM0321LE();

		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, JACStrConst.WKPARA_CH_WKS_SEIKY_TANI_GK);
		msgZM0321.set(ZM0321ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);

		CAANMsg retZM0321 = le.findByPrimaryKey(msgZM0321);

		workParam[0] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);              // SEITAN_GK(00900900601)

		// 業務パラメータ管理より業務機能識別コード：料金項目コード（当月以前ご請求料金）を取得する
		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, JACStrConst.WKPRA_CH_WKS_BF_TG_SEI);
		retZM0321 = le.findByPrimaryKey(msgZM0321);

		workParam[1] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);              // BF_TG_SEI(00900704601)

		// 業務パラメータ管理より業務機能識別コード：料金項目コード（変更前請求額合計）を取得する
		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, JACStrConst.WKPARA_CH_WKS_CHG_SEIKY_GS);
		retZM0321 = le.findByPrimaryKey(msgZM0321);

		workParam[2] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);              // CHG_SEIKG(00900900630)

		return workParam;
	}

	/**
	 * <p>
	 * 処理結果の編集を行う
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param caOutMsg 検索した請求内訳明細リスト
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opeDate 運用日付
	 * @param sctSeikyYm スケジュール定義請求年月
	 * @return retList 編集後の処理結果リスト
	 * </p>
	 */
	private ArrayList<CAANMsg> editOutMsg(CAANMsg inMsg, CAANMsg[] caOutMsg, String opeDate, String sctSeikyYm)
	{
		ArrayList<CAANMsg> retList = new ArrayList<CAANMsg>();

		boolean edit = false;

		// 機能コード判定
		String funcCode = inMsg.getString(ECH0051B010CBSMsg.FUNC_CODE);
		if (JPCModelConstant.FUNC_CD_1.equals(funcCode) 
				|| JPCModelConstant.FUNC_CD_4.equals(funcCode)
				|| JPCModelConstant.FUNC_CD_5.equals(funcCode)
				|| JPCModelConstant.FUNC_CD_6.equals(funcCode) 
				|| JPCModelConstant.FUNC_CD_7.equals(funcCode)
// ANK-4475-00-00 ADD START
				|| "10".equals(funcCode))
// ANK-4475-00-00 ADD END
		{
			edit = true;
		}

		// 総検索件数
		int iTotalSearchNum = 0;

		// 処理結果の編集
		for(CAANMsg outMsg : caOutMsg)
		{
	 		if (edit)
	 		{
				String seikyStat = outMsg.getString(ECH0051B010CBSMsg1List.SEIKY_STAT);
				String seikyYm = outMsg.getString(ECH0051B010CBSMsg1List.SEIKY_YM);

				// 請求ステータスが仮計算中、もしくは仮確定の場合、スケジュール定義請求年月 < 請求年月であれば抽出対象外
				if((JACStrConst.SEIKY_STAT_KR_CALC.equals(seikyStat) || JACStrConst.SEIKY_STAT_KR_FIX.equals(seikyStat)) 
						&& sctSeikyYm.compareTo(seikyYm) < 0)
				{
					continue;
				}
				iTotalSearchNum ++;
	 		}
			else
			{
				iTotalSearchNum ++;
			}

	 		inMsg.set(ECH0051B010CBSMsg.TOTAL_SEARCH_NUM, String.valueOf(iTotalSearchNum));

			// 編集後の処理結果リストに格納する。
			retList.add(outMsg);
		}
		
		return retList;
	}

	/**
	*  運用年月日以前で直近の料金計算実施済の請求年月を取得する
	*  @param msg CBSメッセージ
	*  @param inContext Agentから渡されたAgentDispatchContext
	*  @param opeDate 運用日付
	*  @return String seikyYm 請求年月
	*/
	private String getSeikyYm(CAANMsg inMsg, AgentDispatchContext inContext, String opeDate)
	{
		String seikyYm = "";

		// コネクション
		Connection con1 = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0501ETMsg.getTableName());
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     MAX(CH0501.SEIKY_YM) AS SEIKY_YM ")
					.append(" FROM ")
					.append("     CH_M_PRC_SCHDL_TEIGI CH0501 ")
					.append(" WHERE ")
					.append("     CH0501.EVENT_CD = ? ")
					.append(" AND CH0501.EVENT_YMD <= ? ")
					.append(" AND CH0501.MK_FLG = '0' ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, 1, JACStrConst.EVENT_CD_KR_CALC_SANSHOYMD);
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 戻り値の判定
			if (rsltQuery.next())
			{
				seikyYm = rsltQuery.getString(CH0501ETMsg.SEIKY_YM);
			}
		}
		catch(SQLException e) 
		{
			inMsg.set(ECH0051B010CBSMsg.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(ECH0051B010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}

		return seikyYm;
	}
}
