/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom  					 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatACChrgTgKeiStatWariInf
 *	ソースファイル名	：JBSbatACChrgTgKeiStatWariInf.java
 *	作成者				：富士通　
 *	作成日				：2011年07月08日
 *＜機能概要＞
 *　課金対象契約状態分割情報付加部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/07/08   富士通		新規作成
 *	v3.00		2012/08/07   FJ)本多	【ST2-2012-0001366】違約金課金対象サービス契約情報の出力条件変更対応
 *	v3.00		2012/10/26   FJ)垣内	【ST2-2012-0001906】２日解約の解約時に満額請求のはずが請求が発生しない
 *	v4.00		2013/03/11   FJ)浜口	【IT1-2013-0000377】違約金課金対象サービス契約情報の出力条件変更（割引未適用解約を対象外とする）
 *	v4.01		2013/03/29   FJ)早崎	【IT1-2013-0000690】マンション違約金対象
 *	v9.00.00	2014/04/25   FJ)狭間	【ANK-2054-00-00】スマートリンク端末補償対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFI015;
import eo.business.util.file.JBSbatACIFM055;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
 * (クラスの機能概要)
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JBSbatACChrgTgKeiStatWariInf extends JBSbatBusinessService
{
	
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/** ▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼ */

	/** 有効範囲内チェック部品引数（3:文字列（年月日）） */
	private static final String RNG_CHCK_FLG_YMD = "3";
	
	/** 前月群終了日 */
	private String prvEndMon = null;
	
	/** 前月群開始日 */
	private String prvStaMon = null;
	
	/** 当月群開始日 */
	private String staMon = null;
	
	/** 当月群終了日 */
	private String endMon = null;
	
	/** サービス解約理由（強制解約）リスト */
	private ArrayList<String> svcDlreKsiList = null;

	/** サービス解約理由（割引未適用解約）リスト */
	private ArrayList<String> svcDlreMitList = null;
	
	/** サービス解約理由（割引未適用申出解約） */
	private String svcDlreMitMoKai = null;
	
	/** ▲▲▲▲▲▲クラス変数 終了▲▲▲▲▲▲ */


	/**
	 * 初期処理
	 * 
	 * @param commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */

		// 請求年月取得
		JACbatSchdlUtil su = new JACbatSchdlUtil(commonItem);
		
		String seikyYm = null;		// 請求年月
		
		String prvSeikyYm = null;	// 請求年月の前月
		try
		{
			// 請求年月
			seikyYm = su.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
			
			// 当月群開始日、当月群終了日取得
			String[] nowMon = su.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			
			this.staMon = nowMon[0];	// 当月群開始日
			this.endMon = nowMon[1];	// 当月群終了日
			
			// 請求年月の前月の一日を設定
			prvSeikyYm = JBSbatDateUtil.adjustMonth(seikyYm + JACStrConst.STR_OF_MONTH, -1);
			
			// 前月群開始日、前月群終了日取得
			String[] prvMon = su.getUseStrEnd(prvSeikyYm.substring(0, 6), JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			
			this.prvStaMon = prvMon[0];		// 前月群開始日
			this.prvEndMon = prvMon[1];		// 前月群終了日
		}
		finally
		{
			su.close();
		}
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// 業務パラメータ情報を取得する(強制解約)
		String[] svcDlreKsi = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_KD_KSI_DSL).split(JACStrConst.COMMA);
		
		svcDlreKsiList = new ArrayList<String>();
		
		for(String svcDlre : svcDlreKsi)
		{
			svcDlreKsiList.add(svcDlre);
		}
		
		// 業務パラメータ情報を取得する(割引未適用解約)
		String[] svcDlreMit = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_KD_MIT_DSL).split(JACStrConst.COMMA);
		
		svcDlreMitList = new ArrayList<String>();
		
		for(String svcDlre : svcDlreMit)
		{
			svcDlreMitList.add(svcDlre);
		}
		
		// 業務パラメータ情報を取得する(割引未適用申出解約)
		this.svcDlreMitMoKai = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_KD_MTM_DSL);

		// パラメータ取得クラスクローズ
		paramUtil.close();
		
		// ログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "業パラ．サービス解約理由（強制解約） ：" + svcDlreKsiList.toString());
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "業パラ．サービス解約理由（割引未適用解約） ：" + svcDlreMitList.toString());
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "業パラ．サービス解約理由（割引未適用申出解約） ：" + svcDlreMitMoKai.toString());
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "当月群開始日：" + this.staMon);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "当月群終了日：" + this.endMon);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "前月群開始日：" + this.prvStaMon);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "前月群終了日：" + this.prvEndMon);

		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 * 
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */

		// 課金終了日
		String chrgEndYmd = inMap.getString(JBSbatACIFI015.CHRG_ENDYMD);
		// 課金開始日
		String chrgStaYmd = inMap.getString(JBSbatACIFI015.CHRG_STAYMD);

		// サービス解約理由
		String svcDlre = inMap.getString(JBSbatACIFI015.SVC_DLRE);

		// ファイル区分
		String fileDiv = JACStrConst.KARA_MOJI;

		// 解約起算日
		String dslKisanYmd = JBSbatDateUtil.adjustDate(chrgEndYmd, 1);
		
		// サービス解約日
		String svcDslYmd = inMap.getString(JBSbatACIFI015.SVC_DSL_YMD);
		
		// 前月群開始日 + 1
		String prvStaMonNext = JBSbatDateUtil.adjustDate(prvStaMon, 1);
		
		// ファイル区分決定
		// 解約起算日が当月１日　または
		// サービス解約理由　＝　強制解約　かつ　前月群開始日+1≦解約起算日≦前月群終了日の場合　または
		// サービス解約理由　!＝　強制解約　かつ　群開始日　≦　課金終了日　≦　群終了日　かつ　　課金開始日　>　課金終了日の場合　または
		// サービス解約理由　＝　割引未適用申出解約　かつ　群開始日　≦　課金終了日　≦　群終了日
		if (dslKisanYmd.compareTo(staMon) == 0 || 
			(svcDlreKsiList.contains(svcDlre) && JBSbatStringUtil.rangeCheck(prvEndMon, prvStaMonNext, dslKisanYmd, RNG_CHCK_FLG_YMD)) || 
			(!svcDlreKsiList.contains(svcDlre) && JBSbatStringUtil.rangeCheck(endMon, staMon, chrgEndYmd, RNG_CHCK_FLG_YMD) && chrgStaYmd.compareTo(chrgEndYmd) > 0) ||
			(this.svcDlreMitMoKai.equals(svcDlre) && JBSbatStringUtil.rangeCheck(endMon, staMon, chrgEndYmd, RNG_CHCK_FLG_YMD))) 
		{
			// 違約金課金対象サービス契約情報
			fileDiv = JACStrConst.FILE_DIV_DSL;
		}
		// (サービス解約日　＝　""（空文字）　または(サービス解約理由　≠　""（空文字）　かつ　群開始日≦課金終了日≦群終了日))
		// かつ　課金開始日　≠　""（空文字）　かつ　課金終了日　≠　""（空文字）　かつ　課金開始日　≦　課金終了日の場合
		// かつ　サービス解約理由　!＝　割引未適用解約
		else if((JACStrConst.KARA_MOJI.equals(svcDslYmd) 	|| (!JACStrConst.KARA_MOJI.equals(svcDlre) && JBSbatStringUtil.rangeCheck(endMon, staMon, chrgEndYmd, RNG_CHCK_FLG_YMD)))
			&& !JACStrConst.KARA_MOJI.equals(chrgStaYmd) && !JACStrConst.KARA_MOJI.equals(chrgEndYmd) && chrgStaYmd.compareTo(chrgEndYmd) <= 0
			&& !svcDlreMitList.contains(svcDlre))
		{
			// 課金対象サービス契約情報
			fileDiv = JACStrConst.FILE_DIV_TRGT;
		}
		// 上記以外の場合
		else
		{
			// 出力なし
			return null;
		}
		
		return(this.makeOutItem(inMap, fileDiv));
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */
	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

	/**
	 * 課金対象サービス契約情報（ファイル区分含む）を作成
	 * 
	 * @param inMap　課金対象サービス契約情報
	 * @param fileDiv　ファイル区分　
	 * @return JBSbatOutputItem　課金対象サービス契約情報（ファイル区分含む）
	 * @throws Exception　業務サービス内で発生した例外全般
	 */
	private JBSbatOutputItem makeOutItem(JBSbatServiceInterfaceMap inMap, String fileDiv) throws Exception
	{
		JBSbatOutputItem outItem = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		outMap.setString(JBSbatACIFM055.FILE_DIV,					fileDiv);													// ファイル区分
		outMap.setString(JBSbatACIFM055.SEIRI_NO,			 		inMap.getString(JBSbatACIFI015.SEIRI_NO));					// 整理番号
		outMap.setString(JBSbatACIFM055.SVC_SKBT_CD,			 	inMap.getString(JBSbatACIFI015.SVC_SKBT_CD));				// 料金サービス識別コード
		outMap.setString(JBSbatACIFM055.PRC_GRP_CD, 				inMap.getString(JBSbatACIFI015.PRC_GRP_CD));				// 料金グループコード
		outMap.setString(JBSbatACIFM055.PCRS_CD, 					inMap.getString(JBSbatACIFI015.PCRS_CD));					// 料金コースコード
		outMap.setString(JBSbatACIFM055.PRC_SVC_CD, 				inMap.getString(JBSbatACIFI015.PRC_SVC_CD));				// 料金サービスコード
		outMap.setString(JBSbatACIFM055.SVC_NO, 					inMap.getString(JBSbatACIFI015.SVC_NO));					// サービス番号
		outMap.setString(JBSbatACIFM055.OP_SVKEI_NO, 				inMap.getString(JBSbatACIFI015.OP_SVKEI_NO));				// オプションサービス契約番号 
		outMap.setString(JBSbatACIFM055.SEIKY_KEI_NO,			 	inMap.getString(JBSbatACIFI015.SEIKY_KEI_NO));				// 請求先番号
		outMap.setString(JBSbatACIFM055.SEIKY_YM, 					inMap.getString(JBSbatACIFI015.SEIKY_YM));					// 請求年月
		outMap.setString(JBSbatACIFM055.WRIB_SVC_KEI_NO, 			inMap.getString(JBSbatACIFI015.WRIB_SVC_KEI_NO));			// 割引サービス契約番号
		outMap.setString(JBSbatACIFM055.WRISVC_TRGT_KEI_NO,			inMap.getString(JBSbatACIFI015.WRISVC_TRGT_KEI_NO));		// 割引サービス対象契約番号
		outMap.setString(JBSbatACIFM055.SVC_STAYMD,					inMap.getString(JBSbatACIFI015.SVC_STAYMD));				// サービス開始日
		outMap.setString(JBSbatACIFM055.SVC_DSL_YMD,				inMap.getString(JBSbatACIFI015.SVC_DSL_YMD));				// サービス解約日
		outMap.setString(JBSbatACIFM055.SVC_DLRE,					inMap.getString(JBSbatACIFI015.SVC_DLRE));					// サービス解約理由
		outMap.setString(JBSbatACIFM055.SVC_KAIHK_DAY,				inMap.getString(JBSbatACIFI015.SVC_KAIHK_DAY));				// サービス回復日
		outMap.setString(JBSbatACIFM055.SVC_CANCEL_DAY,				inMap.getString(JBSbatACIFI015.SVC_CANCEL_DAY));			// サービスキャンセル日
		outMap.setString(JBSbatACIFM055.SVC_PAUSE_DAY,				inMap.getString(JBSbatACIFI015.SVC_PAUSE_DAY));				// サービス休止日
		outMap.setString(JBSbatACIFM055.SVC_PAUSE_RLS_YMD,			inMap.getString(JBSbatACIFI015.SVC_PAUSE_RLS_YMD));			// サービス休止解除日
		outMap.setString(JBSbatACIFM055.USE_STAYMD,					inMap.getString(JBSbatACIFI015.USE_STAYMD));				// 利用開始日
		outMap.setString(JBSbatACIFM055.USE_ENDYMD,					inMap.getString(JBSbatACIFI015.USE_ENDYMD));				// 利用終了日
		outMap.setBigDecimal(JBSbatACIFM055.USE_DAY_CNT,			inMap.getBigDecimal(JBSbatACIFI015.USE_DAY_CNT));			// 利用日数
		outMap.setBigDecimal(JBSbatACIFM055.USE_FAIL_DAY_CNT,		inMap.getBigDecimal(JBSbatACIFI015.USE_FAIL_DAY_CNT));		// 利用不可日数
		outMap.setString(JBSbatACIFM055.CHRG_STAYMD,				inMap.getString(JBSbatACIFI015.CHRG_STAYMD));				// 課金開始日
		outMap.setString(JBSbatACIFM055.FIRST_CHRG_STAYMD,			inMap.getString(JBSbatACIFI015.FIRST_CHRG_STAYMD));			// 初回課金開始日
		outMap.setString(JBSbatACIFM055.CHRG_ENDYMD,				inMap.getString(JBSbatACIFI015.CHRG_ENDYMD));				// 課金終了日
		outMap.setBigDecimal(JBSbatACIFM055.SVC_KEIZOKU_MON_CNT,	inMap.getBigDecimal(JBSbatACIFI015.SVC_KEIZOKU_MON_CNT));	// サービス継続月数
		outMap.setBigDecimal(JBSbatACIFM055.SVC_KEIZOKU_DAY_CNT,	inMap.getBigDecimal(JBSbatACIFI015.SVC_KEIZOKU_DAY_CNT));	// サービス継続日数
		outMap.setBigDecimal(JBSbatACIFM055.CHRG_KEIZOKU_MON_CNT,	inMap.getBigDecimal(JBSbatACIFI015.CHRG_KEIZOKU_MON_CNT));	// 課金継続月数
		outMap.setBigDecimal(JBSbatACIFM055.CHRG_KEIZOKU_DAY_CNT,	inMap.getBigDecimal(JBSbatACIFI015.CHRG_KEIZOKU_DAY_CNT));	// 課金継続日数
		outMap.setBigDecimal(JBSbatACIFM055.KEI_CNT,				inMap.getBigDecimal(JBSbatACIFI015.KEI_CNT));				// 契約数
		outMap.setBigDecimal(JBSbatACIFM055.MON_CHU_MAX_KEI_CNT,	inMap.getBigDecimal(JBSbatACIFI015.MON_CHU_MAX_KEI_CNT));	// 月中最大契約数
		outMap.setString(JBSbatACIFM055.AIT_DIV,					inMap.getString(JBSbatACIFI015.AIT_DIV));					// 相対区分
		outMap.setString(JBSbatACIFM055.SIME_DAY,					inMap.getString(JBSbatACIFI015.SIME_DAY));					// 締め日
		outMap.setString(JBSbatACIFM055.SVC_DTL_SKBT_NO,			inMap.getString(JBSbatACIFI015.SVC_DTL_SKBT_NO));			// サービス詳細識別番号
		
		// 出力
		outMap.setOutFlg(true);
		
		// 登録
		outItem.addOutMapList(outMap);
		
		
		return(outItem);
	}
}
