/*********************************************************************
*  All Rights reserved,Copyright (c) Fujitsu ,2016					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKKnytcMailDataMake
*	ソースファイル名	：JBSbatKKKnytcMailDataMake.java
*	作成者				：富士通　
*	作成日				：2016年01月31日
*＜機能概要＞
*　契約内容通知メール送信情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v23.00.00		2016/01/31	FJ)清水		新規作成(【ANK-2737-00-00】消費者保護ルール見直し対応)
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.business.util.file.JBSbatKKIFM693;
import eo.business.util.file.JBSbatKKIFE324;
import eo.business.util.table.JBSbatCC_M_MAIL;
import eo.business.util.table.JBSbatZM_M_TCHI_MAIL_SENDS;
import eo.common.constant.JPCBatchMessageConstant;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKKnytcMailDataMake extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(契約内容通知書)*/
	private static final String D_TBL_NAME_KK_T_KNYTCS = "KK_T_KNYTCS";

	/** テーブル(メール)*/
	private static final String D_TBL_NAME_CC_M_MAIL = "CC_M_MAIL";

	/** テーブル(通知メール送信先)*/
	private static final String D_TBL_NAME_ZM_M_TCHI_MAIL_SENDS = "ZM_M_TCHI_MAIL_SENDS";
	
	/** SQL定義キー(KK_SELECT_004)*/
	private static final String KK_T_KNYTCS_KK_SELECT_004 = "KK_SELECT_004";

	/** SQL定義キー(KK_SELECT_006)*/
	private static final String CC_M_MAIL_KK_SELECT_006 = "KK_SELECT_006";

	/** SQL定義キー(KK_UPDATE_002)*/
	private static final String KK_T_KNYTCS_KK_UPDATE_002 = "KK_UPDATE_002";
	
	/** SQL定義キー(KK_SELECT_001)*/
	private static final String ZM_M_TCHI_MAIL_SENDS_KK_SELECT_001 = "KK_SELECT_001";

	/** テーブルアクセスクラス(契約内容通知書)*/
	private JBSbatSQLAccess db_KK_T_KNYTCS = null;

	/** テーブルアクセスクラス(メール)*/
	private JBSbatSQLAccess db_CC_M_MAIL = null;
	
	/** テーブルアクセスクラス(通知メール送信先)*/
	private JBSbatSQLAccess db_ZM_M_TCHI_MAIL_SENDS = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 契約内容通知書送付先名 */
	private static final String KNYTCS_SOHUS_NM = "KNYTCS_SOHUS_NM";
	
	/** メールコード : 契約内容通知 */
	private static final String MAIL_CD = "KKM1000012";
	
	/** 通知メール送信先番号_コース変更 */
	private static final String TCHI_MAIL_SENDS_NO_CSCH = "01";
	
	/** 通知メール送信先番号_休止受付 */
	private static final String TCHI_MAIL_SENDS_NO_PAUSE  = "02";
	
	/** 異動区分 */
	private static final String IDO_DIV = "IDO_DIV";
	
	/** 異動区分 : コース変更 */
	private static final String IDO_DIV_CSCH = "00009";

	/** 異動区分 : 休止受付 */
	private static final String IDO_DIV_PAUSE= "00024";
	
	/** 置換文字列 : コース変更 */
	private static final String StringCsch = "コース変更";
	
	/** 置換文字列 : 休止 */
	private static final String StringPause = "休止";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_KNYTCS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KNYTCS);
		db_CC_M_MAIL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_M_MAIL);
		db_ZM_M_TCHI_MAIL_SENDS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_TCHI_MAIL_SENDS);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 入力ファイルの情報がなくなったらメイン処理を実行する
		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		// INPUTの読み込みが全て終了している場合
		if (null == inMap)
		{
			// INPUTがない場合処理を終了する
			if (outputInItem == null)
			{
				return null;
			}

			// メイン処理
			mainProp(outputInItem, outputBean);
		}
		else
		{
			// 退避レコード格納リストに、現レコードを保存して、処理を終了する
			outputInItem.addOutMapList(inMap);

			return outputInItem;
		}
		
		return outputBean;

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * メイン処理
	 * 
	 * @param outputInItem 入力データリスト
	 * @param outputBean 出力リスト
	 * @return
	 * @throws Exception
	 */
	private void mainProp(JBSbatOutputItem outputInItem, JBSbatOutputItem outputBean) throws Exception
	{
		
		// 対応記録タイトル（コース変更）
		String taioKirokTitleCsch = null;
		// 対応記録タイトル（休止）
		String taioKirokTitlePause= null;
		
		// メール情報取得
		// setParam = {メールコード, バッチ運用日, バッチ運用日, バッチ運用日}
		Object[] setParamMail = {MAIL_CD, super.opeDate, super.opeDate, super.opeDate};
		this.executeCC_M_MAIL_KK_SELECT_006(setParamMail);
		JBSbatCommonDBInterface resultMail = db_CC_M_MAIL.selectNext();
		if(resultMail == null)
		{
			String[] msgParam = new String[] { "メール", "MAIL_CD:" + MAIL_CD};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, msgParam);
		}
		
		// 対応記録タイトル取得
		// setParam = {メールコード, バッチ運用日, バッチ運用日}
		Object[] setParamTaioCsch = {MAIL_CD,  super.opeDate, super.opeDate};
		this.executeZM_M_TCHI_MAIL_SENDS_KK_SELECT_001(setParamTaioCsch);
		JBSbatCommonDBInterface resultTaio = db_ZM_M_TCHI_MAIL_SENDS.selectNext();
		if(resultTaio == null)
		{
		//  対応記録タイトルからレコードを取得できなかった場合
			String[] msgParam = new String[] { "通知メール送信先", "MAIL_CD:" + MAIL_CD};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, msgParam);
		}

		while(resultTaio != null)
		{
			// 通知メール送信先番号 
			String tchiMailSendsNo = resultTaio.getString(JBSbatZM_M_TCHI_MAIL_SENDS.TCHI_MAIL_SENDS_NO) ;
			
			// 通知メール送信先番号がコース変更の場合
			if(TCHI_MAIL_SENDS_NO_CSCH.equals(tchiMailSendsNo))
			{
				// 対応記録タイトル（コース変更） ←メール.対応記録タイトル 
				taioKirokTitleCsch =  resultTaio.getString(JBSbatZM_M_TCHI_MAIL_SENDS.TAIO_KIROK_TITLE);
			}
			// 通知メール送信先番号が休止の場合
			else if(TCHI_MAIL_SENDS_NO_PAUSE.equals(tchiMailSendsNo))
			{
				// 対応記録タイトル（休止） ←メール.対応記録タイトル 
				taioKirokTitlePause = resultTaio.getString(JBSbatZM_M_TCHI_MAIL_SENDS.TAIO_KIROK_TITLE);
			}
			else
			{
				// 異動区分が"休止" or "コース変更"以外の場合
				String[] msgParam = new String[] { "通知メール送信先 : TCHI_MAIL_SENDS_NO = " +  tchiMailSendsNo};
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0090TE, msgParam);
			}
			
			 resultTaio = db_ZM_M_TCHI_MAIL_SENDS.selectNext();
		}
		
		if(isNullorBlank(taioKirokTitleCsch) || isNullorBlank(taioKirokTitlePause))
		{
			//  対応記録タイトル（コース変更）or 対応記録タイトル（休止）が取得できなかった場合
			String[] msgParam = new String[] { "通知メール送信先", "TCHI_MAIL_SENDS_NO : " 
					+ TCHI_MAIL_SENDS_NO_CSCH + "もしくは" + TCHI_MAIL_SENDS_NO_PAUSE};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, msgParam);
		}
		
		for (int i = 0; i < outputInItem.getOutMapList().size(); i++)
		{
			//契約内容通知書参照
			// 入力データ取得
			JBSbatServiceInterfaceMap inMap = (JBSbatServiceInterfaceMap)outputInItem.getOutMapList().get(i);
				
			// 契約内容通知書番号取得
			// setParam = {契約内容通知書番号}
			Object[] setParamKyntcs = {inMap.getString(JBSbatKKIFM693.KNYTCS_NO)};
			// 契約内容通知情報抽出
			this.executeKK_T_KNYTCS_KK_SELECT_004(setParamKyntcs);
			JBSbatCommonDBInterface resultKnytcs = db_KK_T_KNYTCS.selectNext();
			
			if(resultKnytcs != null)
			{
				// 出力用MAP
				JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
				// サービス契約番号 <- サービス契約番号
				outMap.set(JBSbatKKIFE324.SVC_KEI_NO, inMap.getString(JBSbatKKIFM693.SVC_KEI_NO));
				// メール宛先 <- メール宛先
				outMap.set(JBSbatKKIFE324.SENDS_MLAD, inMap.getString(JBSbatKKIFM693.MLAD));
				// メール送信者名 <- メール送信者名
				outMap.set(JBSbatKKIFE324.SENDM_MLAD_DSP_NM, resultMail.getString(JBSbatCC_M_MAIL.SENDM_MLAD_DSP_NM));
				// メール送信者 <- メール送信者
				outMap.set(JBSbatKKIFE324.SENDM_MLAD, resultMail.getString(JBSbatCC_M_MAIL.SENDM_MLAD));
				// メール返信先 <- 返信先メールアドレス
				outMap.set(JBSbatKKIFE324.HNSIN_MLAD, resultMail.getString(JBSbatCC_M_MAIL.HNSIN_MLAD));
				// エラーメール返信先 <- エラーメールアドレス
				outMap.set(JBSbatKKIFE324.HNSIN_ERR_MLAD, resultMail.getString(JBSbatCC_M_MAIL.ERR_MLAD));
				// ＢＣＣ <- スペース
				outMap.set(JBSbatKKIFE324.BCC_MLAD, "");
				
				// 置換文字配列の宣言
				String[] repStringTitle = new String[1];
				String[] repStringText = new String[2];
				String[] chgTitleNo = {"%1%"};
				String[] chgTextNo = {"%2%", "%3%"};

				// メール本文内契約者氏名の置換文字列を格納
				repStringText[0] = resultKnytcs.getString(KNYTCS_SOHUS_NM);

				// 対応記録タイトル
				String taioKirokTitle = null;
				
				// 契約内容通知書より異動区分取得
				String resultIdoDiv = resultKnytcs.getString(IDO_DIV);
				
				//異動区分が"コース変更"である場合
				if (IDO_DIV_CSCH.equals(resultIdoDiv))
				{
					// メール題名用置換文字列
					repStringTitle[0] = StringCsch;
					// メール本文用置換文字列
					repStringText[1] = StringCsch;
					// コース変更用の対応記録タイトルを格納
					taioKirokTitle = taioKirokTitleCsch;
				}
				//異動区分が"休止受付"である場合
				else if (IDO_DIV_PAUSE.equals(resultIdoDiv))
				{
					// メール題名用置換文字列
					repStringTitle[0] = StringPause;
					// メール本文用置換文字列
					repStringText[1] = StringPause;
					// 休止用の対応記録タイトルを格納
					taioKirokTitle = taioKirokTitlePause;
				}
				else
				{
				// 異動区分が"休止" or "コース変更"以外の場合
					String[] msgParam = new String[] { "KKIFM693001.csv : IDO_DIV" };
					throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0090TE, msgParam);
				}
				
				// メール題名 <- メールタイトル(文字列置換)
				outMap.set(JBSbatKKIFE324.MAIL_TITLE, repTextDataString(resultMail.getString(JBSbatCC_M_MAIL.MAIL_TITLE), repStringTitle, chgTitleNo));
				// メール本文 <- メール本文(置換)
				outMap.set(JBSbatKKIFE324.MAIL_TEXT, repTextDataString(resultMail.getString(JBSbatCC_M_MAIL.MAIL_TEXT), repStringText, chgTextNo));
				// 対応記録タイトル <- 対応記録タイトル
				outMap.set(JBSbatKKIFE324.TAIO_KIROK_TITLE, taioKirokTitle);
				// ファイル出力処理
				outMap.setOutFlg(true);
				outputBean.addOutMapList(outMap);
				
				// 契約内容通知書ステータスの更新
				// setParam = {処理日 , 契約内容通知書番号}
				Object[] setParamKyntcsUpd = { inMap.getString(JBSbatKKIFM693.TRN_DAY), inMap.getString(JBSbatKKIFM693.KNYTCS_NO)};
				this.executeKK_T_KNYTCS_KK_UPDATE_002(setParamKyntcsUpd);
			}
			else
			{
				// 契約内容通知書番号が存在しない場合
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0100AE, new String[]{"契約内容通知書番号:"+inMap.getString(JBSbatKKIFM693.KNYTCS_NO)});
				
			}
		}
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_KNYTCS.close();
		db_CC_M_MAIL.close();
		db_ZM_M_TCHI_MAIL_SENDS.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_004)で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_KNYTCS_KK_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_T_KNYTCS.selectBySqlDefine(paramList, KK_T_KNYTCS_KK_SELECT_004);
	}

	/**
	 * SQLKEY(KK_SELECT_006)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	メールコード
	 *		 	運用日
	 *		 	運用日
	 *		 	運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCC_M_MAIL_KK_SELECT_006(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());

		// DBアクセスを実行します
		db_CC_M_MAIL.selectBySqlDefine(paramList, CC_M_MAIL_KK_SELECT_006);
	}

	/**
	 * SQLKEY(KK_UPDATE_002)で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_KNYTCS_KK_UPDATE_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_KNYTCS.executeBySqlDefine(paramList, KK_T_KNYTCS_KK_UPDATE_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 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 executeZM_M_TCHI_MAIL_SENDS_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_ZM_M_TCHI_MAIL_SENDS.selectBySqlDefine(paramList, ZM_M_TCHI_MAIL_SENDS_KK_SELECT_001);
	}
	
	/**
	 * 文字列内の可変文字を置き換える
	 * <p>
	 * </p>
	 * @param textData 可変文字を含む文字列
	 * @param param    変換する文字列
	 * @return 変換結果（改行コード変更後）
	 */
	private String repTextDataString(String textData, String[] param, String[] chgNo)
	{
		for(int i = 0; i < param.length; i++)
		{
			if (param[i] != null)
			{
				textData = textData.replaceFirst(chgNo[i], param[i]);
			}
		}
		
		return textData;
	}
	
	/**
	 * 値がnullまたは空白かを判定する<br>
	 * @param arg
	 * @return 値がnullまたは空白の場合true
	 */
	private boolean isNullorBlank(String arg)
	{
		if (arg == null || "".equals(arg))
		{
			return true;
		}
		
		return false;
	}
}
