/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKShosaAFSmsSend
*	ソースファイル名	：JBSbatKKShosaAFSmsSend.java
*	作成者				：富士通
*	作成日				：2021年04月12日
*＜機能概要＞
* 照査完了通知SMS情報送信部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	V53.0.0	2021/04/12	FJ) 加藤		【ANK-4009-00-00】CX戦略WG方針対応 新規作成
*   V54.0.0 2021/07/29  FJ) 西窪      　【ANK-4092-00-00】CX戦略WG方針対応STEP2
*   v56.0.0	2021/12/13	FJ) 吉村		【ANK-4174-00-00】開通前マイページ関連業務改善（2022年1月下旬リリース）
*   v60.0.0	2022/08/17	FJ) 藤本涼		【ANK-4262-00-00】量販・訪販Webでの電子交付同意聞き取り方法変更
*********************************************************************/
package eo.business.service;

import java.util.HashMap;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM919;
import eo.business.util.table.JBSbatCC_M_MAIL;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import java.io.BufferedReader;
import java.util.ArrayList;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JKKBatConst;
import eo.business.util.table.JBSbatCR_M_SMS_SENDM_TLN;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
* 照査完了通知SMS送信<BR>
* <BR>
* SMS本文と送信元電話番号を抽出し、読み込んだ「照査完了通知SMS情報」とともに送信する。<BR> 
* <BR>
* @author 富士通
*/
public class JBSbatKKShosaAFSmsSend  extends JBSbatBusinessService
{
/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/

	/** テーブル(WEB申込情報)*/
	private static final String D_TBL_NAME_FU_T_WEB_MSKM_INFO = "FU_T_WEB_MSKM_INFO";
	
	/** テーブル(メール)*/
	private static final String D_TBL_NAME_CC_M_MAIL = "CC_M_MAIL";
	
	/** テーブルアクセスクラス(メール)*/
	private JBSbatSQLAccess db_CC_M_MAIL = null;

	/** テーブルアクセスクラス(WEB申込情報)*/
	private JBSbatSQLAccess db_FU_T_WEB_MSKM_INFO = null;

	// ANK-4174-00-00 ADD START
	/** テーブル(申込)*/
	private static final String D_TBL_NAME_KK_T_MSKM = "KK_T_MSKM";

	/** SQL定義キー(AC_UPDATE_001)*/
	private static final String KK_T_MSKM_KK_UPDATE_001 = "KK_UPDATE_001";

	/** テーブルアクセスクラス(申込)*/
	private JBSbatSQLAccess db_KK_T_MSKM = null;
	// ANK-4174-00-00 ADD END
/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** Excetion発生時のログ出力のメッセージを設定する*/
	
	private String msgid = null;
	private String msg = null;
	
	// 機能コード
	private static String FUNC_CODE = "1";
	
	// メッセージ
	private static String EWCB0200CE = "EWCB0200CE";
	private static String EWCB0190CE = "EWCB0190CE";
	
	// 置換文字
	private static String inputFileName = "照査完了通知SMS情報";
	private static String updateTableName = "WEB申込情報";
	// ANK-4174-00-00 ADD START
	private static String updateMskmTableName = "申込";
	// ANK-4174-00-00 ADD END
	
	/** 照査完了通知SMS情報ファイルパス */
	private String kkifm919FilePath = null;

	/** 入力ファイル定義 */
	private static final String PARAM_IND = "IND";
	
	/** 照査完了通知SMS情報ファイルオブジェクト */
	private JBSbatInputFileUtil kkifm919FileObj = null;
	
	/** 照査完了通知SMS情報抽出ファイル定義 */
	private JBSbatDefFileUtil kkifm919FileObjDef = null;
	
	/** ファイル出力件数 */
	private int outCount = 0;
	
	// ANK-4092-00-00 ADD START
	/** 送信元キー情報種別コード */
	private static final String SENDM_KEYINF_SBTCD_SYSID = "1";
	// ANK-4092-00-00 ADD END
	
