/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHMineoRiteiykMailMakeCr
*	ソースファイル名	：JBSbatCHMineoRiteiykMailMakeCr.java
*	作成者				：富士通　
*	作成日				：2016年11月16日
*＜機能概要＞
*　ｍｉｎｅｏ利用停止予告メール送信情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2016/11/16   富士通		新規作成
*	v28.00.00   2016/12/14   FJ)西面    【IT1-2016-0000168】対応記録タイトルの表示文言不備
*	v41.00.00   2019/02/04   FJ)山地    【ANK-3396-00-00】利用停止スケジュールの変更
*	v41.00.01   2019/03/12   FJ)山地    【IT1-2019-0000041】債権年月の取得条件不備
*	v68.00.00   2023/11/23   FJ)吉田賢  【ANK-4495-00-00】mineo譲渡後の利停処理改善
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatCHIFE519;
import eo.business.util.file.JBSbatCHIFM096;
import eo.business.util.file.JBSbatCHIFM275;
import eo.business.util.table.JBSbatCC_M_MAIL;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatOutputFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHMineoRiteiykMailMakeCr extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(メール)*/
	private static final String D_TBL_NAME_CC_M_MAIL = "CC_M_MAIL";

	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";
	
	// ANK-3396-00-00 ADD START
	/** テーブル(債権)*/
	private static final String D_TBL_NAME_CH_T_SAIKEN = "CH_T_SAIKEN";
	// ANK-3396-00-00 ADD END

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String CC_M_MAIL_CH_SELECT_001 = "CH_SELECT_001";

	/** SQL定義キー(CH_SELECT_020)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_CH_SELECT_020 = "CH_SELECT_020";

	// IT1-2019-0000041 MOD START
	// ANK-3396-00-00 ADD START
	// /** SQL定義キー(CH_SELECT_034)*/
//	private static final String CH_T_SAIKEN_CH_SELECT_034 = "CH_SELECT_034";
	/** SQL定義キー(CH_SELECT_038)*/
	private static final String CH_T_SAIKEN_CH_SELECT_038 = "CH_SELECT_038";
	// ANK-3396-00-00 ADD END
	// IT1-2019-0000041 MOD END

	/** テーブルアクセスクラス(メール)*/
	private JBSbatSQLAccess db_CC_M_MAIL = null;

	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;
	
	// ANK-3396-00-00 ADD START
	/** テーブルアクセスクラス(債権)*/
	private JBSbatSQLAccess db_CH_T_SAIKEN = null;
	// ANK-3396-00-00 ADD END
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** オーソリNGのメール情報 */
	private static HashMap<String,String> osoriNgMailMap = null;

	/** 有効性NGおよびカード会社依頼決済停止のメール情報 */
	private static HashMap<String,String> yukoNgMailMap = null;
	
	/** 口振引落NGのメール情報 */
	private static HashMap<String,String> KhriDebitNgMailMap = null;

//v28.00.00 Mod Start
	/** オーソリNGの対応記録タイトル */
//	private static final String TAIO_KIROK_TITLE_HOSEI = "【mineo】強制解約予告メール（オーソリNG）";
	
	private static final String TAIO_KIROK_TITLE_HOSEI = "【mineo】利用停止予告メール（オーソリNG）";
//v28.00.00 Mod End

//v28.00.00 Mod Start
	/** 有効性NGおよびカード会社依頼決済停止の対応記録タイトル */
//	private static final String TAIO_KIROK_TITLE_YUKO  = "【mineo】利用停止予告メール(有効性NG)";
	
	private static final String TAIO_KIROK_TITLE_YUKO  = "【mineo】利用停止予告メール（有効性NG）";
	
