/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKaik8PerTaxTgKeiUwChg
*	ソースファイル名	：JBSbatACKaik8PerTaxTgKeiUwChg.java
*	作成者				：富士通　
*	作成日				：2014年01月17日
*＜機能概要＞
*　会計用8%納税対象契約内訳変換部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2014/01/17   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFM142;
import eo.business.util.file.JBSbatACIFM261;
import eo.common.constant.JACStrConst;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACKaik8PerTaxTgKeiUwChg extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** マッチング処理フラグ*/
	private static final String MATCH_FLG = "matchFlg";
	
	/** マスタ移動フラグ*/
	private static final String MST_FLG = "mstFlg";
	
	/** トラン移動フラグ*/
	private static final String TRN_FLG = "trnFlg";
	
	/** うち消費税相当額料金項目コードリスト */
	private ArrayList<String> staxPrcKmkCdList = null;
	
	/** 状態フラグ*/
	private String stateFlg = MATCH_FLG;
	
	/** 会計用売掛金情報リスト（請求契約番号単位）*/
	private ArrayList<JBSbatServiceInterfaceMap> kaikUkkInfoseikyList = null;
	
	/** 会計用売掛金情報マップ（請求契約番号＋サービス契約番号単位）*/
	private HashMap<String, JBSbatServiceInterfaceMap> kaikUkkInfoSvcKeiMap = null;
	
	/** 税率変換後情報リスト（うち消費税相当額追加用）*/
	private ArrayList<JBSbatServiceInterfaceMap> staxAddList = null;
	
	/** うち消費税相当額追加用カウント*/
	private int staxAddCount = 0;
	
	/** 出力件数 */
	private int finalOutCnt = 0;
	
	/** ブレイクキー（入力Ｔ：請求契約単位）*/
	private String inTSKey = null;
	
	/** ブレイクキー（出力Ｔ：請求契約単位）*/
	private String outTSKey = null;
	
	/** ブレイクフラグ（Ｔ：請求契約単位）*/
	private boolean tBrkFlg = false;
	
	/** マッチフラグ（請求契約単位）*/
	private boolean sKey = false;
	
	/** 重複チェック */
	private String doubleCheck = null;
	

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		this.kaikUkkInfoseikyList = new ArrayList<JBSbatServiceInterfaceMap>();
		this.kaikUkkInfoSvcKeiMap = new HashMap<String, JBSbatServiceInterfaceMap>();
		this.staxAddList = new ArrayList<JBSbatServiceInterfaceMap>();
		this.stateFlg = MATCH_FLG;
		this.doubleCheck = new String ();
		
		// 業務パラメータよりうち消費税相当額料金項目コードを取得する
		String [] staxPrcKmkCd = paramUtil.getGyoumuParameter(JACStrConst.AC_TAX_PRC_KMK_CD).split(",");
		this.staxPrcKmkCdList = new ArrayList<String>(staxPrcKmkCd.length);
		for(int i=0 ; i < staxPrcKmkCd.length; i++)
		{
			this.staxPrcKmkCdList.add(staxPrcKmkCd[i]);
			assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][うち消費税相当額料金項目(" + staxPrcKmkCd[i] + ")]");
		}
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + mastMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tranMap=" + tranMap.getMap().toString() + "]") : true;

		// 入力Ｍのみ存在する
		if (mastMap != null && tranMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍのみ存在する]");
			this.setMastProcFlg(true);
			// 入力Ｍ（会計用売掛金情報）をそのまま出力する
			setOutKaikUKK(mastMap, outputInItem);
		}
		// 入力Ｔのみ存在する、または入力Ｍ、入力Ｔともに存在する
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみ存在する、または入力Ｍ、入力Ｔともに存在する]");
			// 入力Ｔのみ存在する場合
			if (mastMap == null && tranMap != null)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみ存在する]");
				// トラン移動状態にする
				this.stateFlg = TRN_FLG;
			}
			
			
			// トラン移動状態の場合は以下の処理を行わない
			if (!this.stateFlg.equals(TRN_FLG))
			{
				// Ｍキー＝Ｔキー（請求契約番号単位）となったらマッチフラグを取得する
				if(mastMap.getString(JBSbatACIFM142.SEIKY_KEI_NO).equals(tranMap.getString(JBSbatACIFM261.SEIKY_KEI_NO)))
				{
					// 請求契約番号・サービス契約番号・料金項目コードが同じレコードを重複して追加しない
					if(!this.doubleCheck.equals(mastMap.getString(JBSbatACIFM142.SEIKY_KEI_NO).concat(mastMap.getString(JBSbatACIFM142.SVC_KEI_NO)).concat(mastMap.getString(JBSbatACIFM142.PRC_KMK_CD))))
					{
						this.doubleCheck = mastMap.getString(JBSbatACIFM142.SEIKY_KEI_NO).concat(mastMap.getString(JBSbatACIFM142.SVC_KEI_NO)).concat(mastMap.getString(JBSbatACIFM142.PRC_KMK_CD));
						// マッチフラグ（請求契約単位）を立てる
						this.sKey = true;
						
						// うち消費税相当額料金項目であれば入力ＭをHashMap（請求契約番号単位）に退避する
						for ( int i = 0; i < this.staxPrcKmkCdList.size(); i++)
						{
							if(mastMap.getString(JBSbatACIFM142.PRC_KMK_CD).equals(this.staxPrcKmkCdList.get(i)))
							{
								assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避.うち消費税相当額追加]");
								
								this.kaikUkkInfoseikyList.add(mastMap);
							}
						}
					}
				}
			}
			
			if(this.stateFlg.equals(MATCH_FLG))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][マッチング処理状態]");
				
				
				
				// マッチングキー取得（請求契約番号・サービス契約番号単位）
				// 入力Ｍ
				String mastSSKey = mastMap.getString(JBSbatACIFM142.SEIKY_KEI_NO).concat( mastMap.getString(JBSbatACIFM142.SVC_KEI_NO));
				
				// 入力Ｔ
				String tranSSKey = tranMap.getString(JBSbatACIFM261.SEIKY_KEI_NO).concat(tranMap.getString(JBSbatACIFM261.SVC_NO));
				
				// 入力Ｍ＝入力Ｔ（マッチ）
				if (mastSSKey.compareTo(tranSSKey) == 0)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ＝入力Ｔ]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][マッチキー ＝ " + mastSSKey + "]");
					
					// 入力Ｍ移動状態へ
					this.stateFlg = MST_FLG;
				}
				// 入力Ｍ＜入力Ｔ
				else if (mastSSKey.compareTo(tranSSKey) < 0)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ＜入力Ｔ]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ ＝ " + mastSSKey + "]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔ ＝ " + tranSSKey + "]");
					
					// 入力Ｍ（会計用売掛金情報）をそのまま出力する
					setOutKaikUKK(mastMap, outputInItem);
					
					this.setMastProcFlg(true);
					
				}
				// 入力Ｍ＞入力Ｔ
				else
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ＞入力Ｔ]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ ＝ " + mastSSKey + "]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔ ＝ " + tranSSKey + "]");
					this.setTranProcFlg(true);
				}
			}
			// マスタ移動状態
			else if(this.stateFlg.equals(MST_FLG))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][マスタ移動状態]");
				// 初期化
				String inMSSKey 		= null; // ブレイクキー（入力Ｍ．請求契約・サービス契約単位単位）
				String outMSSKey		= null; // ブレイクキー（出力Ｍ．請求契約・サービス契約単位単位）
				
				// ブレイクキー（入力Ｍ）の設定
				String mkeyStr = this.getKeyStr(mastMap);
				inMSSKey 		= mkeyStr; // ブレイクキー（入力Ｍ．請求契約・サービス契約単位(退避．キー１)）
				
				// ブレイクキー（出力Ｍ）の設定
				// 引継ぎのブレイクキーが存在する
				if (outputInItem.isKeyList())
				{
					outMSSKey = (String)outputInItem.getKeyList().get(0);
				}
				
				// 退避情報初期設定
				// 退避．ブレイクキー（入力Ｍ．請求契約・サービス契約単位単位）が存在しない場合（初回処理判定（入力1件目））
				if (outMSSKey == null)
				{
					// キー情報リストのクリア
					outputInItem.clearKeyList();

					// キー設定
					outputInItem.addKeyList(inMSSKey);
					
					return outputInItem;
				}
				
				// キーブレイク判定
				if (inMSSKey.equals(outMSSKey))
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避（請求契約番号・サービス契約番号単位）]");
					
					// 入力ＭをHashMap（請求契約番号＋サービス契約番号単位）に退避する
					this.kaikUkkInfoSvcKeiMap.put(mastMap.getString(JBSbatACIFM142.PRC_KMK_CD), mastMap);
					this.setMastProcFlg(true);
				}
				else
				{
					// トラン移動フラグを設定
					this.stateFlg = TRN_FLG;
					
					// キー情報リストのクリア
					outputInItem.clearKeyList();
				}
			}
			// トラン移動状態
			else
			{
				
				
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][トラン移動状態]");
				// 初期化
				String inTSSKey 		= null; // ブレイクキー（入力Ｔ．請求契約・サービス契約単位単位）
				String outTSSKey		= null; // ブレイクキー（出力Ｔ．請求契約・サービス契約単位単位）
				
				// ブレイクキー（入力Ｔ）の設定
				String tkeyStr = this.getKeyStr(tranMap);
				inTSSKey 		= tkeyStr; // ブレイクキー（入力Ｔ．請求契約・サービス契約単位(退避．キー１)）
				
				// ブレイクキー（出力Ｔ）の設定
				// 引継ぎのブレイクキーが存在する
				if (outputInItem.isKeyList())
				{
					outTSSKey = (String)outputInItem.getKeyList().get(0);
				}
				// 退避情報初期設定
				// 退避．ブレイクキー（入力Ｔ．請求契約・サービス契約単位単位）が存在しない場合（初回処理判定（入力1件目））
				if (outTSSKey == null)
				{
					
					// キー情報リストのクリア
					outputInItem.clearKeyList();

					// キー設定
					outputInItem.addKeyList(inTSSKey);

					return outputInItem;
				}
				
				// キーブレイク判定
				if (inTSSKey.equals(outTSSKey))
				{
					if (this.kaikUkkInfoSvcKeiMap != null)
					{
						// 入力Ｔで退避.入力Ｍ（請求契約番号＋サービス契約番号単位）に検索を行う
						searchChgTg(this.kaikUkkInfoSvcKeiMap, tranMap, outputInItem);
					}
					this.setTranProcFlg(true);
					
				}
				else
				{
					// 変換対象外の会計売掛金情報の出力を行う
					outEscMast(this.kaikUkkInfoSvcKeiMap, outputInItem);
					
					// 退避.入力Ｍ(請求契約番号・サービス契約番号単位）を初期化
					this.kaikUkkInfoSvcKeiMap = new HashMap<String, JBSbatServiceInterfaceMap>();
					
					// 状態フラグにマッチング処理フラグを設定
					this.stateFlg = MATCH_FLG;
					
					// キー情報リストのクリア
					outputInItem.clearKeyList();
					
				}
				
			}
			
			// ブレイクフラグ（Ｔ）がfalseの場合のみブレイクキーを取得する
			if (!this.tBrkFlg)
			{
				// ブレイクキーを取得（入力Ｔ．請求契約単位）
				this.inTSKey = tranMap.getString(JBSbatACIFM261.SEIKY_KEI_NO);
			}
			
			if (this.outTSKey == null ||this.inTSKey.equals(this.outTSKey))
			{
				// ブレイクキー（出力Ｔ：請求契約単位）にブレイクキー（入力Ｔ：請求契約単位）を設定
				this.outTSKey = this.inTSKey;
			}
			else
			{
				// ブレイクキー（出力Ｔ：請求契約単位）にブレイクキー（入力Ｔ：請求契約単位）を設定
				this.outTSKey = this.inTSKey;
				// トランブレイクフラグを立てる
				this.tBrkFlg = true;
			}
			
			// トランブレイクフラグが成立している場合
			if(this.tBrkFlg)
			{
				// うち消費税相当額追加が1件以上あれば
				// 退避.入力Ｍ（請求契約番号単位）のうち消費税相当額検索を行う
				if ( 0 < this.staxAddList.size())
				{
					// うち消費税相当額追加件数分繰り返す
					for (int i = 0; i < this.staxAddList.size(); i++)
					{
						// うち消費税相当額追加
						setOutStaxAdd(this.kaikUkkInfoseikyList.get(i), staxAddList.get(i), outputInItem);
					}
					// 初期化
					this.kaikUkkInfoseikyList = new ArrayList<JBSbatServiceInterfaceMap> ();
					this.staxAddList = new ArrayList<JBSbatServiceInterfaceMap> ();
					
					// うち消費税相当額追加用カウントを初期化
					this.staxAddCount = 0;
				}
				// ブレイクフラグ、マッチキー（請求契約単位）初期化
				this.tBrkFlg = false;
				this.sKey = false;
			}
				
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/

		if (!this.kaikUkkInfoSvcKeiMap.isEmpty())
		{
			// 変換対象外の会計売掛金情報の出力を行う
			outEscMast(this.kaikUkkInfoSvcKeiMap, null);
			// 税率変換後情報マップ（うち消費税相当額追加用）が1件以上あればでなければ出力を行う
			if (0 < this.staxAddList.size())
			{
				// うち消費税相当額追加件数分繰り返す
				for (int i = 0; i < this.staxAddList.size(); i++)
				{
					// うち消費税相当額追加
					setOutStaxAdd(this.kaikUkkInfoseikyList.get(i), staxAddList.get(i), null);
				}
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/

	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * @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;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * キー情報取得処理を行います。 
	 * <BR>
	 * @param mastMap 会計売掛金情報
	 * @return String[] キー情報<BR>
	 * 			[0]：請求先番号＋サービス契約番号<BR>
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getKeyStr(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		String returnStr = null;
		// マスタ移動状態の場合
		if (stateFlg.equals(MST_FLG))
		{
			// ブレイクキー（入力Ｍ．請求契約番号・サービス契約番号単位）の設定
			StringBuffer sKeyBuf = new StringBuffer();
			sKeyBuf.append(inMap.getString(JBSbatACIFM142.SEIKY_KEI_NO)); 			// 請求先番号
			sKeyBuf.append(inMap.getString(JBSbatACIFM142.SVC_KEI_NO)); 			// サービス契約番号
			
			returnStr = sKeyBuf.toString(); 								// ブレイクキー（入力Ｍ．請求契約番号・サービス契約番号単位）
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getMKeyStr]請求先番号(" + inMap.getString(JBSbatACIFM142.SEIKY_KEI_NO) + ")" +
																					"サービス契約番号(" + inMap.getString(JBSbatACIFM142.SVC_KEI_NO) + ")");
		}
		else
		{
			// ブレイクキー（入力Ｔ．請求契約番号・サービス契約番号単位）の設定
			StringBuffer sKeyBuf = new StringBuffer();
			sKeyBuf.append(inMap.getString(JBSbatACIFM261.SEIKY_KEI_NO)); 			// 請求先番号
			sKeyBuf.append(inMap.getString(JBSbatACIFM261.SVC_NO)); 			// サービス番号
			
			returnStr = sKeyBuf.toString(); 								// ブレイクキー（入力Ｍ．請求契約番号・サービス契約番号単位）
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getTKeyArray]請求先番号(" + inMap.getString(JBSbatACIFM261.SEIKY_KEI_NO) + ")" +
																					"サービス契約番号(" + inMap.getString(JBSbatACIFM261.SVC_NO) + ")");

		}

		return returnStr;
	}
	
	/**
	 * 会計売掛金情報編集（単純転送）を行います。 
	 * <BR>
	 * @param inMap 会計売掛金情報
	 * @param outputInItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private void setOutKaikUKK(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutKaikUKK][単純転送]");
		
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap();
		
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_SBT_CD, 		inMap.getString(JBSbatACIFM142.KAIK_UCWK_SBT_CD)); 	 	// 会計内訳種別コード
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD,	inMap.getString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD)); 	// 会計内訳種別詳細コード
		outputMap.setString(JBSbatACIFM142.SEIKY_KEI_NO, 			inMap.getString(JBSbatACIFM142.SEIKY_KEI_NO)); 		 	// 請求契約番号
		outputMap.setString(JBSbatACIFM142.KAIK_YM, 		 		inMap.getString(JBSbatACIFM142.KAIK_YM)); 		 	 	// 会計計上月
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_CD, 			inMap.getString(JBSbatACIFM142.KAIK_UCWK_CD)); 		 	// 会計内訳コード
		outputMap.setString(JBSbatACIFM142.PRC_GRP_CD, 		 		inMap.getString(JBSbatACIFM142.PRC_GRP_CD)); 		 	// 料金グループコード
		outputMap.setString(JBSbatACIFM142.PCRS_CD, 		 		inMap.getString(JBSbatACIFM142.PCRS_CD)); 		 	 	// 料金コースコード
		outputMap.setString(JBSbatACIFM142.PRC_SVC_CD, 		 		inMap.getString(JBSbatACIFM142.PRC_SVC_CD)); 		 	// 料金サービスコード
		outputMap.setString(JBSbatACIFM142.PRC_KMK_CD, 		 		inMap.getString(JBSbatACIFM142.PRC_KMK_CD)); 		 	// 料金項目コード
		outputMap.setString(JBSbatACIFM142.CVSTORE_PAY_RSV_YMD, 	inMap.getString(JBSbatACIFM142.CVSTORE_PAY_RSV_YMD));  	// コンビニ支払予定年月日
		outputMap.setString(JBSbatACIFM142.CNT, 		 			inMap.getString(JBSbatACIFM142.CNT)); 		 		 	// 件数
		outputMap.setString(JBSbatACIFM142.AMNT, 		 			inMap.getString(JBSbatACIFM142.AMNT));		 		 	// 金額
		outputMap.setString(JBSbatACIFM142.SEIKY_NO, 		 		inMap.getString(JBSbatACIFM142.SEIKY_NO)); 		 	 	// 請求番号
		outputMap.setString(JBSbatACIFM142.PRC_MON, 		 		inMap.getString(JBSbatACIFM142.PRC_MON)); 		 	 	// 料金月
		outputMap.setString(JBSbatACIFM142.SVC_KEI_NO, 		 		inMap.getString(JBSbatACIFM142.SVC_KEI_NO)); 		 	// サービス契約番号
		outputMap.setString(JBSbatACIFM142.PAY_WAY, 		 		inMap.getString(JBSbatACIFM142.PAY_WAY)); 		 	 	// 支払方法
		outputMap.setString(JBSbatACIFM142.CRECARD_COMP_CD, 		inMap.getString(JBSbatACIFM142.CRECARD_COMP_CD)); 	 	// クレジットカード会社コード
		outputMap.setString(JBSbatACIFM142.CONT_SVC_CD, 			inMap.getString(JBSbatACIFM142.CONT_SVC_CD)); 		 	// コンテンツサービスコード
		outputMap.setString(JBSbatACIFM142.COMP_SKBT_CD, 			inMap.getString(JBSbatACIFM142.COMP_SKBT_CD)); 		 	// 企業識別コード

		// レコード出力判定フラグの設定
		outputMap.setOutFlg(true);
		
		if (outputInItem == null)
		{
			finalOut(outputMap);
		}
		else
		{
			// 出力レコード情報を設定する
			outputInItem.addOutMapList(outputMap);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutKaikUKK][単純転送]");
	}
	
	/**
	 * 会計売掛金情報編集（変換後内訳）を行います。 
	 * <BR>
	 * @param kaikUkkInfoSvcKeiMap 会計売掛金情報
	 * @param mastMap 税率変換後情報
	 * @param outputInItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private void setOutChgUW(JBSbatServiceInterfaceMap kaikUkkInfoSvcKeiMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutChgUW][変換後内訳]");
		
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap();
		
		// 会計内訳コード（8%税率）変換
		String kaikUW = chg8PerTaxKaikUW(kaikUkkInfoSvcKeiMap);
		
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_SBT_CD, 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.KAIK_UCWK_SBT_CD)); 	 	// 会計内訳種別コード
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD,	kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD)); 	// 会計内訳種別詳細コード
		outputMap.setString(JBSbatACIFM142.SEIKY_KEI_NO, 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.SEIKY_KEI_NO)); 		 	// 請求契約番号
		outputMap.setString(JBSbatACIFM142.KAIK_YM, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.KAIK_YM)); 		 	 	// 会計計上月
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_CD, 			kaikUW); 		 														// 会計内訳コード
		outputMap.setString(JBSbatACIFM142.PRC_GRP_CD, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PRC_GRP_CD)); 		 	// 料金グループコード
		outputMap.setString(JBSbatACIFM142.PCRS_CD, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PCRS_CD)); 		 	 	// 料金コースコード
		outputMap.setString(JBSbatACIFM142.PRC_SVC_CD, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PRC_SVC_CD)); 		 	// 料金サービスコード
		outputMap.setString(JBSbatACIFM142.PRC_KMK_CD, 		 		tranMap.getString(JBSbatACIFM261.PRC_KMK_CD)); 					 	 	// 料金項目コード
		outputMap.setString(JBSbatACIFM142.CVSTORE_PAY_RSV_YMD, 	kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.CVSTORE_PAY_RSV_YMD));  	// コンビニ支払予定年月日
		outputMap.setString(JBSbatACIFM142.CNT, 		 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.CNT)); 		 		 	// 件数
		outputMap.setString(JBSbatACIFM142.AMNT, 		 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.AMNT));		 		 	// 金額
		outputMap.setString(JBSbatACIFM142.SEIKY_NO, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.SEIKY_NO)); 		 	 	// 請求番号
		outputMap.setString(JBSbatACIFM142.PRC_MON, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PRC_MON)); 		 	 	// 料金月
		outputMap.setString(JBSbatACIFM142.SVC_KEI_NO, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.SVC_KEI_NO)); 		 	// サービス契約番号
		outputMap.setString(JBSbatACIFM142.PAY_WAY, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PAY_WAY)); 		 	 	// 支払方法
		outputMap.setString(JBSbatACIFM142.CRECARD_COMP_CD, 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.CRECARD_COMP_CD)); 	 	// クレジットカード会社コード
		outputMap.setString(JBSbatACIFM142.CONT_SVC_CD, 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.CONT_SVC_CD)); 		 	// コンテンツサービスコード
		outputMap.setString(JBSbatACIFM142.COMP_SKBT_CD, 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.COMP_SKBT_CD)); 		 	// 企業識別コード

		// レコード出力判定フラグの設定
		outputMap.setOutFlg(true);

		// 出力レコード情報を設定する
		outputInItem.addOutMapList(outputMap);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutChgUW][変換後内訳]");
	}
	
	/**
	 * 会計売掛金情報編集（うち消費税相当額変更）を行います。 
	 * <BR>
	 * @param kaikUkkInfoSvcKeiMap 会計売掛金情報
	 * @param tranMap 税率変換後情報
	 * @param outputInItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private void setOutStaxChg(JBSbatServiceInterfaceMap kaikUkkInfoSvcKeiMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutStaxChg][うち消費税相当額変更]");
		
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap();
		
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_SBT_CD, 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.KAIK_UCWK_SBT_CD)); 	 	// 会計内訳種別コード
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD,	kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD)); 	// 会計内訳種別詳細コード
		outputMap.setString(JBSbatACIFM142.SEIKY_KEI_NO, 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.SEIKY_KEI_NO)); 		 	// 請求契約番号
		outputMap.setString(JBSbatACIFM142.KAIK_YM, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.KAIK_YM)); 		 	 	// 会計計上月
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_CD, 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.KAIK_UCWK_CD)); 		 	// 会計内訳コード
		outputMap.setString(JBSbatACIFM142.PRC_GRP_CD, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PRC_GRP_CD)); 		 	// 料金グループコード
		outputMap.setString(JBSbatACIFM142.PCRS_CD, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PCRS_CD)); 		 	 	// 料金コースコード
		outputMap.setString(JBSbatACIFM142.PRC_SVC_CD, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PRC_SVC_CD)); 		 	// 料金サービスコード
		outputMap.setString(JBSbatACIFM142.PRC_KMK_CD, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PRC_KMK_CD)); 		 	// 料金項目コード
		outputMap.setString(JBSbatACIFM142.CVSTORE_PAY_RSV_YMD, 	kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.CVSTORE_PAY_RSV_YMD));  	// コンビニ支払予定年月日
		outputMap.setString(JBSbatACIFM142.CNT, 		 			"0"); 														 		 	// 件数
		outputMap.setString(JBSbatACIFM142.AMNT, 		 			tranMap.getBigDecimal(JBSbatACIFM261.PRC));					 		 	// 金額
		outputMap.setString(JBSbatACIFM142.SEIKY_NO, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.SEIKY_NO)); 		 	 	// 請求番号
		outputMap.setString(JBSbatACIFM142.PRC_MON, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PRC_MON)); 		 	 	// 料金月
		outputMap.setString(JBSbatACIFM142.SVC_KEI_NO, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.SVC_KEI_NO)); 		 	// サービス契約番号
		outputMap.setString(JBSbatACIFM142.PAY_WAY, 		 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.PAY_WAY)); 		 	 	// 支払方法
		outputMap.setString(JBSbatACIFM142.CRECARD_COMP_CD, 		kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.CRECARD_COMP_CD)); 	 	// クレジットカード会社コード
		outputMap.setString(JBSbatACIFM142.CONT_SVC_CD, 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.CONT_SVC_CD)); 		 	// コンテンツサービスコード
		outputMap.setString(JBSbatACIFM142.COMP_SKBT_CD, 			kaikUkkInfoSvcKeiMap.getString(JBSbatACIFM142.COMP_SKBT_CD)); 		 	// 企業識別コード

		// レコード出力判定フラグの設定
		outputMap.setOutFlg(true);

		// 出力レコード情報を設定する
		outputInItem.addOutMapList(outputMap);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutStaxChg][うち消費税相当額変更]");
	}
	
	/**
	 * 会計売掛金情報編集（うち消費税相当額追加）を行います。 
	 * <BR>
	 * @param kaikUkkInfoseikyList 会計売掛金情報
	 * @param staxAddList 税率変換後情報
	 * @param outputInItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private void setOutStaxAdd(JBSbatServiceInterfaceMap kaikUkkInfoseikyList, JBSbatServiceInterfaceMap staxMap, JBSbatOutputItem outputInItem)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutStaxChg][うち消費税相当額追加]");
		
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap();
		
		// 会計内訳コード（8%税率）変換
		String kaikUW = chg8PerTaxKaikUW(kaikUkkInfoseikyList);
		
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_SBT_CD, 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.KAIK_UCWK_SBT_CD)); 	 	// 会計内訳種別コード
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD,	kaikUkkInfoseikyList.getString(JBSbatACIFM142.KAIK_UCWK_SBT_DTL_CD)); 	// 会計内訳種別詳細コード
		outputMap.setString(JBSbatACIFM142.SEIKY_KEI_NO, 			kaikUkkInfoseikyList.getString(JBSbatACIFM142.SEIKY_KEI_NO)); 		 	// 請求契約番号
		outputMap.setString(JBSbatACIFM142.KAIK_YM, 		 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.KAIK_YM)); 		 	 	// 会計計上月
		outputMap.setString(JBSbatACIFM142.KAIK_UCWK_CD, 			kaikUW); 		 														// 会計内訳コード
		outputMap.setString(JBSbatACIFM142.PRC_GRP_CD, 		 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.PRC_GRP_CD)); 		 	 	// 料金グループコード
		outputMap.setString(JBSbatACIFM142.PCRS_CD, 		 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.PCRS_CD)); 		 	 	// 料金コースコード
		outputMap.setString(JBSbatACIFM142.PRC_SVC_CD, 		 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.PRC_SVC_CD)); 		 	 	// 料金サービスコード
		outputMap.setString(JBSbatACIFM142.PRC_KMK_CD, 		 		staxMap.getString(JBSbatACIFM261.PRC_KMK_CD)); 		 	 			// 料金項目コード
		outputMap.setString(JBSbatACIFM142.CVSTORE_PAY_RSV_YMD, 	kaikUkkInfoseikyList.getString(JBSbatACIFM142.CVSTORE_PAY_RSV_YMD));  	// コンビニ支払予定年月日
		outputMap.setString(JBSbatACIFM142.CNT, 		 			"0"); 														 		 	// 件数
		outputMap.setString(JBSbatACIFM142.AMNT, 		 			staxMap.getBigDecimal(JBSbatACIFM261.PRC));					 		// 金額
		outputMap.setString(JBSbatACIFM142.SEIKY_NO, 		 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.SEIKY_NO)); 		 	 	// 請求番号
		outputMap.setString(JBSbatACIFM142.PRC_MON, 		 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.PRC_MON)); 		 	 	// 料金月
		outputMap.setString(JBSbatACIFM142.SVC_KEI_NO, 		 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.SVC_KEI_NO)); 		 	 	// サービス契約番号
		outputMap.setString(JBSbatACIFM142.PAY_WAY, 		 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.PAY_WAY)); 		 	 	// 支払方法
		outputMap.setString(JBSbatACIFM142.CRECARD_COMP_CD, 		kaikUkkInfoseikyList.getString(JBSbatACIFM142.CRECARD_COMP_CD)); 	 	// クレジットカード会社コード
		outputMap.setString(JBSbatACIFM142.CONT_SVC_CD, 			kaikUkkInfoseikyList.getString(JBSbatACIFM142.CONT_SVC_CD)); 		 	// コンテンツサービスコード
		outputMap.setString(JBSbatACIFM142.COMP_SKBT_CD, 			kaikUkkInfoseikyList.getString(JBSbatACIFM142.COMP_SKBT_CD)); 		 	// 企業識別コード

		// レコード出力判定フラグの設定
		outputMap.setOutFlg(true);
		
		if (outputInItem == null)
		{
			finalOut(outputMap);
		}
		else
		{
			// 出力レコード情報を設定する
			outputInItem.addOutMapList(outputMap);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutStaxChg][うち消費税相当額追加]");
	}
	
	/**
	 * 入力Ｔで退避.売掛金情報に対し検索を行います。 
	 * <BR>
	 * @param kaikUkkInfoseikyList 退避.会計売掛金情報
	 * @param mastMap 税率変換後情報
	 * @param outputInItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private void searchChgTg(HashMap<String, JBSbatServiceInterfaceMap> kaikUkkInfoseikyList, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		String prcKmkCdBf = tranMap.getString(JBSbatACIFM261.PRC_KMK_CD_BF);	// 税率変換後情報.変更前料金項目コード
		String prcKmkCd   = tranMap.getString(JBSbatACIFM261.PRC_KMK_CD);		// 税率変換後情報.料金項目コード
		
		
		// 税率変換後情報.変更前料金項目コードがnullでない場合
		if (prcKmkCdBf != null && !JACStrConst.KARA_MOJI.equals(prcKmkCdBf))
		{
			// 税率変換後情報.変更前料金項目コードで検索
			if (kaikUkkInfoseikyList.containsKey(prcKmkCdBf))
			{
				// 変換後内訳として編集・出力する
				setOutChgUW(kaikUkkInfoseikyList.get(prcKmkCdBf), tranMap, outputInItem);
				
				// 対象となった売掛金情報をマップから削除する
				kaikUkkInfoseikyList.remove(prcKmkCdBf);
			}
		}
		// 税率変換後情報.変更前料金項目コードがnullの場合
		else
		{
			// 税率変換後情報.料金項目コードで検索
			if (kaikUkkInfoseikyList.containsKey(prcKmkCd))
			{
				// 変換後内訳として編集・出力する
				setOutStaxChg(kaikUkkInfoseikyList.get(prcKmkCd), tranMap, outputInItem);
				
				// 対象となった売掛金情報をマップから削除する
				kaikUkkInfoseikyList.remove(prcKmkCd);
			}
			else
			{
				// 検索がヒットしなかった場合、うち消費税相当額追加として処理するため税率変換後情報を退避
				this.staxAddList.add(staxAddCount, tranMap);
				this.staxAddCount++;
			}
		}
		
		return;
	}
	
	/**
	 * 会計内訳コードを8%税率に変換します。 
	 * <BR>
	 * @param inMap 会計売掛金情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private String chg8PerTaxKaikUW(JBSbatServiceInterfaceMap inMap)throws Exception
	{
		// 会計内訳コードの下1桁を"7"（8%税率）に変換
		return inMap.getString(JBSbatACIFM142.KAIK_UCWK_CD).substring(0, 11).concat("7");
	}
	
	/**
	 * 退避.売掛金情報を出力します。 
	 * <BR>
	 * @param inMap 退避.売掛金情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private void outEscMast(HashMap<String, JBSbatServiceInterfaceMap> inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		// 変換対象外の会計用売掛金情報を出力する。
		Iterator<JBSbatServiceInterfaceMap> outList = inMap.values().iterator();
		
		// 退避分件数分出力
		while (outList.hasNext())
		{
			JBSbatServiceInterfaceMap outMap = outList.next();
			
			// 出力情報設定
			setOutKaikUKK(outMap, outputInItem);
		}
	}
	
	/**
	 * 退避しているレコードを出力します。
	 * <BR>
	 * @param outUsePrcMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void finalOut(JBSbatServiceInterfaceMap outUsePrcMap) throws Exception
	{
		// ファイル出力部品を取得
		JBSbatOutputFileUtil fileUtil = super.commonItem.getOutPutFile();

		// 設定されているエンコード形式を退避
		String enc = fileUtil.getEncode();

		if (JACStrConst.ENCODE_SJIS.toUpperCase().equals(enc.toUpperCase()))
		{
			// encodeの形式がSHIFT-JISの場合、MS932に変換
			enc = JACStrConst.ENCODE_MS932;
		}

		// 出力定義ファイル名を取得する。
		String outFileDefName = JBSbatAplConst.getAplConstValue("OTD") + super.freeItem;

		// 出力定義ファイルオブジェクトを生成する
		JBSbatDefFileUtil outFileDef = new JBSbatDefFileUtil(outFileDefName, fileUtil);

		// 退避したエンコード形式を戻す（出力定義ファイルオブジェクト生成時に上書きが発生しているため）
		fileUtil.setEncode(enc);

		fileUtil.print(outUsePrcMap, outFileDef);

		finalOutCnt += 1;
	}
}