	// ANK-4262-00-00 ADD START
	/** SQL定義キー(KK_SELECT_009)*/
	private static final String CC_M_MAIL_KK_SELECT_009 = "KK_SELECT_009";
	
	/** 仮受付状態フラグ 仮受付*/
	private static final String KUK_STAT_FLG_1 = "1";
	// ANK-4262-00-00 ADD END
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CC_M_MAIL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_M_MAIL);

		// DBアクセスクラスを生成します
		db_FU_T_WEB_MSKM_INFO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_FU_T_WEB_MSKM_INFO);

		// ANK-4174-00-00 ADD START
		// DBアクセスクラスを生成します
		db_KK_T_MSKM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_MSKM);
		// ANK-4174-00-00 ADD END
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// フリー項目を取得する
		String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);

		// フリー項目より以下を取得
		// ・入力ファイルパス
		// ・入力ファイル定義
		kkifm919FilePath = freeItems[0];
		String inputDef = freeItems[1];
		
		
		// 入力ファイルオブジェクトの生成
		kkifm919FileObj = new JBSbatInputFileUtil(kkifm919FilePath);
		
		// 入力定義ファイルオブジェクトの生成
		String kkifm919DefFileObjDefNm = JBSbatAplConst.getAplConstValue(PARAM_IND) + inputDef;
		kkifm919FileObjDef = new JBSbatDefFileUtil(kkifm919DefFileObjDefNm, kkifm919FileObj);
		
		kkifm919FileObj.createReader();
				
		// ファイル出力件数
		outCount = 0;
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		//エラー件数
		int businessErrCnt = 0;
		
		
		// 項目を設定
		//メール
		String message =inMap.getString(JBSbatCC_M_MAIL.MAIL_TEXT);
		//SMS送信元電話番号
		String senderName = inMap.getString(JBSbatCR_M_SMS_SENDM_TLN.SMS_SENDM_TLN);
		
		// ANK-4262-00-00 ADD START
		// 仮受付用SMS本文取得マップ
		JBSbatCommonDBInterface kukSmsRcvMap = new JBSbatCommonDBInterface();	
		kukSmsRcvMap = getCC_M_MAIL_KK_SELECT_009();
		String kukMessage = kukSmsRcvMap.getString(JBSbatCC_M_MAIL.MAIL_TEXT);
		// ANK-4262-00-00 ADD END
		
		// 照査完了通知SMS情報ファイル件数分を繰返す
		BufferedReader br = null;
		try
		{

			// Excetion発生時のログ出力のメッセージを設定する
			msgid = EWCB0200CE;						//%1%ファイルの読み込みに失敗しました。
			msg = inputFileName;				// 読み込むファイル名
			
			while (kkifm919FileObj.ready())
			{
				// 1行読込み
				JBSbatServiceInterfaceMap kkifm919DefFileObjLine =
					kkifm919FileObjDef.lineToObject(kkifm919FileObj.readLine(), kkifm919FileObj, 0);
			
				/** 対象データ取得 */
				String sysid = kkifm919DefFileObjLine.getString(JBSbatKKIFM919.SYSID);					// SYSID
				String address = kkifm919DefFileObjLine.getString(JBSbatKKIFM919.KEISHA_TELNO);			// 契約者電話番号
				String KanriNo = kkifm919DefFileObjLine.getString(JBSbatKKIFM919.KANRI_NO);				// 管理番号
				// ANK-4174-00-00 ADD START
				String mskmNo = kkifm919DefFileObjLine.getString(JBSbatKKIFM919.MSKM_NO);				// 申込番号
				// ANK-4174-00-00 ADD END
				// ANK-4262-00-00 ADD START
				String kukStatFlg = kkifm919DefFileObjLine.getString(JBSbatKKIFM919.KUK_STAT_FLG);		// 仮受付状態フラグ
				// ANK-4262-00-00 ADD END


				// 送信用マップを生成
				HashMap<String, Object> inputMap = new HashMap<String, Object>();
				HashMap<String, Object> KKSV0980inputMap = new HashMap<String, Object>();

				inputMap.put("func_code", FUNC_CODE);
				inputMap.put("address", address);
				inputMap.put("senderName", senderName);
				// ANK-4262-00-00 ADD START
				// 仮受付状態フラグが"1"(仮受付)の場合、仮受付用SMS本文を設定する
				if (KUK_STAT_FLG_1.equals(kukStatFlg))
				{
					inputMap.put("message", kukMessage);
				}
				else
				{
				// ANK-4262-00-00 ADD END
					inputMap.put("message", message);
				// ANK-4262-00-00 ADD START
				}
				// ANK-4262-00-00 ADD END
				// ANK-4092-00-00 ADD START
				inputMap.put("sendmKeyInf", sysid);
				inputMap.put("sendmKeyInfSbtCd", SENDM_KEYINF_SBTCD_SYSID);
				// ANK-4092-00-00 ADD END
				KKSV0980inputMap.put("KKSV098001SC", inputMap);
				

				// ユースケースIDを格納するMAP
				HashMap<Object, Object>  paramMap = new HashMap<Object, Object>();
				paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, "KKSV0980");
				paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, "KKSV0980OP");

				// サービスの処理結果の格納用MAP
				HashMap<String, Object> outputMap = new HashMap<String, Object>();
				
				// サービス呼び出し
				JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, KKSV0980inputMap, outputMap);
				
				// サービスの処理結果を判定
				String returnCode = outputMap.get(JCCBatchEsbInterface.RETURN_CODE).toString();
				if(!JCCBatchEsbInterface.RETURN_CODE_SUCCESS.equals(returnCode))
				{
					// サービスの処理結果より取得
					HashMap<String, Object> resultMap = (HashMap<String, Object>)outputMap.get("KKSV098001SC");
					

					ArrayList<HashMap<String, String>> resultList = (ArrayList<HashMap<String, String>>)resultMap.get("EKKA1880001CBSMsg1List");

					if(resultList!=null && resultList.size()>0){

						HashMap<String, String> sendSmsErrResponse = (HashMap<String, String>)resultList.get(0);
						
						String errorReason = (String)sendSmsErrResponse.get("errorReason");
						String http_status = (String)sendSmsErrResponse.get("http_status");
						
						// HTTPステータスよりエラーコード、エラーメッセージを設定
						String errCode = null;
						String errMessage = null;
						
						if("400".equals(http_status))
						{
							errCode = "Bad Request";
							errMessage = "不正なリクエストを受信しました";
						}
						else if("401".equals(http_status) )
						{
							errCode = "Unauthorized";
							errMessage = "認証エラー";
						}
						else if("404".equals(http_status))
						{
							errCode = "Not Found";
							errMessage = "URLの誤り";
						}
						else if("500".equals(http_status))
						{
							errCode = "Internal Server Error";
							errMessage = "APL内処理での異常発生";
						}
						else if("503".equals(http_status))
						{
							errCode = "Service Unavailable";
							errMessage = "APLの輻輳規制による応答";
						}
						else
						{
							errCode = " ";
							errMessage = "想定外のエラー";
						}
						// エラーカウントを加算
						businessErrCnt++;
						
						//送信失敗の場合、ログに出力する
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
	
						// 送信エラーログ出力
						String[] msgParam = new String[]{"SYSID：" + sysid + "　, 契約者電話番号：" + address + "　, HTTPステータス：" + http_status + "　, エラー内容：" + errorReason + "　, エラーコード：" + errCode + "　, エラーメッセージ：" + errMessage };
						super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1270CW, msgParam);
						
						//エラー件数設定
						super.commonItem.setErrorCount(businessErrCnt);

					
					}else{
						//TODO 単項目エラーを設定
						super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1270CW, new String[]{"単項目エラー"});
						
					}
				}
				else
				{
					// Excetion発生時のログ出力のメッセージを設定する
					msgid = EWCB0190CE;						// %1%データベースの書き込みに失敗しました。
					msg = updateTableName;				// selectを実施するテーブル名

					//送信完了の場合、WEB申込情報.SMS送信年月日を更新する
					// パラメータの設定
					Object[] setParam = {
							super.opeDate,
							KanriNo,
					};

					// UPDATE文を実行
					executeFU_T_WEB_MSKM_INFO_KK_UPDATE_001(setParam);

					// ANK-4174-00-00 ADD START
					// Exception発生時のログ出力のメッセージを設定する
					msgid = EWCB0190CE;						// %1%データベースの書き込みに失敗しました。
					msg = updateMskmTableName;				// selectを実施するテーブル名

					//送信完了の場合、申込.照査完了通知を更新する
					// パラメータの設定
					Object[] setParam_2 = {
							"1",
							mskmNo,
					};

					// UPDATE文を実行
					executeKK_T_MSKM_KK_UPDATE_001(setParam_2);
					// ANK-4174-00-00 ADD END

					// 送信完了ログ出力
					String[] msgParam = new String[]{"SMS送信" , "SYSID：" + sysid + "　, 契約者電話番号：" + address  };
					super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECRB0440AI, msgParam);
				}

				// データ件数計算
				outCount++;
			}


			// 送信失敗ログに1件以上出力した場合
			if(businessErrCnt > 0)
			{
				// マイナーエラー処理
				commonItem.addErrorCount(1);
			}

			return null;
		}
		catch (Exception e)
		{
			// 照査完了通知SMS情報ファイルがない場合０件と同様とする
			super.logPrint.printDebugLog("照査完了通知SMS情報ファイルなし");
			
			// DB、ファイルアクセスエラーの場合メジャーアラームを発生させる。
			throw new JBSbatBusinessException(msgid, new String[]{msg});
		}
		finally
		{
			if (null != br)
			{
				br.close();
			}
		}

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CC_M_MAIL.close();
		db_FU_T_WEB_MSKM_INFO.close();
		// ANK-4174-00-00 ADD START
		db_KK_T_MSKM.close();
		// ANK-4174-00-00 ADD END
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	/**
	 * SQLKEY(KK_UPDATE_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 executeFU_T_WEB_MSKM_INFO_KK_UPDATE_001(Object[] param) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("SMS_SEND_YMD", param[0]);

		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("KANRI_NO",  param[1]);
		
		// DBアクセスを実行します
		db_FU_T_WEB_MSKM_INFO.updateByPrimaryKeys(whereMap, setMap);
	}

	// ANK-4174-00-00 ADD START
	/**
	 * SQLKEY(KK_UPDATE_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_MSKM_KK_UPDATE_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_MSKM.executeBySqlDefine(paramList, KK_T_MSKM_KK_UPDATE_001);
	}
	// ANK-4174-00-00 ADD END
	// ANK-4262-00-00 ADD START
	/**
	 * 仮受付用SMS本文を取得します。
	 * <BR>
	 * @throws Exception 
	 * @return telnoRcvMap
x	 */
	private JBSbatCommonDBInterface getCC_M_MAIL_KK_SELECT_009() throws Exception
	{
		JBSbatCommonDBInterface smsMessageMap = new JBSbatCommonDBInterface();
		
		// パラメータの設定
		Object[] setParam = {
				super.opeDate,
				super.opeDate,
				super.opeDate,
				super.opeDate,
				super.opeDate,
		};
		// 仮受付用SMS本文を取得
		executeCC_M_MAIL_KK_SELECT_009(setParam);
	
		// データを読む
		smsMessageMap = db_CC_M_MAIL.selectNext();
		
		if(smsMessageMap == null || smsMessageMap.getMapSize() == 0 )
		{
			return new JBSbatCommonDBInterface();
		}

		return smsMessageMap;
	}
	
	/**
	 * SQLKEY(KK_SELECT_009)で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_009(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());

		// DBアクセスを実行します
		db_CC_M_MAIL.selectBySqlDefine(paramList, CC_M_MAIL_KK_SELECT_009);
	}
	// ANK-4262-00-00 ADD END
}