//v28.00.00 Mod End
	
	// ANK-3396-00-00 ADD START
	/** 早期利用停止対象者の対応記録タイトル */
	private static final String TAIO_KIROK_TITLE_EARLY  = "【mineo】利用停止予告メール（早期利用停止）";

	/** 債権年月 */
	private static final String SAIKEN_YM = "SAIKEN_YM";
	// ANK-3396-00-00 ADD END

	/** レコード件数 */
	private int dataCnt  = 0;
	
	// ANK-3396-00-00 ADD START
	/** サービス契約番号 */
	private String svc_kei_no = null;
	
	/** 早期利用停止フラグ:対象 */
	private String early_use_stp_flg_trgt = "1";
	// ANK-3396-00-00 ADD END

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	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_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
		// ANK-3396-00-00 ADD START
		db_CH_T_SAIKEN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SAIKEN);
		// ANK-3396-00-00 ADD END
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		//[オーソリNG]のメール情報を取得する
		JBSbatCommonDBInterface osoriNgFormatRcd = getMailFormat(JACStrConst.MAIL_CD_CHM1000001);
		osoriNgMailMap = osoriNgFormatRcd.getMap();

		//[有効性NG]または[カード会社依頼決済停止]のメール情報を取得する
		JBSbatCommonDBInterface yukoNgFormatRcd = getMailFormat(JACStrConst.MAIL_CD_CHM1000002);
		yukoNgMailMap = yukoNgFormatRcd.getMap();

		//運用日時点で最新の請求年月日を取得
		String seikyYmd = getSeikyYmd();

		//請求年月日と運用日を配列で渡し、成形された配列をもらう
		String[] ymdDateAry = makeYmdDate(seikyYmd, super.opeDate);
		//請求月
		String eventMonth = ymdDateAry[0];
		String eventDay = ymdDateAry[1];
		String unyoMonth = ymdDateAry[2];

		//督促理由がオーソリNGのメール本文を設定
		makeMailText(osoriNgMailMap, eventMonth, eventDay, unyoMonth);

		//督促理由が有効性NGまたはカード会社依頼決済停止のメール本文を設定
		makeMailText(yukoNgMailMap, eventMonth, eventDay, unyoMonth);


	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		// 出力電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		//mineo利用停止予告メール送信の出力マップを生成
		JBSbatServiceInterfaceMap mineoRtiMailMap = new JBSbatServiceInterfaceMap();

		//mineo督促理由コードを取得する
		String mineoTkskRsnCd = inMap.getString(JBSbatCHIFM275.MINEO_TKSK_RSN_CD);
		
		// ANK-3396-00-00 ADD START
		// 早期利用停止フラグの取得
		String earlyUseStpFlg = inMap.getString(JBSbatCHIFM275.EARLY_USE_STP_FLG);
		// ANK-3396-00-00 ADD END
		
		// ANK-3396-00-00 MOD START
