/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCHSeikyUwEditUtil
*	ソースファイル名：JCHSeikyUwEditUtil.java
*	作成者			：富士通
*	日付			：2011年12月18日
*＜機能概要＞
*	共通で使用する請求内訳編集ユーティリティクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/18	富士通		新規作成
*	v5.00.00	2013/07/12	FJ)小野		【LT-2013-0000404】随時請求登録画面にて、内訳明細のNoがID番号ごとに採番されない
*	v5.00.01	2013/07/24	FJ)林		【LT-2013-0000517】随時請求登録画面にて再計算時、消費税相当額が誤っている
*	v6.00.00    2013/12/05  FJ)林		【OM-2013-0002699】会計計上優先料金グループコード設定対応
*	v8.00.00	2013/12/25  FJ)小野     【ANK-1584-00-00】MVNO（本体）対応
*	v8.00.01	2014/02/28  FJ)小野     【IT1-2014-0000054】利用開始、終了日の日付表示制御を修正。
*	v9.00.00	2014/04/16	FJ)小野     【ANK-2054-00-00】eoスマートリンク改修(端末補償)。
*	v9.00.01	2014/05/16	FJ)林       【IT1-2014-0000151】登録確認画面、再計算後のNo欄の表示制御を修正。
*	v36.00.00	2018/02/05	FJ)清原     【ANK-3296-00-00】標準工事費分割請求
*
**********************************************************************/
package eo.web.webview.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JACStrConst;
import eo.common.util.JCHCommonFormatUtil;
import eo.web.webview.CHW00201SF.CHW00201SFConst;
import eo.web.webview.CHW00901SF.CHW00901SFConst;

/**
 * 画面の請求内訳情報を編集する共通部品です。
 * <br>
 * @author 富士通
 */
public class JCHSeikyUwEditUtil 
{

	/**◇請求内訳情報の画面項目名 */
	/** 請求内訳情報 */
	private String seikyUwInfo = null;
	/** 請求内訳情報 Ｎｏ */
	private String no = null;
	/** 請求内訳情報 ＩＤ番号 */
	private String idNo = null;
	/** 請求内訳情報 利用開始日 */
	private String useStaYmd = null;
	/** 請求内訳情報 利用終了日 */
	private String useEndYmd = null;
	/** 請求内訳情報 料金内訳 */
	private String prcUw = null;
	/** 請求内訳情報 内訳額 */
	private String uwAmnt = null;
	/** 請求内訳情報 整理番号 */
	private String keySeiriNo = null;
	/** 請求内訳情報 サービス契約番号 */
	private String keySvcKeiNo = null;
	/** 請求内訳情報 マンションＩＤ */
	private String mansionId = null;
	/** 請求内訳情報 料金グループコード */
	private String keyPrcGrpCd = null;
	/** 請求内訳情報 料金コースコード */
	private String keyPcrsCd = null;
	/** 請求内訳情報 料金サービスコード */
	private String keyPrcSvcCd = null;
	/** 請求内訳情報 料金項目コード */
	private String keyPrcKmkCd = null;
	/** 請求内訳情報 請求書ＮＯ欄表示制御フラグ */
	private String sksNoRanDspCtrlFlg = null;
	/** 請求内訳情報 サービス契約番号表示制御フラグ */
	private String svckeiNoDspCtrlFlg = null;
	/** 請求内訳情報 マンションＩＤ表示制御フラグ */
	private String mansIdDspCtrlFlg = null;
	/** 請求内訳情報 利用期間表示制御フラグ */
	private String usePrdDspCtrlFlg = null;
	/** 請求内訳情報 料金訂正可否 */
	private String prcTeisiKh = null;
	/** 請求内訳情報 税区分 */
	private String taxDiv = null;
	/** 請求内訳情報 合計行判定区分 */
	private String sumLineJudgeDiv = null;
	/** 請求内訳情報 表示制御値 */
	private String dspCntrlValue = null;
	/** 請求内訳情報 サービス詳細識別番号 */
	private String svcDtlSkbtNo = null;
	/** 請求内訳情報 請求内訳番号 */
	private String seikyUcwkNo = null;

	/**◇共通の画面項目名 */
	/** 請求契約番号 */
	private String seikyKeiNo = null;

	/**◇フル桁(パディング処理) */
	private static final  int KETA_SVC_KEI_NO = 10;
	private static final int KETA_MANSION_ID = 10;
	private static final int KETA_PRC_GRP_CD = 2;
	private static final int KETA_PCRS_CD = 3;
	private static final int KETA_PRC_SVC_CD = 12;

	/**◇挿入位置検索値 */
	/** 挿入位置なし(既存ID番号なし) */
	private static final int INS_IDX_NONE = -1;
	/** 挿入位置なし(既存ID番号あり) */
	private static final int INS_IDX_NONE_SAME_ID_EXIST = -2;

	/** 税区分 */
	private static final String TAX_DIV = "税区分";

	/** 請求内訳情報Bean配列アクセサ */
	private X31SDataBeanAccessArray seikyUwBeanAccessArray = null;

	/** 請求内訳情報キーリスト */
	private ArrayList<String> keyList = null;

	/**
	 * インスタンス生成.<br>
	 * 請求内訳編集ユーティリティのインスタンスを生成します。
	 * <br>
	 * @param screenId     画面ＩＤ
	 * @param beanArray    請求内訳情報Bean配列アクセサ
	 * @return 請求内訳編集ユーティリティ
	 */
	public static JCHSeikyUwEditUtil createInstance(String screenId, X31SDataBeanAccessArray beanArray)
	{
		JCHSeikyUwEditUtil util = new JCHSeikyUwEditUtil();
		
		util.seikyUwBeanAccessArray = beanArray;
		util.seikyKeiNo = JCHCommonConst.SEIKY_KEI_NO;
		if (JACScreenConst.SCREEN_ID_CHW01001.equals(screenId)
				|| JACScreenConst.SCREEN_ID_CHW00901.equals(screenId))
		{
			//◇画面項目名設定
			util.seikyUwInfo = JCHCommonConst.SEIKY_UW_INFO;
			util.no = JCHCommonConst.NO;
			util.idNo = JCHCommonConst.ID_NO;
			util.useStaYmd = JCHCommonConst.USE_STAYMD;
			util.useEndYmd = JCHCommonConst.USE_ENDYMD;
			util.prcUw = JCHCommonConst.PRC_UW;
			util.uwAmnt = JCHCommonConst.CHOSEIGO_AMNT;
			util.keySeiriNo = JCHCommonConst.SEIRI_NO;
			util.keySvcKeiNo = JCHCommonConst.KEY_SVC_KEI_NO;
			util.mansionId = JCHCommonConst.MANSION_ID;
			util.keyPrcGrpCd = JCHCommonConst.KEY_PRC_GRP_CD;
			util.keyPcrsCd = JCHCommonConst.KEY_PCRS_CD;
			util.keyPrcSvcCd = JCHCommonConst.KEY_PRC_SVC_CD;
			util.keyPrcKmkCd = JCHCommonConst.KEY_PRC_KMK_CD;
			util.sksNoRanDspCtrlFlg = JCHCommonConst.SKS_NO_RAN_DSP_CTRL_FLG;
			util.mansIdDspCtrlFlg = JCHCommonConst.MANS_ID_DSP_CTRL_FLG;
			util.svckeiNoDspCtrlFlg = JCHCommonConst.SVKEI_NO_DSP_CTRL_FLG;
			util.usePrdDspCtrlFlg = JCHCommonConst.USE_PRD_DSP_CTRL_FLG;
			util.prcTeisiKh = JCHCommonConst.PRC_TEISEI_KH;
			util.taxDiv = JCHCommonConst.TAX_DIV;
			util.sumLineJudgeDiv = JCHCommonConst.SUM_LINE_JUDGE_DIV;
			util.dspCntrlValue = JCHCommonConst.DSP_CNTRL_VALUE;
			util.svcDtlSkbtNo = JCHCommonConst.SVC_DTL_SKBT_NO;
			util.seikyUcwkNo = JCHCommonConst.SEIKY_UCWK_NO;
		}
		
		// 請求内訳情報キーリスト
		util.keyList = new ArrayList<String>();
		for (int idx = 0; idx < util.seikyUwBeanAccessArray.getCount(); idx++)
		{
			String svckeiNo = padLeftSpace(util.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(util.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE), KETA_SVC_KEI_NO);
			String mansionId = padLeftSpace(util.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(util.mansionId, X31CWebConst.DATABEAN_GET_VALUE), KETA_MANSION_ID);
			String prcGrpCd = padLeftSpace(util.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(util.keyPrcGrpCd, X31CWebConst.DATABEAN_GET_VALUE), KETA_PRC_GRP_CD);
			String pcrsCd = padLeftSpace(util.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(util.keyPcrsCd, X31CWebConst.DATABEAN_GET_VALUE), KETA_PCRS_CD);
			String prcSvcCd = padLeftSpace(util.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(util.keyPrcSvcCd, X31CWebConst.DATABEAN_GET_VALUE), KETA_PRC_SVC_CD);
			String prcKmkCd = util.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(util.keyPrcKmkCd, X31CWebConst.DATABEAN_GET_VALUE);
			String svcDtlSkbtNo = util.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(util.svcDtlSkbtNo, X31CWebConst.DATABEAN_GET_VALUE);

			StringBuffer key = new StringBuffer();
			
			if (JACStrConst.SVC_KEI_NO_SP.equals(svckeiNo))
			{
				key.append(svckeiNo)
					.append(mansionId)
					.append(prcSvcCd)
					.append(prcKmkCd);
			}
			else
			{
				key.append(svckeiNo)
					.append(mansionId)
					.append(prcGrpCd)
					.append(pcrsCd)
					.append(prcSvcCd)
					.append(prcKmkCd)
					.append(svcDtlSkbtNo);
			}

			util.keyList.add(key.toString());
		}

		return util;
	}
	
