/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKOrsJgsKeiIdtDsl
*	ソースファイル名	：JBSbatKKOrsJgsKeiIdtDsl.java
*	作成者				：富士通
*	作成日				：2018年04月06日
*＜機能概要＞
*卸先事業者解約部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v37.00.00   2018/04/06  FJ)澤田   【ANK-3366-00-00】eo光設備卸対応
*   v37.01.00   2018/04/27  FJ)藤本   【IT1-2018-0000053】連絡事項に工事会社連携情報メモが登録されない(水平展開対応)
*   v71.00.00   2024/03/25  FJ)森本   【ANK-4512-00-00】卸契約遡及解約対象チェック機能追加
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM788;
import eo.common.constant.JKKStrConst;
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.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKOrsJgsKeiIdtDsl extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	
	/** テーブル(卸先事業者契約異動通知)*/
	private static final String D_TBL_NAME_KK_T_ORSJGS_KEI_IDT = "KK_T_ORSJGS_KEI_IDT";

	/** SQL定義キー(KK_SELECT_228)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_228 = "KK_SELECT_228";

	/** SQL定義キー(KK_SELECT_300)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_300 = "KK_SELECT_300";

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	
	/** テーブルアクセスクラス(卸先事業者契約異動通知)*/
	private JBSbatSQLAccess db_KK_T_ORSJGS_KEI_IDT = null;
	
	/** 対象データマップ */
	private static final String KKSV089801CC = "KKSV089801CC";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		// 中間ファイルが空ファイルの場合は継続処理を行わず、警告を返す。
		if(!super.commonItem.getInput_data_flg())
		{
			super.logPrint.printBusinessErrorLog("EKKB0720KW",
			new String[]{ "卸先事業者解約対象情報ファイル" });
		}

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_ORSJGS_KEI_IDT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_ORSJGS_KEI_IDT);
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		try
		{
			
			// 入力ファイルの内容取得
			String inputOrsjgsKeiIdtNo = inMap.getString(JBSbatKKIFM788.ORSJGS_KEI_IDT_NO);//卸先事業者契約異動通知番号
			String inputSvcKeiNo = inMap.getString(JBSbatKKIFM788.SVC_KEI_NO);//サービス契約番号
			// ANK-4512-00-00 ADD Start
			String inputOrsjgsCd = inMap.getString(JBSbatKKIFM788.ORSJGS_CD);//卸先事業者コード
			// ANK-4512-00-00 ADD End
			String inputOrsjgsDslSbtCd = inMap.getString(JBSbatKKIFM788.ORSJGS_DSL_SBT_CD);//卸先事業者解約種別コード
			String inputtkWaySbtCd = inMap.getString(JBSbatKKIFM788.TK_WAY_SBT_CD);//撤去方法種別コード 
			String inputdslProscstNm = inMap.getString(JBSbatKKIFM788.DSL_PROSCST_NM);//解約問合せ客名 
			String inputtkKojiRrksTln = inMap.getString(JBSbatKKIFM788.TK_KOJI_RRKS_TLN);//撤去工事連絡先電話番号 
			String inputKojiApoTaioshaNm = inMap.getString(JBSbatKKIFM788.KOJI_APO_TAIOSHA_NM);//工事アポ対応者名 
			String inputKojiTachiaishaNm = inMap.getString(JBSbatKKIFM788.KOJI_TACHIAISHA_NM);//工事立会者名 
			String inputKocompRnkiInfMemo = inMap.getString(JBSbatKKIFM788.KOCOMP_RNKI_INF_MEMO);//工事会社連携情報メモ  
			String inputOrsjgsKeiIdoRsvYmd = inMap.getString(JBSbatKKIFM788.ORSJGS_KEI_IDO_RSV_YMD);//卸先事業者契約異動予約年月日 
			String inputSysid = inMap.getString(JBSbatKKIFM788.SYSID);//SYSID 
			String inputSvcCd = inMap.getString(JBSbatKKIFM788.SVC_CD);//サービスコード 
			String inputSeikyKeiNo = inMap.getString(JBSbatKKIFM788.SEIKY_KEI_NO);//請求契約番号 
			
			// 解約対象情報抽出
			Object[] setParam = 
			{
					inputSvcKeiNo,// サービス契約番号
					super.opeDate,
			};
			executeKK_T_SVC_KEI_KK_SELECT_300(setParam);
			
			// 解約対象外の場合、次のレコードを読み込む。
			JBSbatCommonDBInterface dateMap = db_KK_T_SVC_KEI.selectNext();
			
			// 取得できなかった場合、処理を終了する。
			if(dateMap == null){
				super.logPrint.printBusinessErrorLog("EKKB1620KW", 
						new String[]{ inputSvcKeiNo , "解約" });
				super.commonItem.setErrFlg(true);
				//エラー 課金終了日は未設定
				updateOrsjgsKeiIdt(null, inputOrsjgsKeiIdtNo, "2", "契約状態が解約処理対象外です。");
				return null;
			}
			
			String svcKeiStat = dateMap.getString("SVC_KEI_STAT");
			//サービス契約ステータスが"100"、"210"、"220"以外の場合
			if (!(JKKStrConst.CD00037_SVCTK_CHU.equals(svcKeiStat) ||
					JKKStrConst.CD00037_STAT_PAUSE.equals(svcKeiStat) ||
						JKKStrConst.CD00037_STAT_STP.equals(svcKeiStat)))
			{
				
				super.logPrint.printBusinessErrorLog("EKKB1620KW", 
						new String[]{ inputSvcKeiNo , "解約" });
				super.commonItem.setErrFlg(true);
				//エラー 課金終了日は未設定
				updateOrsjgsKeiIdt(null, inputOrsjgsKeiIdtNo, "2", "契約状態が解約処理対象外です。");
				return null;
			}
			
			// ユースケースIDを格納するMAP
			HashMap<String,Object> paramMap = new HashMap<String,Object>();
			paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, "KKSV0898");
			
			// サービスに渡す業務データを格納するMAP
			HashMap<String,Object> inputMap = new HashMap<String,Object>();
			
			// inputMapに設定するデータをHashMapで構築する。
			HashMap<String,Object> dataMap = new HashMap<String,Object>();

			// 共通情報のマッピング
			dataMap.put("func_code", "1");

			// 部品呼び出し → 解約実行マップ.起動元コード
			dataMap.put("kido_cd", String.valueOf("02"));
			// ＳＹＳＩＤ → 解約実行マップ.ＳＹＳＩＤ
			dataMap.put("sysid", inputSysid);
			// サービス契約番号 → 解約実行マップ.サービス契約番号
			dataMap.put("svc_kei_no", inputSvcKeiNo);
			// サービスコード → 解約実行マップ.サービスコード
			dataMap.put("tekyo_kbn_svc_cd", inputSvcCd);
			// 撤去方法種別コード  → 解約実行マップ.工事範囲コード
			dataMap.put("tk_way_sbt_cd", inputtkWaySbtCd);
			// 工事会社連携情報メモ  → 解約実行マップ.工事案件連絡事項
			// IT1-2018-0000053 MOD START
