/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbEAC0601B010TPDA
*	ソースファイル名：JSYejbEAC0601B010TPDA.java
*	作成者			：EKek0087
*	日付			：2012年02月20日
*＜機能概要＞
*	通信量情報合計一覧照会テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ9.00.00	2014/07/01  FJ)小野     【OM-2014-0002090】FTTH通信明細、FTTH通信合計のインデックス変更に伴うオンライン機能対応。
*
********************************************************************************/

package eo.ejb.cbs.sqlf;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANSQLFacility;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
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.TemplateDBAccessHandler;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;

import eo.ejb.cbs.cbsmsg.EAC0601B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EAC0601B010CBSMsg1List;
import eo.ejb.cbm.entity.AC0091ETMsg;
import eo.ejb.common.JPCModelCommon;

/**
*
*  テンプレートDBアクセス部品　EAC0601B010_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbEAC0601B010TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbEAC0601B010TPDA()	{
	}
	
	/**
	*   EAC0601B010_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
// 手修正箇所S
			// 最大検索月数取得
			String sMaxSearchMonCnt = inMsg.getString(EAC0601B010CBSMsg.KEY_MAX_SEARCH_MON_CNT);
// 手修正箇所E
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(AC0091ETMsg.getTableName());
			
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     AC0601.USE_YM ")
					.append("    ,SUM((AC0601.USE_TSRYO_GK + AC0601.HOSEI_TSRYO_GK)) AS TSRYO_GK ")
					.append(" FROM ")
					.append("     AC_T_FTTH_TUSHIN_GK AC0601 ");
			// SQL文_個別部1
			if ( "1".equals( inMsg.getObject(EAC0601B010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE ")
						.append("     AC0601.SVC_KEI_NO = ? ")
						.append(" AND AC0601.SEIKY_YM = ? ")
						.append(" GROUP BY AC0601.USE_YM ");
			}
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			int i = 1;
			
			String sRiyoYM = null;
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(EAC0601B010CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿サービス契約番号を指定)
				CAANJDBCUtil.setParam(pstmt, i++, inMsg.getObject(EAC0601B010CBSMsg.KEY_SVC_KEI_NO));
				
// 手修正箇所S
				if("1".equals(sMaxSearchMonCnt)){
					// パラメータの設定(運用日)
					CAANJDBCUtil.setParam(pstmt, i++, JPCModelCommon.getOpeDate(inMsg,  null).substring(0,6));
					
					sRiyoYM = JPCModelCommon.getOpeDate(inMsg,  null).substring(0,6);
				}
				else if("2".equals(sMaxSearchMonCnt)){
					// 運用日付を取得する。
					String sOpeDate = JPCModelCommon.getOpeDate(inMsg,  null);
					
					// 運用日付をCalendar型にキャストする
					Calendar opeCal = this.toCalendar(sOpeDate);
					
					// 前月を生成する。
					Calendar opeCalbf = subM(opeCal, "1");
					
					int intYear = opeCalbf.get(Calendar.YEAR);
					int intMonth = opeCalbf.get(Calendar.MONTH) + 1;
					
					String inYM = String.valueOf(intYear) + String.format("%1$02d", intMonth);
					
					// パラメータの設定(運用日の前月)
					CAANJDBCUtil.setParam(pstmt, i++, inYM);
					
					sRiyoYM = inYM;
				}
				else if("3".equals(sMaxSearchMonCnt)){
					// 運用日付を取得する。
					String sOpeDate = JPCModelCommon.getOpeDate(inMsg,  null);
					
					// 運用日付をCalendar型にキャストする
					Calendar opeCal = this.toCalendar(sOpeDate);
					
					// 前月を生成する。
					Calendar opeCalbf = subM(opeCal, "2");
					
					int intYear = opeCalbf.get(Calendar.YEAR);
					int intMonth = opeCalbf.get(Calendar.MONTH) + 1;
					
					String inYM = String.valueOf(intYear) + String.format("%1$02d", intMonth);
					
					// パラメータの設定(運用日の前々月)
					CAANJDBCUtil.setParam(pstmt, i++, inYM);
					
					sRiyoYM = inYM;
				}
// 手修正箇所E
			}
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// EAC0601B010CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  EAC0601B010CBSMsg1List.RIYO_YM
					, EAC0601B010CBSMsg1List.USE_TSRYO
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.EAC0601B010CBSMsg1List",0);
			
// 手修正箇所S
			if(outMsg1.length == 0){
				// 検索結果が0件の場合、利用月のみを設定した明細を作成する。
				outMsg1 = new CAANMsg[1];
				
				CAANMsg msg = new CAANMsg("eo.ejb.cbs.cbsmsg.EAC0601B010CBSMsg1List");
				
				msg.set(EAC0601B010CBSMsg1List.RIYO_YM, sRiyoYM);
				
				outMsg1[0] = msg;
			}
			
// 手修正箇所E
			
			inMsg.set("EAC0601B010CBSMsg1List", outMsg1);
			
		} catch(SQLException e) {
			inMsg.set(EAC0601B010CBSMsg.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(EAC0601B010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
	
	/**
	/**
	 * <p>
	 * String型の日付をCalendar型にキャストする
	 * </p>
	 * 
	 * @param date キャストする日付
	 * 
	 * @return Calndar型にキャストしたdate
	 * @throws NumberFormatException 数値に変換できない場合にスローされる
	 */
	private Calendar toCalendar(Object date) throws NumberFormatException
	{
		// パラメータの日付を年、月、日に分割する
		int year = Integer.parseInt(date.toString().substring(0, 4));
		int month = Integer.parseInt(date.toString().substring(4, 6));
		int day = Integer.parseInt(date.toString().substring(6, 8));
		
		// カレンダーオブジェクト生成
		Calendar cal = Calendar.getInstance();
		// カレンダーオブジェクトを未設定にする
		cal.clear();
		
		// 分割したパラメータを設定する(月は0から始まるため、-1する)
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month -1);
		cal.set(Calendar.DATE, day);
		
		return cal;
	}
	
	/**
	 * パラメータに指定された日付を減算します。
	 * 
	 * @param cal      減算される日付
	 * @param addMonth 減算する月数
	 * 
	 * @return パラメータの値が減算されたcal
	 */
	private Calendar subM(Calendar cal, Object addMonth) throws NumberFormatException
	{
		// 運用日付にパラメータの年月日数を減算する
		// 月数が設定されていたら月数を減算する
		if (addMonth != null && addMonth.toString().length() > 0)
		{
			cal.add(Calendar.MONTH, Integer.parseInt(addMonth.toString()) * -1);
		}
		
		return cal;
	}
}
