/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbEKK0081B511TPDA
*	ソースファイル名：JSYejbEKK0081B511TPDA.java
*	作成者			：EK908604
*	日付			：2012年12月05日
*＜機能概要＞
*	料金コース一覧照会（サービス契約番号）テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ5.00.00   2013/07/12  FJ)小野     【LT-2013-0000510】機能コード:1の場合、サービス契約ステータスの条件を削除(キャンセル済でも取得する)
*
********************************************************************************/

package eo.ejb.cbs.sqlf;

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.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.util.JCRUtilCommon;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B511CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B511CBSMsg1List;
import eo.ejb.common.JPCModelCommon;

/**
*
*  テンプレートDBアクセス部品　EKK0081B511_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbEKK0081B511TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbEKK0081B511TPDA()	{
	}
	
	/**
	*   EKK0081B511_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;

		// 手修正箇所S
		// パラメータインデックス
		int i = 1;
		// 手修正箇所E
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0081ETMsg.getTableName());
			
			String funcCd = inMsg.getString(EKK0081B511CBSMsg.FUNC_CODE);

			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();

			// SQL文_個別部1
			if ("1".equals(funcCd) || "2".equals(funcCd))
			{
				sql_Buff.append(" SELECT ")
						.append("     KK0081.SVC_CD ")
						.append("    ,KK0081.PRC_GRP_CD ")
						.append("    ,KK0081.PCRS_CD ")
						.append("    ,(SELECT ")
						.append("          KK0791.PCRS_NM ")
						.append("        FROM ")
						.append("          KK_M_PCRS KK0791 ")
						.append("       WHERE ")
						.append("             KK0791.PCRS_CD = KK0081.PCRS_CD ")
						.append("         AND KK0791.RSV_APLY_YMD || KK0791.GENE_ADD_DTM = ")
						.append("             (SELECT ")
						.append("                  MAX(KK0791_GENE.RSV_APLY_YMD || KK0791_GENE.GENE_ADD_DTM) AS KK0791_MAX ")
						.append("                FROM ")
						.append("                   KK_M_PCRS KK0791_GENE ")
						.append("               WHERE ")
						.append("                     KK0791_GENE.PCRS_CD = KK0791.PCRS_CD ")
						.append("                 AND KK0791_GENE.RSV_APLY_YMD <= ? ")
						.append("                 AND KK0791_GENE.MK_FLG= '0') ")
						.append("     ) AS PCRS_NM ")
						.append("    ,KK0081.PPLAN_CD ")
						.append("    ,KK0161.PCRS_CD ")
						.append("    ,KK0161.PPLAN_CD ")
						.append("   FROM ")
						.append("      KK_T_SVC_KEI KK0081 ")
						.append("      LEFT JOIN ")
						.append("        (SELECT * ")
						.append("           FROM ")
						.append("              KK_T_SVC_KEI_UCWK KK0161 ")
						.append("          WHERE ")
						.append("              KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM = ")
						.append("              (SELECT ")
						.append("                   MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) ")
						.append("                 FROM ")
						.append("                    KK_T_SVC_KEI_UCWK KK0161_GENE ")
						.append("               WHERE ")
						.append("                     KK0161_GENE.SVC_KEI_UCWK_NO  = KK0161.SVC_KEI_UCWK_NO ")
						.append("                 AND KK0161_GENE.RSV_APLY_YMD <= ? ")
						.append("                 AND KK0161_GENE.RSV_APLY_CD = '2' ")
						.append("                 AND KK0161_GENE.MK_FLG = '0') ")
						.append("        ) KK0161 ")
						.append("      ON  KK0161.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
						.append("      AND KK0081.PLAN_STAYMD <= KK0161.PLAN_STAYMD ")
						.append("      AND KK0081.PLAN_ENDYMD >= KK0161.PLAN_STAYMD ")
						.append("      AND KK0161.MK_FLG = '0' ");

				if ("1".equals(funcCd))
				{
					sql_Buff.append("  WHERE ")
						.append("        KK0081.SVC_KEI_NO = ? ")
						.append("    AND KK0081.RSV_APLY_CD = '2' ")
						.append("    AND KK0081.MK_FLG = '0'  ")
						.append(" ORDER BY ")
						.append("      KK0081.PCRS_CD ")
						.append("     ,KK0081.SVC_CD ")
						.append("     ,KK0081.PRC_GRP_CD ");
				}
				if ("2".equals(funcCd)) {
					sql_Buff.append("  WHERE ")
						.append("        KK0081.SVC_KEI_NO = ? ")
						.append("    AND KK0081.SVC_KEI_STAT <> ? ")
						.append("    AND KK0081.RSV_APLY_CD = '2' ")
						.append("    AND KK0081.MK_FLG = '0'  ")
						.append("    AND KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM IN  ")
						.append("        (SELECT ")
						.append("             MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) AS KK0081_MAX   ")
						.append("           FROM ")
						.append("             KK_T_SVC_KEI KK0081_GENE ")
						.append("          WHERE ")
						.append("                KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
						.append("            AND KK0081_GENE.RSV_APLY_YMD <= ? ")
						.append("            AND KK0081_GENE.RSV_APLY_CD = '2' ")
						.append("            AND KK0081_GENE.MK_FLG = '0') ");
				}
			}
			else if ("3".equals(funcCd))
			{
   				sql_Buff.append(" SELECT ")
						.append("     KK0781.SVC_CD ")
						.append("    ,KK0791.PRC_GRP_CD ")
						.append("    ,KK0591.PCRS_CD ")
						.append("    ,KK0791.PCRS_NM ")
						.append("    ,KK0591.PPLAN_CD ")
						.append("    ,NULL AS PCRS_CD ")
						.append("    ,NULL AS PPLAN_CD ")
						.append(" FROM ")
						.append("    KK_M_PPLAN KK0591 ")
						.append("    INNER JOIN KK_M_PCRS KK0791 ")
						.append("       ON KK0591.PCRS_CD = KK0791.PCRS_CD ")
						.append("    INNER JOIN KK_M_PRC_GRP KK0781 ")
						.append("       ON KK0791.PRC_GRP_CD = KK0781.PRC_GRP_CD ")
						.append(" WHERE ")
						.append("        KK0591.PPLAN_TSTAYMD <= ? ")
						.append("    AND KK0591.PPLAN_TENDYMD >= ? ")
						.append("    AND KK0591.MK_FLG = 0 ")
						.append("    AND KK0791.PCRS_TSTAYMD <= ? ")
						.append("    AND KK0791.PCRS_TENDYMD >= ? ")
						.append("    AND KK0791.RSV_APLY_YMD || KK0791.GENE_ADD_DTM = ")
						.append("       (SELECT ")
						.append("            MAX(KK0791_GENE.RSV_APLY_YMD || KK0791_GENE.GENE_ADD_DTM) ")
						.append("          FROM ")
						.append("             KK_M_PCRS KK0791_GENE ")
						.append("         WHERE ")
						.append("             KK0791_GENE.PCRS_CD = KK0791.PCRS_CD ")
						.append("         AND KK0791_GENE.RSV_APLY_YMD <= ? ")
						.append("         AND KK0791_GENE.MK_FLG = '0') ")
						.append("    AND KK0791.MK_FLG = '0' ")
						.append("    AND KK0781.PRC_GRP_TSTAYMD <= ?  ")
						.append("    AND KK0781.PRC_GRP_TENDYMD >= ?  ")
						.append("    AND KK0781.RSV_APLY_YMD || KK0781.GENE_ADD_DTM = ")
						.append("       (SELECT ")
						.append("            MAX(KK0781_GENE.RSV_APLY_YMD || KK0781_GENE.GENE_ADD_DTM) ")
						.append("          FROM ")
						.append("             KK_M_PCRS KK0781_GENE ")
						.append("         WHERE ")
						.append("             KK0781_GENE.PRC_GRP_CD = KK0781.PRC_GRP_CD ")
						.append("         AND KK0781_GENE.RSV_APLY_YMD <= ? ")
						.append("         AND KK0781_GENE.MK_FLG = '0') ")
						.append("    AND KK0781.MK_FLG = '0' ")
						.append(" ORDER BY ")
						.append("       KK0591.PCRS_CD ")
						.append("      ,KK0781.SVC_CD ")
						.append("      ,KK0791.PRC_GRP_CD ")
						.append("      ,KK0591.PPLAN_CD ");
			}

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// 運用日の設定
			String opeDate = (String)JPCModelCommon.getOpeDate(inMsg, inContext, null);
			if (!inMsg.isNull(EKK0081B511CBSMsg.KEY_UNYO_DAY))
			{
				opeDate = (String)inMsg.getObject(EKK0081B511CBSMsg.KEY_UNYO_DAY);
			}

			if ("1".equals(funcCd))
			{
				// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
				// パラメータの設定(運用日を指定)
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				// パラメータの設定(ＫＥＹ＿サービス契約番号を指定)
				CAANJDBCUtil.setParam(pstmt, i++, inMsg.getObject(EKK0081B511CBSMsg.KEY_SVC_KEI_NO));
			}
			else if ("2".equals(funcCd))
			{
				// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
				// パラメータの設定(運用日を指定)
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				// パラメータの設定(ＫＥＹ＿サービス契約番号を指定)
				CAANJDBCUtil.setParam(pstmt, i++, inMsg.getObject(EKK0081B511CBSMsg.KEY_SVC_KEI_NO));
				// パラメータの設定(サービス契約ステータス)
				CAANJDBCUtil.setParam(pstmt, i++, JACStrConst.SVC_KEI_STAT_CNCL_ZUMI);
				// パラメータの設定(ＫＥＹ＿運用日を指定)
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
			}
			else if ("3".equals(funcCd))
			{
				// パラメータの設定(運用日を指定)
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
				CAANJDBCUtil.setParam(pstmt, i++, opeDate);
			}
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// EKK0081B511CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  EKK0081B511CBSMsg1List.SVC_CD
					, EKK0081B511CBSMsg1List.PRC_GRP_CD
					, EKK0081B511CBSMsg1List.PCRS_CD
					, EKK0081B511CBSMsg1List.PCRS_NM
					, EKK0081B511CBSMsg1List.PPLAN_CD
					, EKK0081B511CBSMsg1List.PCRS_CD_PLU
					, EKK0081B511CBSMsg1List.PPLAN_CD_PLU
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.EKK0081B511CBSMsg1List",0);
			
			ArrayList<CAANMsg> outAyList = groupResult(inMsg, inContext, outMsg1, con1);
			
			CAANMsg[] outMsg2 = (CAANMsg[]) outAyList.toArray(new CAANMsg[0]);
			
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EKK0081B511CBSMsg1List", outMsg2);

		} catch(SQLException e) {
			inMsg.set(EKK0081B511CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(EKK0081B511CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	 * <p>
	 * グループ処理
	 * サービスコード・料金グループコード・料金コースコードでグループ処理を行う。
	 * @param inMsg      処理対象のメッセージキャリア
	 * @param inContext  Agentから渡されたAgentDispatchContext
	 * @param caOutMsg   検索した料金コース一覧照会（サービス契約番号）明細
	 * @param con        コネクション
	 * 
	 * @return outAyList 編集後の料金コース一覧照会（サービス契約番号）明細
	 * </p>
	 */
	private ArrayList<CAANMsg> groupResult(CAANMsg inMsg, AgentDispatchContext inContext, CAANMsg[] caOutMsg, Connection con) throws SQLException
	{
		ArrayList<CAANMsg> retList = new ArrayList<CAANMsg>();

		String keybk = "";
		String planCd = "";
		StringBuffer pcrsCdPlu = new StringBuffer("");
		StringBuffer planCdPlu = new StringBuffer("");

		boolean ucwkExist = false;
		
		if ( "1".equals( inMsg.getObject(EKK0081B511CBSMsg.FUNC_CODE).toString() ) ||
				"2".equals( inMsg.getObject(EKK0081B511CBSMsg.FUNC_CODE).toString() ) ) 
		{
			ucwkExist = true;
		}
		
		for (int i = 0; i < caOutMsg.length; i++)
		{
			String key = caOutMsg[i].getString(EKK0081B511CBSMsg1List.SVC_CD)
			            + caOutMsg[i].getString(EKK0081B511CBSMsg1List.PRC_GRP_CD)
			            + caOutMsg[i].getString(EKK0081B511CBSMsg1List.PCRS_CD);

			if (!"".equals(keybk))
			{
				if (!keybk.equals(key))
				{
					CAANMsg retMsg = makeMsg(caOutMsg[i-1], pcrsCdPlu, planCdPlu);
					retList.add(retMsg);
					keybk = "";
					pcrsCdPlu = new StringBuffer("");
					planCdPlu = new StringBuffer("");
				}
				else
				{
					if(!planCd.equals(caOutMsg[i].getString(EKK0081B511CBSMsg1List.PPLAN_CD)))
					{
						planCd = caOutMsg[i].getString(EKK0081B511CBSMsg1List.PPLAN_CD);
						setCdSvcKei(caOutMsg[i], pcrsCdPlu, planCdPlu, true);
					}
					if(ucwkExist)
					{
						setCdSvcKeiUcwk(caOutMsg[i], pcrsCdPlu, planCdPlu, true);
					}
				}
			}

			if ("".equals(keybk))
			{
				keybk = key;
				planCd = caOutMsg[i].getString(EKK0081B511CBSMsg1List.PPLAN_CD);
				setCdSvcKei(caOutMsg[i], pcrsCdPlu, planCdPlu, false);
				if(ucwkExist)
				{
					setCdSvcKeiUcwk(caOutMsg[i], pcrsCdPlu, planCdPlu, true);
				}
			}
		}

		if (!"".equals(keybk))
		{
			CAANMsg retMsg = makeMsg(caOutMsg[caOutMsg.length -1], pcrsCdPlu, planCdPlu);
			retList.add(retMsg);
		}

		return retList;
	}

	/**
	 * <p>
	 * サービス契約の料金コースコード・料金プランコード設定処理
	 * @param outMsg     処理対象のメッセージキャリア
	 * @param pcrsCdPlu  料金コースコード（複数）文字列
	 * @param planCdPlu  料金プランコード（複数）文字列
	 * @param addcnma    カンマ追加（true:要/false:不要）
	 * </p>
	 */
	private void setCdSvcKei(CAANMsg outMsg, StringBuffer pcrsCdPlu, StringBuffer planCdPlu, boolean addcnma)
	{
		if (!JCRUtilCommon.isNull(outMsg.getString(EKK0081B511CBSMsg1List.PCRS_CD)) ||
				!JCRUtilCommon.isNull(outMsg.getString(EKK0081B511CBSMsg1List.PPLAN_CD)))
		{
			if (addcnma)
			{
				pcrsCdPlu.append(",").append(outMsg.getString(EKK0081B511CBSMsg1List.PCRS_CD));
				planCdPlu.append(",").append(outMsg.getString(EKK0081B511CBSMsg1List.PPLAN_CD));
			}
			else
			{
				pcrsCdPlu.append(outMsg.getString(EKK0081B511CBSMsg1List.PCRS_CD));
				planCdPlu.append(outMsg.getString(EKK0081B511CBSMsg1List.PPLAN_CD));
			}
		}
	}

	/**
	 * <p>
	 * サービス契約内訳の料金コースコード・料金プランコード設定処理
	 * @param outMsg     処理対象のメッセージキャリア
	 * @param pcrsCdPlu  料金コースコード（複数）文字列
	 * @param planCdPlu  料金プランコード（複数）文字列
	 * @param addcnma    カンマ追加（true:要/false:不要）
	 * </p>
	 */
	private void setCdSvcKeiUcwk(CAANMsg outMsg, StringBuffer pcrsCdPlu, StringBuffer planCdPlu, boolean addcnma)
	{
		if (!JCRUtilCommon.isNull(outMsg.getString(EKK0081B511CBSMsg1List.PCRS_CD_PLU)) ||
				!JCRUtilCommon.isNull(outMsg.getString(EKK0081B511CBSMsg1List.PPLAN_CD_PLU)))
		{
			if (addcnma)
			{
				pcrsCdPlu.append(",").append(outMsg.getString(EKK0081B511CBSMsg1List.PCRS_CD_PLU));
				planCdPlu.append(",").append(outMsg.getString(EKK0081B511CBSMsg1List.PPLAN_CD_PLU));
			}
			else
			{
				pcrsCdPlu.append(outMsg.getString(EKK0081B511CBSMsg1List.PCRS_CD_PLU));
				planCdPlu.append(outMsg.getString(EKK0081B511CBSMsg1List.PPLAN_CD_PLU));
			}
		}
	}

	/**
	 * <p>
	 * 編集行生成処理
	 * @param outMsg     処理対象のメッセージキャリア
	 * @param pcrsCdPlu  料金コースコード（複数）文字列
	 * @param planCdPlu  料金プランコード（複数）文字列
	 * </p>
	 */
	private CAANMsg makeMsg(CAANMsg outMsg, StringBuffer pcrsCdPlu, StringBuffer planCdPlu)
	{
		CAANMsg retMsg = new CAANMsg("eo.ejb.cbs.cbsmsg.EKK0081B511CBSMsg1List");

		retMsg.set(EKK0081B511CBSMsg1List.SVC_CD, outMsg.getString(EKK0081B511CBSMsg1List.SVC_CD));
		retMsg.set(EKK0081B511CBSMsg1List.PRC_GRP_CD, outMsg.getString(EKK0081B511CBSMsg1List.PRC_GRP_CD));
		retMsg.set(EKK0081B511CBSMsg1List.PCRS_CD, outMsg.getString(EKK0081B511CBSMsg1List.PCRS_CD));
		retMsg.set(EKK0081B511CBSMsg1List.PCRS_NM, outMsg.getString(EKK0081B511CBSMsg1List.PCRS_NM));
		retMsg.set(EKK0081B511CBSMsg1List.PPLAN_CD, outMsg.getString(EKK0081B511CBSMsg1List.PPLAN_CD));
		retMsg.set(EKK0081B511CBSMsg1List.PCRS_CD_PLU, pcrsCdPlu.toString());
		retMsg.set(EKK0081B511CBSMsg1List.PPLAN_CD_PLU, planCdPlu.toString());

		return retMsg;
	}

}