//			dataMap.put("rrk_jiko", inputKocompRnkiInfMemo);
			dataMap.put("rrk_jiko", "工事会社連携情報メモ：" + inputKocompRnkiInfMemo);
			// IT1-2018-0000053 MOD END
			// 解約問合せ客名   → 解約実行マップ.申込者名 
			dataMap.put("mskmsha_nm", inputdslProscstNm);
			// 撤去工事連絡先電話番号  → 解約実行マップ.工事アポ連絡先電話番号
			dataMap.put("koji_apo_rrks_telno", inputtkKojiRrksTln);
			// 工事立会者名、工事アポ対応者名 → 解約実行マップ.工事案件備考1
			// OM#81535 MOD START
			// IT1-2018-0000053 MOD START
//			dataMap.put("kojiak_biko_1", "{工事立会者名：" + inputKojiTachiaishaNm + "}、{工事アポ対応者名：" + inputKojiApoTaioshaNm);
			boolean warningFlg = false;
			String bikou = "工事立会者名：" + inputKojiTachiaishaNm + "、工事アポ対応者名：" + inputKojiApoTaioshaNm;
			if(bikou.length() > 200){
				dataMap.put("kojiak_biko_1", bikou.substring(0, 200));
				warningFlg = true;
			}
			else
			{
				dataMap.put("kojiak_biko_1", bikou);
			}
			// IT1-2018-0000053 MOD END
			// OM#81535 MOD END
			// 卸先事業者契約異動予約年月日  → 解約実行マップ.解約希望日
			dataMap.put("dsl_ymd_tekkyo", inputOrsjgsKeiIdoRsvYmd);
			//卸先事業者解約種別コード 
			dataMap.put("orsjgs_dsl_sbt_cd", inputOrsjgsDslSbtCd);
			//異動区分を設定
			String idoDiv = "";
			//卸先事業者解約種別コードが１（通常解約）の場合
			if ("1".equals(inputOrsjgsDslSbtCd))
			{
				idoDiv = "00005";
			}
			else
			{
				idoDiv = "00064";
			}
			dataMap.put("ido_div", idoDiv);
			// 備考 → 解約実行マップ.業務連絡備考
			dataMap.put("work_rrk_biko", null);
			// サービス終了年月日 → 解約実行マップ.サービス終了年月日
			dataMap.put("svc_endymd", super.opeDate);
			// サービス課金終了年月日 → 解約実行マップ.サービス課金終了年月日
			dataMap.put("svc_chrg_endymd", super.opeDate);
			// 違約金発生区分（選択） → 解約実行マップ.違約金発生コード
			String pnltyHasseiCd = "";
			if ("2".equals(inputSvcCd))
			{
				pnltyHasseiCd = "2";
			}
			else
			{
				pnltyHasseiCd = "1";
			}
			dataMap.put("pnlty_hassei_cd", pnltyHasseiCd);
			
			HashMap<String,Object> inputIdoRsnCd = new HashMap<String,Object>();
			// 異動理由データリストをArrayListで構築する。
			ArrayList<HashMap<String,Object>> inputIdoRsnDataList = new ArrayList<HashMap<String,Object>>();
			// 異動理由明細リスト.異動理由コード → 進捗登録マップ.異動理由明細.異動理由コード
			inputIdoRsnCd.put("ido_rsn_cd", "56");
			inputIdoRsnDataList.add(inputIdoRsnCd);
			dataMap.put("ido_list", inputIdoRsnDataList);
			//請求先番号
			dataMap.put("seiky_kei_no", inputSeikyKeiNo);
			//基準日
			dataMap.put("reqymd", super.opeDate);
			inputMap.put(KKSV089801CC, dataMap);
			
			// サービスの処理結果が格納されるMAP
			HashMap<String,Object> outputMap = new HashMap<String,Object>();
			
			String returnCode = null;
			// IT1-2018-0000053 MOD START
			// NG理由がnullに更新されない事象を修正(JBSbatCommonDBInterface.setValueの仕様でnullは更新対象とされない)
