/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACJgskeiSsnPrcCalc
*	ソースファイル名	：JBSbatACJgskeiSsnPrcCalc.java
*	作成者				：富士通　
*	作成日				：2011年12月16日
*＜機能概要＞
*　事業者契約精算料金計算部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/16   富士通		新規作成
*	v3.00		2012/07/31   富士通		【ST1-2012-0000182】出力値変更
*********************************************************************/
package eo.business.service;


import javax.print.DocFlavor.STRING;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM105;
import eo.business.util.table.JBSbatCH_M_JGSHAKSSN_PRC;
import eo.business.util.table.JBSbatCH_T_JGSHAKSSN_KEI;
import eo.common.constant.JACStrConst;
import eo.common.util.JPCUtilCommon;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACJgskeiSsnPrcCalc extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 固定値"0" */
	private static final String ZERO = "0";
	
	/** 請求年月 */
	private String wk_SkyuYM 	= null;

	/** 群月初日 */
	private String wk_GunStr 	= null;

	/** 群締め日 */
	private String wk_GunEnd 	= null;

	/** 請求年月の歴日付 */
	private int	wk_CalDay 	= -1;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");
		
		
		// 請求年月取得
		JACbatSchdlUtil schdUtil = new JACbatSchdlUtil(commonItem);
		// 料金スケジュール定義アクセス部品を使用する。
		this.wk_SkyuYM = schdUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
		
		// 群月初日、群締め日　←　JACbatSchdlUtil.getUseStrEnd(請求年月, イベントコード("01"（利用開始日））, イベントコード（"02"（利用終了日））)
		String[] rtn = schdUtil.getUseStrEnd(this.wk_SkyuYM, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);

		// クローズ
		schdUtil.close();
		
		this.wk_GunStr = rtn[0];
		this.wk_GunEnd = rtn[1];
		
		// 請求月の暦日数を取得する（引数：群終了日、群開始日）
		this.wk_CalDay = JPCUtilCommon.subtractDay(wk_GunEnd, wk_GunStr) + 1;
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		
		int notUseStr 		= 0; // 未利用期間（開始）
		int nouUseEnd 		= 0; // 未利用期間（終了）
		int riyoDateCount 	= 0; // 利用日数
		
		boolean riyoDateCntFlg = true; // 利用日数計算フラグ
		
		// サービスを利用していない期間の算出
		// 事業者間契約開始年月日
		String tmpFistChrgStaYmd 	= inMap.getString(JBSbatCH_T_JGSHAKSSN_KEI.JGSHAK_KEI_STAYMD);
		// 事業者間契約解約年月日
		String tmpLastChrgEndYmd 	= inMap.getString(JBSbatCH_T_JGSHAKSSN_KEI.JGSHAK_KEI_DSLYMD);
		
		// 事業者間契約開始年月日が設定されていない場合
		if(tmpFistChrgStaYmd.equals(JACStrConst.KARA_MOJI))
		{
			riyoDateCount = 0;
		}
		else 
		{
			// 課金終了日が設定されていて
			// 事業者間契約開始年月日＞事業者間契約解約年月日の場合
			if(!tmpLastChrgEndYmd.equals(JACStrConst.KARA_MOJI) && tmpFistChrgStaYmd.compareTo(tmpLastChrgEndYmd) > 0)
			{
				riyoDateCntFlg = false;
			}
			
			// 前月　または　群月初日　で解約している場合
			else if(tmpLastChrgEndYmd.compareTo(this.wk_GunStr) < 0)
			{
				riyoDateCntFlg = false;
			}
			
			//////////////////////////////////
			// A.群月初日　から(当月)事業者間契約開始年月日
			//////////////////////////////////
			// 前月　または　群月初日　で事業者間契約開始している場合
			// 入力．事業者間契約開始年月日  ≦ 群月初日
			if(tmpFistChrgStaYmd.compareTo(this.wk_GunStr) <= 0)
			{

				// 0日間
				notUseStr = 0;
			}
			// 群月初日より後に事業者間契約開始している場合	
			// 群月初日　＜　入力．事業者間契約開始年月日	
			else
			{
				// 入力．事業者間契約開始年月日　-　群月初日
				notUseStr = JPCUtilCommon.subtractDay(tmpFistChrgStaYmd, this.wk_GunStr);
			}

			//////////////////////////////////
			// B.課金終了日 から 群締め日
			//////////////////////////////////
			// 群締め日まで課金対象の場合
			// 　入力．事業者間契約解約年月日　＝　未設定　 または
			// 　入力．事業者間契約解約年月日　＞　群月末日
			if(tmpLastChrgEndYmd.isEmpty() 
				|| tmpLastChrgEndYmd.compareTo(this.wk_GunEnd) > 0)
			{
				// 0日間
				nouUseEnd = 0;
			}
			// 翌郡月初日以前に課金終了した場合	
			// 　入力．事業者間契約解約年月日　≦　群月末日
			else
			{
				// 群締め日　-　入力．事業者間契約解約年月日
				nouUseEnd = JPCUtilCommon.subtractDay(this.wk_GunEnd, tmpLastChrgEndYmd);
			}
			
			// ◆利用期間
			if(riyoDateCntFlg)
			{
				// 　利用日数　←　歴日数 - サービスを利用していない期間（未利用期間（開始）＋（終了））
				riyoDateCount = this.wk_CalDay - (notUseStr + nouUseEnd);
			}
			else
			{
				riyoDateCount = 0;
			}
		}
		
		
		
		// 事業者間精算料金情報作成
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		{
			JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
			
			// 請求先番号
			outMap.set(JBSbatACIFM105.SEIKY_KEI_NO, 		JACStrConst.KARA_MOJI);
			// 請求年月
			outMap.set(JBSbatACIFM105.SEIKY_YM, 			JACStrConst.KARA_MOJI);
			// サービス番号
			outMap.set(JBSbatACIFM105.SVC_NO, 				JACStrConst.KARA_MOJI);
			// 料金サービス識別コード
			outMap.set(JBSbatACIFM105.SVC_SKBT_CD, 			JACStrConst.KARA_MOJI);
			// 料金コースコード
			outMap.set(JBSbatACIFM105.PCRS_CD, 				JACStrConst.KARA_MOJI);
			// 料金サービスコード
			outMap.set(JBSbatACIFM105.PRC_SVC_CD, 			JACStrConst.KARA_MOJI);
			// 精算内容ソートキー
			outMap.set(JBSbatACIFM105.SSN_NYO_SORT_KEY, 	JACStrConst.SSN_NYO_SORT_KEY_SEIKY);
			// 精算内容-SSN_NYO
			outMap.set(JBSbatACIFM105.SSN_NYO, 				JACStrConst.SSN_NYO_SEIKY);
			// 料金項目コード
			outMap.set(JBSbatACIFM105.PRC_KMK_CD, 			inMap.getString(JBSbatCH_M_JGSHAKSSN_PRC.PRC_KMK_CD));
			// 徴収パターンコード
			outMap.set(JBSbatACIFM105.COLLECT_PATTERN_CD,	inMap.getString(JBSbatCH_M_JGSHAKSSN_PRC.COLLECT_PATTERN_CD));
			// 料金
			outMap.set(JBSbatACIFM105.PRC, 					inMap.getBigDecimal(JBSbatCH_M_JGSHAKSSN_PRC.SSN_PRC));
			// 利用開始日
			outMap.set(JBSbatACIFM105.USE_STAYMD, 			tmpFistChrgStaYmd);
			// 利用終了日
			outMap.set(JBSbatACIFM105.USE_ENDYMD, 			tmpLastChrgEndYmd);
			// サービス開始日
			outMap.set(JBSbatACIFM105.SVC_STAYMD, 			tmpFistChrgStaYmd);
			// 初回課金開始日
			outMap.set(JBSbatACIFM105.FIRST_CHRG_STAYMD, 	tmpFistChrgStaYmd);
			// サービス解約日
			outMap.set(JBSbatACIFM105.SVC_DSL_YMD, 			tmpLastChrgEndYmd);
			// サービス解約理由
			outMap.set(JBSbatACIFM105.SVC_DLRE, 			JACStrConst.KARA_MOJI);
			// サービス回復日
			outMap.set(JBSbatACIFM105.SVC_KAIHK_DAY, 		JACStrConst.KARA_MOJI);
			// 利用日数
			outMap.set(JBSbatACIFM105.USE_DAY_CNT, 			String.valueOf(riyoDateCount));
			// 利用不可日数
			outMap.set(JBSbatACIFM105.USE_FAIL_DAY_CNT,		ZERO);
			// 相対区分
			outMap.set(JBSbatACIFM105.AIT_DIV, 				JACStrConst.KARA_MOJI);
			// 締め日
			outMap.set(JBSbatACIFM105.SIME_DAY, 			JACStrConst.KARA_MOJI);
			// 事業者コード
			outMap.set(JBSbatACIFM105.JIGYOSHA_CD, 			inMap.getString(JBSbatCH_T_JGSHAKSSN_KEI.JIGYOSHA_CD));
			// 事業者契約コード
			outMap.set(JBSbatACIFM105.JIGYOSHA_KEI_CD, 		inMap.getString(JBSbatCH_T_JGSHAKSSN_KEI.JIGYOSHA_KEI_CD));
			// 利用不可適用方法
			outMap.set(JBSbatACIFM105.USE_APLY_KH_CD, 		JACStrConst.USE_FAIL_APLY_WAY_CD_ALL);
			// 前受相殺優先順位
			outMap.set(JBSbatACIFM105.MAE_YUSEN_JUN, 		JACStrConst.MAEUK_SOSAI_YUSEN_JUN_0);
			// 割引優先順位
			outMap.set(JBSbatACIFM105.WRIB_YUSEN_JUN, 		JACStrConst.WRIB_YUSEN_JUN_0);
			
			// 出力フラグを設定
			outMap.setOutFlg(true);
			
			// 出力共通電文に入出力インターフェースを設定する
			outputItem.addOutMapList(outMap);
			
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