//		//督促理由コードがオーソリNGの場合
//		if(JACStrConst.MINEO_TKSK_RSN_CD_AUTHORI_NG.equals(mineoTkskRsnCd))
//		{
//			//mineo利用停止予告メール送信情報（クレ）作成
//			mineoRtiMailMap = setSendMail(inMap,osoriNgMailMap,mineoTkskRsnCd);
//
//			//出力内容を設定
//			outputBean.addOutMapList_2(mineoRtiMailMap);
//
//			//料金履歴情報を設定
//			prcrrkMake(outputBean,inMap,mineoTkskRsnCd);
//			dataCnt++;
//		}
//
//		//有効性NGまたはカード会社依頼決済停止の場合
//		else if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(inMap.getString(JBSbatCHIFM275.MINEO_TKSK_RSN_CD))||
//				JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(inMap.getString(JBSbatCHIFM275.MINEO_TKSK_RSN_CD)))
//		{
//			//mineo利用停止予告メール送信情報（クレ）作成
//			mineoRtiMailMap = setSendMail(inMap,yukoNgMailMap,mineoTkskRsnCd);
//
//			//出力内容を設定する。
//			outputBean.addOutMapList_2(mineoRtiMailMap);
//			
//			//料金履歴情報を設定
//			prcrrkMake(outputBean,inMap,mineoTkskRsnCd);
//			dataCnt++;
//		}
		
		// 早期利用停止フラグが"0"の場合
		if (!(early_use_stp_flg_trgt.equals(earlyUseStpFlg)))
		{
			//督促理由コードがオーソリNGの場合
			if(JACStrConst.MINEO_TKSK_RSN_CD_AUTHORI_NG.equals(mineoTkskRsnCd))
			{
				//mineo利用停止予告メール送信情報（クレ）作成
				mineoRtiMailMap = setSendMail(inMap,osoriNgMailMap,mineoTkskRsnCd,earlyUseStpFlg);
				
				//出力内容を設定
				outputBean.addOutMapList_2(mineoRtiMailMap);
				
				//料金履歴情報を設定
				prcrrkMake(outputBean,inMap,mineoTkskRsnCd,earlyUseStpFlg);
				dataCnt++;
			}
			
			//有効性NGまたはカード会社依頼決済停止の場合
			// ANK-4495-00-00 MOD START
//			else if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(inMap.getString(JBSbatCHIFM275.MINEO_TKSK_RSN_CD))||
//					JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(inMap.getString(JBSbatCHIFM275.MINEO_TKSK_RSN_CD)))
			else if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(inMap.getString(JBSbatCHIFM275.MINEO_TKSK_RSN_CD)) ||
					JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(inMap.getString(JBSbatCHIFM275.MINEO_TKSK_RSN_CD)) ||
					JACStrConst.MINEO_TOKUSK_RSN_CD_MDGC.equals(inMap.getString(JBSbatCHIFM275.MINEO_TKSK_RSN_CD))
			)
			// ANK-4495-00-00 MOD END
			{
				//mineo利用停止予告メール送信情報（クレ）作成
				mineoRtiMailMap = setSendMail(inMap,yukoNgMailMap,mineoTkskRsnCd,earlyUseStpFlg);
				
				//出力内容を設定する。
				outputBean.addOutMapList_2(mineoRtiMailMap);
				
				//料金履歴情報を設定
				prcrrkMake(outputBean,inMap,mineoTkskRsnCd,earlyUseStpFlg);
				dataCnt++;
			}
		}
		// 早期利用停止フラグが"1"の場合
		else
		{
			//[口振引落NG]のメール情報を取得する
			JBSbatCommonDBInterface KhriDebitNgFormatRcd = getMailFormat(JACStrConst.MAIL_CD_CHM1000003);
			KhriDebitNgMailMap = KhriDebitNgFormatRcd.getMap();
			
			//債権年月の取得（最古:0、最新:1）
			String saikenYm[] = saikenYmGet(inMap);
			
			//督促理由が口振引落NGのメール本文を設定
			makeEarlyUseStpMailText(KhriDebitNgMailMap, saikenYm);
			
			//mineo利用停止予告メール送信情報（クレ）作成
			mineoRtiMailMap = setSendMail(inMap,KhriDebitNgMailMap,mineoTkskRsnCd,earlyUseStpFlg);
			
			//出力内容を設定する。
			outputBean.addOutMapList_2(mineoRtiMailMap);
			
			//料金履歴情報を設定
			prcrrkMake(outputBean,inMap,mineoTkskRsnCd,earlyUseStpFlg);
			dataCnt++;
		}
		// ANK-3396-00-00 MOD END
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		
		// 件数ファイルオブジェクト
		JBSbatOutputFileUtil cntFile = null;

		try
		{
			// フリーパラメータをチェック
			if(super.freeItem == null || "".equals(super.freeItem))
			{
				// 件数ファイルパラメータ異常
				throw new Exception();
			}
			// 件数ファイル作成
			cntFile = new JBSbatOutputFileUtil(super.freeItem);
			cntFile.setEncode(JKKBatConst.SJIS);
			cntFile.setLine(JACStrConst.LINE_LF);
			cntFile.createWriter();
			StringBuffer sb = new StringBuffer();
			sb.append(JACStrConst.DOUBLE_QUOTE);
			sb.append(String.format("%05d",dataCnt));
			sb.append(JACStrConst.DOUBLE_QUOTE);
			cntFile.write(sb.toString());
		}
		catch(Exception e)
		{
			// 出力ファイルの作成に失敗
			String rsn = "件数ファイルの作成に失敗（";
			StringBuffer buf = new StringBuffer();
			buf.append("出力件数パス：");
			buf.append(super.freeItem);	
			buf.append("）");
			// エラーを投げる
			throw new JBSbatBusinessException("ECHB1550CE", new String[]{ rsn, buf.toString() });
		}
		finally
		{
			// 件数ファイルオブジェクトを閉じる
			if(cntFile != null)
			{
				// 件数ファイルを閉じる
				cntFile.close();
				cntFile = null;
			}
		}
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CC_M_MAIL.close();
		db_CH_M_PRC_SCHDL_TEIGI.close();
		// ANK-3396-00-00 ADD START
		db_CH_T_SAIKEN.close();
		// ANK-3396-00-00 ADD END
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	
	/** メールコードに紐づいたメール情報を取得する 
	 * @param mailCd メールコード
	 * @return JBSbatCommonDBInterface
	 * */
	private JBSbatCommonDBInterface getMailFormat(String mailCd) throws Exception
	{
		//オーソリNGのメール情報を取得する
		final Object[] setprmOsoriNg = { mailCd, super.opeDate, super.opeDate, super.opeDate};

		executeCC_M_MAIL_CH_SELECT_001(setprmOsoriNg);
		JBSbatCommonDBInterface osoriNgFormat = db_CC_M_MAIL.selectNext();

		if(osoriNgFormat == null)
		{
			String[] msgParam = null;
			if(JACStrConst.MAIL_CD_CHM1000001.equals(mailCd)){
				msgParam = new String[] { "メール情報", "メールコード（CHM1000001）"};
			}
			else if(JACStrConst.MAIL_CD_CHM1000002.equals(mailCd)){
				msgParam = new String[] { "メール情報", "メールコード（CHM1000002）"};
			}
			// ANK-3396-00-00 ADD START
			else if(JACStrConst.MAIL_CD_CHM1000003.equals(mailCd)){
				msgParam = new String[] { "メール情報", "メールコード（CHM1000003）"};
			}
			// ANK-3396-00-00 ADD END
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB1520CE, msgParam);
		}
		return osoriNgFormat;
	}


	/** 運用日までで、最新の請求年月日を取得
	 * @return seikyYmd 請求年月日
	 * */
	private String getSeikyYmd() throws Exception
	{
		//運用日までで最新の請求年月日を取得

		Object[] setPrm = { JACStrConst.EVENT_CD_SIKY_TRN_DAY, super.opeDate };
		executeCH_M_PRC_SCHDL_TEIGI_CH_SELECT_020(setPrm);
		JBSbatCommonDBInterface eventYmdRslt = db_CH_M_PRC_SCHDL_TEIGI.selectNext();

		if(eventYmdRslt == null)
		{
			String[] msgParam = new String[] { "イベント年月日", "イベントコード（04）"};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB1520CE, msgParam);
		}

		//請求年月日を文字列に変換
		String seikyYmd = eventYmdRslt.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.EVENT_YMD);

		return seikyYmd;
	}

	/**
	 * 年月日のフォーマットを整形する 
	 * 
	 * @param seikyYmd 請求年月日
	 * @param unyoYmd 運用年月日
	 * @return ymdArray []{請求月, 請求日, 運用月}
	 */
	private String[] makeYmdDate(String seikyYmd, String unyoYmd)
	{
		//請求年月日を月と日に分別
		String eventMonth = seikyYmd.substring(4, 6);
		String eventDay = seikyYmd.substring(6, 8);
		//運用日の月を取得
		String unyoMonth = unyoYmd.substring(4, 6);

		//月日のフォーマットを成形する。 (02 => 2)
		eventMonth = changeYmdFormat(eventMonth);
		eventDay = changeYmdFormat(eventDay);
		unyoMonth = changeYmdFormat(unyoMonth);

		//返却用配列につめる
		String[] ymdArray = new String[3];
		ymdArray[0] = eventMonth;
		ymdArray[1] = eventDay;
		ymdArray[2] = unyoMonth;
		return ymdArray;
	}
	

	/** メール本文の埋め込み文字を設定します。 
	 * @param mailFormat メール情報
	 * @param seikyMonth 請求月
	 * @param seikyDay 請求日
	 * @param unyoMonth 運用月
	 * */
	private void makeMailText(HashMap<String,String> mailFormat , String seikyMonth, String seikyDay, String unyoMonth)throws Exception
	{
		//メール本文を取得し、埋め込み文字を設定し、マップに設定する。
		//請求月を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%1%", seikyMonth));
		//請求日を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%2%", seikyDay));
		//カード利用停止月を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%3%", unyoMonth));
		//カード利用停止日を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%4%", "20"));
		
		
	}

	// ANK-3396-00-00 ADD START
	/** メール本文の埋め込み文字を設定します。 
	 * @param mailFormat メール情報
	 * @param seikyMonth 請求月
	 * @param seikyDay 請求日
	 * @param unyoMonth 運用月
	 * */
	private void makeEarlyUseStpMailText(HashMap<String,String> mailFormat , String[] saikenYm)throws Exception
	{
		//バッチ運用月を埋め込み文字用に編集する
		String opM = changeYmdFormat(super.opeDate.substring(4, 6));
		
		//上記で取得した埋め込み文字用債権年月を元にメール埋め込み文言を編集する
		String minoM = makeMinoMonth(saikenYm);
		
		//メール本文を取得し、埋め込み文字を設定し、マップに設定する。
		//未収月を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%1%", minoM));
		//利用停止年月月を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%2%", opM));
		//利用停止年月日を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%3%", "20"));
		//強制解約月を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%4%", opM));
		//強制解約日を設定
		mailFormat.put(JBSbatCC_M_MAIL.MAIL_TEXT,(mailFormat.get(JBSbatCC_M_MAIL.MAIL_TEXT)).replaceFirst("%5%", JBSbatDateUtil.getEndOfMonth(super.opeDate.substring(0, 6))));
	}
	// ANK-3396-00-00 ADD END

	/** 月または日を成形します。
	 * 
	 * @param md (月または日)
	 * @return md (月または日)
	 */
	private String changeYmdFormat(String md){
		
		//返却用月日
		int rtnMd = 0;
		//月または日を埋め込み文字用に編集する
		//月または日の一文字目を取得（"10"→"10","09"→"9"）
		rtnMd = Integer.parseInt(md);
		 
		return "" + rtnMd ;
	}

	// ANK-3966-00-00 ADD START
	/**
	 * 債権年月取得
	 * 
	 * @param inMap
	 * @return saikenYm
	 * @throws Exception
	 */
	private String[] saikenYmGet(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// IT1-2019-0000041 ADD START
		//運用日時点で最新の請求年月日を取得
		String seikyYmd = getSeikyYmd();
		String lastYm = JCCBatCommon.addMonth(seikyYmd, -1).substring(0, 6);
		// IT1-2019-0000041 ADD END
		
		// 入力ファイルより請求契約番号の取得
		// IT1-2019-0000041 MOD START
//		Object[] setParamseikykeino = {inMap.getString(JBSbatCHIFM275.SEIKY_KEI_NO)};
		Object[] setParamseikykeino = {inMap.getString(JBSbatCHIFM275.SEIKY_KEI_NO),lastYm};
		
		// 債権年月の取得
//		this.executeCH_T_SAIKEN_CH_SELECT_034(setParamseikykeino);
		this.executeCH_T_SAIKEN_CH_SELECT_038(setParamseikykeino);
		// IT1-2019-0000041 MOD END
		
		//債権年月（最古:0、最新:1）
		String[] saikenYm = new String[2];

		//検索結果を取得
		JBSbatCommonDBInterface saikenInf = db_CH_T_SAIKEN.selectNext();
		
		if(null != saikenInf)
		{
			// 昇順に取得しているので1レコード目が最古年月
			saikenYm[0] = saikenInf.getString(SAIKEN_YM);
			saikenInf = db_CH_T_SAIKEN.selectNext();
		}
		while (null != saikenInf) {
			// 最終レコードを最新年月に格納する
			saikenYm[1] = saikenInf.getString(SAIKEN_YM);

			saikenInf = db_CH_T_SAIKEN.selectNext();
		}
		 //最古年月が取得できなかった場合
		 if (saikenYm[0] == null)
		 {
			// ワーニング出力
			String[] msgParam = new String[]{ "債権年月",svc_kei_no };
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB1530TW, msgParam);
			
			// 次のデータへスキップ。
			throw new JBSbatBusinessError();
		 }
		 return saikenYm;
	}

	
	/**
	 * 本文埋め込み編集（未納年月）
	 * 
	 * @param ym 年月
	 * @return month
	 * @throws Exception
	 */
	private String makeMinoMonth(String[] saikenYm) throws Exception
	{
		StringBuilder sb = new StringBuilder();
		
		//取得した年月を年と月に分け、埋め込み文字用に編集する
		sb.append(makeMonthSubstring(saikenYm[0]));
		
		if(saikenYm[1] != null)
		{
			sb.append("および");
			//取得した年月を年と月に分け、埋め込み文字用に編集する
			sb.append(makeMonthSubstring(saikenYm[1]));
		}
		return sb.toString();
	}
	
	/**
	 * 債権年月編集（月）
	 * 
	 * @param saikenYm 年月
	 * @return sb(債権月-01月→1月に編集する)
	 * @throws Exception
	 */
	private StringBuilder makeMonthSubstring(String saikenYm) throws Exception
	{
		StringBuilder sb = new StringBuilder();
		String saiken_month = "";
		
		saiken_month = saikenYm.substring(4, 6);
		
		//月の一文字目を取得（10月→"1",09月→"0"）
		sb.append(changeYmdFormat(saiken_month));
		sb.append("月");
		
		return sb;
	}
	
	// ANK-3966-00-00 ADD END

	/** 
	 * メール送信データに出力する内容を設定します
	 * @param inMap 入力電文
	 * @param mailMap メール情報
	 * @param mineoTkskRsnCd 督促理由コード
	 * @return outMap 出力電文
	 * */
	// ANK-3396-00-00 MOD START
	// private JBSbatServiceInterfaceMap setSendMail(JBSbatServiceInterfaceMap inMap, HashMap<String,String> mailMap, String mineoTkskRsnCd) throws Exception
	private JBSbatServiceInterfaceMap setSendMail(JBSbatServiceInterfaceMap inMap, HashMap<String,String> mailMap, String mineoTkskRsnCd, String earlyUseStpFlg) throws Exception
	// ANK-3396-00-00 MOD END
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		//1.お客様ID
		outMap.set((JBSbatCHIFE519.SVC_KEI_NO),				inMap.getString(JBSbatCHIFE519.SVC_KEI_NO));
		//2.メール宛先
		outMap.set((JBSbatCHIFE519.MINEO_MAIL_ADDRESS),		inMap.getString(JBSbatCHIFE519.MINEO_MAIL_ADDRESS));
		//3.メール送信者名
		outMap.set((JBSbatCHIFE519.SENDM_MLAD_DSP_NM),		mailMap.get(JBSbatCHIFE519.SENDM_MLAD_DSP_NM));
		//4.メール送信者
		outMap.set((JBSbatCHIFE519.SENDM_MLAD),				mailMap.get(JBSbatCHIFE519.SENDM_MLAD));
		//5.メール返信先
		outMap.set((JBSbatCHIFE519.HNSIN_MLAD),				mailMap.get(JBSbatCHIFE519.HNSIN_MLAD));
		//6.エラーメール返信先
		outMap.set((JBSbatCHIFE519.ERR_MLAD),			mailMap.get(JBSbatCHIFE519.ERR_MLAD));
		//7.BCC
		outMap.set((JBSbatCHIFE519.BCC_MLAD),				" ");
		//8.メール題名
		outMap.set((JBSbatCHIFE519.MAIL_TITLE),				mailMap.get(JBSbatCHIFE519.MAIL_TITLE));
		//9.メール本文
		outMap.set((JBSbatCHIFE519.MAIL_TEXT),				mailMap.get(JBSbatCHIFE519.MAIL_TEXT));

		//10.対応記録タイトル
		// ANK-3396-00-00 MOD START
