/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKSvKeiSikyInfShuk
*	ソースファイル名	：JBSbatKKSvKeiSikyInfShuk.java
*	作成者				：富士通　
*	作成日				：2011年06月22日
*＜機能概要＞
*　サービス契約（請求）情報集約部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/22   富士通		新規作成
*	v3.00.00	2012/07/01	FJ			【TAI-2012-0000031】
*	v3.00.01	2013/07/17	AS)新居		請求契約キャンセルＩＦ見直し対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JKKBatConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatDateUtil;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatKKIFM019;
import eo.business.util.file.JBSbatKKIFM020;

/**
* (クラスの機能概要) <p>
* 請求契約とサービス契約を請求契約番号で突合して、サービス契約番号単位にサービス契約をカウントして
* 料金計算対象サービス契約情報（請求契約）の契約数と最大契約数を設定する。
* 料金計算対象として抽出された請求契約を、契約抽出の共通フォーマットに編集して出力する。
*<BR>
*1. 有効サービス契約集計
*   料金計算対象サービス契約情報（請求契約）と料金計算対象サービス契約（サービス契約）を請求契約番号で突合する。
*   (1) 請求契約番号が一致した場合
*       （サービス契約）・サービス契約番号単位にレコード数をカウントする。
*   (2) （請求契約番号）のみの場合
*        機能をスキップする。
*   (3) （サービス契約）のみの場合
*       機能をスキップする。
*2. 料金計算対象サービス契約情報出力
*   料金計算対象サービス契約情報を出力する。
*<BR>
* @author 富士通
*/
public class JBSbatKKSvKeiSikyInfShuk extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg = false;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg = false;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg = false;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 出力フラグ*/
	// private boolean outFlg = false;

	/** サービス契約番号(退避用)*/ 
	private String tmpSvcNo = "";

	/** サービス開始年月日(退避用)*/
	private String tmpSvcStaYmd = "";

	/** サービス初回課金開始年月日(退避用)*/
	private String tmpFstChgYmd = "";

	/** 課金開始年月日(退避用)*/
	private String tmpChgStaYmd = "";

	/** 課金終了年月日(退避用)*/
	private String tmpChgEndYmd = "";

	/** 解約年月日(退避用)*/
	private String tmpSvcDslYmd = "";

	/** 未解約フラグ*/
	private boolean nDslFlg = false;

	/** 契約数カウンタ*/
	private int kei = 0;

	/** 最大契約数カウンタ*/
	private int max_kei = 0;

	/** 処理対象月月初*/
	private String monStaYmd = null;

	/** 処理対象月月末*/
	private String monEndYmd = null;

	/** 運用日前月末*/
	private String zenEndYmd = null;

	/** フリー項目[処理月区分] **/
	private String targetMonthDiv = "";


	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		this.setMastProcFlg(false);
		this.setTranProcFlg(false);
		this.setMatchProcFlg(false);
		
		String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		// フリー項目[処理月区分]を設定
		targetMonthDiv = freeItems[0];
		
		//開始済の場合
		if(JBSbatKKConst.TRAN_TRGT_KAISHI.equals(targetMonthDiv))
		{
			if(freeItems.length == 2)
			{
				zenEndYmd = freeItems[1];
				// フリー項目[運用日前月末日が設定されている場合は前月初、前月末を設定
				String strYm = commonItem.getOpeDate().substring(0, 6);
				monStaYmd = strYm + "01";
				monEndYmd = strYm + JBSbatDateUtil.getEndOfMonth(strYm);
				monStaYmd = JBSbatDateUtil.adjustMonth(monStaYmd, -1);
				monEndYmd = JBSbatDateUtil.adjustMonth(monEndYmd, -1);
			}
			else
			{
				// 月初、月末を算出
				String strYm = commonItem.getOpeDate().substring(0, 6);
				monStaYmd = strYm + "01";
				monEndYmd = strYm + JBSbatDateUtil.getEndOfMonth(strYm);
			}
		}
		else
		{
			// 月初、月末を算出
			String strYm = commonItem.getOpeDate().substring(0, 6);
			monStaYmd = strYm + "01";
			monEndYmd = strYm + JBSbatDateUtil.getEndOfMonth(strYm);
		
			// String free = commonItem.getFreeItem();
			// 処理種別が[前月]または[継続]の場合には前月の値に更新
			if(JBSbatKKConst.TRAN_TRGT_MON_BF.equals(targetMonthDiv) || isNullBlunk(targetMonthDiv))
			{
				monStaYmd = JBSbatDateUtil.adjustMonth(monStaYmd, -1);
				monEndYmd = JBSbatDateUtil.adjustMonth(monEndYmd, -1);
			}
		}
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		if (mastMap == null && tranMap != null) 
		{
			// 入力Ｍのみnullの場合(請求契約側レコードなし)
			this.setTranProcFlg(true);
			return outputBean;
		} 
		else if (mastMap != null && tranMap == null) 
		{
			// 入力Ｔのみnullの場合(サービス契約側レコードなし)
			this.setMastProcFlg(true);
			
			// if(outFlg)
			// {
				// 料金計算用サービス契約情報レコードの作成
				JBSbatServiceInterfaceMap outmap = setOutMap(mastMap, kei, max_kei);
				// 出力フラグON
				outmap.setOutFlg(true);
				// 出力共通電文に追加する
				outputBean.addOutMapList(outmap);
				
				// 蓄積情報初期化
				initTmpInf();
				
				// outFlg = false;
			// }
			return outputBean;
		} 
		else 
		{
			// 入力Ｔ、入力Ｍが共にnullでない場合
			// キー情報取得
			String mastKey = mastMap.getString(JBSbatKKIFM019.SEIKY_KEI_NO);	// マスタ.請求契約番号
			String tranKey = tranMap.getString(JBSbatKKIFM020.SEIKY_KEI_NO);	// トラン.請求契約番号
			
			if (mastKey.compareTo(tranKey) == 0) 
			{
				/* 入力Ｍ = 入力Ｔ */
				this.setMatchProcFlg(true);
				
				// 出力フラグON
				// outFlg = true;
				
				// サービス開始年月日編集(同一請求配下で最古の年月日を適用)
				String inSvcStaYmd = tranMap.getString(JBSbatKKIFM020.SVC_STAYMD);
				if(!isNullBlunk(inSvcStaYmd))
				{
					// 退避年月日より小さい(古い年月日)場合には退避情報を更新
					if(tmpSvcStaYmd.compareTo(inSvcStaYmd) > 0 || "".equals(tmpSvcStaYmd))
					{
						tmpSvcStaYmd = inSvcStaYmd;
					}
				}
				// サービス初回課金開始年月日編集(同一請求配下で最古の年月日を適用)
				String inFstChgYmd = tranMap.getString(JBSbatKKIFM020.FIRST_CHRG_STAYMD);
				if(!isNullBlunk(inFstChgYmd))
				{
					// 退避年月日より小さい(古い年月日)場合には退避情報を更新
					if(tmpFstChgYmd.compareTo(inFstChgYmd) > 0 || "".equals(tmpFstChgYmd))
					{
						tmpFstChgYmd = inFstChgYmd;
					}
				}
				// 課金開始年月日編集(同一請求配下で最古の年月日を適用)
				String inChgStaYmd = tranMap.getString(JBSbatKKIFM020.CHRG_STAYMD);
				if(!isNullBlunk(inChgStaYmd))
				{
					if(tmpChgStaYmd.compareTo(inChgStaYmd) > 0 || "".equals(tmpChgStaYmd))
					{
						tmpChgStaYmd = inChgStaYmd;
					}
				}
				// 課金終了年月日編集(同一請求配下で最新の年月日を適用)
				String inChgEndYmd = tranMap.getString(JBSbatKKIFM020.CHRG_ENDYMD);
				if(!isNullBlunk(inChgEndYmd))
				{
					if(tmpChgEndYmd.compareTo(inChgEndYmd) < 0 || "".equals(tmpChgEndYmd))
					{
						tmpChgEndYmd = inChgEndYmd;
					}
				}
				// 解約年月日編集(同一請求配下で最新の年月日を適用)※未解約の契約があれば""(未設定)で確定
				String inSvcDslYmd = tranMap.getString(JBSbatKKIFM020.SVC_DSL_YMD);
				if(!nDslFlg)
				{
					if(!isNullBlunk(inSvcDslYmd))
					{
						if(tmpSvcDslYmd.compareTo(inSvcDslYmd) < 0 || "".equals(tmpSvcDslYmd))
						{
							tmpSvcDslYmd = inSvcDslYmd;
						}
					}
					else
					{
						tmpSvcDslYmd = inSvcDslYmd;
						// 未解約フラグをON
						nDslFlg = true;
					}
				}
				
				// 契約数の編集(同一サービス契約番号はカウント対象外)
				String inSvcNo = tranMap.getString(JBSbatKKIFM020.SVC_NO);
				if(!tmpSvcNo.equals(inSvcNo))
				{
					// 月中最大契約数にカウント
					max_kei += tranMap.getBigDecimal(JBSbatKKIFM020.KEI_CNT).intValue();
					
					// サービス開始年月日が月末以前、かつプラン課金終了年月日が翌月以降の場合
					if( (!isNullBlunk(inSvcStaYmd) && Integer.parseInt(monEndYmd) >= Integer.parseInt(inSvcStaYmd))
						&& (!isNullBlunk(inChgEndYmd) && Integer.parseInt(monEndYmd) < Integer.parseInt(inChgEndYmd)) )
					{
						// 契約数にカウント
						kei += tranMap.getBigDecimal(JBSbatKKIFM020.KEI_CNT).intValue();
					}
					
					// 次処理用にサービス契約番号を退避
					tmpSvcNo = inSvcNo;
				}
				return outputBean;
			}
			else if (mastKey.compareTo(tranKey) < 0) 
			{
				// 入力Ｍ < 入力Ｔ
				this.setMastProcFlg(true);
				
				// 出力情報生成
				// if(outFlg)
				// {
					// 料金計算用サービス契約情報レコードの作成
					JBSbatServiceInterfaceMap outmap = setOutMap(mastMap, kei, max_kei);
					// 出力フラグON
					outmap.setOutFlg(true);
					// 出力共通電文に追加する
					outputBean.addOutMapList(outmap);
					
					// 蓄積情報初期化
					initTmpInf();
					
					// outFlg = false;
				// }
				return outputBean;
			} 
			else 
			{
				// 入力Ｍ > 入力Ｔ
				this.setTranProcFlg(true);
				// 出力情報生成
				return outputBean;
			}
		
		}
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}


	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/

	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * <dd>メソッド名	：ファイル編集
	 * <dd>メソッド説明	：1.ファイル編集対象項目を取得します。
	 *                    2.取得した項目を元にファイル編集を行います。
	 * @param  inMap     データ取得情報Map
	 *          nkei       契約数
	 *          nmax_kei   契約数
	 * @return outMap    出力Map
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap setOutMap(JBSbatServiceInterfaceMap inMap, int nkei, int nmax_kei) throws Exception 
	{
		// 出力情報を設定するMap
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();

		outmap.setString(JBSbatKKIFM019.CHSHT_KEI_DIV, inMap.getString(JBSbatKKIFM019.CHSHT_KEI_DIV));					//抽出契約区分
		outmap.setString(JBSbatKKIFM019.SVC_KEI_NO, inMap.getString(JBSbatKKIFM019.SVC_KEI_NO)); 						//サービス契約番号
		outmap.setString(JBSbatKKIFM019.SVC_CD, inMap.getString(JBSbatKKIFM019.SVC_CD)); 								//サービスコード
		outmap.setString(JBSbatKKIFM019.PRC_GRP_CD, inMap.getString(JBSbatKKIFM019.PRC_GRP_CD)); 						//料金グループコード
		outmap.setString(JBSbatKKIFM019.PCRS_CD, inMap.getString(JBSbatKKIFM019.PCRS_CD)); 								//料金コースコード
		outmap.setString(JBSbatKKIFM019.PPLAN_CD, inMap.getString(JBSbatKKIFM019.PPLAN_CD)); 							//料金プランコード
		outmap.setString(JBSbatKKIFM019.TRGT_KEI_SVC_CD, inMap.getString(JBSbatKKIFM019.TRGT_KEI_SVC_CD)); 				//対象契約サービスコード
		outmap.setString(JBSbatKKIFM019.SVC_KEI_UCWK_NO, inMap.getString(JBSbatKKIFM019.SVC_KEI_UCWK_NO)); 				//サービス契約内訳番号
		outmap.setString(JBSbatKKIFM019.KKTK_SVC_KEI_NO, inMap.getString(JBSbatKKIFM019.KKTK_SVC_KEI_NO)); 				//機器提供サービス契約番号
		outmap.setString(JBSbatKKIFM019.OP_SVC_KEI_NO, inMap.getString(JBSbatKKIFM019.OP_SVC_KEI_NO)); 					//オプションサービス契約番号
		outmap.setString(JBSbatKKIFM019.SEIOPSVC_KEI_NO, inMap.getString(JBSbatKKIFM019.SEIOPSVC_KEI_NO)); 				//請求オプションサービス契約番号
		outmap.setString(JBSbatKKIFM019.SBOP_SVC_KEI_NO, inMap.getString(JBSbatKKIFM019.SBOP_SVC_KEI_NO)); 				//サブオプションサービス契約番号
		outmap.setString(JBSbatKKIFM019.WRIB_SVC_KEI_NO, inMap.getString(JBSbatKKIFM019.WRIB_SVC_KEI_NO)); 				//割引サービス契約番号
		outmap.setString(JBSbatKKIFM019.WRIB_SVC_TRGT_KEI_NO, inMap.getString(JBSbatKKIFM019.WRIB_SVC_TRGT_KEI_NO)); 	//割引サービス対象契約番号
		outmap.setString(JBSbatKKIFM019.WRIB_SVC_TANKA_NO, inMap.getString(JBSbatKKIFM019.WRIB_SVC_TANKA_NO)); 			//割引サービス単価番号		
		outmap.setString(JBSbatKKIFM019.OWNR_KEI_NO, inMap.getString(JBSbatKKIFM019.OWNR_KEI_NO)); 						//オーナー契約番号
		outmap.setString(JBSbatKKIFM019.TK_HOSHIKI_KEI_NO, inMap.getString(JBSbatKKIFM019.TK_HOSHIKI_KEI_NO));			//提供方式契約番号
		outmap.setString(JBSbatKKIFM019.SEIKY_KEI_NO, inMap.getString(JBSbatKKIFM019.SEIKY_KEI_NO));					//請求契約番号
//		outmap.setString(JBSbatKKIFM019.SVC_STAYMD, inMap.getString(JBSbatKKIFM019.SVC_STAYMD));						//サービス開始年月日
//		outmap.setString(JBSbatKKIFM019.SVC_CHRG_STAYMD, inMap.getString(JBSbatKKIFM019.SVC_CHRG_STAYMD)); 				//サービス課金開始年月日
//		outmap.setString(JBSbatKKIFM019.PLAN_STAYMD, inMap.getString(JBSbatKKIFM019.PLAN_STAYMD)); 						//プラン課金開始年月日
//		outmap.setString(JBSbatKKIFM019.PLAN_ENDYMD, inMap.getString(JBSbatKKIFM019.PLAN_ENDYMD)); 						//プラン課金終了年月日
//		outmap.setString(JBSbatKKIFM019.SVC_DSL_YMD, inMap.getString(JBSbatKKIFM019.SVC_DSL_YMD));						//サービス解約年月日
		outmap.setString(JBSbatKKIFM019.SVC_DLRE_CD, inMap.getString(JBSbatKKIFM019.SVC_DLRE_CD));						//サービス解約理由
		outmap.setString(JBSbatKKIFM019.PLAN_END_SBT_CD, inMap.getString(JBSbatKKIFM019.PLAN_END_SBT_CD)); 				//プラン終了種別コード
		outmap.setString(JBSbatKKIFM019.PNLTY_HASSEI_CD, inMap.getString(JBSbatKKIFM019.PNLTY_HASSEI_CD)); 				//違約金発生コード
		outmap.setString(JBSbatKKIFM019.KAIHK_YMD, inMap.getString(JBSbatKKIFM019.KAIHK_YMD)); 							//回復年月日
		outmap.setString(JBSbatKKIFM019.PAUSE_STP_CD, inMap.getString(JBSbatKKIFM019.PAUSE_STP_CD)); 					//休止中断コード
		outmap.setString(JBSbatKKIFM019.SVC_PAUSE_YMD, inMap.getString(JBSbatKKIFM019.SVC_PAUSE_YMD)); 					//サービス休止年月日
		outmap.setString(JBSbatKKIFM019.SVC_PAUSE_PRC_TSTAYMD, inMap.getString(JBSbatKKIFM019.SVC_PAUSE_PRC_TSTAYMD));	//サービス休止料金適用開始年月日
		outmap.setString(JBSbatKKIFM019.SVC_PAUSE_RLS_YMD, inMap.getString(JBSbatKKIFM019.SVC_PAUSE_RLS_YMD)); 			//サービス休止解除年月日
		outmap.setString(JBSbatKKIFM019.SVC_CANCEL_YMD, inMap.getString(JBSbatKKIFM019.SVC_CANCEL_YMD)); 				//サービスキャンセル年月日
//		outmap.setString(JBSbatKKIFM019.SVC_ENDYMD, inMap.getString(JBSbatKKIFM019.SVC_ENDYMD)); 						//サービス終了年月日
//		outmap.setString(JBSbatKKIFM019.SVC_CHRG_ENDYMD, inMap.getString(JBSbatKKIFM019.SVC_CHRG_ENDYMD)); 				//サービス課金終了年月日
		outmap.setString(JBSbatKKIFM019.IDO_DIV, inMap.getString(JBSbatKKIFM019.IDO_DIV)); 								//異動区分
		outmap.setString(JBSbatKKIFM019.TELNO, inMap.getString(JBSbatKKIFM019.TELNO)); 									//電話番号
		outmap.setString(JBSbatKKIFM019.JIGYOSHA_KEI_ID, inMap.getString(JBSbatKKIFM019.JIGYOSHA_KEI_ID)); 				//事業者用契約ID
		outmap.setString(JBSbatKKIFM019.KEI_CNT, nkei); 																//契約数
		outmap.setString(JBSbatKKIFM019.CAPA, inMap.getString(JBSbatKKIFM019.CAPA)); 									//容量
		outmap.setString(JBSbatKKIFM019.MON_MAX_KEI_CNT, nmax_kei); 													//月中最大契約数
		outmap.setString(JBSbatKKIFM019.GUN_CD, inMap.getString(JBSbatKKIFM019.GUN_CD)); 								//群コード
		outmap.setString(JBSbatKKIFM019.USE_FAIL_STAYMD, inMap.getString(JBSbatKKIFM019.USE_FAIL_STAYMD)); 				//利用不可開始年月日
		outmap.setString(JBSbatKKIFM019.USE_FAIL_ENDYMD, inMap.getString(JBSbatKKIFM019.USE_FAIL_ENDYMD)); 				//利用不可終了年月日
		
		// 開始済みの場合
		if(JBSbatKKConst.TRAN_TRGT_KAISHI.equals(targetMonthDiv) && !isNullBlunk(zenEndYmd))
		{
			// サービス開始年月日
			outmap.setString(JBSbatKKIFM019.SVC_STAYMD, monStaYmd);
			// サービス課金開始年月日
			outmap.setString(JBSbatKKIFM019.SVC_CHRG_STAYMD, monStaYmd);
			// プラン課金開始年月日
			outmap.setString(JBSbatKKIFM019.PLAN_STAYMD, monStaYmd);
			// サービス解約年月日　開始済みかつサービス解約日が設定されている場合に限り（申出解約）を設定
			if(!"".equals(tmpSvcDslYmd))
			{
				outmap.setString(JBSbatKKIFM019.SVC_DLRE_CD, JBSbatKKConst.SVC_DLRE_MOUSIDE);
			}
		}
		else
		{
			// サービス開始年月日(未設定時には月初にて補填)
			outmap.setString(JBSbatKKIFM019.SVC_STAYMD, tmpSvcStaYmd);
			if("".equals(tmpSvcStaYmd))
			{
				outmap.setString(JBSbatKKIFM019.SVC_STAYMD, monStaYmd);
			}
			// サービス課金開始年月日(未設定時には月初にて補填)
			outmap.setString(JBSbatKKIFM019.SVC_CHRG_STAYMD, tmpFstChgYmd);
			if("".equals(tmpFstChgYmd))
			{
				outmap.setString(JBSbatKKIFM019.SVC_CHRG_STAYMD, monStaYmd);
			}
			// プラン課金開始年月日(未設定時には月初にて補填)
			outmap.setString(JBSbatKKIFM019.PLAN_STAYMD, tmpChgStaYmd);
			if("".equals(tmpChgStaYmd))
			{
				outmap.setString(JBSbatKKIFM019.PLAN_STAYMD, monStaYmd);
			}
		}
		// サービス終了年月日、サービス課金終了年月日、プラン課金終了年月日(未設定時には2099/12/31にて補填)
		outmap.setString(JBSbatKKIFM019.SVC_ENDYMD, tmpChgEndYmd);
		outmap.setString(JBSbatKKIFM019.SVC_CHRG_ENDYMD, tmpChgEndYmd);
		outmap.setString(JBSbatKKIFM019.PLAN_ENDYMD, tmpChgEndYmd);
		if("".equals(tmpChgEndYmd))
		{
			outmap.setString(JBSbatKKIFM019.SVC_ENDYMD, JBSbatKKConst.S_MAX_DATE);
			outmap.setString(JBSbatKKIFM019.SVC_CHRG_ENDYMD, JBSbatKKConst.S_MAX_DATE);
			outmap.setString(JBSbatKKIFM019.PLAN_ENDYMD, JBSbatKKConst.S_MAX_DATE);
		}
		// サービス解約年月日(未設定時の補填は不要)
		outmap.setString(JBSbatKKIFM019.SVC_DSL_YMD, tmpSvcDslYmd);
		
		return outmap ;
	}

	/**
	 * 集計用に蓄積した情報を初期化
	 * @param
	 * @return
	 */
	private void initTmpInf()
	{
		max_kei = 0;		// 月中最大契約数
		kei = 0;			// 契約数
		tmpSvcStaYmd = "";	// サービス開始年月日
		tmpFstChgYmd = "";	// サービス課金開始年月日
		tmpChgStaYmd = "";	// プラン課金開始年月日
		tmpChgEndYmd = "";	// プラン課金終了年月日
		tmpSvcDslYmd = "";	// 解約年月日
		nDslFlg = false;	// 未解約フラグ
		// outFlg = false;		// 出力フラグ
	}

	/**
	 * null、空文字判定
	 * @param str
	 * @return
	 */
	private boolean isNullBlunk(String str)
	{
		if (str == null || 0 == str.length())
		{
			return true;
		}
		return false;
	}
}