	/**
	 * 内訳追加処理.<br>
	 * 指定された内訳情報マップを基に請求内訳情報に明細を追加します。
	 * <br>
	 * @param bean サービスフォームBean
	 * @param uwMap 内訳情報マップ
	 * @return 追加可能チェック結果
	 */
	public boolean addUwItem(X31SDataBeanAccess bean, HashMap<String, Object> uwMap)
	{
		// ◇請求先単位判定
		String isSeikySaki = this.isSeikySakiUnit(bean, uwMap);

		// 詳細必須料金項目区分
		String dtlReqKbn = bean.sendMessageString(JCHCommonConst.DTL_REQ_KBN, X31CWebConst.DATABEAN_GET_VALUE);

		// 詳細必須料金項目区分（タブレット）
		String tabDtlReqKbn = bean.sendMessageString(JCHCommonConst.TAB_DTL_REQUIRE_FLG, X31CWebConst.DATABEAN_GET_VALUE);

		// ◇キー重複チェック
		if (this.isKeyDuplication(uwMap, dtlReqKbn, tabDtlReqKbn))
		{
			return false;
		}
		
		// 挿入位置検索用ID番号
		String searchIdNo = JACStrConst.KARA_MOJI;
		if (!JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki))
		{
			searchIdNo = (String)uwMap.get(idNo);
		}
		
		// ◇挿入位置検索＆挿入処理
		int insIndex = this.searchInsIndex(searchIdNo);
		if (insIndex >= 0)
		{
			// 検索した挿入位置に追加する
			this.addUwItemAtIndex(uwMap, isSeikySaki, insIndex);
		}
		else if (!JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki) || insIndex == INS_IDX_NONE_SAME_ID_EXIST)
		{
			// 最終行に追加する
			this.addUwItemAtLast(uwMap, isSeikySaki);
		}
		else
		{
			// 先頭行に追加する
			this.addUwItemAtIndex(uwMap, isSeikySaki, 0);			
		}
		
		// サービス契約番号表示制御フラグ、請求契約番号表示制御フラグの再設定
		this.resetIdNoDspCtrlFlg();
		
		return true;
	}
	
	/**
	 * 内訳削除処理.<br>
	 * 指定されたインデックスの内訳情報を請求内訳情報から削除します。
	 * <br>
	 * @param delIndex 削除インデックス
	 * @param delKmkMap 削除項目マップ
	 */
//v36.00.00 ANK-3296-00-00 Mod Start
//	public void delUwItem(int delIndex)
	public void delUwItem(int delIndex, HashMap<String, String> delKmkMap)
//v36.00.00 ANK-3296-00-00 Mod End
	{
		// ◇同一ID番号内料金項目内訳カウント
		ArrayList<Integer> sumLineIndexList = new ArrayList<Integer>();
		//v36.00.00 ANK-3296-00-00 Mod Start
		//int prcKmkUwCnt = countPrcKmkUwInSameIdNo(delIndex, sumLineIndexList);
		int prcKmkUwCnt = countPrcKmkUwInSameIdNo(delIndex, sumLineIndexList, delKmkMap);
		//v36.00.00 ANK-3296-00-00 Mod End
		
		// ◇削除処理
		// 削除インデックスリスト
		ArrayList<Integer> delIndexList = new ArrayList<Integer>();
		delIndexList.add(delIndex);

		// 削除前の料金項目内訳の件数が１件である場合
		if (prcKmkUwCnt == 1)
		{
			// 即ち、当該の料金項目内訳が削除されると、同一ID番号に属する料金項目内訳が存在しなくなる場合で
			// 同一ID番号内の合計行(先のカウント処理で取得した合計行インデックスリスト)を削除する必要がある
			for (int sumLineCnt = 0; sumLineCnt < sumLineIndexList.size(); sumLineCnt++)
			{
				delIndexList.add(sumLineIndexList.get(sumLineCnt));
			}
			
		}		
		this.del(delIndexList);
		
		// ◇全行削除処理
		// 削除処理の結果、請求内訳に存在する料金項目内訳が0件となった場合、合計行を全て削除する。
		if (countPrcKmkUw() == 0)
		{
			// 合計行のみ存在のため、単純に請求内訳情報をクリアする
			this.seikyUwBeanAccessArray.clearArray();
		}
		
		this.remakeSeikyUcwkNo(delIndexList);

		// サービス契約番号表示制御フラグ、請求契約番号表示制御フラグの再設定
		this.resetIdNoDspCtrlFlg();
	}
	
	
	//v36.00.00 ANK-3296-00-00 Add Start
	/**
	 * 内訳削除処理.<br>
	 * 指定されたインデックスの内訳情報を請求内訳情報から削除します。
	 * <br>
	 * @param bean サービスフォームBean
	 * @param delKmkMap 削除項目マップ
	 */
	public void delUwItem2(X31SDataBeanAccess bean, HashMap<String, String> delKmkMap)
	{
		// ◇同一ID番号内料金項目内訳カウント
		// ◇削除処理
		this.del2(bean, delKmkMap);
	}
	//v36.00.00 ANK-3296-00-00 Add End
	
	/**
	 * 内訳パターン追加処理.<br>
	 * 指定された内訳情報リストを基に請求内訳情報に明細を追加します。<br>
	 * 内訳情報リストは１件以上であることを前提とします。
	 * @param bean サービスフォームBean
	 * @param uwList 内訳情報リスト
	 * @return 追加可能チェック結果(0:OK、-1：キー重複、-2：不正内訳パターン) 
	 */
	public int addUwPtn(X31SDataBeanAccess bean, ArrayList<HashMap<String, Object>> uwList)
	{
		// ◇請求先単位判定
		String isSeikySaki = this.isSeikySakiUnit(bean, uwList);

		// 詳細必須料金項目区分（内訳パターン用）
		String dtlReqKbn = bean.sendMessageString(JCHCommonConst.DTL_REQ_KBN_UW_PTN, X31CWebConst.DATABEAN_GET_VALUE);

		// 詳細必須料金項目フラグ（タブレット）（内訳パターン用）
		String tabDtlReqKbn = bean.sendMessageString(JCHCommonConst.TAB_DTL_REQ_KBN_UW_PTN, X31CWebConst.DATABEAN_GET_VALUE);

		// キー重複チェック
		if (this.isKeyDuplication(uwList, isSeikySaki, dtlReqKbn, tabDtlReqKbn))
		{
			return -1;
		}
		// 不正内訳パターンチェック処理
		if (this.isInvalidUwPtn(uwList, isSeikySaki))
		{
			return -2;
		}
		
		// 挿入位置検索用ID番号
		String searchIdNo = JACStrConst.KARA_MOJI;
		if (!JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki))
		{
			searchIdNo = (String)uwList.get(0).get(idNo);
		}
		
		// ◇挿入位置検索＆挿入処理
		int insIndex = this.searchInsIndex(searchIdNo);
		if (insIndex >= 0)
		{
			// 検索した挿入位置に追加する
			this.addUwListAtIndex(uwList, isSeikySaki, insIndex);
		}
		else if (!JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki) || insIndex == INS_IDX_NONE_SAME_ID_EXIST)
		{
			// 最終行に追加する
			this.addUwListAtLast(uwList, isSeikySaki);
		}
		else
		{
			// 先頭行に追加する
			this.addUwListAtIndex(uwList, isSeikySaki, 0);			
		}
		
		// サービス契約番号表示制御フラグ、請求契約番号表示制御フラグの再設定
		this.resetIdNoDspCtrlFlg();
		
		return 0;
	}
	
	/**
	 * 挿入インデックス検索処理.<br>
	 * 指定されたID番号を基に内訳情報の挿入位置を検索します。
	 * <br>
	 * 挿入位置がない場合はマイナス値を返却しますが、
	 * 指定したID番号が既存であるかを判別可能とする目的で
	 * 異なるマイナス値を返却します。
	 * @param idNo ID番号
	 * @return 挿入インデックス -1：挿入位置なし(既存ID番号なし)、-2：挿入位置なし(既存ID番号あり)
	 */
	private int searchInsIndex(String idNo)
	{	
		int insIndex = INS_IDX_NONE;
		
		// 開始位置検索
		int idxStart = INS_IDX_NONE;
		for (int idx = 0; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
		{
			String curIdNo = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE);
			if (curIdNo.equals(idNo))
			{
				idxStart = idx;
				break;
			}
		}
		
		// 開始位置が検索された(既存明細あり)場合
		if (idxStart != INS_IDX_NONE)
		{
			int idxEnd = INS_IDX_NONE;
			// 開始位置の次行から終了位置を特定して挿入インデックスとする
			for (int idx = idxStart + 1; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
			{
				String curIdNo = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE);
				if (curIdNo.equals(idNo) == false)
				{
					idxEnd = idx;
					break;
				}	
			}
			if (idxEnd != -1)
			{
				insIndex = idxEnd;
			}
			else
			{
				insIndex = INS_IDX_NONE_SAME_ID_EXIST;
			}
		}
		
		return insIndex;
	}

	/**
	 * 同ID番号内料金項目内訳カウント処理.<br>
	 * 指定されたインデックスと同じID番号内に存在する料金項目内訳をカウントします。
	 * また、同ID番号内に存在する合計行のインデックスリストを生成します。
	 * <br>
	 * @param index            請求内訳インデックス
	 * @param sumLineIndexList 合計行インデックスリスト
	 * @return 料金項目内訳数
	 */
