/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHJtskPrcIktAdjSjFileSksi
*	ソースファイル名	：JBSbatCHJtskPrcIktAdjSjFileSksi.java
*	作成者				：富士通　
*	作成日				：2020年04月20日
*＜機能概要＞
*　譲渡先料金一括調整指示ファイル作成部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v49.00.00	2020/04/20	 FJ)塩津	【ANK-3826-00-00】譲渡未収分の載せ替え処理の自動化
*	v49.00.00	2020/07/03	 FJ)塩津	【IT2-2020-0000011】譲渡元の料金一括変更ができない
*	v50.00.00	2020/08/17	 FJ)塩津	【ANK-3912-00-00】譲渡未収載せ替え対象の条件見直し
*	v62.00.00	2022/10/17	 FJ)吉村	【ANK-4283-00-00】譲渡未収載せ替え処理の改善
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.util.file.JBSbatCHIFM352;
// v49.00 2020/07/03 IT2-2020-0000011 del start
//import eo.business.util.file.JBSbatCHIFM353;
// v49.00 2020/07/03 IT2-2020-0000011 del end
// v49.00 2020/07/03 IT2-2020-0000011 add start
import eo.business.util.file.JBSbatCHIFM354;
// v49.00 2020/07/03 IT2-2020-0000011 add end
import eo.business.util.table.JBSbatCH_T_SEIKY_UCWK;
// v49.00 2020/07/03 IT2-2020-0000011 add start
import eo.business.util.table.JBSbatKK_T_KKTK_SVC_KEI;
// v49.00 2020/07/03 IT2-2020-0000011 add end
import eo.common.util.JPCEditString;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;


