/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：プロジェクト共通
*	モジュール名	：JBSbatACInvPrcYearKaktokSksi
*	ソースファイル名：JBSbatACInvPrcYearKaktokSksi.java
*	作成者			：富士通
*	日付			：2018年11月19日
*＜機能概要＞
*	インセンティブ料金年間獲得数情報を作成するクラスです。
*	バージョン	修正日		修正者		修正内容
*	v39.00.00	2018/11/19	FJ)中野		ANK-3478-01-00 新規作成
*
**********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACBatOrsInsSvcInfoUtil;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM328;
import eo.business.util.file.JBSbatACIFM329;
import eo.business.util.table.JBSbatCH_M_ORSJGS_INV_SETE;
import eo.common.util.JKKStringUtil;
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 JBSbatACInvPrcYearKaktokSksi extends JBSbatBusinessService
{
	/** テーブル(卸先事業者インセンティブ設定)*/
	private static final String D_TBL_NAME_CH_M_ORSJGS_INV_SETE = "CH_M_ORSJGS_INV_SETE";

	/** SQL定義キー(AC_SELECT_010) 継続業者抽出*/
	private static final String CH_M_ORSJGS_INV_SETE_AC_SELECT_010 = "AC_SELECT_010";
	/** SQL定義キー(AC_SELECT_011) 前月終了業者抽出*/
	private static final String CH_M_ORSJGS_INV_SETE_AC_SELECT_011 = "AC_SELECT_011";
	
	/** テーブルアクセスクラス(卸先事業者インセンティブ設定 AC_SELECT_010用)*/
	private JBSbatSQLAccess db_CH_M_ORSJGS_INV_SETE_10 = null;
	
	/** テーブルアクセスクラス(卸先事業者インセンティブ設定 AC_SELECT_011用)*/
	private JBSbatSQLAccess db_CH_M_ORSJGS_INV_SETE_11 = null;
	
	private ArrayList<HashMap<String,String>> orsjgsInvPrcYearKaktokSksiList = new ArrayList<HashMap<String,String>>();
	
	/** インセンティブ計算区分(年間獲得数料金) */
	private static final String INCNTV_CALC_DIV_03 = "3";
	
	/** インセンティブ計算区分枝番 */
	private static final String INCNTV_CALC_DIV_SEQ_01 = "1";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		
		db_CH_M_ORSJGS_INV_SETE_10 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_ORSJGS_INV_SETE);
		db_CH_M_ORSJGS_INV_SETE_11 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_ORSJGS_INV_SETE);
		
		orsjgsInvPrcYearKaktokSksiList = getOrsjgsInvPrcYearKaktokSksiList();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		super.logPrint.printDebugLog("execute_START");
		
		JBSbatOutputItem outitem = new JBSbatOutputItem();
		
		outitem = makeOutputInf(inMap);
		
		super.logPrint.printDebugLog("execute_END");
		return outitem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		db_CH_M_ORSJGS_INV_SETE_10.close();
		db_CH_M_ORSJGS_INV_SETE_11.close();
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	
	/**
	 * 前月初日を取得します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getZngtuGessyo() throws Exception
	{
		String zngtuGessyoYmd = "";
		
		// バッチ処理日の前月を取得（YYYYMMDD形式）
		String zngtu = JBSbatDateUtil.adjustMonth(super.opeDate, -1);
		
		zngtuGessyoYmd = zngtu.substring(0, 6) + "01";
		
		return zngtuGessyoYmd;
		
	}
	
	/**
	 * 前月末日を取得します。
	 * 
	 * @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;
		
	}
	
	/**
	 * インセンティブ料金年間獲得数ファイルを出力判定に必要な情報を取得します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<HashMap<String,String>> getOrsjgsInvPrcYearKaktokSksiList() throws Exception
	{
		// 返却用リスト
		ArrayList<HashMap<String, String>> orsjgsInvSeteList = new ArrayList<HashMap<String, String>>();
		
		// 取得レコード
		JBSbatCommonDBInterface selectMap = null;
		JBSbatCommonDBInterface selectMap2 = null;
		
		// 初期値設定
		String OrsjgsCd = "";
		String SvcCd = "";
		
		// DBアクセスクラスを生成します
		db_CH_M_ORSJGS_INV_SETE_10 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_ORSJGS_INV_SETE);
		db_CH_M_ORSJGS_INV_SETE_11 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_ORSJGS_INV_SETE);
		
		// バッチ処理日の前月初日を取得
		String zngtuGessyo = getZngtuGessyo();
		
		// バッチ処理日の前月末日を取得
		String zngtuLastDay = getZngtuLastDay();
		
		//バインド変数(継続業者抽出用)
		String[] keizkparam = { zngtuLastDay, INCNTV_CALC_DIV_03, INCNTV_CALC_DIV_SEQ_01, zngtuLastDay, zngtuLastDay, INCNTV_CALC_DIV_03, INCNTV_CALC_DIV_SEQ_01};

		// バインド変数(前月終了業者抽出用)
		String[] param = { zngtuLastDay, INCNTV_CALC_DIV_03, INCNTV_CALC_DIV_SEQ_01, zngtuGessyo, zngtuLastDay, zngtuLastDay, INCNTV_CALC_DIV_03, INCNTV_CALC_DIV_SEQ_01};
		
		//SQL実行処理
		executeCH_M_ORSJGS_INV_SETE_AC_SELECT_010(keizkparam);
		executeCH_M_ORSJGS_INV_SETE_AC_SELECT_011(param);
		
		//
		while ((selectMap = db_CH_M_ORSJGS_INV_SETE_10.selectNext()) != null) {
			
			HashMap<String, String> workMap = new HashMap<String, String>();
			
			// 卸先事業者コード
			workMap.put("orsjgsCd", JKKStringUtil.nullToBlank(selectMap.getString(JBSbatCH_M_ORSJGS_INV_SETE.ORSJGS_CD)));
			// サービスコード
			workMap.put("svcCd", JKKStringUtil.nullToBlank(selectMap.getString(JBSbatCH_M_ORSJGS_INV_SETE.SVC_CD)));
			
			orsjgsInvSeteList.add(workMap);
		}
		// 取得した結果を格納
		while ((selectMap2 = db_CH_M_ORSJGS_INV_SETE_11.selectNext()) != null) {
			
			HashMap<String, String> workMap = new HashMap<String, String>();
			
			boolean duplicate = false;
			
			//前月終了業者抽出結果を取得
			// 卸先事業者コード
			OrsjgsCd = JKKStringUtil.nullToBlank(selectMap2.getString(JBSbatCH_M_ORSJGS_INV_SETE.ORSJGS_CD));
			// サービスコード
			SvcCd = JKKStringUtil.nullToBlank(selectMap2.getString(JBSbatCH_M_ORSJGS_INV_SETE.SVC_CD));
			
			for (int i = 0; i < orsjgsInvSeteList.size(); i++) {
				
				// 継続業者抽出結果を取得
				// 卸先事業者コード
				String KeizkOrsjgsCd2 = orsjgsInvSeteList.get(i).get("orsjgsCd");
				// サービスコード
				String KeizkSvcCd2 = orsjgsInvSeteList.get(i).get("svcCd");
				
				if (OrsjgsCd.equals(KeizkOrsjgsCd2) && SvcCd.equals(KeizkSvcCd2)) {
					duplicate = true;
					break;
				}
				
			}
			
			if (!duplicate) {
			
			// 作業用マップ格納処理
			workMap.put("orsjgsCd", OrsjgsCd);
			workMap.put("svcCd", SvcCd);
			
			orsjgsInvSeteList.add(workMap);
			
			}

		}
		return orsjgsInvSeteList;
	}
	
	/**
	 * インセンティブ料金年間獲得数ファイルを出力判定します。
	 * 
	 * @param inMap 入力電文
	 * @return JBSbatOutputItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatOutputItem makeOutputInf(JBSbatServiceInterfaceMap inMap) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInf]");
		
		JBSbatOutputItem outputInf = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
		
		String trgtOrsjgsCd = JKKStringUtil.nullToBlank(inMap.getString(JBSbatACIFM328.ORSJGS_CD));					// 卸先事業者コード
		String trgtSvcCd = JKKStringUtil.nullToBlank(inMap.getString(JBSbatACIFM328.SVC_CD));						// サービスコード

		//出力判定フラグ
		boolean OutMapFlg = false; 
				
		//インセンティブ料金年間獲得数ファイル作成の呼び出し
		if (orsjgsInvPrcYearKaktokSksiList != null && orsjgsInvPrcYearKaktokSksiList.size() > 0)
		{
			
			for (int i = 0; orsjgsInvPrcYearKaktokSksiList.size() > i; i++)
			{
				HashMap<String, String> orsjgsInvPrcYearKaktokSksi = new HashMap<String, String>();
				
				orsjgsInvPrcYearKaktokSksi = orsjgsInvPrcYearKaktokSksiList.get(i);
				
				// 判定用卸先事業者コード
				String judgeOrsjgsCd = orsjgsInvPrcYearKaktokSksi.get("orsjgsCd");
				// 判定用サービスコード
				String judgeSvcCd = orsjgsInvPrcYearKaktokSksi.get("svcCd");
				
				if (judgeOrsjgsCd.equals(trgtOrsjgsCd) && judgeSvcCd.equals(trgtSvcCd))
				{
					OutMapFlg = true;
					// インセンティブ料金（年間獲得数料金）を作成
					createAcifm329(inMap, outmap);
				}
			}
		}
		
		//レコードが出力対象の場合ファイルに出力
		if (OutMapFlg) {
			// ファイル出力する
			outmap.setOutFlg(true);
			// 出力共通電文に設定
			outputInf.addOutMapList(outmap);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputInf][outmap=" + outmap.getMap().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInf]");
		
		return(outputInf);
	}
	
	/**
	 * 
	 * インセンティブ料金年間獲得数ファイルの作成を行います。
	 * 
	 * @return outputBean JBSbatOutputItem
	 * @throws Exception
	 *             メソッド内で発生した例外全般。
	 */
	private void createAcifm329(JBSbatServiceInterfaceMap inMap, JBSbatServiceInterfaceMap outMap) throws Exception 
	{
		//サービスコードを取得
		String SvcCd = inMap.getString(JBSbatACIFM328.SVC_CD);
		
		//文字列編集を行う共通クラス
		String svcNm = JACBatOrsInsSvcInfoUtil.getSvcNm(SvcCd);
		
		//サービス開始年月日の編集
		String SvcStaYmd = inMap.getString(JBSbatACIFM328.SVC_STA_YMD);
		String SvcStaYMD = "";
		if (!JKKStringUtil.isNullBlank(SvcStaYmd))
		{
			String SvcStaY = SvcStaYmd.substring(0, 4);
			String SvcStaM = SvcStaYmd.substring(4, 6);
			String SvcStaD = SvcStaYmd.substring(6, 8);
			SvcStaYMD = SvcStaY + "/" + SvcStaM +"/" + SvcStaD;
		}
		
		
		//項目を設定
		outMap.setString(JBSbatACIFM329.ORSJGS_CD, inMap.getString(JBSbatACIFM328.ORSJGS_CD));		// 卸先事業者コード
		outMap.setString(JBSbatACIFM329.ORSJGS_NM, inMap.getString(JBSbatACIFM328.ORSJGS_NM));		// 卸先事業者名
		outMap.setString(JBSbatACIFM329.SVC_KEI_NO, inMap.getString(JBSbatACIFM328.SVC_KEI_NO));	// サービス契約番号
		outMap.setString(JBSbatACIFM329.SVC_CD, SvcCd);												// サービスコード
		outMap.setString(JBSbatACIFM329.SVC_NM, svcNm);												// サービス名
		outMap.setString(JBSbatACIFM329.SVC_STA_YMD, SvcStaYMD);									// サービス開始年月日
		
	}

	/**
	 * SQLKEY(AC_SELECT_010)で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_010(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());

		// DBアクセスを実行します
		db_CH_M_ORSJGS_INV_SETE_10.selectBySqlDefine(paramList, CH_M_ORSJGS_INV_SETE_AC_SELECT_010);
	}
	
	
	/**
	 * SQLKEY(AC_SELECT_011)で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_011(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());

		// DBアクセスを実行します
		db_CH_M_ORSJGS_INV_SETE_11.selectBySqlDefine(paramList, CH_M_ORSJGS_INV_SETE_AC_SELECT_011);
	}
}
