/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKIdoSvKeiTrgrCht
*	ソースファイル名	：JBSbatKKIdoSvKeiTrgrCht.java
*	作成者				：富士通　
*	作成日				：2011年06月01日
*＜機能概要＞
*　異動分サービス契約トリガー抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/01   富士通		新規作成
*	v4.01.00	2013/05/03   富士通		【TG1-2013-0000281】
*	v5.01.00	2013/11/14   富士通		【OM-2013-0003339】
*	v7.00.00	2013/12/04   FJ)上田	【ANK-1578-00-00】
*	v7.00.01	2013/12/04   AS)安井	【OM-2014-0000099】
*   v19.00.00   2015/08/20   FJ)安井     OM-2015-0001096 課金先適用期間変更
*	v36.00.00   2018/01/15   FJ)酒井    【ANK-3296-00-00】
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.util.file.JBSbatKKIFM021;
import eo.business.util.file.JBSbatKKIFM023;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.business.util.table.JBSbatKK_T_KAKINS;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKIdoSvKeiTrgrCht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(課金先)*/
	private static final String D_TBL_NAME_KK_T_KAKINS = "KK_T_KAKINS";

	/** SQL定義キー(KK_SELECT_001)*/
	private static final String KK_T_KAKINS_KK_SELECT_001 = "KK_SELECT_001";

	/** テーブルアクセスクラス(課金先)*/
	private JBSbatSQLAccess db_KK_T_KAKINS = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** キー情報[請求契約番号] **/
	String key_seikyKeiNo = "";
	
	/** 抽出期間_開始年月日 **/
	String stYmd = "";
	
	/** 抽出期間_終了年月日 **/
	String edYmd = "";
	
// ANK-3296-00-00 ADD STA
	/** フリー項目情報 */
	String free = "";
// ANK-3296-00-00 ADD END

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_KAKINS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAKINS);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// フリー項目[処理月区分]
// ANK-3296-00-00 MOD STA
//		String targetMonthDiv = commonItem.getFreeItem();
		free = commonItem.getFreeItem();
// ANK-3296-00-00 MOD END
		
		// 抽出対象期間を算出
		// システム日付から当月の月初と月末を算出
		String strDate = commonItem.getOpeDate();
		String ym = strDate.substring(0, 6);
		stYmd = ym + "01";
		edYmd = ym + JBSbatDateUtil.getEndOfMonth(ym);
		
		// ++++++++++ v4.01.00 開始 ++++++++++ //
		// 処理対象が[前月]の場合、前月の月初と月末を算出