//			String orsjgsKeiIdtNgRsn = null;
			String orsjgsKeiIdtNgRsn = "";
			// IT1-2018-0000053 MOD END
			
			boolean isSuccess = false;
			// OM#81535 MOD START
			// 工事案件備考1が201文字以上の場合、ログ出力とマイナーアラームを発行
			if (warningFlg)
			{
				// サービス契約番号を業務ログに出力
				String msgParam = "工事案件備考１";
				super.logPrint.printBusinessErrorLog("EKKB2260AW", 
						new String[]{ msgParam , inputSvcKeiNo });
				super.commonItem.setErrFlg(true);
			}
			// OM#81535 MOD END
			try
			{
				// サービス呼び出し
				JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
	
				// サービスの処理結果が格納されたoutputMapから指定したキーで値を取得する。
				returnCode = JCCBatchEsbInterface.getReturnCode(outputMap);
				
				HashMap<String, Object> map = (HashMap<String, Object>)outputMap.get(KKSV089801CC);
				String msgParam = null;
				if (map != null && "1".equals(map.get("TEKKYO_DSL_ERR_FLG")))
				{
					msgParam = "撤去解約";
					orsjgsKeiIdtNgRsn = "卸先事業者撤去解約時、エラーが発生しました。";
				}
				// サービスがエラーを返した場合
				else if (!JKKStrConst.CHECK_OK.equals(returnCode))
				{
					msgParam = "解約";
					orsjgsKeiIdtNgRsn = "卸先事業者解約時、エラーが発生しました。";
				}
				
				if (msgParam == null)
				{
					isSuccess = true;
				}
				else
				{
					super.logPrint.printBusinessErrorLog("EKKB1670KW", 
							new String[]{ msgParam , inputSvcKeiNo });
					super.commonItem.setErrFlg(true);
				}
			}
			catch(Throwable e)
			{
				String msgParam = "解約";
				orsjgsKeiIdtNgRsn = "卸先事業者解約時、エラーが発生しました。";
				super.logPrint.printBusinessErrorLog("EKKB1670KW", 
						new String[]{ msgParam , inputSvcKeiNo });
				super.commonItem.setErrFlg(true);
			}
			
			String chrgEndYmd = "";
			String orsjgsKeiIdtRsltCd = "2";
			if (isSuccess)
			{
				// ANK-4512-00-00 ADD Start
				// 遡及解約判定：卸先事業者契約異動予約年月日(解約希望日)がバッチ運用日よりも前の日の場合、ログ出力とマイナーアラームを発行
				if (JPCUtilCommon.isPastDate(inputOrsjgsKeiIdoRsvYmd, super.opeDate, "0"))
				{
					super.logPrint.printBusinessErrorLog("EKKB2270KW", 
							new String[]{ inputOrsjgsKeiIdoRsvYmd, inputSvcKeiNo, inputOrsjgsCd });
					super.commonItem.setErrFlg(true);
				}

				// ANK-4512-00-00 ADD End
				// サービス契約情報抽出
				setParam = new Object[]
				{
						inputSvcKeiNo,// サービス契約番号
						super.opeDate,
				};
				executeKK_T_SVC_KEI_KK_SELECT_228(setParam);
				
				dateMap = db_KK_T_SVC_KEI.selectNext();
				if(dateMap != null){
					// 課金終了年月日設定
					chrgEndYmd = dateMap.getString("SVC_CHRG_ENDYMD");
				}
				orsjgsKeiIdtRsltCd = "1";
			}
			
			// 解約処理結果を卸先事業者契約異動通知スキーマに対して更新をおこなう。
			updateOrsjgsKeiIdt(chrgEndYmd, inputOrsjgsKeiIdtNo, orsjgsKeiIdtRsltCd, orsjgsKeiIdtNgRsn);
			
		}
		catch(Exception e)
		{
			throw e;
		}

		return null;
	}
	
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
		db_KK_T_ORSJGS_KEI_IDT.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * SQLKEY(KK_SELECT_228)で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_SVC_KEI_KK_SELECT_228(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_228);
	}
	
	/**
	 * SQLKEY(KK_SELECT_300)で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_SVC_KEI_KK_SELECT_300(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_300);
	}
	
	/**
	 * 卸先事業者契約異動通知スキーマの更新を行う<br>
	 * @param  orsjgsKeiIdoNo
	 * @param  orsjgsKeiIdtRsltCd
	 * @throws Exception 
	 */
	private void updateOrsjgsKeiIdt(String chrgEndYmd, String orsjgsKeiIdoNo, String orsjgsKeiIdtRsltCd, String orsjgsKeiIdtNgRsn) throws Exception
	{
		// 設定項目を設定します。
		String [] setParam = {chrgEndYmd, orsjgsKeiIdtRsltCd, super.opeDate, orsjgsKeiIdtNgRsn};
		// 条件項目を設定します。
		String [] whereParam = {orsjgsKeiIdoNo};
		
		// 卸先事業者契約異動通知スキーマ登録
		executeKK_T_ORSJGS_KEI_IDT_PKUPDATE(setParam, whereParam);
		
		// コミット処理を行う
		super.commit();
	}
	
	/**
	 * PK(ＰＫ 更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	卸先事業者契約異動通知結果コード				ORSJGS_KEI_IDT_RSLT_CD
	 *		 	卸先事業者契約異動処理年月日					ORSJGS_KEI_IDO_TRN_YMD
	 *		 	卸先事業者契約異動通知NG理由					ORSJGS_KEI_IDT_NG_RSN
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	卸先事業者契約異動通知番号						ORSJGS_KEI_IDT_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_ORSJGS_KEI_IDT_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("CHRG_ENDYMD", setParam[0]);
		setMap.setValue("ORSJGS_KEI_IDT_RSLT_CD", setParam[1]);
		setMap.setValue("ORSJGS_KEI_IDO_TRN_YMD", setParam[2]);
		setMap.setValue("ORSJGS_KEI_IDT_NG_RSN", setParam[3]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("ORSJGS_KEI_IDT_NO", whereParam[0]);

		// DBアクセスを実行します
		db_KK_T_ORSJGS_KEI_IDT.updateByPrimaryKeys(whereMap, setMap);
	}
	
}