//v36.00.00 ANK-3296-00-00 Mod Start
//	private int countPrcKmkUwInSameIdNo(int index, ArrayList<Integer> sumLineIndexList, HashMap<String, String> delKmkMap)
	private int countPrcKmkUwInSameIdNo(int index, ArrayList<Integer> sumLineIndexList, HashMap<String, String> delKmkMap)
//v36.00.00 ANK-3296-00-00 Mod End
	{
		int prcKnkUwCnt = 0;

		String svcKeiNo = this.seikyUwBeanAccessArray.getDataBean(index).sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE);
		String mansionId = this.seikyUwBeanAccessArray.getDataBean(index).sendMessageString(this.mansionId, X31CWebConst.DATABEAN_GET_VALUE);
		//v36.00.00 ANK-3296-00-00 Add Start
		// 埋込み料金項目の削除用に保持しておく
		delKmkMap.put(this.keySvcKeiNo, this.seikyUwBeanAccessArray.getDataBean(index).sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE));
		delKmkMap.put(this.keyPrcGrpCd, this.seikyUwBeanAccessArray.getDataBean(index).sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_GET_VALUE));
		delKmkMap.put(this.keyPcrsCd, this.seikyUwBeanAccessArray.getDataBean(index).sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_GET_VALUE));
		delKmkMap.put(this.keyPrcSvcCd, this.seikyUwBeanAccessArray.getDataBean(index).sendMessageString(this.keyPrcSvcCd, X31CWebConst.DATABEAN_GET_VALUE));
		delKmkMap.put(this.keyPrcKmkCd, this.seikyUwBeanAccessArray.getDataBean(index).sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_GET_VALUE));
		//v36.00.00 ANK-3296-00-00 Add End
		// ◇カウント処理
		for (int i = 0; i < this.seikyUwBeanAccessArray.getCount(); i++)
		{
			X31SDataBeanAccess uwBean = this.seikyUwBeanAccessArray.getDataBean(i);
			String curSvcKeiNo = uwBean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE);
			String curMansionId = uwBean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_GET_VALUE);
			String curSumLineDiv = uwBean.sendMessageString(this.sumLineJudgeDiv, X31CWebConst.DATABEAN_GET_VALUE);
			
			if (curSvcKeiNo.equals(svcKeiNo))
			{

				if (JACStrConst.SUM_LINE_JUDGE_DIV_SHUK.equals(curSumLineDiv))
				{
					// 同一のサービス契約番号で、かつ合計行判定区分が集計先である場合
					sumLineIndexList.add(i);
				}
				else
				{
					// 同一のサービス契約番号で、かつ合計行判定区分が集計先でない明細をカウント。
					prcKnkUwCnt = prcKnkUwCnt + 1;
				}
			}
			else if(curMansionId.equals(mansionId))
			{
				if (JACStrConst.SUM_LINE_JUDGE_DIV_SHUK.equals(curSumLineDiv))
				{
					// 同一のマンションＩＤで、かつ合計行判定区分が集計先である場合
					sumLineIndexList.add(i);
				}
				else
				{
					// 同一のマンションＩＤで、かつ合計行判定区分が集計先でない明細をカウント。
					prcKnkUwCnt = prcKnkUwCnt + 1;
				}
			}
		}
		
		return prcKnkUwCnt;
	}
	
	/**
	 * 料金項目内訳カウント処理.<br>
	 * 請求内訳情報に存在する料金項目内訳をカウントします。
	 * <br>
	 * @return 料金項目内訳数
	 */
	private int countPrcKmkUw()
	{
		int prcKnkUwCnt = 0;
		
		// ◇カウント処理
		for (int i = 0; i < this.seikyUwBeanAccessArray.getCount(); i++)
		{
			X31SDataBeanAccess uwBean = this.seikyUwBeanAccessArray.getDataBean(i);
			String curSumLineDiv = uwBean.sendMessageString(this.sumLineJudgeDiv, X31CWebConst.DATABEAN_GET_VALUE);

			if (!JACStrConst.SUM_LINE_JUDGE_DIV_SHUK.equals(curSumLineDiv))
			{
				// 合計行判定区分が集計先でない行を料金項目内訳としてカウント
				prcKnkUwCnt += 1;
			}
		}
		
		return prcKnkUwCnt;
	}
	
	/**
	 * 内訳情報追加処理(最終行).<br>
	 * 指定された内訳情報マップを請求内訳情報の最終行に追加します。
	 * <br>
	 * @param uwMap 内訳情報マップ
	 * @param isSeikySaki 請求先単位追加
	 */
	private void addUwItemAtLast(HashMap<String, Object> uwMap, String isSeikySaki)
	{	
		// ◇内訳情報追加
		X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.addDataBean();
		// Ｎｏ
		bean.sendMessageString(this.no, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.no));
		// ＩＤ番号
		if (JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki))
		{
			//請求先単位である場合は、請求契約番号を設定
			bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.seikyKeiNo));
		}
		// マンションＩＤ
		else if (JCHCommonConst.DTL_DIV_MANS_ID.equals(isSeikySaki))
		{
			// マンションＩＤ単位である場合、ID番号を設定
			bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.mansionId));
		}
		// サービス契約番号
		else if (JCHCommonConst.DTL_DIV_SVC_KEI.equals(isSeikySaki))
		{
			// サービス契約単位である場合、ID番号を設定
			bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keySvcKeiNo));
		}
		// 利用開始日、利用終了日
		bean.sendMessageString(this.useStaYmd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.useStaYmd));
		bean.sendMessageString(this.useEndYmd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.useEndYmd));
		// 料金内訳
		bean.sendMessageString(this.prcUw, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.prcUw));
		// 内訳額
		bean.sendMessageString(this.uwAmnt, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.uwAmnt));
		// 税区分
		String taxDivNm = JCHDspEditUtil.getTaxDivDspNm(this.taxDiv);
		bean.sendMessageString(this.taxDiv, X31CWebConst.DATABEAN_SET_VALUE, taxDivNm);
		// 整理番号
		bean.sendMessageString(this.keySeiriNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keySeiriNo));
		// サービス契約番号
		bean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keySvcKeiNo));
		// マンションＩＤ
		bean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.mansionId));
		// 料金グループコード、料金コースコード、料金サービスコード、料金項目コード
		bean.sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keyPrcGrpCd));
		bean.sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keyPcrsCd));
		bean.sendMessageString(this.keyPrcSvcCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keyPrcSvcCd));
		bean.sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keyPrcKmkCd));
		// 利用期間表示制御フラグ
		bean.sendMessageString(this.usePrdDspCtrlFlg, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.usePrdDspCtrlFlg));
		// 料金訂正可否
		bean.sendMessageString(this.prcTeisiKh, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.prcTeisiKh));
		// 合計行判定区分
		bean.sendMessageString(this.sumLineJudgeDiv, X31CWebConst.DATABEAN_SET_VALUE, JACStrConst.SUM_LINE_JUDGE_DIV_DTL);
		// サービス詳細識別番号
		bean.sendMessageString(this.svcDtlSkbtNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.svcDtlSkbtNo));
		// 請求内訳番号
		bean.sendMessageString(this.seikyUcwkNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.seikyUcwkNo));
	}
	
	/**
	 * 内訳情報追加処理(指定行).<br>
	 * 指定された内訳情報マップを請求内訳情報の指定された行に追加します。
	 * <br>
	 * @param uwMap 内訳情報マップ
	 * @param isSeikySaki 請求先単位追加
	 * @param insIndex 挿入位置インデックス
	 */
	private void addUwItemAtIndex(HashMap<String, Object> uwMap, String isSeikySaki, int insIndex)
	{	
		// ＩＤ番号
		if (JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki))
		{
			//請求先単位である場合は、請求契約番号を設定
			uwMap.put(this.idNo, (String)uwMap.get(this.seikyKeiNo));
		}
		
		// サービス契約番号
		if (JCHCommonConst.DTL_DIV_SVC_KEI.equals(isSeikySaki))
		{
			// サービス契約単位である場合、ID番号を設定
			uwMap.put(this.idNo, (String)uwMap.get(this.keySvcKeiNo));
		}
		
		if (JCHCommonConst.DTL_DIV_MANS_ID.equals(isSeikySaki))
		{
			// マンションＩＤ単位である場合、ID番号を設定
			uwMap.put(this.idNo, (String)uwMap.get(this.mansionId));
		}
		
		// 合計行判定区分
		uwMap.put(this.sumLineJudgeDiv, JACStrConst.SUM_LINE_JUDGE_DIV_DTL);
		
		// 挿入
		insert(uwMap, insIndex);
	}

	/**
	 * 内訳情報リスト追加処理(最終行).<br>
	 * 指定された内訳情報リストを請求内訳情報の最終行に追加します。
	 * <br>
	 * @param uwList 内訳情報リスト
	 * @param isSeikySaki 請求先単位追加
	 */
	private void addUwListAtLast(ArrayList<HashMap<String, Object>> uwList, String isSeikySaki)
	{	
		// ◇内訳情報リスト追加
		for (int idx = 0; idx < uwList.size(); idx++)
		{
			HashMap<String, Object> uwMap = uwList.get(idx);
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.addDataBean();
			// Ｎｏ
			bean.sendMessageString(this.no, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.no));
			// ＩＤ番号
			if (JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki))
			{
				//請求先単位である場合は、請求契約番号を設定
				bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.seikyKeiNo));
			}
			// マンションＩＤ
			else if (JCHCommonConst.DTL_DIV_MANS_ID.equals(isSeikySaki))
			{
				// マンションＩＤ単位である場合、ID番号を設定
				bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.mansionId));
			}
			// サービス契約番号
			else if (JCHCommonConst.DTL_DIV_SVC_KEI.equals(isSeikySaki))
			{
				// サービス契約単位である場合、ID番号を設定
				bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keySvcKeiNo));
			}
			// 利用開始日、利用終了日
			bean.sendMessageString(this.useStaYmd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.useStaYmd));
			bean.sendMessageString(this.useEndYmd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.useEndYmd));
			// 料金内訳
			bean.sendMessageString(this.prcUw, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.prcUw));
			// 内訳額
			bean.sendMessageString(this.uwAmnt, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.uwAmnt));
			// 税区分
			String taxDivNm = JCHDspEditUtil.getTaxDivDspNm(this.taxDiv);
			bean.sendMessageString(this.taxDiv, X31CWebConst.DATABEAN_SET_VALUE, taxDivNm);
			// 整理番号
			bean.sendMessageString(this.keySeiriNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keySeiriNo));
			// サービス契約番号
			bean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keySvcKeiNo));
			// マンションＩＤ
			bean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.mansionId));
			// 料金グループコード、料金コースコード、料金サービスコード、料金項目コード
			bean.sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keyPrcGrpCd));
			bean.sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keyPcrsCd));
			bean.sendMessageString(this.keyPrcSvcCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keyPrcSvcCd));
			bean.sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.keyPrcKmkCd));
			// 利用期間表示制御フラグ
			bean.sendMessageString(this.usePrdDspCtrlFlg, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.usePrdDspCtrlFlg));
			// 料金訂正可否
			bean.sendMessageString(this.prcTeisiKh, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.prcTeisiKh));
			// 合計行判定区分
			bean.sendMessageString(this.sumLineJudgeDiv, X31CWebConst.DATABEAN_SET_VALUE, JACStrConst.SUM_LINE_JUDGE_DIV_DTL);
			// サービス詳細識別番号
			bean.sendMessageString(this.svcDtlSkbtNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.svcDtlSkbtNo));
			// 請求内訳番号
			bean.sendMessageString(this.seikyUcwkNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uwMap.get(this.seikyUcwkNo));
		}
	}

	/**
	 * 内訳情報追加処理(指定行).<br>
	 * 指定された内訳情報リストを請求内訳情報の指定された行に追加します。
	 * <br>
	 * @param uwList 内訳情報リスト
	 * @param isSeikySaki 請求先単位追加
	 * @param insIndex 挿入位置インデックス
	 */
	private void addUwListAtIndex(ArrayList<HashMap<String, Object>> uwList, String isSeikySaki, int insIndex)
	{		
		// ◇属性設定
		for (int idx = 0; idx < uwList.size(); idx++)
		{
			HashMap<String, Object> uwMap = uwList.get(idx);
			// ＩＤ番号
			if (JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki))
			{
				//請求先単位である場合は、請求契約番号を設定
				uwMap.put(this.idNo, (String)uwMap.get(this.seikyKeiNo));
			}
			// サービス契約番号
			if (JCHCommonConst.DTL_DIV_SVC_KEI.equals(isSeikySaki))
			{
				// サービス契約単位である場合、ID番号を設定
				uwMap.put(this.idNo, (String)uwMap.get(this.keySvcKeiNo));
			}
			// マンションＩＤ
			if (JCHCommonConst.DTL_DIV_MANS_ID.equals(isSeikySaki))
			{
				// マンションＩＤ単位である場合、ID番号を設定
				uwMap.put(this.idNo, (String)uwMap.get(this.mansionId));
			}
			// 合計行判定区分
			uwMap.put(this.sumLineJudgeDiv, JACStrConst.SUM_LINE_JUDGE_DIV_DTL);
		}
		
		// 挿入
		insert(uwList, insIndex);
	}
	
	/**
	 * ＩＤ番号表示制御フラグ再設定処理.<br>
	 * 請求内訳情報を前方走査して、サービス契約番号が変わった行に
	 * 表示制御フラグを設定します。
	 * なお、サービス契約番号は同じ番号である場合は連続して存在し、
	 * また、請求先単位の明細である場合は空文字であることを前提とします。
	 * <br>
	 */
	public void resetIdNoDspCtrlFlg()
	{
		// サービス契約番号(ブレイク判定用)
		String svcKeiNo = null;
		// マンションＩＤ(ブレイク判定用)
		String mansionId = null;
		// ＮＯ
		int noCnt = 0;
		
		for (int idx = 0; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
		{
			String curSvcKeiNo = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE);
			String curMAnsionId = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.mansionId, X31CWebConst.DATABEAN_GET_VALUE);
			String idNo = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.idNo, X31CWebConst.DATABEAN_GET_VALUE);
			
			// ◇サービス契約番号ブレイク判定
			if ((!curSvcKeiNo.equals(svcKeiNo) || !curMAnsionId.equals(mansionId)) && !JCHCommonFormatUtil.isNull(idNo))
			{
				// ＩＤ番号表示制御フラグ
				if (JACStrConst.KARA_MOJI.equals(curSvcKeiNo.trim()) && JACStrConst.KARA_MOJI.equals(curMAnsionId.trim()))
				{
					this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.sksNoRanDspCtrlFlg, X31CWebConst.DATABEAN_SET_VALUE, "1");
				}
				else if(!JACStrConst.KARA_MOJI.equals(curMAnsionId.trim()))
				{
					// ＮＯ
					noCnt++;
					this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.no, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(noCnt));
				}
				else if(!JACStrConst.KARA_MOJI.equals(curSvcKeiNo.trim()))
				{
					// ＮＯ
					noCnt++;
					this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.no, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(noCnt));
				}
				else
				{
					this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.no, X31CWebConst.DATABEAN_SET_VALUE, "");
					this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, "");
				}

				// 次のブレイク判定用にサービス契約番号を保持
				svcKeiNo = curSvcKeiNo;
				// 次のブレイク判定用にマンションＩＤを保持
				mansionId = curMAnsionId;
			}
			else
			{
				this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.no, X31CWebConst.DATABEAN_SET_VALUE, "");
				this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, "");
			}

			// ◇表示制御値
			String dspCntrlValue = "even";
			if (idx % 2 == 0)
			{
				dspCntrlValue = "odd";
			} 
			this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.dspCntrlValue, X31CWebConst.DATABEAN_SET_VALUE, dspCntrlValue);
		}
	}

	/**
	 * キー重複チェック処理.<br>
	 * 指定された内訳情報マップのキーと既存明細とのキー重複をチェックします。
	 * @param uwMap       内訳情報マップ
	 * @param dtlReqKbn 詳細必須料金項目区分
	 * @param tabDtlReqKbn 詳細必須料金項目区分（タブレット）
	 * @return チェック結果
	 */
	private boolean isKeyDuplication(HashMap<String, Object> uwMap, String dtlReqKbn, String tabDtlReqKbn)
	{
		boolean isDuplicate = false;
		
		StringBuffer addKey = new StringBuffer();

		if (JACStrConst.SVC_KEI_NO_SP.equals(padLeftSpace((String)uwMap.get(this.keySvcKeiNo), KETA_SVC_KEI_NO)))
		{
			addKey.append(padLeftSpace((String)uwMap.get(this.keySvcKeiNo), KETA_SVC_KEI_NO));
			addKey.append(padLeftSpace((String)uwMap.get(this.mansionId), KETA_MANSION_ID));
			addKey.append(padLeftSpace((String)uwMap.get(this.keyPrcSvcCd), KETA_PRC_SVC_CD));
			addKey.append(uwMap.get(this.keyPrcKmkCd));
		}
		else
		{
			if ("1".equals(dtlReqKbn) || "2".equals(dtlReqKbn) || "1".equals(tabDtlReqKbn))
			{
				addKey.append(padLeftSpace((String)uwMap.get(this.keySvcKeiNo), KETA_SVC_KEI_NO));
				addKey.append(padLeftSpace((String)uwMap.get(this.mansionId), KETA_MANSION_ID));
				addKey.append(padLeftSpace((String)uwMap.get(this.keyPrcGrpCd), KETA_PRC_GRP_CD));
				addKey.append(padLeftSpace((String)uwMap.get(this.keyPcrsCd), KETA_PCRS_CD));
				addKey.append(padLeftSpace((String)uwMap.get(this.keyPrcSvcCd), KETA_PRC_SVC_CD));
				addKey.append(uwMap.get(this.keyPrcKmkCd));
				addKey.append(uwMap.get(this.svcDtlSkbtNo));
			}
			else
			{
				addKey.append(padLeftSpace((String)uwMap.get(this.keySvcKeiNo), KETA_SVC_KEI_NO));
				addKey.append(padLeftSpace((String)uwMap.get(this.mansionId), KETA_MANSION_ID));
				addKey.append(padLeftSpace((String)uwMap.get(this.keyPrcGrpCd), KETA_PRC_GRP_CD));
				addKey.append(padLeftSpace((String)uwMap.get(this.keyPcrsCd), KETA_PCRS_CD));
				addKey.append(padLeftSpace((String)uwMap.get(this.keyPrcSvcCd), KETA_PRC_SVC_CD));
				addKey.append(uwMap.get(this.keyPrcKmkCd));
			}
		}

		if (this.keyList.contains(addKey.toString()))
		{

			// 詳細必須料金項目区分が"2"の時は重複してもエラーとしない
			if ("2".equals(dtlReqKbn))
			{
				// キー重複した場合、重複した数をカウント
				int dplCnt = 0;
				for (int i = 0; i < this.keyList.size(); i++)
				{
					String key = this.keyList.get(i);

					if (key.equals(addKey.toString()))
					{
						dplCnt++;
					}
				}

				// 請求内訳番号を採番し、セット
				uwMap.put(CHW00901SFConst.SEIKY_UCWK_NO_11, String.valueOf(++dplCnt));
			}
			else
			{
				isDuplicate = true;
			}
		}

		return isDuplicate;
	}
	
	/**
	 * キー重複チェック処理.<br>
	 * 指定された内訳情報リストのキーと既存明細とのキー重複をチェックします。
	 * @param uwList 内訳情報リスト
	 * @param isSeikySaki 請求先単位追加
	 * @param dtlReqKbn 詳細必須料金項目区分
	 * @param tabDtlReqKbn 詳細必須料金項目区分（タブレット）
	 * @return チェック結果
	 */
	private boolean isKeyDuplication(ArrayList<HashMap<String, Object>> uwList, String isSeikySaki, String dtlReqKbn, String tabDtlReqKbn)
	{
		boolean isDuplicate = false;
		
		for (int idx = 0; idx < uwList.size(); idx++)
		{
			HashMap<String, Object> uwMap = uwList.get(idx);
			if (isKeyDuplication(uwMap, dtlReqKbn, tabDtlReqKbn))
			{
				isDuplicate = true;
				break;				
			}
		}
		
		return isDuplicate;
	}

	/**
	 * 不正内訳パターンチェック処理.<br>
	 * 指定された内訳情報リストの追加先が請求先単位である場合に
	 * 内訳パターン明細に請求先単位明細として追加不可能なキーが含まれていないかチェックします。
	 * @param uwList 内訳情報リスト
	 * @param isSeikySaki 請求先単位追加
	 * @return チェック結果
	 */
	private boolean isInvalidUwPtn(ArrayList<HashMap<String, Object>> uwList, String isSeikySaki)
	{
		boolean isInvalid = false;
		
		if (JCHCommonConst.DTL_DIV_SEIKY_SAKI.equals(isSeikySaki))
		{
			// 請求先単位に追加する場合
			for (int idx = 0; idx < uwList.size(); idx++)
			{
				HashMap<String, Object> uwMap = uwList.get(idx);
				StringBuffer checkKey = new StringBuffer();
				checkKey.append(uwMap.get(this.keySvcKeiNo));
				checkKey.append(uwMap.get(this.keyPrcGrpCd));
				checkKey.append(uwMap.get(this.keyPcrsCd));
				checkKey.append(uwMap.get(this.keyPrcSvcCd));
				if (JACStrConst.KARA_MOJI.equals(checkKey.toString().trim()) == false)
				{
					// 請求先単位に追加可能な明細は、サービス契約番号、料金コース、料金サービスが空
					isInvalid = true;
					break;
				}
			}
		}
		
		return isInvalid;
	}

	/**
	 * 請求先単位追加判定処理.<br>
	 * 指定された内訳情報リストの追加先が請求先単位であるか判定する。
	 * <br>
	 * @param bean サービスフォームBean
	 * @param uwList 内訳情報リスト
	 * @return チェック結果
	 */
	private String isSeikySakiUnit(X31SDataBeanAccess bean, ArrayList<HashMap<String, Object>> uwList)
	{
		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };
		
		// サービス契約番号（選択）
		String svcKeiNoSel = JCHPulldownUtil.getSelectedValue(paramBeans,
				JCHCommonConst.SVC_KEI_NO_INFO_UW, JCHCommonConst.SVC_KEI_NO_LIST_UW, JCHCommonConst.SVC_KEI_NO_SEL_UW);

		// マンションＩＤ
		String mansionId = JCHPulldownUtil.getSelectedValue(paramBeans,
				JCHCommonConst.SVC_KEI_NO_INFO_UW, JCHCommonConst.MANSION_ID_LIST_UW, JCHCommonConst.SVC_KEI_NO_SEL_UW);

		// 部屋番号
		String roomNo = JCHPulldownUtil.getSelectedValue(paramBeans,
				JCHCommonConst.SVC_KEI_NO_INFO_UW, JCHCommonConst.KAISEN_PLACE_ADRRM_LIST_UW, JCHCommonConst.SVC_KEI_NO_SEL_UW);

		// サービス契約番号（入力値）
		String svcKeiNoInput = bean.sendMessageString(JCHCommonConst.SVC_KEI_NO_INPUT_UW, X31CWebConst.DATABEAN_GET_VALUE);

		// ◇請求先単位判定
		String isSeikySaki = JCHCommonConst.DTL_DIV_SEIKY_SAKI;
		if (JCHWebCommon.isNullOrEmpty(svcKeiNoSel) && JCHWebCommon.isNullOrEmpty(svcKeiNoInput))
		{
			// 請求先単位に追加する
			isSeikySaki = JCHCommonConst.DTL_DIV_SEIKY_SAKI;
		}
		else if (this.seikyKeiNo.equals(svcKeiNoInput))
		{
			// 請求先単位に追加する
			isSeikySaki = JCHCommonConst.DTL_DIV_SEIKY_SAKI;
		}
		else if(!JACStrConst.KARA_MOJI.equals(roomNo) || !JACStrConst.KARA_MOJI.equals(mansionId))
		{
			// マンションID単位に追加する
			isSeikySaki = JCHCommonConst.DTL_DIV_MANS_ID;
		}
		else
		{
			// サービス契約番号単位に追加する
			isSeikySaki = JCHCommonConst.DTL_DIV_SVC_KEI;
		}
		
		return isSeikySaki;
	}
	
	/**
	 * 請求先単位追加判定処理.<br>
	 * 指定された内訳情報マップの追加先が請求先単位であるか判定する。
	 * <br>
	 * @param bean サービスフォームBean
	 * @param uwMap 内訳情報マップ
	 * @return チェック結果
	 */
	private String isSeikySakiUnit(X31SDataBeanAccess bean, HashMap<String, Object> uwMap)
	{
		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		// サービス契約番号（選択）
		String svcKeiNoSel = JCHPulldownUtil.getSelectedValue(paramBeans,
				JCHCommonConst.SVC_KEI_NO_INFO, JCHCommonConst.SVC_KEI_NO_LIST, JCHCommonConst.SVC_KEI_NO_SEL);

		// マンションＩＤ
		String mansionId = JCHPulldownUtil.getSelectedValue(paramBeans,
				JCHCommonConst.SVC_KEI_NO_INFO, JCHCommonConst.MANSION_ID_LIST, JCHCommonConst.SVC_KEI_NO_SEL);

		// 部屋番号
		String roomNo = JCHPulldownUtil.getSelectedValue(paramBeans,
				JCHCommonConst.SVC_KEI_NO_INFO, JCHCommonConst.KAISEN_PLACE_ADRRM_LIST, JCHCommonConst.SVC_KEI_NO_SEL);

		// サービス契約番号（入力値）
		String svcKeiNoInput = bean.sendMessageString(JCHCommonConst.SVC_KEI_NO_INPUT, X31CWebConst.DATABEAN_GET_VALUE);

		// ◇請求先単位判定
		String isSeikySaki = JCHCommonConst.DTL_DIV_SEIKY_SAKI;
		if (JCHWebCommon.isNullOrEmpty(svcKeiNoSel) && JCHWebCommon.isNullOrEmpty(svcKeiNoInput))
		{
			// 請求先単位に追加する
			isSeikySaki = JCHCommonConst.DTL_DIV_SEIKY_SAKI;
		}
		else if (this.seikyKeiNo.equals(svcKeiNoInput))
		{
			// 請求先単位に追加する
			isSeikySaki = JCHCommonConst.DTL_DIV_SEIKY_SAKI;
		}
		else if(!JACStrConst.KARA_MOJI.equals(roomNo) || !JACStrConst.KARA_MOJI.equals(mansionId))
		{
			// マンションID単位に追加する
			isSeikySaki = JCHCommonConst.DTL_DIV_MANS_ID;
		}
		else
		{
			// サービス契約番号単位に追加する
			isSeikySaki = JCHCommonConst.DTL_DIV_SVC_KEI;
		}
		return isSeikySaki;
	}

	/**
	 * 内訳情報挿入処理.<br>
	 * 指定された内訳情報マップを内訳情報のリストに挿入します。
	 * <br>
	 * @param uwMap 内訳情報マップ
	 * @param insIndex 挿入位置インデックス
	 */
	private void insert(HashMap<String, Object> uwMap, int insIndex)
	{
		// 内訳情報リスト(退避)
		ArrayList<HashMap<String, Object>> uwList = new ArrayList<HashMap<String, Object>>();
		
		// 挿入インデック前まで情報を退避
		for (int idx = 0; idx < insIndex; idx++)
		{
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.getDataBean(idx);
			
			HashMap<String, Object> uw = new HashMap<String, Object>();
			this.copyUwBeanToMap(bean, uw);
			uwList.add(uw);
		}
		// 情報を追加
		uwList.add(uwMap);
		// 挿入位置以降の情報を退避
		for (int idx = insIndex; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
		{
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.getDataBean(idx);
			
			HashMap<String, Object> uw = new HashMap<String, Object>();
			this.copyUwBeanToMap(bean, uw);
			uwList.add(uw);
		}
		
		// 内訳情報リスト(退避)から内訳情報を生成し直す
		this.seikyUwBeanAccessArray.clearArray();
		for (int idx = 0; idx < uwList.size(); idx++)
		{
			HashMap<String, Object> uw = (HashMap<String, Object>)uwList.get(idx);
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.addDataBean();
			this.copyUwMapToBean(uw, bean);
		}
	}
	
	/**
	 * 内訳情報リスト挿入処理.<br>
	 * 指定された内訳情報リストを内訳情報のリストに挿入します。
	 * <br>
	 * @param uwList 内訳情報リスト
	 * @param insIndex 挿入位置インデックス
	 */
	private void insert(ArrayList<HashMap<String, Object>> uwList, int insIndex)
	{
		// 内訳情報リスト(退避)
		ArrayList<HashMap<String, Object>> tempUwList = new ArrayList<HashMap<String, Object>>();
		
		// 挿入インデック前まで情報を退避
		for (int idx = 0; idx < insIndex; idx++)
		{
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.getDataBean(idx);
			
			HashMap<String, Object> uw = new HashMap<String, Object>();
			this.copyUwBeanToMap(bean, uw);
			tempUwList.add(uw);
		}
		
		// 情報リストを追加
		for (int idx = 0; idx < uwList.size(); idx++)
		{
			tempUwList.add(uwList.get(idx));
		}
		
		// 挿入位置以降の情報を退避
		for (int idx = insIndex; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
		{
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.getDataBean(idx);
			
			HashMap<String, Object> uw = new HashMap<String, Object>();
			this.copyUwBeanToMap(bean, uw);
			tempUwList.add(uw);
		}
		
		// 内訳情報リスト(退避)から内訳情報を生成し直す
		this.seikyUwBeanAccessArray.clearArray();
		for (int idx = 0; idx < tempUwList.size(); idx++)
		{
			HashMap<String, Object> uw = (HashMap<String, Object>)tempUwList.get(idx);
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.addDataBean();
			this.copyUwMapToBean(uw, bean);
		}
	}
	
	/**
	 * 内訳情報削除処理(複数件).<br>
	 * 指定された削除インデックスリストの内訳情報を内訳情報のリストから削除します。
	 * <br>
	 * @param delIndexList 削除インデックスリスト
	 */
	private void del(ArrayList<Integer> delIndexList)
	{
		// 内訳情報リスト(退避)
		ArrayList<HashMap<String, Object>> uwList = new ArrayList<HashMap<String, Object>>();
		
		for (int idx = 0; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
		{
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.getDataBean(idx);
			
			if (!delIndexList.contains(idx))
			{
				// 削除インデックスリストのインデックスと一致しない場合は退避
				HashMap<String, Object> uw = new HashMap<String, Object>();
				this.copyUwBeanToMap(bean, uw);
				uwList.add(uw);
			}
		}
		
		// 内訳情報リスト(退避)から内訳情報を生成し直す
		this.seikyUwBeanAccessArray.clearArray();
		for (int idx = 0; idx < uwList.size(); idx++)
		{
			HashMap<String, Object> uw = (HashMap<String, Object>)uwList.get(idx);
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.addDataBean();
			this.copyUwMapToBean(uw, bean);
		}
	}
	
	//v36.00.00 ANK-3296-00-00 Add Start
	/**
	 * 内訳情報削除処理(複数件).<br>
	 * 指定された削除インデックスリストの内訳情報を内訳情報のリストから削除します。
	 * <br>
	 * @param bean2 
	 * @param delKmkMap 削除インデックスリスト
	 */
	private void del2(X31SDataBeanAccess inBean, HashMap<String, String> delKmkMap)
	{
		// 内訳情報リスト(退避)
		ArrayList<HashMap<String, Object>> uwList = new ArrayList<HashMap<String, Object>>();
		
		for (int idx = 0; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
		{
			X31SDataBeanAccess seikyUwBean = this.seikyUwBeanAccessArray.getDataBean(idx);
			// 判定対象サービス契約番号
			String keySvcKeiNo = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE);
			// 判定対象料金コースコード
			String keyPcrsCd   = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_GET_VALUE);
			// 判定対象料金サービスコード
			String keyPrcSvcCd = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.keyPrcSvcCd, X31CWebConst.DATABEAN_GET_VALUE);
			// 判定対象料金項目コード
			String keyPrcKmkCd = this.seikyUwBeanAccessArray.getDataBean(idx).sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_GET_VALUE);
			
			// 削除対象サービス契約番号
			String delSvcKeiNo = delKmkMap.get(this.keySvcKeiNo);
			// 削除対象料金コースコード
			String delPcrsCd   = delKmkMap.get(this.keyPcrsCd);
			// 削除対象料金サービスコード
			String delPrcSvcCd = delKmkMap.get(this.keyPrcSvcCd);
			// 削除対象料金項目コード
			String delPrcKmkCd = delKmkMap.get(this.keyPrcKmkCd);
			
			String prcKmkCdNetKjGak = inBean.sendMessageString(CHW00201SFConst.PRC_KMK_CD_NET_KOJIHI_GAKU, X31CWebConst.DATABEAN_GET_VALUE);
			String prcKmkCdTelKjGak = inBean.sendMessageString(CHW00201SFConst.PRC_KMK_CD_TEL_KOJIHI_GAKU, X31CWebConst.DATABEAN_GET_VALUE);
			String prcKmkCdKjhiKai = inBean.sendMessageString(CHW00201SFConst.PRC_KMK_CD_KOJIHI_CNT, X31CWebConst.DATABEAN_GET_VALUE);

			// 削除対象料金項目コードが工事費分割代金（ネット）又は工事費分割代金（電話）と一致した場合、工事費分割回数を削除対象とする。
			if(prcKmkCdNetKjGak.equals(delPrcKmkCd)||prcKmkCdTelKjGak.equals(delPrcKmkCd))
			{
				delPrcKmkCd = prcKmkCdKjhiKai;
			}

			// 判定対象料金項目情報と削除対象料金項目情報が一致した場合、請求内訳情報（非表示）から削除する。
			if (!(keySvcKeiNo.equals(delSvcKeiNo)
					&& keyPcrsCd.equals(delPcrsCd)
					&& keyPrcSvcCd.equals(delPrcSvcCd)
					&& keyPrcKmkCd.equals(delPrcKmkCd)))
			{
				HashMap<String, Object> uw = new HashMap<String, Object>();
				this.copyUwBeanToMap2(seikyUwBean, uw);
				uwList.add(uw);
			}
		}
		
		// 内訳情報リスト(退避)から内訳情報を生成し直す
		this.seikyUwBeanAccessArray.clearArray();
		for (int idx = 0; idx < uwList.size(); idx++)
		{
			HashMap<String, Object> uw = (HashMap<String, Object>)uwList.get(idx);
			X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.addDataBean();
			this.copyUwMapToBean(uw, bean);
		}
	}
	//v36.00.00 ANK-3296-00-00 Add End
	
	/**
	 * 内訳情報コピー処理.<br>
	 * 指定された内訳情報Beanアクセサから内訳情報マップに値をコピーします。
	 * <br>
	 * @param bean 内訳情報Beanアクセサ
	 * @param uw 内訳情報マップ
	 */
	private void copyUwBeanToMap(X31SDataBeanAccess bean, HashMap<String, Object> uw)
	{
		uw.put(this.no, bean.sendMessageString(this.no, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.idNo, bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.useStaYmd, bean.sendMessageString(this.useStaYmd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.useEndYmd, bean.sendMessageString(this.useEndYmd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.prcUw, bean.sendMessageString(this.prcUw, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.uwAmnt, bean.sendMessageString(this.uwAmnt, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keySeiriNo, bean.sendMessageString(this.keySeiriNo, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keySvcKeiNo, bean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.mansionId, bean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keyPrcGrpCd, bean.sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keyPcrsCd, bean.sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keyPrcSvcCd, bean.sendMessageString(this.keyPrcSvcCd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keyPrcKmkCd, bean.sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.usePrdDspCtrlFlg, bean.sendMessageString(this.usePrdDspCtrlFlg, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.prcTeisiKh, bean.sendMessageString(this.prcTeisiKh, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.taxDiv, bean.sendMessageString(this.taxDiv, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.sumLineJudgeDiv, bean.sendMessageString(this.sumLineJudgeDiv, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.svcDtlSkbtNo, bean.sendMessageString(this.svcDtlSkbtNo, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.seikyUcwkNo, bean.sendMessageString(this.seikyUcwkNo, X31CWebConst.DATABEAN_GET_VALUE));
	}
	
	//v36.00.00 ANK-3296-00-00 Add Start

	/**
	 * 内訳情報コピー処理.<br>
	 * 指定された内訳情報Beanアクセサから内訳情報マップに値をコピーします。
	 * <br>
	 * @param bean 内訳情報Beanアクセサ
	 * @param uw 内訳情報マップ
	 */
	private void copyUwBeanToMap2(X31SDataBeanAccess bean, HashMap<String, Object> uw)
	{
		uw.put(this.no, bean.sendMessageString(this.no, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.idNo, bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.useStaYmd, bean.sendMessageString(this.useStaYmd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.useEndYmd, bean.sendMessageString(this.useEndYmd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.prcUw, bean.sendMessageString(this.prcUw, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.uwAmnt, bean.sendMessageString(this.uwAmnt, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keySeiriNo, bean.sendMessageString(this.keySeiriNo, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keySvcKeiNo, bean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.mansionId, bean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keyPrcGrpCd, bean.sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keyPcrsCd, bean.sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keyPrcSvcCd, bean.sendMessageString(this.keyPrcSvcCd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.keyPrcKmkCd, bean.sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.usePrdDspCtrlFlg, bean.sendMessageString(this.usePrdDspCtrlFlg, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.prcTeisiKh, bean.sendMessageString(this.prcTeisiKh, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.taxDiv, bean.sendMessageString(this.taxDiv, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.svcDtlSkbtNo, bean.sendMessageString(this.svcDtlSkbtNo, X31CWebConst.DATABEAN_GET_VALUE));
		uw.put(this.seikyUcwkNo, bean.sendMessageString(this.seikyUcwkNo, X31CWebConst.DATABEAN_GET_VALUE));
	}
	//v36.00.00 ANK-3296-00-00 Add End

	/**
	 * 内訳情報コピー処理.<br>
	 * 指定された訳情報マップから内訳情報Beanに値をコピーします。
	 * <br>
	 * @param uw 内訳情報マップ
	 * @param bean 内訳情報Beanアクセサ
	 */
	private void copyUwMapToBean(HashMap<String, Object> uw, X31SDataBeanAccess bean)
	{
		bean.sendMessageString(this.no, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.no));
		bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.idNo));
		bean.sendMessageString(this.useStaYmd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.useStaYmd));
		bean.sendMessageString(this.useEndYmd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.useEndYmd));
		bean.sendMessageString(this.prcUw, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.prcUw));
		bean.sendMessageString(this.uwAmnt, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.uwAmnt));
		bean.sendMessageString(this.keySeiriNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keySeiriNo));
		bean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keySvcKeiNo));
		bean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.mansionId));
		bean.sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keyPrcGrpCd));
		bean.sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keyPcrsCd));
		bean.sendMessageString(this.keyPrcSvcCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keyPrcSvcCd));
		bean.sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keyPrcKmkCd));
		bean.sendMessageString(this.usePrdDspCtrlFlg, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.usePrdDspCtrlFlg));
		bean.sendMessageString(this.prcTeisiKh, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.prcTeisiKh));
		bean.sendMessageString(this.taxDiv, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.taxDiv));
		bean.sendMessageString(this.sumLineJudgeDiv, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.sumLineJudgeDiv));
		bean.sendMessageString(this.svcDtlSkbtNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.svcDtlSkbtNo));
		bean.sendMessageString(this.seikyUcwkNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.seikyUcwkNo));
	}

	//v36.00.00 ANK-3296-00-00 Add Start

	/**
	 * 内訳情報コピー処理.<br>
	 * 指定された訳情報マップから内訳情報Beanに値をコピーします。
	 * <br>
	 * @param uw 内訳情報マップ
	 * @param bean 内訳情報Beanアクセサ
	 */
	private void copyUwMapToBean2(HashMap<String, Object> uw, X31SDataBeanAccess bean)
	{
		bean.sendMessageString(this.no, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.no));
		bean.sendMessageString(this.idNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.idNo));
		bean.sendMessageString(this.useStaYmd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.useStaYmd));
		bean.sendMessageString(this.useEndYmd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.useEndYmd));
		bean.sendMessageString(this.prcUw, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.prcUw));
		bean.sendMessageString(this.uwAmnt, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.uwAmnt));
		bean.sendMessageString(this.keySeiriNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keySeiriNo));
		bean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keySvcKeiNo));
		bean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.mansionId));
		bean.sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keyPrcGrpCd));
		bean.sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keyPcrsCd));
		bean.sendMessageString(this.keyPrcSvcCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keyPrcSvcCd));
		bean.sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.keyPrcKmkCd));
		bean.sendMessageString(this.usePrdDspCtrlFlg, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.usePrdDspCtrlFlg));
		bean.sendMessageString(this.prcTeisiKh, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.prcTeisiKh));
		bean.sendMessageString(this.taxDiv, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.taxDiv));
		bean.sendMessageString(this.svcDtlSkbtNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.svcDtlSkbtNo));
		bean.sendMessageString(this.seikyUcwkNo, X31CWebConst.DATABEAN_SET_VALUE, (String)uw.get(this.seikyUcwkNo));
	
	}
	//v36.00.00 ANK-3296-00-00 Add End

	
	/**
	 * 指定された文字列に対して、指定された長さになるまで左側に半角スペース文字を埋めます。
	 * 指定された値がNULLであっても動作します。
	 * <br>
	 * @param source   対象文字列
	 * @param length   長さ
	 * @return         結果文字列  
	 */
	private static String padLeftSpace(String source, int length)
	{
		StringBuffer editor = null;
		if (source == null)
		{
			editor = new StringBuffer();
		}
		else
		{
			editor = new StringBuffer(source);
		}
		
		int len = 0;
		if (source != null)
		{
			len = source.length();
		}
		
		if (len < length)
		{
			int padLen = length - len;
			for (int i = 0; i < padLen; i++)
			{
				editor.insert(0, JACStrConst.SPACE_1);
			}
		}
		
		return editor.toString();
	}

	/**
	 * 請求内訳番号再設定処理。<br>
	 * 請求内訳情報の削除が行われた場合、請求内訳番号を連番で再設定する。
	 * 随時請求、随時入金でのみ使用。
	 * <br>
	 * @param delIndexList 削除インデックスリスト
	 */
	private void remakeSeikyUcwkNo(ArrayList<Integer> delIndexList)
	{
		// -------------------------------------------------- //
		// 請求内訳情報の中から削除対象行のキーを保持する
		// -------------------------------------------------- //
		List<String> keyList = new ArrayList<String>();

		for (int delIdx = 0; delIdx < delIndexList.size(); delIdx++)
		{
			for (int idx = 0; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
			{
				if (delIndexList.get(delIdx) == idx)
				{
					X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.getDataBean(idx);

					String wkSvcKeiNo = bean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE);
					String wkMansionId = bean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_GET_VALUE);
					String wkPrcGrpCd = bean.sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_GET_VALUE);
					String wkPcrsCd = bean.sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_GET_VALUE);
					String wkPrcKmkCd = bean.sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_GET_VALUE);
					String wkSvcDtlSkbtNo = bean.sendMessageString(this.svcDtlSkbtNo, X31CWebConst.DATABEAN_GET_VALUE);

					StringBuilder wkKey = new StringBuilder();
					wkKey.append(wkSvcKeiNo)
						.append(wkMansionId)
						.append(wkPrcGrpCd)
						.append(wkPcrsCd)
						.append(wkPrcKmkCd)
						.append(wkSvcDtlSkbtNo);

					keyList.add(wkKey.toString());
				}
			}
		}

		// -------------------------------------------------- //
		// 請求内訳情報の中から削除対象行のキーと同じ明細の場合、請求内訳番号を振りなおす
		// -------------------------------------------------- //
		for (int keyIdx = 0; keyIdx < keyList.size(); keyIdx++)
		{
			int maxValue = 1;

			for (int idx = 0; idx < this.seikyUwBeanAccessArray.getCount(); idx++)
			{
				X31SDataBeanAccess bean = this.seikyUwBeanAccessArray.getDataBean(idx);

				String wkSvcKeiNo = bean.sendMessageString(this.keySvcKeiNo, X31CWebConst.DATABEAN_GET_VALUE);
				String wkMansionId = bean.sendMessageString(this.mansionId, X31CWebConst.DATABEAN_GET_VALUE);
				String wkPrcGrpCd = bean.sendMessageString(this.keyPrcGrpCd, X31CWebConst.DATABEAN_GET_VALUE);
				String wkPcrsCd = bean.sendMessageString(this.keyPcrsCd, X31CWebConst.DATABEAN_GET_VALUE);
				String wkPrcKmkCd = bean.sendMessageString(this.keyPrcKmkCd, X31CWebConst.DATABEAN_GET_VALUE);
				String wkSvcDtlSkbtNo = bean.sendMessageString(this.svcDtlSkbtNo, X31CWebConst.DATABEAN_GET_VALUE);

				StringBuilder wkKey = new StringBuilder();
				wkKey.append(wkSvcKeiNo)
					.append(wkMansionId)
					.append(wkPrcGrpCd)
					.append(wkPcrsCd)
					.append(wkPrcKmkCd)
					.append(wkSvcDtlSkbtNo);

				if (keyList.get(keyIdx).equals(wkKey.toString()))
				{
					bean.sendMessageString(this.seikyUcwkNo, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(maxValue));
					maxValue++;
				}
			}
		}

	}

	// ▲▲ クラス内共通処理 ▲▲	
}