//		if(JBSbatKKConst.TRAN_TRGT_MON_BF.equals(targetMonthDiv))
//		{
//			stYmd = JBSbatDateUtil.adjustMonth(stYmd, -1);
//			edYmd = JBSbatDateUtil.adjustMonth(edYmd, -1);
//		}
		// ++++++++++ v4.01.00 終了 ++++++++++ //
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		/// 処理形式：単一加工／増幅★（入力：ファイル１、出力：なし） ///
		super.logPrint.printDebugLog("execute start");
		
		// 請求契約番号比較(キー情報−入力レコード)
		String wrk_seikyKeiNo = inMap.getString(JBSbatKKIFM021.SEIKY_KEI_NO);
		// SQL結果退避領域
		JBSbatCommonDBInterface kakinMap = new JBSbatCommonDBInterface();
		// 出力情報保持部品
		JBSbatOutputItem outItem = new JBSbatOutputItem();
		// 出力情報退避領域
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		// 出力件数カウンタ
		int count = 0;
		
		// 前入力レコードと同一の請求契約番号は処理対象外
		if(!key_seikyKeiNo.equals(wrk_seikyKeiNo))
		{
			// キー情報を更新
			key_seikyKeiNo = wrk_seikyKeiNo;
			
			// 課金先情報取得_SQLKEY(KK_SELECT_001)
			executeKK_T_KAKINS_KK_SELECT_001(getSelect001Param(inMap));
			
			// 1件目のレコードを取得
			kakinMap = db_KK_T_KAKINS.selectNext();
			
			// キー情報[抽出契約区分＋各種サービス契約番号]保持変数
			String keyInf = "";
			// 取得レコードのキー情報格納用
			String wrkInf = "";
			
			while(null != kakinMap)
			{
				// 出力内容の編集(異動分請求契約番号ファイル)
				outMap = new JBSbatServiceInterfaceMap();
				outMap = editMap(inMap, kakinMap);
				if(null != outMap)
				{
					// 同一キーの情報は出力対象外
					wrkInf = outMap.getString(JBSbatKKIFM023.CHSHT_KEI_DIV)
								+ outMap.getString(JBSbatKKIFM023.SVC_KEI_NO);
					if(!keyInf.equals(wrkInf))
					{
						// キー情報を更新
						keyInf = wrkInf;
						// 出力フラグをON
						outMap.setOutFlg(true);
						// 出力データを格納
						outItem.addOutMapList(outMap);
						count = count + 1;
// ANK-3296-00-00 ADD STA
						if(JBSbatKKConst.TRAN_TRGT_MON_NOW.equals(free) || JBSbatKKConst.TRAN_TRGT_MON_BF.equals(free)){
							// 出力内容の編集(異動分請求契約番号ファイル)
							JBSbatServiceInterfaceMap outMap_3 = editMap_3(outMap);
							if(null != outMap_3){
								// 出力フラグをON
								outMap_3.setOutFlg(true);
								// 出力データを格納
								outItem.addOutMapList(outMap_3);
							}
						}
// ANK-3296-00-00 ADD END
					}
				}
				// 次レコード取得
				kakinMap = db_KK_T_KAKINS.selectNext();
			}
			// ++++++++++ v5.01.00 開始 ++++++++++ //
//			// 入力レコードについて出力が1件以上、かつ請求契約情報が未出力の場合
//			if(count > 0)
//			{
			// 出力情報退避領域
			JBSbatServiceInterfaceMap outMap_2 = new JBSbatServiceInterfaceMap();
			
			// 請求契約情報レコード編集
			outMap_2 = editMap_2(inMap);
			// 出力フラグをON
			outMap_2.setOutFlg(true);
			// 出力データを格納
			outItem.addOutMapList(outMap_2);
//			}
			// ++++++++++ v5.01.00 終了 ++++++++++ //
		}
		super.logPrint.printDebugLog("execute end");
		return outItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * <dd>メソッド名	：ファイル編集
	 * <dd>メソッド説明	：1.ファイル編集対象項目を取得します。
	 *                    2.取得した項目を元にファイル編集を行います。
	 * @param  inMap     入力レコードデータ情報Map
	 * @param  kakinMap  課金先データ情報Map
	 * @return outMap    出力Map
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap editMap(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface kakinMap) throws Exception 
	{
		// 出力情報Map
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		// 抽出対象契約区分
		String chstTrgtDiv = "";
		// サービス契約番号
		String svcKeiNo = "";
		
		// サービス契約番号
		svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.SVC_KEI_NO);
		if (null != svcKeiNo && svcKeiNo.length() != 0)
		{
			chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_10;
		}
		// サービス契約内訳番号
		if ("".equals(chstTrgtDiv))
		{
			svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.SVC_KEI_UCWK_NO);
			if (null != svcKeiNo && svcKeiNo.length() != 0)
			{
				chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_11;
			}
		}
		// サブオプションサービス契約番号
		if ("".equals(chstTrgtDiv))
		{
			svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.SBOP_SVC_KEI_NO);
			if (null != svcKeiNo && svcKeiNo.length() != 0)
			{	
				chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_21;
			}
		}
		// オプションサービス契約番号
		if ("".equals(chstTrgtDiv))
		{
			svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.OP_SVC_KEI_NO);
			if (null != svcKeiNo && svcKeiNo.length() != 0)
			{	
				chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_20;
			}
		}
		// 機器提供サービス契約番号
		if ("".equals(chstTrgtDiv))
		{
			svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.KKTK_SVC_KEI_NO);
			if (null != svcKeiNo && svcKeiNo.length() != 0)
			{	
				chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_30;
			}
		}
		// 請求オプションサービス契約番号取得
		if ("".equals(chstTrgtDiv))
		{
			svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.SEIOPSVC_KEI_NO);
			if (null != svcKeiNo && svcKeiNo.length() != 0)
			{	
				chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_40;
			}
		}
		// 割引サービス契約番号取得
		if ("".equals(chstTrgtDiv))
		{
			svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.WRIB_SVC_KEI_NO);
			if (null != svcKeiNo && svcKeiNo.length() != 0)
			{	
				chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_50;
			}
		}
		// オーナー契約番号取得
		if ("".equals(chstTrgtDiv))
		{
			svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.OWNR_KEI_NO);
			if (null != svcKeiNo && svcKeiNo.length() != 0)
			{	
				chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_60;
			}
		}
		
		// ++++++++++ v7.00.00 開始 ++++++++++ //
		// 機器オプションサービス契約番号取得
		if ("".equals(chstTrgtDiv))
		{
			svcKeiNo = kakinMap.getString(JBSbatKK_T_KAKINS.KKOP_SVC_KEI_NO);
			if (null != svcKeiNo && svcKeiNo.length() != 0)
			{	
				chstTrgtDiv = JBSbatKKConst.CHSHT_KEI_DIV_31;
			}
		}
		// ++++++++++ v7.00.00 終了 ++++++++++ //
		
		// 出力ファイル項目編集
		if (!"".equals(chstTrgtDiv))
		{
			// 抽出対象契約区分
			outMap.setString(JBSbatKKIFM023.CHSHT_KEI_DIV, chstTrgtDiv);
			// 請求契約番号
			outMap.setString(JBSbatKKIFM023.SEIKY_KEI_NO, key_seikyKeiNo);
			// サービス契約番号
			outMap.setString(JBSbatKKIFM023.SVC_KEI_NO, svcKeiNo);
		}
		else
		{
			outMap = null;
		}
		
		return outMap;
	}

	/**
	 * <dd>メソッド名	：ファイル編集
	 * <dd>メソッド説明	：1.ファイル編集対象項目を取得します。
	 *                    2.取得した項目を元にファイル編集を行います。
	 * @param  inMap     入力レコードデータ情報Map
	 * @return outMap    出力Map
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap editMap_2(JBSbatServiceInterfaceMap inMap) throws Exception 
	{
		// 出力情報Map
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 抽出対象契約区分
		outMap.setString(JBSbatKKIFM023.CHSHT_KEI_DIV, JBSbatKKConst.CHSHT_KEI_DIV_90);
		// 請求契約番号
		outMap.setString(JBSbatKKIFM023.SEIKY_KEI_NO, key_seikyKeiNo);
		// サービス契約番号
		outMap.setString(JBSbatKKIFM023.SVC_KEI_NO, null);
		
		return outMap;
	}

// ANK-3296-00-00 ADD STA
	/**
	 * <dd>メソッド名	：ファイル編集
	 * <dd>メソッド説明	：1.ファイル編集対象項目を取得します。
	 *                    2.取得した項目を元にファイル編集を行います。
	 * @param  inMap     入力レコードデータ情報Map
	 * @return outMap    出力Map
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap editMap_3(JBSbatServiceInterfaceMap inMapp) throws Exception 
	{
		if(JBSbatKKConst.CHSHT_KEI_DIV_10.equals(inMapp.get(JBSbatKKIFM023.CHSHT_KEI_DIV))){

			// 出力情報Map
			JBSbatServiceInterfaceMap outMap  = new JBSbatServiceInterfaceMap();
			
			// 抽出対象契約区分
			outMap.setString(JBSbatKKIFM023.CHSHT_KEI_DIV, JBSbatKKConst.CHSHT_KEI_DIV_70);
			// 請求契約番号
			outMap.setString(JBSbatKKIFM023.SEIKY_KEI_NO, inMapp.get(JBSbatKKIFM023.SEIKY_KEI_NO));
			// サービス契約番号
			outMap.setString(JBSbatKKIFM023.SVC_KEI_NO, inMapp.get(JBSbatKKIFM023.SVC_KEI_NO));

			return outMap;
		}
		
		return null;
	}
// ANK-3296-00-00 ADD END

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_KAKINS.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * SQLKEY(KK_SELECT_001)で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_KAKINS_KK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_KK_T_KAKINS.selectBySqlDefine(paramList, KK_T_KAKINS_KK_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * SQLKEY(KK_SELECT_001)でDBアクセスを実行する際に必要なパラメータを設定します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.パラメータ設定処理。
	 * </pre>
	 * <p>
	 * @param inMap 入力電文
	 * @return param SQLKEY(KK_SELECT_001)でDBアクセスを実行する際に必要なパラメータ
	 * @throws Exception 
	 */
	private Object[] getSelect001Param(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		//▼OM-2014-0000099▼
//		Object[] ret_Param = {
//			stYmd, // 抽出対象期間_開始年月日
//			edYmd, // 抽出対象期間_終了年月日
//			JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM021.SEIKY_KEI_NO)) // 請求契約番号
//		};
//OM-2015-0001096 MOD STA
//		Object[] ret_Param = {
//			commonItem.getOpeDate(), // 抽出対象期間_運用日
//			edYmd, // 抽出対象期間_終了年月日
//			JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM021.SEIKY_KEI_NO)) // 請求契約番号
//		};
		Object[] ret_Param = {
			commonItem.getOpeDate(), // 抽出対象期間_運用日
			commonItem.getOpeDate(), // 抽出対象期間_運用日
			JBSbatStringUtil.Rtrim(inMap.getString(JBSbatKKIFM021.SEIKY_KEI_NO)) // 請求契約番号
		};
//OM-2015-0001096 MOD END
		//▲OM-2014-0000099▲
		return ret_Param;
	}
}
