/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKKnTvGuidemgFileCst
*	ソースファイル名	：JBSbatKKKnTvGuidemgFileCst.java
*	作成者				：FJ)古田
*	作成日				：2011年10月14日
*＜機能概要＞
*　ＫＮテレビジョンガイド誌ファイル抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/14  FJ)古田		新規作成
*	v3.00.00	2012/10/10  FJ)藤本		【ST1-2012-0000707】予約レコードも抽出するように修正
*   v4.00.00	2013/03/05  FJ)柳		【KT1-2013-0000323】障害対応
*	v5.00.00	2013/01/24	FJ)石原		【ANK-1371-00-00】ガイド送付リストの編集対応
*	v5.00.01	2013/03/18	FJ)神田		【IT1-2013-0000498】障害対応
*	v5.00.02	2013/04/22	FJ)団		【IT1-2013-0001014】障害対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.business.common.JKKBatCommon;
import eo.business.util.file.JBSbatKKIFM139;
import eo.business.util.table.JBSbatKK_T_OP_SVC_KEI;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKKnTvGuidemgFileCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";

	/** テーブル(異動予約)*/
	private static final String D_TBL_NAME_KK_T_IDO_RSV = "KK_T_IDO_RSV";

	/** SQL定義キー(KK_SELECT_028)*/
	private static final String KK_T_OP_SVC_KEI_KK_SELECT_028 = "KK_SELECT_028";

	/** SQL定義キー(KK_SELECT_046)*/
	private static final String KK_T_IDO_RSV_KK_SELECT_046 = "KK_SELECT_046";

	/** テーブルアクセスクラス(オプションサービス契約)*/
	private JBSbatSQLAccess db_KK_T_OP_SVC_KEI = null;

	/** テーブルアクセスクラス(異動予約)*/
	private JBSbatSQLAccess db_KK_T_IDO_RSV = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_OP_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
		db_KK_T_IDO_RSV = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_IDO_RSV);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		super.logPrint.printDebugLog("execute_START");

		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		// SQL実行結果取得用map（オプションサービス契約、オプションサービス契約（TV））
		JBSbatCommonDBInterface opSvcKeiMap = null;

		// 翌月１日を取得します。
		String opdAddMonth = getOpdAddMonth();

		// オプションサービス契約、オプションサービス契約（TV）よりデータを取得
		searchOP_SVC_KEI(opdAddMonth);

		// サービス契約番号が変わったか判断する項目
		String svcKeiNo_wk = "";

		// SYSID（ファイル出力時に使用）
		String sysId_wk = "";

		// オプションサービス契約番号（ファイル出力時に使用）
		String opSvckeiNo_wk = "";
		
		// 取得したサービス契約番号
		String svcKeiNo = "";

		// ガイド誌発送部数
		int guideHssoBusu = 0;

		for (opSvcKeiMap = db_KK_T_OP_SVC_KEI.selectNext(); null != opSvcKeiMap; opSvcKeiMap = db_KK_T_OP_SVC_KEI.selectNext())
		{
			// 異動予約にデータがある場合、出力しません。
			if(isIdoRsvExists(opSvcKeiMap, opdAddMonth))
			{
				super.logPrint.printDebugLog("異動予約にデータが存在するので対象データではありません。");
				super.logPrint.printDebugLog("サービス契約番号[" + JBSbatStringUtil.trim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_KEI_NO)) + "]");
				super.logPrint.printDebugLog("オプションサービス契約番号[" + JBSbatStringUtil.trim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_NO)) + "]");

				continue;
			}

			svcKeiNo = JBSbatStringUtil.trim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_KEI_NO));

			// サービス契約番号がかわった場合
			if(!svcKeiNo_wk.equals(svcKeiNo))
			{
				// 変わる前の明細を出力します。
				if(guideHssoBusu != 0)
				{
					// ファイルデータを格納します。
					outputBean.addOutMapList(createKkifm139Data(svcKeiNo_wk, sysId_wk, guideHssoBusu, opSvckeiNo_wk));
				}

				// 契約番号が変わったため1をセットします。
				guideHssoBusu = 1;
				svcKeiNo_wk = svcKeiNo;
				sysId_wk = JBSbatStringUtil.trim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.SYSID));
				opSvckeiNo_wk = JBSbatStringUtil.trim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_NO));
			}
			else
			{
				guideHssoBusu++;
			}
		}

		if(guideHssoBusu > 0)
		{
			// 最終行のファイルデータを格納します。
			outputBean.addOutMapList(createKkifm139Data(svcKeiNo_wk, sysId_wk, guideHssoBusu, opSvckeiNo_wk));
		}

		// ファイルを出力します。
		JKKBatCommon.outFile(super.commonItem, outputBean, "KKIFM139", super.commonItem.getFreeItem(), "KKIFM139001.csv");
		
		super.logPrint.printDebugLog("execute_END");
		return null;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_OP_SVC_KEI.close();
		db_KK_T_IDO_RSV.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(KK_SELECT_028)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	オプションサービス予約適用年月日
	 *		 	サービス契約予約適用年月日
	 *		 	休止年月日
	 *		 	休止解除年月日
	 *		 	サービス開始年月日
	 *		 	サービス終了年月日
	 *		 	予約適用年月日
	 *		 	予約適用年月日FROM
	 *		 	予約適用年月日TO
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_OP_SVC_KEI_KK_SELECT_028(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());
		paramList.setValue(param[9].toString());
		paramList.setValue(param[10].toString());
		paramList.setValue(param[11].toString());

		// DBアクセスを実行します
		db_KK_T_OP_SVC_KEI.selectBySqlDefine(paramList, KK_T_OP_SVC_KEI_KK_SELECT_028);
	}

	/**
	 * SQLKEY(KK_SELECT_046)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	オプションサービス契約番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_IDO_RSV_KK_SELECT_046(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_IDO_RSV.selectBySqlDefine(paramList, KK_T_IDO_RSV_KK_SELECT_046);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 運用日の翌月１日を取得します。
	 * @return  opDateYm 翌月１日
	 * 
	 */
	private String getOpdAddMonth()
	{
		// 翌月１日を取得
		String opDateYm = JBSbatInterface.adjustMonth(super.opeDate, 1).substring(0, 6) + "01";

		return opDateYm;
	}
	
	/**
	 * 
	 *  オプションサービス契約、オプションサービス契約（TV）よりデータを取得します。<br>
	 * <p>
	 * <pre>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	オプションサービス予約適用年月日
	 *		 	サービス契約予約適用年月日
	 *		 	休止年月日
	 *		 	休止解除年月日
	 *		 	サービス開始年月日
	 *		 	サービス終了年月日
	 *		 	予約適用年月日
	 *		 	予約適用年月日FROM
	 *		 	予約適用年月日TO
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param addMonth 運用日の翌月１日
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void searchOP_SVC_KEI(String addMonth) throws Exception
	{
		// 運用日の翌月(yyyymm)
		String addYM = addMonth.substring(0, 6);
		
		String[] setParam = new String[12];
		setParam[0] = addMonth;
		setParam[1] = addMonth;
		setParam[2] = addMonth;
		setParam[3] = addMonth;
		setParam[4] = addMonth;
		setParam[5] = addMonth;
		setParam[6] = addMonth;
		setParam[7] = addMonth;
		setParam[8] = addMonth;	
		setParam[9] = addMonth;
		setParam[10] = addYM + JBSbatInterface.getEndOfMonth(addYM);	// 運用日翌月末日
		setParam[11] = addMonth;
		
		executeKK_T_OP_SVC_KEI_KK_SELECT_028(setParam);
	}
	
	/**
	 * 
	 *  異動予約に解約予約のデータが存在するか判定します。<br>
	 * <p>
	 * <pre>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	オプションサービス契約番号
	 *		 	予約適用年月日
	 *		検索条件
	 *			OP_SVC_KEI_NO = ?
	 *			AND KK1681.IDO_DIV = '00031'
	 *			AND KK1681.IDO_RSV_DTL_CD = '016'
	 *			AND KK1681.RSV_APLY_YMD < ?
	 *			AND KK1681.MK_FLG = '0'
	 *
	 * </pre>
	 * <p>
	 * @param opSvcKeiMap オプションサービス契約、オプションサービス契約（TV）の検索結果
	 * @param addMonth 運用日の翌月１日
	 * @return 存在する場合true 存在しない場合false
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean isIdoRsvExists(JBSbatCommonDBInterface opSvcKeiMap, String addMonth) throws Exception
	{

		String[] setParam = new String[2];
		setParam[0] = JBSbatStringUtil.trim(opSvcKeiMap.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_NO));
		setParam[1] = addMonth;

		executeKK_T_IDO_RSV_KK_SELECT_046(setParam);

		if(db_KK_T_IDO_RSV.selectNext() == null)
		{

			return false;
		}

		return true;
	}
	
	/**
	 * 
	 *  ＫＮテレビジョンガイド誌中間ファイルの作成を行います。
	 * @param svcKeiNo_wk サービス契約番号
	 * @param sysId_wk SYSID
	 * @param guideHssoBusu ガイド発送部数
	 * @param opSvckeiNo_wk オプションサービス契約番号
	 * @return JBSbatServiceInterfaceMap
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap createKkifm139Data(String svcKeiNo_wk, String sysId_wk, int guideHssoBusu, String opSvckeiNo_wk) throws Exception
	{
		// 入出力インターフェースオブジェクトを生成
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();

		// サービス契約番号
		outmap.setString(JBSbatKKIFM139.SVC_KEI_NO, svcKeiNo_wk);
		// SYSID（お客様を識別するID）
		outmap.setString(JBSbatKKIFM139.SYSID, sysId_wk);
		// 発行部数
		outmap.setString(JBSbatKKIFM139.HASSO_CNT, String.valueOf(guideHssoBusu));
		// オプションサービス契約番号
		outmap.setString(JBSbatKKIFM139.OP_SVC_KEI_NO, String.valueOf(opSvckeiNo_wk));
		
		return outmap;
	}
	
}