/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHJtskPrcIktAdjSjFileSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** テーブル(請求内訳)*/
	private static final String D_TBL_NAME_CH_T_SEIKY_UCWK = "CH_T_SEIKY_UCWK";
	
	/** SQL定義キー(CH_SELECT_024)*/
	private static final String CH_T_SEIKY_UCWK_CH_SELECT_024 = "CH_SELECT_024";
	
	// v49.00 2020/07/03 IT2-2020-0000011 add start
	/** テーブル(機器提供サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KKTK_SVC_KEI = "KK_T_KKTK_SVC_KEI";
	
	/** SQL定義キー(CH_SELECT_004)*/
	private static final String KK_T_KKTK_SVC_KEI_CH_SELECT_004 = "CH_SELECT_004";
	// v49.00 2020/07/03 IT2-2020-0000011 add end
	
	/** テーブルアクセスクラス(請求内訳)*/
	private JBSbatSQLAccess db_CH_T_SEIKY_UCWK = null;
	
	// v49.00 2020/07/03 IT2-2020-0000011 add start
	/** テーブルアクセスクラス(機器提供サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KKTK_SVC_KEI = null;
	// v49.00 2020/07/03 IT2-2020-0000011 add end
	
	/** 退避．ワーク処理グループ番号*/
	private int wkTrnGrpNo = 0;
	
	/** 退避．ワーク処理通番*/
	private int wkTrnSeq = 1;
	
	/** 編集用 桁数 */
	private static final int NO_LENGTH = 4;
	
	/** 退避．変更区分 */
	private String chgDiv = null;
	
	/** 退避．変更後金額 */
	private BigDecimal chgAfAmnt = BigDecimal.ZERO;
	
	/** 退避．記事 */
	private String kiji = null;
	
	/** 退避．未納請求月 */
	private String minouSeikyMonths = null;
	
	/** 退避．請求契約番号（譲渡元） */
	private String seikyKeiNoMts = null;

	/** 退避．出力マップ */
	private JBSbatServiceInterfaceMap bkOutMap = new JBSbatServiceInterfaceMap();

	/** キー：請求契約番号*/
	private String keySeikyKeiNo = null;

	/** キー：出力単位*/
	private String keyOutput = null;
	
	/** キー：インマップ*/
	private static final String KEY_IN_MAP = "IN_MAP";
	
	/** "0" */
	private static final String ZERO_DEL = "0";

	// v50.00.00 2020/08/17 ANK-3912-00-00 mod start
	/** 頭文字*/
	//private static final String HEAD_TEXT = "　・";
	/** 頭文字*/
	private static final String HEAD_TEXT = "・";
	// v50.00.00 2020/08/17 ANK-3912-00-00 mod end

	/** 未納請求月リスト*/
	List<String> minouSeikyMonthList = new ArrayList<String>();

	/** 請求契約番号（譲渡元）リスト*/
	List<String> seikyKeiNoMtList = new ArrayList<String>();

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_CH_T_SEIKY_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY_UCWK);
		// v49.00 2020/07/03 IT2-2020-0000011 add start
		db_KK_T_KKTK_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KKTK_SVC_KEI);
		// v49.00 2020/07/03 IT2-2020-0000011 add end
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		if (null == inMap)
		{
			// 退避リストが空でない場合
			if (outputInItem.isOutMapList()) 
			{
				// キーブレーク処理
				outputInItem = keyBreakProc(inMap, outputInItem);
			}
			return outputInItem;
		}
		
		// 退避リストが空の場合
		if (!outputInItem.isOutMapList()) 
		{
			//処理グループ番号の設定
			wkTrnGrpNo++;
			// キーブレーク判定用キー
			keySeikyKeiNo = inMap.getString(JBSbatCHIFM352.SEIKY_KEI_NO_SK);
			// データ追加処理
			addDataProc(inMap, outputInItem);
			return outputInItem;
		}
		else
		{
			// キーブレーク（請求契約番号（譲渡先））の場合
			if (isKeyBreak1(inMap, outputInItem))
			{
				// キーブレーク処理
				outputInItem = keyBreakProc(inMap, outputInItem);
			}
			// キーブレーク（請求契約番号（譲渡先））でない場合
			else
			{
				if (isKeyBreak2(inMap, outputInItem))
				{
					// キーブレーク判定用キー
					String keys1 = JBSbatCHIFM352.SEIKY_KEI_NO_SK;
					String keys2 = JBSbatCHIFM352.SVC_KEI_NO;
					String keys3 = JBSbatCHIFM352.PCRS_CD;
					String keys4 = JBSbatCHIFM352.PRC_SVC_CD;
					String keys5 = JBSbatCHIFM352.PRC_KMK_CD_SK;
					// ANK-4283-00-00 ADD START
					String keys6 = JBSbatCHIFM352.SVC_DTL_SKBT_NO;
					// ANK-4283-00-00 ADD END
					keyOutput = inMap.getString(keys1).concat(inMap.getString(keys2)).concat(inMap.getString(keys3))
					// ANK-4283-00-00 MOD START
							//	.concat(inMap.getString(keys4)).concat(inMap.getString(keys5));
								.concat(inMap.getString(keys4)).concat(inMap.getString(keys5)).concat(inMap.getString(keys6));
					// ANK-4283-00-00 MOD END
				}
			}
			// データ追加処理
			addDataProc(inMap, outputInItem);
		}
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_CH_T_SEIKY_UCWK.close();
		// v49.00 2020/07/03 IT2-2020-0000011 add start
		db_KK_T_KKTK_SVC_KEI.close();
		// v49.00 2020/07/03 IT2-2020-0000011 add end
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CH_SELECT_024)で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_SEIKY_UCWK_CH_SELECT_024(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());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		// ANK-4283-00-00 ADD START
		paramList.setValue(param[6].toString());
		// ANK-4283-00-00 ADD END

		// DBアクセスを実行します
		db_CH_T_SEIKY_UCWK.selectBySqlDefine(paramList, CH_T_SEIKY_UCWK_CH_SELECT_024);
	}

	// v49.00 2020/07/03 IT2-2020-0000011 add start
	/**
	 * SQLKEY(CH_SELECT_004)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	業務機能識別コード
	 *		 	業務機能識別コード
	 *		 	抽出変換コード
	 *		 	適用開始年月日
	 *		 	適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KKTK_SVC_KEI_CH_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_KKTK_SVC_KEI.selectBySqlDefine(paramList, KK_T_KKTK_SVC_KEI_CH_SELECT_004);
	}
	// v49.00 2020/07/03 IT2-2020-0000011 add end

	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	/**
	 * 出力用マップを取得します。
	 * 
	 * @param outputInItem 入力データリスト
	 * @param outputBean 出力リスト
	 * @return 出力用マップ
	 * @throws Exception キャストまたはDBアクセスで例外が発生した場合
	 */
	private JBSbatServiceInterfaceMap getOutMap(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		// 出力用マップ
		JBSbatServiceInterfaceMap outMap = null;
		
		outMap = new JBSbatServiceInterfaceMap();
		
		// v49.00 2020/07/03 IT2-2020-0000011 mod start
		// キーブレーク判定用キー
//		String keys1 = JBSbatCHIFM352.SEIKY_KEI_NO_SK;
//		String keys2 = JBSbatCHIFM352.SVC_KEI_NO;
//		String keys3 = JBSbatCHIFM352.PCRS_CD;
//		String keys4 = JBSbatCHIFM352.PRC_SVC_CD;
//		String keys5 = JBSbatCHIFM352.PRC_KMK_CD_SK;

//		// 現在の値
//		String key = inMap.getString(keys1).concat(inMap.getString(keys2)).concat(inMap.getString(keys3))
//		.concat(inMap.getString(keys4)).concat(inMap.getString(keys5));
//		if (keyOutput == null || !keyOutput.equals(key))
//		{
//			
//			// 譲渡元料金項目コードに紐づく譲渡先の当月分請求内訳の金額の取得
//			 BigDecimal amnt = getGetSeikyAmnt(inMap);
//			 // 譲渡先の当月分請求内訳の金額が存在する場合、金額の合算
//			 if(amnt != null)
//			 {
//				 // 変更区分に"2"(変更)を設定する
//				 chgDiv = JACStrConst.ADJ_DIV_ADJ;
//				 // 金額の合算
//				 chgAfAmnt = amnt;
//			 }
//			 else
//			 {
//				 // 変更区分に"1"(追加)を設定する
//				 chgDiv = JACStrConst.ADJ_DIV_ADD;
//			 }
//			if (keyOutput == null)
//			{
//				keyOutput = key;
//			}
//		}
//		chgAfAmnt = new BigDecimal(inMap.getString(JBSbatCHIFM352.CHNG_AMNT)).add(chgAfAmnt);
		
		// v50.00.00 2020/08/17 ANK-3912-00-00 add start
		// キーブレーク判定用キー
		String keys1 = JBSbatCHIFM352.SEIKY_KEI_NO_SK;
		String keys2 = JBSbatCHIFM352.SVC_KEI_NO;
		String keys3 = JBSbatCHIFM352.PCRS_CD;
		String keys4 = JBSbatCHIFM352.PRC_SVC_CD;
		String keys5 = JBSbatCHIFM352.PRC_KMK_CD_SK;
		// ANK-4283-00-00 ADD START
		String keys6 = JBSbatCHIFM352.SVC_DTL_SKBT_NO;
		// ANK-4283-00-00 ADD END

		// 現在の値
		String key = inMap.getString(keys1).concat(inMap.getString(keys2)).concat(inMap.getString(keys3))
		// ANK-4283-00-00 MOD START
	//	.concat(inMap.getString(keys4)).concat(inMap.getString(keys5));
		.concat(inMap.getString(keys4)).concat(inMap.getString(keys5)).concat(inMap.getString(keys6));
		// v50.00.00 2020/08/17 ANK-3912-00-00 add end
		// ANK-4283-00-00 MOD END
		// 譲渡元料金項目コードに紐づく譲渡先の当月分請求内訳の金額の取得
		BigDecimal amnt = getGetSeikyAmnt(inMap);
		// 譲渡先の当月分請求内訳の金額が存在する場合、金額の合算
		if(amnt != null)
		{
			// 変更区分に"2"(変更)を設定する
			chgDiv = JACStrConst.ADJ_DIV_ADJ;
			// 金額の合算
			chgAfAmnt = amnt;
		}
		else
		{
			// 変更区分に"1"(追加)を設定する
			chgDiv = JACStrConst.ADJ_DIV_ADD;
		}
		// v50.00.00 2020/08/17 ANK-3912-00-00 add start
		if (keyOutput == null)
		{
			keyOutput = key;
		}
		// v50.00.00 2020/08/17 ANK-3912-00-00 add end
		chgAfAmnt = new BigDecimal(inMap.getString(JBSbatCHIFM352.CHNG_AMNT)).add(chgAfAmnt);
		// v49.00 2020/07/03 IT2-2020-0000011 mod end
		// v49.00 2020/07/03 IT2-2020-0000011 mod start
		// 処理グループ番号（ゼロパディング）
//		outMap.setString(JBSbatCHIFM353.TRN_GRP_NO, JPCEditString.fillZero(String.valueOf(wkTrnGrpNo), NO_LENGTH, false));
//		// 処理通番（ゼロパディング）
//		outMap.setString(JBSbatCHIFM353.TRN_SEQ, JPCEditString.fillZero(String.valueOf(wkTrnSeq), NO_LENGTH, false));
//		// 変更区分
//		outMap.setString(JBSbatCHIFM353.CHG_DIV, chgDiv);
//		// 請求年月
//		outMap.setString(JBSbatCHIFM353.SEIKY_YM, inMap.getString(JBSbatCHIFM352.SEIKY_YM_SK));
//		// 請求種別
//		outMap.setString(JBSbatCHIFM353.SEIKY_SBT_CD, inMap.getString(JBSbatCHIFM352.SEIKY_SBT_CD));
//		// 請求契約番号
//		outMap.setString(JBSbatCHIFM353.SEIKY_KEI_NO, inMap.getString(JBSbatCHIFM352.SEIKY_KEI_NO_SK));
//		// サービス契約番号
//		outMap.setString(JBSbatCHIFM353.SVC_KEI_NO, inMap.getString(JBSbatCHIFM352.SVC_KEI_NO));
//		// マンションＩＤ
//		outMap.setString(JBSbatCHIFM353.MANS_ID, null);
//		// 部屋番号
//		outMap.setString(JBSbatCHIFM353.RM_NO, null);
//		// サービス詳細識別番号
//		outMap.setString(JBSbatCHIFM353.SVC_DTL_SKBT_NO, inMap.getString(JBSbatCHIFM352.SVC_DTL_SKBT_NO));
//		// 開始日
//		outMap.setString(JBSbatCHIFM353.USE_STAYMD, inMap.getString(JBSbatCHIFM352.USE_STAYMD));
//		// 終了日
//		outMap.setString(JBSbatCHIFM353.USE_ENDYMD, inMap.getString(JBSbatCHIFM352.USE_ENDYMD));
//		// 料金コースコード
//		outMap.setString(JBSbatCHIFM353.PCRS_CD, inMap.getString(JBSbatCHIFM352.PCRS_CD));
//		// 料金サービスコード
//		outMap.setString(JBSbatCHIFM353.PRC_SVC_CD, inMap.getString(JBSbatCHIFM352.PRC_SVC_CD));
//		// 料金項目コード
//		outMap.setString(JBSbatCHIFM353.PRC_KMK_CD, inMap.getString(JBSbatCHIFM352.PRC_KMK_CD_SK));
//		// 変更後金額
//		outMap.setString(JBSbatCHIFM353.CHG_AF_AMNT, chgAfAmnt);
//		// 処理通番が1の場合、補償費扱いフラグ・顧客対応履歴表示フラグを設定
//		if(wkTrnSeq == 1)
//		{
//			// 補償費扱いフラグ
//			outMap.setString(JBSbatCHIFM353.COMPENSATION_FLG, "0");
//			// 顧客対応履歴表示フラグ
//			outMap.setString(JBSbatCHIFM353.CUST_TOAK_DSP_FLG, "0");
//		}
//		else
//		{
//			// 補償費扱いフラグ
//			outMap.setString(JBSbatCHIFM353.COMPENSATION_FLG, null);
//			// 顧客対応履歴表示フラグ
//			outMap.setString(JBSbatCHIFM353.CUST_TOAK_DSP_FLG, null);
//		}
		// 処理グループ番号（ゼロパディング）
		 outMap.setString(JBSbatCHIFM354.TRN_GRP_NO, JPCEditString.fillZero(String.valueOf(wkTrnGrpNo), NO_LENGTH, false));
		 // 処理通番（ゼロパディング）
		 outMap.setString(JBSbatCHIFM354.TRN_SEQ, JPCEditString.fillZero(String.valueOf(wkTrnSeq), NO_LENGTH, false));
		 // 変更区分
		 outMap.setString(JBSbatCHIFM354.CHG_DIV, chgDiv);
		 // 請求年月
		 outMap.setString(JBSbatCHIFM354.SEIKY_YM, inMap.getString(JBSbatCHIFM352.SEIKY_YM_SK));
		 // 請求契約番号
		 outMap.setString(JBSbatCHIFM354.SEIKY_KEI_NO, inMap.getString(JBSbatCHIFM352.SEIKY_KEI_NO_SK));
		 // サービス契約番号
		 outMap.setString(JBSbatCHIFM354.SVC_KEI_NO, inMap.getString(JBSbatCHIFM352.SVC_KEI_NO));
		 // マンションＩＤ
		 outMap.setString(JBSbatCHIFM354.MANS_ID, null);
		 // 部屋番号
		 outMap.setString(JBSbatCHIFM354.RM_NO, null);
		 // サービス詳細識別番号
		 //outMap.setString(JBSbatCHIFM354.SVC_DTL_SKBT_NO, inMap.getString(JBSbatCHIFM352.SVC_DTL_SKBT_NO));
		 if(inMap.getString(JBSbatCHIFM352.SVC_DTL_SKBT_NO).length() == 12)
			{
				// 機器提供サービス契約から機器製造番号を取得
				String kikiSeizoNo = getKikiSeizoNo(inMap.getString(JBSbatCHIFM352.SVC_DTL_SKBT_NO));
				
				if(null != kikiSeizoNo)
				{
					// サービス詳細識別番号に機器製造番号を設定
					outMap.set(JBSbatCHIFM354.SVC_DTL_SKBT_NO, kikiSeizoNo);
				}
				else
				{
					// サービス詳細識別番号
					outMap.set(JBSbatCHIFM354.SVC_DTL_SKBT_NO, inMap.getString(JBSbatCHIFM352.SVC_DTL_SKBT_NO));
				}
			}
			else
			{
				// サービス詳細識別番号
				outMap.set(JBSbatCHIFM354.SVC_DTL_SKBT_NO, inMap.getString(JBSbatCHIFM352.SVC_DTL_SKBT_NO));
			}
		 // 開始日
		 outMap.setString(JBSbatCHIFM354.USE_STAYMD, inMap.getString(JBSbatCHIFM352.USE_STAYMD));
		 // 終了日
		 outMap.setString(JBSbatCHIFM354.USE_ENDYMD, inMap.getString(JBSbatCHIFM352.USE_ENDYMD));
		 // 料金コースコード
		 outMap.setString(JBSbatCHIFM354.PCRS_CD, inMap.getString(JBSbatCHIFM352.PCRS_CD));
		 // 料金サービスコード
		 outMap.setString(JBSbatCHIFM354.PRC_SVC_CD, inMap.getString(JBSbatCHIFM352.PRC_SVC_CD));
		 // 料金項目コード
		 outMap.setString(JBSbatCHIFM354.PRC_KMK_CD, inMap.getString(JBSbatCHIFM352.PRC_KMK_CD_SK));
		 // 変更後金額
		 outMap.setString(JBSbatCHIFM354.CHG_AF_AMNT, chgAfAmnt);
		 // 処理通番が1の場合、補償費扱いフラグ・顧客対応履歴表示フラグを設定
		 if(wkTrnSeq == 1)
		 {
		 	// 補償費扱いフラグ
		 	outMap.setString(JBSbatCHIFM354.COMPENSATION_FLG, "0");
		 	// 顧客対応履歴表示フラグ
		 	outMap.setString(JBSbatCHIFM354.CUST_TOAK_DSP_FLG, "1");
		 }
		 else
		 {
		 	// 補償費扱いフラグ
		 	outMap.setString(JBSbatCHIFM354.COMPENSATION_FLG, null);
		 	// 顧客対応履歴表示フラグ
		 	outMap.setString(JBSbatCHIFM354.CUST_TOAK_DSP_FLG, null);
		 }
		// v49.00 2020/07/03 IT2-2020-0000011 mod end
		// 未納請求月、請求契約番号（譲渡元）の追加処理
		addMinouSeikyMonthProc(inMap);
		
		// インマップ
		outMap.set(KEY_IN_MAP, inMap);

		return outMap;
	}
	/**
	 * データ追加処理です。
	 * <br>
	 * @param inMap 入力電文
	 * @param outputInItem 出力情報ワーク
	 * @throws Exception キャストで例外が発生した場合
	 */
	private void addDataProc(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = getOutMap(inMap, outputInItem);
		if (outMap != null)
		{
			outputInItem.addOutMapList(outMap); 
		}
	}

	/**
	 * キーブレークかを取得します。
	 * <br>
	 * @param inMap 入力電文
	 * @param outputInItem 出力情報ワーク
	 * @return 判定結果
	 * @throws Exception キャストで例外が発生した場合
	 */
	private boolean isKeyBreak1(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		if (keyOutput == null)
		{
			return false;
		}

		// 現在の値
		String curValue = inMap.getString(JBSbatCHIFM352.SEIKY_KEI_NO_SK);
		// 値が変わっていればキーブレーク
		if (!keySeikyKeiNo.equals(curValue))
		{
			if (bkOutMap != null)
			{
				// キーブレーク判定用キー
				String keys1 = JBSbatCHIFM352.SEIKY_KEI_NO_SK;
				String keys2 = JBSbatCHIFM352.SVC_KEI_NO;
				String keys3 = JBSbatCHIFM352.PCRS_CD;
				String keys4 = JBSbatCHIFM352.PRC_SVC_CD;
				String keys5 = JBSbatCHIFM352.PRC_KMK_CD_SK;
				// ANK-4283-00-00 ADD START
				String keys6 = JBSbatCHIFM352.SVC_DTL_SKBT_NO;
				// ANK-4283-00-00 ADD END
				keyOutput = inMap.getString(keys1).concat(inMap.getString(keys2)).concat(inMap.getString(keys3))
				// ANK-4283-00-00 MOD START
			//	.concat(inMap.getString(keys4)).concat(inMap.getString(keys5));
				.concat(inMap.getString(keys4)).concat(inMap.getString(keys5)).concat(inMap.getString(keys6));
				// ANK-4283-00-00 MOD END
				
			}
			// キーブレーク判定用キー
			keySeikyKeiNo = inMap.getString(JBSbatCHIFM352.SEIKY_KEI_NO_SK);
			chgAfAmnt = BigDecimal.ZERO;
			return true;
		}

		return false;
	}
	
	/**
	 * キーブレーク（出力単位）かを取得します。
	 * <br>
	 * @param inMap 入力電文
	 * @return 判定結果
	 * @throws Exception キャストで例外が発生した場合
	 */
	private boolean isKeyBreak2(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		// キーブレーク判定用キー
		String keys1 = JBSbatCHIFM352.SEIKY_KEI_NO_SK;
		String keys2 = JBSbatCHIFM352.SVC_KEI_NO;
		String keys3 = JBSbatCHIFM352.PCRS_CD;
		String keys4 = JBSbatCHIFM352.PRC_SVC_CD;
		String keys5 = JBSbatCHIFM352.PRC_KMK_CD_SK;
		// ANK-4283-00-00 ADD START
		String keys6 = JBSbatCHIFM352.SVC_DTL_SKBT_NO;
		// ANK-4283-00-00 ADD END

		// 現在の値
		String key = inMap.getString(keys1).concat(inMap.getString(keys2)).concat(inMap.getString(keys3))
		// ANK-4283-00-00 MOD START
	//	.concat(inMap.getString(keys4)).concat(inMap.getString(keys5));
		.concat(inMap.getString(keys4)).concat(inMap.getString(keys5)).concat(inMap.getString(keys6));
		// ANK-4283-00-00 MOD END
		// 値が変わっていればキーブレーク
		if (keyOutput == null)
		{
			keyOutput = key;
		}
		
		if (!keyOutput.equals(key))
		{
			// 処理通番の設定
			wkTrnSeq++;
			chgAfAmnt = BigDecimal.ZERO;
			return true;
		}

		return false;
	}

	/**
	 * キーブレーク処理です。
	 * <br>
	 * @param inMap 入力電文
	 * @param outputInItem 出力情報ワーク
	 * @throws Exception キャストで例外が発生した場合
	 */
	private JBSbatOutputItem keyBreakProc(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		// ワークグループ番号を設定
		wkTrnGrpNo++;
		// ワーク処理通番を設定
		wkTrnSeq = 1;

		// 未納請求月、請求契約番号（譲渡元）を初期設定にする
		minouSeikyMonths = null;
		seikyKeiNoMts = null;
		minouSeikyMonthList = new ArrayList<String>();
		seikyKeiNoMtList = new ArrayList<String>();

		JBSbatServiceInterfaceMap tmpBean = new JBSbatServiceInterfaceMap();
		JBSbatServiceInterfaceMap tmpBeanNext = new JBSbatServiceInterfaceMap();
		JBSbatOutputItem outputInItemWk = new JBSbatOutputItem();
		
		for(int i = 0; i < outputInItem.getOutMapList().size(); i++)
		{
			tmpBean = (JBSbatServiceInterfaceMap)outputInItem.getOutMapList().get(i);

			// v49.00 2020/07/03 IT2-2020-0000011 mod start
			// 記事を設定
//			if ("0001".equals(tmpBean.getString(JBSbatCHIFM353.TRN_SEQ)))
//			{
//				tmpBean.set(JBSbatCHIFM353.KIJI, kiji);
//			}
//
//			if (i < outputInItem.getOutMapList().size() -1)
//			{
//				tmpBeanNext = (JBSbatServiceInterfaceMap)outputInItem.getOutMapList().get(i+1);
//
//				if (!(tmpBean.getString(JBSbatCHIFM353.SEIKY_KEI_NO).equals(tmpBeanNext.getString(JBSbatCHIFM353.SEIKY_KEI_NO)) && 
//						tmpBean.getString(JBSbatCHIFM353.SVC_KEI_NO).equals(tmpBeanNext.getString(JBSbatCHIFM353.SVC_KEI_NO)) &&
//						tmpBean.getString(JBSbatCHIFM353.PCRS_CD).equals(tmpBeanNext.getString(JBSbatCHIFM353.PCRS_CD)) &&
//						tmpBean.getString(JBSbatCHIFM353.PRC_SVC_CD).equals(tmpBeanNext.getString(JBSbatCHIFM353.PRC_SVC_CD)) &&
//						tmpBean.getString(JBSbatCHIFM353.PRC_KMK_CD).equals(tmpBeanNext.getString(JBSbatCHIFM353.PRC_KMK_CD))))
//				{
//					// 出力フラグを設定
//					tmpBean.setOutFlg(true);
//					
//					outputInItemWk.addOutMapList(tmpBean); 
//				}
//				
//			}
			// 記事を設定
			if ("0001".equals(tmpBean.getString(JBSbatCHIFM354.TRN_SEQ)))
			{
				tmpBean.set(JBSbatCHIFM354.KIJI, kiji);
			}

			if (i < outputInItem.getOutMapList().size() -1)
			{
				tmpBeanNext = (JBSbatServiceInterfaceMap)outputInItem.getOutMapList().get(i+1);

				if (!(tmpBean.getString(JBSbatCHIFM354.SEIKY_KEI_NO).equals(tmpBeanNext.getString(JBSbatCHIFM354.SEIKY_KEI_NO)) && 
						tmpBean.getString(JBSbatCHIFM354.SVC_KEI_NO).equals(tmpBeanNext.getString(JBSbatCHIFM354.SVC_KEI_NO)) &&
						tmpBean.getString(JBSbatCHIFM354.PCRS_CD).equals(tmpBeanNext.getString(JBSbatCHIFM354.PCRS_CD)) &&
						tmpBean.getString(JBSbatCHIFM354.PRC_SVC_CD).equals(tmpBeanNext.getString(JBSbatCHIFM354.PRC_SVC_CD)) &&
						// ANK-4283-00-00 MOD START
					//	tmpBean.getString(JBSbatCHIFM354.PRC_KMK_CD).equals(tmpBeanNext.getString(JBSbatCHIFM354.PRC_KMK_CD))))
						tmpBean.getString(JBSbatCHIFM354.PRC_KMK_CD).equals(tmpBeanNext.getString(JBSbatCHIFM354.PRC_KMK_CD))&&
						tmpBean.getString(JBSbatCHIFM354.SVC_DTL_SKBT_NO).equals(tmpBeanNext.getString(JBSbatCHIFM354.SVC_DTL_SKBT_NO))))
						// ANK-4283-00-00 MOD END
				{
					// 出力フラグを設定
					tmpBean.setOutFlg(true);
					
					outputInItemWk.addOutMapList(tmpBean); 
				}
				
			}
			// v49.00 2020/07/03 IT2-2020-0000011 mod end
			if (i +1 == outputInItem.getOutMapList().size())
			{
				// 出力フラグを設定
				tmpBean.setOutFlg(true);

				outputInItemWk.addOutMapList(tmpBean); 
			}
		}

		return outputInItemWk;
		
	}
	/**
	 * 請求金額の取得
	 * 
	 * @param workKinoSkbtCd		業務機能識別コード
	 * @return HashMap<String, String> 		退避用マップ
	 * @throws Exception 	業務サービス内で発生した例外全般
	 */
	private BigDecimal getGetSeikyAmnt(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getGetSeikyAmnt]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(inMap.get(JBSbatCHIFM352.SEIKY_KEI_NO_SK));		// 請求契約番号（譲渡先）
		paramList.setValue(inMap.get(JBSbatCHIFM352.SEIKY_YM_SK));			// 請求年月
		paramList.setValue(inMap.get(JBSbatCHIFM352.PRC_GRP_CD));			// 料金グループコード
		paramList.setValue(inMap.get(JBSbatCHIFM352.PCRS_CD));				// 料金コースコード
		paramList.setValue(inMap.get(JBSbatCHIFM352.PRC_SVC_CD));			// 料金サービスコード
		paramList.setValue(inMap.get(JBSbatCHIFM352.PRC_KMK_CD_SK));		// 料金項目コード
		// ANK-4283-00-00 ADD START
		paramList.setValue(inMap.get(JBSbatCHIFM352.SVC_DTL_SKBT_NO));		// サービス詳細識別番号
		// ANK-4283-00-00 ADD END
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getGetSeikyAmnt][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeCH_T_SEIKY_UCWK_CH_SELECT_024(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_T_SEIKY_UCWK.selectNext(); 
		
		// 取得出来ない場合
		if(dbMap == null)
		{
			// 該当データなしの場合、請求者指名にブランクを設定する。
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getGetSeikyAmnt][該当データが存在しない場合 ]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getGetSeikyAmnt]");
			return null;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getGetSeikyAmnt]");
		return dbMap.getBigDecimal(JBSbatCH_T_SEIKY_UCWK.AMNT);
	}

	/**
	 * 未納請求月、請求契約番号（譲渡元）追加処理です。
	 * <br>
	 * @param inMap 入力電文
	 * @throws Exception キャストで例外が発生した場合
	 */
	private void addMinouSeikyMonthProc(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 未納請求月リストの追加
		String minouSeikyMonth = inMap.getString(JBSbatCHIFM352.SEIKY_YM_MT);
		if (!minouSeikyMonthList.contains(minouSeikyMonth))
		{
			// 未納請求月の取得
			minouSeikyMonthList.add(minouSeikyMonth);
			//未納請求月ソート(昇順)
			Collections.sort(minouSeikyMonthList);
		}
		
		// 未納請求月の取得
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < minouSeikyMonthList.size(); i++)
		{
			if (i > 0)
			{
				sb.append(HEAD_TEXT);
			}
			sb.append(getSeikyMonth(minouSeikyMonthList.get(i).substring(4, 6)));
		}
		minouSeikyMonths = sb.toString();

		// 請求契約番号（譲渡元）リストの追加
		String seikyKeiNo = inMap.getString(JBSbatCHIFM352.SEIKY_KEI_NO_MT);
		if (!seikyKeiNoMtList.contains(seikyKeiNo))
		{
			seikyKeiNoMtList.add(seikyKeiNo);
		}
		
		// 請求契約番号（譲渡元）の取得
		sb = new StringBuffer();
		for (int i = 0; i < seikyKeiNoMtList.size(); i++)
		{
			if (i > 0)
			{
				sb.append(HEAD_TEXT);
			}
			sb.append(seikyKeiNoMtList.get(i));
		}
		seikyKeiNoMts = sb.toString();

		// 記事作成処理
		kiji = makeKiji(inMap, minouSeikyMonths, seikyKeiNoMts);
	}
	/**
	 * 請求月の取得
	 * @param  seikyYm 請求年月
	 * @return seikyMonth 請求月
	 * @throws Exception 例外が発生した場合
	 */
	private String getSeikyMonth(String seikyMonth) throws Exception
	{
		// 請求月の0削除
		if(seikyMonth.substring(0, 1).equals(ZERO_DEL))
		{
		     // 月の2桁目を出力
			seikyMonth = seikyMonth.substring(1, 2);
		}
		
		// 全角変換
		seikyMonth = JCHbatSeikyKaknoBusinessUtil.formatHanToZen(seikyMonth, JACStrConst.HAN_TO_ZEN_CHR);
		
		return seikyMonth;
	}
	/**
	 * 記事の取得
	 * @param  minouSeikyMonths 未納請求月リスト
	 * @param  seikyKeiNoSks 請求契約番号（譲渡元）リスト
	 * @return wkKiji 記事
	 * @throws Exception 例外が発生した場合
	 */
	private String makeKiji(JBSbatServiceInterfaceMap tmpBean, String minouSeikyMonths, String seikyKeiNoMts) throws Exception
	{
		//記事の設定
		String wkKiji = "旧請求先番号" + seikyKeiNoMts + "から" + minouSeikyMonths.toString()+ "月譲渡未納分載せ替え";
		
		return wkKiji;
	}
	// v49.00 2020/07/03 IT2-2020-0000011 add start
	/**
	 * 機器製造番号を取得
	 * @param kktkSvcKeiNo　機器提供サービス契約番号
	 * @return kikiSeizoNo 　機器製造番号
	 * @throws Exception
	 */
	private String getKikiSeizoNo(String kktkSvcKeiNo) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKikiSeizoNo]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKikiSeizoNo][workKinoSkbtCd=" + kktkSvcKeiNo + "]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(kktkSvcKeiNo);					// 機器提供サービス契約番号
		paramList.setValue(super.opeDate);					// 予約適用年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKikiSeizoNo][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeKK_T_KKTK_SVC_KEI_CH_SELECT_004(paramList.getList().toArray());
		
		// データを取得
		JBSbatCommonDBInterface dbMap = db_KK_T_KKTK_SVC_KEI.selectNext(); 
		
		// 取得したデータを機器製造番号に設定
		String kikiSeizoNo = dbMap.getString(JBSbatKK_T_KKTK_SVC_KEI.KIKI_SEIZO_NO);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKikiSeizoNo]");
		return kikiSeizoNo;
	}
	// v49.00 2020/07/03 IT2-2020-0000011 add end
}