//		if(JACStrConst.MINEO_TKSK_RSN_CD_AUTHORI_NG.equals(mineoTkskRsnCd))
//		{
//			outMap.set((JBSbatCHIFE519.TAIO_KIROK_TITLE),	TAIO_KIROK_TITLE_HOSEI);
//		}
//		if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(mineoTkskRsnCd) ||
//				JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(mineoTkskRsnCd))
//		{
//			outMap.set((JBSbatCHIFE519.TAIO_KIROK_TITLE),	TAIO_KIROK_TITLE_YUKO);
//		}
		if (!(early_use_stp_flg_trgt.equals(earlyUseStpFlg)))
		{
			if(JACStrConst.MINEO_TKSK_RSN_CD_AUTHORI_NG.equals(mineoTkskRsnCd))
			{
				outMap.set((JBSbatCHIFE519.TAIO_KIROK_TITLE),	TAIO_KIROK_TITLE_HOSEI);
			}
			// ANK-4495-00-00 MOD START
//			if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(mineoTkskRsnCd) ||
//					JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(mineoTkskRsnCd))
			if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(mineoTkskRsnCd) ||
					JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(mineoTkskRsnCd) ||
					JACStrConst.MINEO_TOKUSK_RSN_CD_MDGC.equals(mineoTkskRsnCd)
			)
			// ANK-4495-00-00 MOD END
			{
				outMap.set((JBSbatCHIFE519.TAIO_KIROK_TITLE),	TAIO_KIROK_TITLE_YUKO);
			}
		}
		else
		{
			outMap.set((JBSbatCHIFE519.TAIO_KIROK_TITLE),	TAIO_KIROK_TITLE_EARLY);
		}
		// ANK-3396-00-00 MOD END
		outMap.setOutFlg(true);

		return outMap;
		
	}
	

	/**
	 * 料金履歴情報作成
	 * 
	 * @param outputBean
	 * @return 
	 * @throws Exception
	 */
	// ANK-3396-00-00 MOD START
	//private void prcrrkMake(JBSbatOutputItem outputBean, JBSbatServiceInterfaceMap inMap, String mineoTkskRsnCd)throws Exception
	private void prcrrkMake(JBSbatOutputItem outputBean, JBSbatServiceInterfaceMap inMap, String mineoTkskRsnCd, String earlyUseStpFlg)throws Exception
	// ANK-3396-00-00 MOD END
	{
		//全項目つめる
		// 料金対応記録送信出力用MAP
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		// 01.請求契約番号
		outMap.set(JBSbatCHIFM096.SEIKY_KEI_NO, 				inMap.getString(JBSbatCHIFM275.SEIKY_KEI_NO));
		// 02.サービス契約番号
		outMap.set(JBSbatCHIFM096.SVC_KEI_NO, 					null);
		// 03.対応年月日時分秒
		outMap.set(JBSbatCHIFM096.TAIO_DTM, 					super.opeDate.concat(JCCBatCommon.getSysDateTimeStamp().substring(8)));
		// 04.料金対応記録種別コード	 <- "133"（mineo督促処理（バッチ））
		outMap.set(JBSbatCHIFM096.PRC_TAIO_KIROK_SBT_CD, 		JACStrConst.PRC_TAIO_KIROK_SBT_CD_MINEO_TKSK_RSN);
		// 05.料金対応記録種別詳細コード <- "2713"（mineo利用停止予告済）
		outMap.set(JBSbatCHIFM096.PRC_TAIO_KIROK_SBT_DTL_CD, 	JACStrConst.PRC_TAIO_KIROK_SBT_CD_MINEO_RTI_YKK_ZM);
		// 06.記録対象年月
		outMap.set(JBSbatCHIFM096.KIROK_TG_YM, 					null);
		// 07.督促番号
		outMap.set(JBSbatCHIFM096.TOKUSOKU_NO, 					null);
		// 08.督促異動番号
		outMap.set(JBSbatCHIFM096.TOKUSOKU_IDO_NO, 				null);
		// 09.請求番号
		outMap.set(JBSbatCHIFM096.SEIKY_NO,						null);
		// 10.金庫番号
		outMap.set(JBSbatCHIFM096.KNK_NO, 						null);
		// 11.債権番号
		outMap.set(JBSbatCHIFM096.SAIKEN_NO, 					null);
		// 12.入金番号
		outMap.set(JBSbatCHIFM096.NYUKIN_NO, 					null);
		// 13.電子ファイル管理番号
		outMap.set(JBSbatCHIFM096.EFILE_KANRI_NO, 				null);
		// 14.対応履歴連動対象フラグ<- "0"(対応履歴連動非対象)
		outMap.set(JBSbatCHIFM096.TAIORRKI_RENDO_TG_FLG, 		JACStrConst.TAIORRKI_RENDO_TG_FLG_HIHYOJI);
		// 15.変更前金額
		outMap.set(JBSbatCHIFM096.AMNT_CHBF, 					null);
		// 16.変更後金額
		outMap.set(JBSbatCHIFM096.AMNT_CHAF, 					null);
		// 17.変更前督促ステータス
		outMap.set(JBSbatCHIFM096.TOKUSOKU_STAT_CHBF, 			null);
		// 18.変更後督促ステータス
		outMap.set(JBSbatCHIFM096.TOKUSOKU_STAT_CHAF, 			null);
		// 19.変更前料金グループコード
		outMap.set(JBSbatCHIFM096.PRC_GRP_CD_CHBF, 				null);
		// 20.変更後料金グループコード
		outMap.set(JBSbatCHIFM096.PRC_GRP_CD_CHAF, 				null);
		// 21.変更前料金コースコード
		outMap.set(JBSbatCHIFM096.PCRS_CD_CHBF, 				null);
		// 22.変更後料金コースコード
		outMap.set(JBSbatCHIFM096.PCRS_CD_CHAF, 				null);
		// 23.変更前料金サービスコード
		outMap.set(JBSbatCHIFM096.PRC_SVC_CD_CHBF, 				null);
		// 24.変更後料金サービスコード
		outMap.set(JBSbatCHIFM096.PRC_SVC_CD_CHAF, 				null);
		// 25.変更前金庫料金項目コード
		outMap.set(JBSbatCHIFM096.KNK_PRC_KMK_CD_CHBF, 			null);
		// 26.変更後金庫料金項目コード
		outMap.set(JBSbatCHIFM096.KNK_PRC_KMK_CD_CHAF, 			null);
		// 27.督促メールパターン

		// ANK-3396-00-00 MOD START
//		//督促理由がオーソリNGの場合、"A1"が設定される
//		if(JACStrConst.MINEO_TKSK_RSN_CD_AUTHORI_NG.equals(mineoTkskRsnCd))
//		{
//			outMap.set(JBSbatCHIFM096.TOKUSOKU_ML_PTN_CD, 			JACStrConst.TOKUSOKU_ML_PTN_CD_A1);
//		}
//		//督促理由が、有効性NGかカード会社依頼決済停止の場合、"A2"が設定される
//		else if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(mineoTkskRsnCd) ||
//				JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(mineoTkskRsnCd))
//		{
//			outMap.set(JBSbatCHIFM096.TOKUSOKU_ML_PTN_CD, 			JACStrConst.TOKUSOKU_ML_PTN_CD_A2);
//		}
		
		if (!(early_use_stp_flg_trgt.equals(earlyUseStpFlg)))
		{
			//督促理由がオーソリNGの場合、"A1"が設定される
			if(JACStrConst.MINEO_TKSK_RSN_CD_AUTHORI_NG.equals(mineoTkskRsnCd))
			{
				outMap.set(JBSbatCHIFM096.TOKUSOKU_ML_PTN_CD, 			JACStrConst.TOKUSOKU_ML_PTN_CD_A1);
			}
			//督促理由が、有効性NGかカード会社依頼決済停止、窓口の場合、"A2"が設定される
			// ANK-4495-00-00 MOD START
//			else if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(mineoTkskRsnCd) ||
//					JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(mineoTkskRsnCd))
			else if(JACStrConst.MINEO_TKSK_RSN_CD_YKSEI_NG.equals(mineoTkskRsnCd) ||
					JACStrConst.MINEO_TKSK_RSN_CD_CARD_CP_REQ_KSI_STOP.equals(mineoTkskRsnCd) ||
				JACStrConst.MINEO_TOKUSK_RSN_CD_MDGC.equals(mineoTkskRsnCd)
			)
				// ANK-4495-00-00 MOD END
			{
				outMap.set(JBSbatCHIFM096.TOKUSOKU_ML_PTN_CD, 			JACStrConst.TOKUSOKU_ML_PTN_CD_A2);
			}
		}
		else
		{
			//早期利用停止対象者の場合、"A7"が設定される
			outMap.set(JBSbatCHIFM096.TOKUSOKU_ML_PTN_CD, 			JACStrConst.TOKUSOKU_ML_PTN_CD_A7);

		}
		// ANK-3396-00-00 MOD END

		// 28.変更前補償費扱いフラグ
		outMap.set(JBSbatCHIFM096.COMPENSATION_FLG_CHBF, 		null);
		// 29.変更後補償費扱いフラグ
		outMap.set(JBSbatCHIFM096.COMPENSATION_FLG_CHAF, 		null);
		// 30.変更前引抜き種別コード
		outMap.set(JBSbatCHIFM096.HKNK_SBT_CD_CHBF, 			null);
		// 31.変更後引抜き種別コード
		outMap.set(JBSbatCHIFM096.HKNK_SBT_CD_CHAF, 			null);
		// 32.記事
		outMap.set(JBSbatCHIFM096.KIJI, 						null);
		// 出力フラグ設定
		outMap.setOutFlg(true);
		outputBean.addOutMapList(outMap);
	}

	
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AC_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 executeCC_M_MAIL_CH_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());
		paramList.setValue(param[3].toString());

		// DBアクセスを実行します
		db_CC_M_MAIL.selectBySqlDefine(paramList, CC_M_MAIL_CH_SELECT_001);
	}

	/**
	 * SQLKEY(CH_SELECT_020)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	EVENT_CD
	 *		 	EVENT_YMD
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_SCHDL_TEIGI_CH_SELECT_020(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(paramList, CH_M_PRC_SCHDL_TEIGI_CH_SELECT_020);
	}
	
	// IT1-2019-0000041 MOD START
//	// ANK-3396-00-00 ADD START
//	/**
//	 * SQLKEY(CH_SELECT_034)で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_T_SAIKEN_CH_SELECT_034(Object[] param) throws Exception
//	{
//		// バイント変数のリストを生成します
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//		paramList.setValue(param[0].toString());
//
//		// DBアクセスを実行します
//		db_CH_T_SAIKEN.selectBySqlDefine(paramList, CH_T_SAIKEN_CH_SELECT_034);
//	}
//	// ANK-3396-00-00 ADD END
	/**
	 * SQLKEY(CH_SELECT_038)で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_T_SAIKEN_CH_SELECT_038(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_T_SAIKEN.selectBySqlDefine(paramList, CH_T_SAIKEN_CH_SELECT_038);
	}
	// IT1-2019-0000041 MOD END
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
