/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACStbOrsKeiChsht
*	ソースファイル名	：JBSbatACStbOrsKeiChsht.java
*	作成者				：富士通　
*	作成日				：2018年09月26日
*＜機能概要＞
*　設備卸契約情報（継続利用)抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v39.00.00	2018/09/25  富士通		ANK-3478-00-00 新規作成 ｅｏ光設備卸対応(サービス開始対応)
*	v39.01.00	2018/10/05  富士通		IT1-2018-0000158 前月月末取得不備対応
*	v39.02.00   2018/11/20  FJ)寺園    【ANK-3478-01-00】eo光設備卸（サービス開始対応）【12月末商用リリース分】 インセンティブ処理データ管理
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM311;
import eo.business.util.file.JBSbatACIFM315;
import eo.business.util.table.JBSbatCH_M_ORSJGS_INV_SETE;
import eo.common.constant.JACStrConst;
import eo.common.util.JCHStringUtil;
import eo.common.util.JPCUtilCommon;
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.JBSbatDateUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACStbOrsKeiChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(卸先事業者インセンティブ設定)*/
	private static final String D_TBL_NAME_CH_M_ORSJGS_INV_SETE = "CH_M_ORSJGS_INV_SETE";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String CH_M_ORSJGS_INV_SETE_AC_SELECT_003 = "AC_SELECT_003";

	/** テーブルアクセスクラス(卸先事業者インセンティブ設定)*/
	private JBSbatSQLAccess db_CH_M_ORSJGS_INV_SETE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 退避．卸先事業者インセンティブ設定マップ */
	private HashMap<String, List<JBSbatCommonDBInterface>> tmpOrsIesntivMap = null;
	
	/**  退避．群月初日 */
	private String tmpCycFst = null;
	
	/**  退避．群月末日 */
	private String tmpCycEnd = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_ORSJGS_INV_SETE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_ORSJGS_INV_SETE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");

		// IT1-2018-0000158 MOD START
		//// 料金スケジュール定義アクセス部品初期処理
		//JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		//
		//try
		//{
		//	// 請求年月を取得する
		//	String seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
		//	
		//	// 請求年月から、利用開始終了日取得
		//	String[] strEndYmd = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
		//	
		//	this.tmpCycFst = strEndYmd[0];	// 群月初日
		//	this.tmpCycEnd = strEndYmd[1];	// 群月末日
		//	assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][群月初日：" + tmpCycFst + "]");
		//	assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][群月末日：" + tmpCycEnd + "]");
		//}
		//finally
		//{
		//	// 料金スケジュール定義アクセス部品クローズ
		//	schdlUtil.close();
		//}
		this.tmpCycEnd = getZngtuLastDay();
		// IT1-2018-0000158 MOD END

		// 卸先事業者インセンティブ設定マップを作成
		this.makeOrsIesntivMap();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	/**
	 * 卸先事業者インセンティブ設定マスタより、卸先事業者コード、サービスコードを取得し、
	 * 退避．卸先事業者インセンティブ設定マップに保持する
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void makeOrsIesntivMap() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOrsIesntivMap]");

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		// 群月末日
		paramList.setValue(this.tmpCycEnd);
		
		// SQL実行
		executeCH_M_ORSJGS_INV_SETE_AC_SELECT_003(paramList.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_CH_M_ORSJGS_INV_SETE.selectNext();
		
		this.tmpOrsIesntivMap = new HashMap<String, List<JBSbatCommonDBInterface>>();
		
		
		// 検索結果0件の場合
		if(null == dbMap)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOrsIesntivMap]");
			return;
		}
			
		//ブレイク用Key
		String bKey = makeStr(dbMap.getString(JBSbatCH_M_ORSJGS_INV_SETE.ORSJGS_CD), dbMap.getString(JBSbatCH_M_ORSJGS_INV_SETE.SVC_CD));
		
		// 退避マップに設定するバリュー：検索結果のリスト
		ArrayList<JBSbatCommonDBInterface> keizokuList = new ArrayList<JBSbatCommonDBInterface>();
		// 取得出来た場合
		while(dbMap != null)
		{
			// KEY：卸先事業者コード
			String key = makeStr(dbMap.getString(JBSbatCH_M_ORSJGS_INV_SETE.ORSJGS_CD), dbMap.getString(JBSbatCH_M_ORSJGS_INV_SETE.SVC_CD));
		
			// キーと検索結果のキーが異なった場合
			if(!bKey.equals(key))
			{
				// 卸先事業者インセンティブ設定マップにキーとバリューを設定する
				this.tmpOrsIesntivMap.put(bKey, keizokuList);
				// キーに新たな値を設定する
				bKey = key;
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOrsIesntivMap]Key:" + bKey);
				// バリューをクリアー
				keizokuList = new ArrayList<JBSbatCommonDBInterface>();
			}
			// 取得結果より卸先事業者インセンティブ設定マップを作成しリストに格納
			keizokuList.add(dbMap);
			
			// 検索結果キークリアー
			key = null;
			
			dbMap =  db_CH_M_ORSJGS_INV_SETE.selectNext();

		}
		
		// 最後の取得結果を格納
		// 割賦料金マップにキーとバリューを設定する
		this.tmpOrsIesntivMap.put(bKey, keizokuList);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOrsIesntivMap]");
		return;
	}
	
	/**
	 * 文字を連結します
	 * @param  string 文字
	 * @return strBuf 連結した文字列
	 */
		private String makeStr(String ...string)
		{
			StringBuffer strBuf = new StringBuffer();
			for(String str:string)
			{
				if(str == null)
				{
					strBuf.append(JACStrConst.KARA_MOJI);
				}
				else
				{
					strBuf.append(str);
				}
			}
			return strBuf.toString();
		}
	public static void main(String[] args) {
	
	}
	
	// IT1-2018-0000158 ADD START
	/**
	 * 前月末日を取得します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getZngtuLastDay() throws Exception
	{
		String zngtuLastDay = "";
		String zngtuLastYmd = "";
		
		// バッチ処理日の前月を取得（YYYYMMDD形式）
		String zngtu = JBSbatDateUtil.adjustMonth(super.opeDate, -1);
		
		// 前処理で取得した前月（YYYYMMDD形式）から年月を取得し、前月の末日を取得（DD形式）
		zngtuLastDay =  JBSbatDateUtil.getEndOfMonth(zngtu.substring(0, 6));
		
		zngtuLastYmd = zngtu.substring(0, 6) + zngtuLastDay;
		
		return zngtuLastYmd;
		
	}
	// IT1-2018-0000158 ADD END

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AC_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	運用月月初
	 *			
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_ORSJGS_INV_SETE_AC_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CH_M_ORSJGS_INV_SETE.selectBySqlDefine(paramList,CH_M_ORSJGS_INV_SETE_AC_SELECT_003);
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		// KEY：卸先事業者コード ＋　サービスコード
		String key = inMap.getString(JBSbatACIFM311.ORSJGS_CD) + inMap.getString(JBSbatACIFM311.SVC_CD);
		
		// 取得できなかった場合は対象外
		if(!this.tmpOrsIesntivMap.containsKey(key))
		{
			return outputItem;
		}

		// サービス開始年月日または、サービス課金終了年月日が取得できなかった場合は対象外
		if(JCHStringUtil.isNullBlank(inMap.getString(JBSbatACIFM311.SVC_STA_YMD)) || JCHStringUtil.isNullBlank(inMap.getString(JBSbatACIFM311.SVC_CHRG_ENDYMD)))
		{
			return outputItem;
		}
		
		outMap.setOutFlg(true);

		// 卸先事業者コード
		outMap.setString(JBSbatACIFM315.ORSJGS_CD, inMap.getString(JBSbatACIFM311.ORSJGS_CD));
		// サービス契約番号
		outMap.setString(JBSbatACIFM315.SVC_KEI_NO, inMap.getString(JBSbatACIFM311.SVC_KEI_NO));
		// サービスコード
		outMap.setString(JBSbatACIFM315.SVC_CD, inMap.getString(JBSbatACIFM311.SVC_CD));
		// サービス開始年月日
		outMap.setString(JBSbatACIFM315.SVC_STA_YMD, inMap.getString(JBSbatACIFM311.SVC_STA_YMD));
		// サービス課金終了年月日
		outMap.setString(JBSbatACIFM315.SVC_CHRG_ENDYMD, inMap.getString(JBSbatACIFM311.SVC_CHRG_ENDYMD));

		// 継続利用月数
		String svcStaymd = inMap.getString(JBSbatACIFM311.SVC_STA_YMD);
		String svcChrgEndymd = inMap.getString(JBSbatACIFM311.SVC_CHRG_ENDYMD);
		
		int svcKeizokuMonCnt = JBSbatDateUtil.monthDiff(super.opeDate.substring(0, 6), svcStaymd.substring(0, 6), "1");

		//サービス課金終了年月日　＜　バッチ運用日の場合はサービス課金終了年月を使用する
		if (svcChrgEndymd.compareTo(super.opeDate) < 0)
		{
			svcKeizokuMonCnt = JBSbatDateUtil.monthDiff(svcChrgEndymd.substring(0, 6), svcStaymd.substring(0, 6), "1");
		}
// v39.02.00 MOD START
//		outMap.setString(JBSbatACIFM315.KEIZOKU_USE_MON_CNT, svcKeizokuMonCnt);
		outMap.setString(JBSbatACIFM315.KEIZOKU_USE_MON_CNT, JPCUtilCommon.fillZero(String.valueOf(svcKeizokuMonCnt), 3, false));
		if (svcKeizokuMonCnt < 0)
		{
			return null;
		}
// v39.02.00 MOD END

		// 抽出件数
		outMap.setString(JBSbatACIFM315.CHST_CNT, 1);

		outputItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_ORSJGS_INV_SETE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
