/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：CHW00109SFLogic
 *	ソースファイル名：CHW00109SFLogic.java
 *	作成者			：富士通
 *	日付			：2011年08月18日
 *＜機能概要＞
 *	請求内訳再発行のビューロジック部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/08/18	富士通		新規作成
 *	v1.01.00	2013/05/08	FJ)大塚     メッセージ領域の背景色の設定対応
 *	v68.00.00	2022/10/25	FJ)寺田		[ANK-4475-00-00] インボイス対応 STEP2
 *  v71.00.00   2024/04/01  FJ)張      【ANK-4543-00-00】【eo定期】NTT卸対応：Step0
 **********************************************************************/
package eo.web.webview.CHW00109SF;

import java.util.ArrayList;
import java.util.HashMap;

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.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JPCFomatString;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JACScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCHCommonConst;
import eo.web.webview.common.JCHCommonServiceUtil;
import eo.web.webview.common.JCHPageTransferUtil;
import eo.web.webview.mapping.CHSV0047_CHSV0047OPDBMapper;
import eo.web.webview.mapping.CHSV0048_CHSV0048OPDBMapper;

/**
 * 請求内訳再発行のビューロジックを提供します。
 * <p>
 * <BR>
 * 
 * @author 富士通
 */
public class CHW00109SFLogic extends JCCWebBusinessLogic
{

	/** ユースケースID(請求内訳再発行画面情報取得) */
	private static final String USECASE_ID_CHSV0047 = "CHSV0047";

	/** ユースケースID(請求内訳再発行) */
	private static final String USECASE_ID_CHSV0048 = "CHSV0048";

	/** メッセージＩＤ(ＮＧワード) */
	private static final String MESSAGE_ID_NG_WORD = "EKB8580-KW";

// ANK-4475-00-00 ADD START
	/** メッセージＩＤ(再計算後、出力する帳票が無い) */
	private static final String MESSAGE_ID_ALL_SKIP = "EKBD980-KW";
// ANK-4475-00-00 ADD END
	
	/** マップID */
	private static final String MAP_CC_ID = "TUSHINSVCPRCCHOHYOCC";

	/** 督促ステータス判定用数値 */
	private static final int JDG_TOKUSOKU_STAT_INT = 29;
	
// ANK-4475-00-00 ADD START
	/** インデックス */
	private static final String STC_INDEX = "インデックス";
// ANK-4475-00-00 ADD END
	
	/**
	 * 請求内訳再発行の初期表示処理を行います。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean init() throws Exception
	{
		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面IDを判定して画面IDに対応する初期表示処理を呼び出す
		String screenId = commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);
		if (screenId.equals(JACScreenConst.SCREEN_ID_CHW00109))
		{
			initShokaiScreen();
		}

		return true;
	}

	/**
	 * 請求内訳再発行確認画面に遷移します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean printCfm() throws Exception
	{
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean, commoninfoBean };

		// 選択されている手数料有無を取得する
		String tesuryoUmNm = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.TESURYO_NM_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String tesuryoUmCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.TESURYO_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String selOutputPrcGrpCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.OUTPUT_PRC_GRP_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String selOutPcrsCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.OUT_PCRS_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String selOutPrcSvcCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.OUT_PRC_SVC_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String selOutPrcKmkCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.OUT_PRC_KMK_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		
		bean.sendMessageString(CHW00109SFConst.TESURYO_UM_NM, X31CWebConst.DATABEAN_SET_VALUE, tesuryoUmNm);
		bean.sendMessageString(CHW00109SFConst.TESURYO_UM_CD, X31CWebConst.DATABEAN_SET_VALUE, tesuryoUmCd);
		bean.sendMessageString(CHW00109SFConst.SEL_OUTPUT_PRC_GRP_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutputPrcGrpCd);
		bean.sendMessageString(CHW00109SFConst.SEL_OUT_PCRS_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPcrsCd);
		bean.sendMessageString(CHW00109SFConst.SEL_PRC_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPrcSvcCd);
		bean.sendMessageString(CHW00109SFConst.SEL_OUT_PRC_KMK_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPrcKmkCd);

		
// ANK-4475-00-00 ADD START

		// 選択されている宛名出力を取得、設定する。
		String atena_output_um_nm = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.ATENA_OUTPUT_INFO, CHW00109SFConst.ATENA_OUTPUT_NM_LIST_04, CHW00109SFConst.ATENA_OUTPUT_CD_SEL_04);
		String atena_output_um_cd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.ATENA_OUTPUT_INFO, CHW00109SFConst.ATENA_OUTPUT_CD_LIST_04, CHW00109SFConst.ATENA_OUTPUT_CD_SEL_04);
		bean.sendMessageString(CHW00109SFConst.ATENA_OUTPUT_UM_NM, X31CWebConst.DATABEAN_SET_VALUE, atena_output_um_nm);
		bean.sendMessageString(CHW00109SFConst.ATENA_OUTPUT_UM_CD, X31CWebConst.DATABEAN_SET_VALUE, atena_output_um_cd);

		// 選択されている請求年月（開始）を取得、設定する。
		String seiky_ym_from_value = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.SEIKY_YM_FROM_INFO, CHW00109SFConst.SEIKY_YM_FROM_LIST_06, CHW00109SFConst.SEIKY_YM_FROM_SEL_06);
		bean.sendMessageString(CHW00109SFConst.SEIKY_YM_FROM_VALUE, X31CWebConst.DATABEAN_SET_VALUE, seiky_ym_from_value);
		String seiky_ym_from_value_rep = seiky_ym_from_value.replace(JACStrConst.SLASH, JACStrConst.KARA_MOJI).substring(0, 6);

		// 選択されている請求年月（終了）を取得、設定する。
		String seiky_ym_to_value = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.SEIKY_YM_TO_INFO, CHW00109SFConst.SEIKY_YM_TO_LIST_07, CHW00109SFConst.SEIKY_YM_TO_SEL_07);
		bean.sendMessageString(CHW00109SFConst.SEIKY_YM_TO_VALUE, X31CWebConst.DATABEAN_SET_VALUE, seiky_ym_to_value);
		String seiky_ym_to_value_rep = seiky_ym_to_value.replace(JACStrConst.SLASH, JACStrConst.KARA_MOJI).substring(0, 6);

		// 選択されている請求年月（開始）〜（終了）範囲の請求年月・請求番号を再格納する。

		// 請求年月・請求番号のMAX情報
		X31SDataBeanAccessArray seiky_ym_info = paramBeans[0].getDataBeanArray(CHW00109SFConst.SEIKY_YM_INFO);
		X31SDataBeanAccess subbean2 = seiky_ym_info.getDataBean(0);

		// 再格納する情報
		X31SDataBeanAccessArray seiky_ym_output_info = paramBeans[0].getDataBeanArray(CHW00109SFConst.SEIKY_YM_OUTPUT_INFO);
		X31SDataBeanAccess subbean3 = seiky_ym_output_info.getDataBean(0);
		subbean3.sendMessage(CHW00109SFConst.SEIKY_YM_OUTPUT_LIST_08, X31CWebConst.DATABEAN_CLEAR);
		subbean3.sendMessage(CHW00109SFConst.SEIKY_NO_OUTPUT_LIST_08, X31CWebConst.DATABEAN_CLEAR);

		// 請求年月リストの件数を格納
		int seiky_ym_count = ((Integer) subbean2.sendMessage(CHW00109SFConst.SEIKY_YM_LIST_05, X31CWebConst.DATABEAN_GET_COUNT)).intValue();

		int seiky_ym_From_count = 0;
		int seiky_ym_To_count = 0;
		Boolean countFromFlg = true;

		for (int i = 0; i < seiky_ym_count; i++) {
			String Seiky_Ym = subbean2.sendMessageString(CHW00109SFConst.SEIKY_YM_LIST_05, X31CWebConst.DATABEAN_GET_VALUE, i);
			if (seiky_ym_from_value_rep.equals(Seiky_Ym) & countFromFlg) {
				// 請求年月が合致していたらそのindexを初回のみ格納
				seiky_ym_From_count = i;
				countFromFlg = false;
			}
			if (seiky_ym_to_value_rep.equals(Seiky_Ym)) {
				// 請求年月が合致していたら合致が終わるまでそのindexを格納、更新をする。
				seiky_ym_To_count = i;
			}
		}
		// 請求年月（開始）〜（終了）範囲の請求年月・請求番号を格納
		for (int i = seiky_ym_From_count; i <= seiky_ym_To_count; i++) {
			subbean3.sendMessageString(CHW00109SFConst.SEIKY_YM_OUTPUT_LIST_08, X31CWebConst.DATABEAN_ADD_VALUE, subbean2.sendMessageString(CHW00109SFConst.SEIKY_YM_LIST_05, X31CWebConst.DATABEAN_GET_VALUE, i));
			subbean3.sendMessageString(CHW00109SFConst.SEIKY_NO_OUTPUT_LIST_08, X31CWebConst.DATABEAN_ADD_VALUE, subbean2.sendMessageString(CHW00109SFConst.SEIKY_NO_LIST_05, X31CWebConst.DATABEAN_GET_VALUE, i));
		}

// ANK-4475-00-00 ADD END

		// ユーザーIDの取得
		String userId = commoninfoBean.sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE);

		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// 請求内訳再発行サービス実行
		this.execCHSV0048(paramBeans, JPCModelConstant.FUNC_CD_2, userId, outputMap);

		// ＮＧワードチェック
		ArrayList<String> ngWordList = JCHCommonServiceUtil.getNgWordList(outputMap);

		// NGワードが存在する場合、警告メッセージ表示
		if (!ngWordList.isEmpty())
		{
			for (int i = 0; i < ngWordList.size(); i++)
			{
				JCCWebCommon.setMessageInfo(this, MESSAGE_ID_NG_WORD, new String[] { CHW00109SFConst.KIJI, ngWordList.get(i) });
			}
			return true;
		}
		
// ANK-4475-00-00 ADD START
		// 帳票出力全件Skipチェック
		ArrayList<String> skip_Flg_List = getSkip_Flg_List(outputMap);

		int output_num = skip_Flg_List.size();

		for (int i = 0; i < skip_Flg_List.size(); i++) {
			if ("1".equals(skip_Flg_List.get(i))) {
				output_num = output_num - 1;
			}
		}
		// 全件SKIPの場合、警告メッセージ表示
		if (output_num == 0) {
			JCCWebCommon.setMessageInfo(this, MESSAGE_ID_ALL_SKIP);
			return true;
		}
// ANK-4475-00-00 ADD END
		
		// メッセージ領域の背景色の設定
		JCCWebCommon.setMessageAreaBackColor(this, "1");
		
//ANK-4543-00-00 ADD START
		//NTT卸契約エラー判定
		ArrayList NttErrList = getNtt_Flg_List(outputMap);
		if(NttErrList != null)
		{
			for(int i = 0; i < NttErrList.size(); i++ ){
				String nttErrFlg = (String)NttErrList.get(i);
				if (nttErrFlg.equals("1")){
					JCCWebCommon.setMessageInfo(this, "NTT卸契約が複数件存在します");
				}
			}
		}
//ANK-4543-00-00 ADD END
		
		// メッセージの設定
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, new String[] {"再発行"});

		// 遷移先画面を設定する
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_CHW00110);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_CHW00110);

		return true;
	}

	/**
	 * 確定完了を処理します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean fixFin() throws Exception
	{
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean, commoninfoBean };

		// 選択されている手数料有無を取得する
		String tesuryoUmNm = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.TESURYO_NM_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String tesuryoUmCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.TESURYO_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String selOutputPrcGrpCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.OUTPUT_PRC_GRP_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String selOutPcrsCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.OUT_PCRS_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String selOutPrcSvcCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.OUT_PRC_SVC_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);
		String selOutPrcKmkCd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.TESURYO_INFO, CHW00109SFConst.OUT_PRC_KMK_CD_LIST_01,
				CHW00109SFConst.TESURYO_CD_SEL_01);

		bean.sendMessageString(CHW00109SFConst.TESURYO_UM_NM, X31CWebConst.DATABEAN_SET_VALUE, tesuryoUmNm);
		bean.sendMessageString(CHW00109SFConst.TESURYO_UM_CD, X31CWebConst.DATABEAN_SET_VALUE, tesuryoUmCd);
		bean.sendMessageString(CHW00109SFConst.SEL_OUTPUT_PRC_GRP_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutputPrcGrpCd);
		bean.sendMessageString(CHW00109SFConst.SEL_OUT_PCRS_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPcrsCd);
		bean.sendMessageString(CHW00109SFConst.SEL_PRC_SVC_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPrcSvcCd);
		bean.sendMessageString(CHW00109SFConst.SEL_OUT_PRC_KMK_CD, X31CWebConst.DATABEAN_SET_VALUE, selOutPrcKmkCd);

// ANK-4475-00-00 ADD START
		
		// 選択されている宛名出力を取得、設定する。
		String atena_output_um_nm = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.ATENA_OUTPUT_INFO, CHW00109SFConst.ATENA_OUTPUT_NM_LIST_04, CHW00109SFConst.ATENA_OUTPUT_CD_SEL_04);
		String atena_output_um_cd = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.ATENA_OUTPUT_INFO, CHW00109SFConst.ATENA_OUTPUT_CD_LIST_04, CHW00109SFConst.ATENA_OUTPUT_CD_SEL_04);
		bean.sendMessageString(CHW00109SFConst.ATENA_OUTPUT_UM_NM, X31CWebConst.DATABEAN_SET_VALUE, atena_output_um_nm);
		bean.sendMessageString(CHW00109SFConst.ATENA_OUTPUT_UM_CD, X31CWebConst.DATABEAN_SET_VALUE, atena_output_um_cd);

		// 選択されている請求年月（開始）を取得、設定する。
		String seiky_ym_from_value = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.SEIKY_YM_FROM_INFO, CHW00109SFConst.SEIKY_YM_FROM_LIST_06, CHW00109SFConst.SEIKY_YM_FROM_SEL_06);
		String seiky_ym_from_value_rep = seiky_ym_from_value.replace(JACStrConst.SLASH, JACStrConst.KARA_MOJI).substring(0, 6);

		// 選択されている請求年月（終了）を取得、設定する。
		String seiky_ym_to_value = this.convSelIndexToTarget(paramBeans, CHW00109SFConst.SEIKY_YM_TO_INFO, CHW00109SFConst.SEIKY_YM_TO_LIST_07, CHW00109SFConst.SEIKY_YM_TO_SEL_07);
		String seiky_ym_to_value_rep = seiky_ym_to_value.replace(JACStrConst.SLASH, JACStrConst.KARA_MOJI).substring(0, 6);

		// 選択されている請求年月（開始）〜（終了）範囲の請求年月・請求番号を再格納する。

		// 請求年月・請求番号のMAX情報
		X31SDataBeanAccessArray seiky_ym_info = paramBeans[0].getDataBeanArray(CHW00109SFConst.SEIKY_YM_INFO);
		X31SDataBeanAccess subbean2 = seiky_ym_info.getDataBean(0);

		// 再格納する情報
		X31SDataBeanAccessArray seiky_ym_output_info = paramBeans[0].getDataBeanArray(CHW00109SFConst.SEIKY_YM_OUTPUT_INFO);
		X31SDataBeanAccess subbean3 = seiky_ym_output_info.getDataBean(0);
		subbean3.sendMessage(CHW00109SFConst.SEIKY_YM_OUTPUT_LIST_08, X31CWebConst.DATABEAN_CLEAR);
		subbean3.sendMessage(CHW00109SFConst.SEIKY_NO_OUTPUT_LIST_08, X31CWebConst.DATABEAN_CLEAR);

		// 請求年月リストの件数を格納
		int seiky_ym_count = ((Integer) subbean2.sendMessage(CHW00109SFConst.SEIKY_YM_LIST_05, X31CWebConst.DATABEAN_GET_COUNT)).intValue();

		int seiky_ym_From_count = 0;
		int seiky_ym_To_count = 0;
		Boolean countFromFlg = true;

		for (int i = 0; i < seiky_ym_count; i++) {
			String Seiky_Ym = subbean2.sendMessageString(CHW00109SFConst.SEIKY_YM_LIST_05, X31CWebConst.DATABEAN_GET_VALUE, i);
			if (seiky_ym_from_value_rep.equals(Seiky_Ym) & countFromFlg) {
				// 請求年月が合致していたらそのindexを初回のみ格納
				seiky_ym_From_count = i;
				countFromFlg = false;
			}
			if (seiky_ym_to_value_rep.equals(Seiky_Ym)) {
				// 請求年月が合致していたら合致が終わるまでそのindexを格納、更新をする。
				seiky_ym_To_count = i;
			}
		}
		// 請求年月（開始）〜（終了）範囲の請求年月・請求番号を格納
		for (int i = seiky_ym_From_count; i <= seiky_ym_To_count; i++) {
			subbean3.sendMessageString(CHW00109SFConst.SEIKY_YM_OUTPUT_LIST_08, X31CWebConst.DATABEAN_ADD_VALUE, subbean2.sendMessageString(CHW00109SFConst.SEIKY_YM_LIST_05, X31CWebConst.DATABEAN_GET_VALUE, i));
			subbean3.sendMessageString(CHW00109SFConst.SEIKY_NO_OUTPUT_LIST_08, X31CWebConst.DATABEAN_ADD_VALUE, subbean2.sendMessageString(CHW00109SFConst.SEIKY_NO_LIST_05, X31CWebConst.DATABEAN_GET_VALUE, i));
		}
		

// ANK-4475-00-00 ADD END

		
		// ユーザーIDの取得
		String userId = commoninfoBean.sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE);

		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// 請求内訳再発行サービス実行
		this.execCHSV0048(paramBeans, JPCModelConstant.FUNC_CD_1, userId, outputMap);

		return true;
	}

	/**
	 * モーダル反映画面に遷移して画面を閉じます。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean close() throws Exception
	{
		// 遷移先画面IDを取得し、子画面を閉じる共通処理を呼出す
		return JCHPageTransferUtil.closeTransfer(this, JCCWebCommon.getScreenId(this));
	}

	/**
	 * 修正を処理します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean shusei() throws Exception
	{
		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		// 遷移先画面を設定する
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_CHW00109);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_CHW00109);

		return true;
	}

	/**
	 * 請求内訳再発行画面の初期表示処理を行います。 <br>
	 * 
	 * @throws Exception 例外が発生した場合
	 */
	private void initShokaiScreen() throws Exception
	{
		// 画面間引継情報を設定する
		JCCWebCommon.getScreenInfo(this);

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		// 帳票出力フラグの初期化
		paramBeans[0].sendMessageString(CHW00109SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");

		// 請求内訳再発行画面情報取得サービス実行
		this.execCHSV0047(paramBeans);
	}

	/**
	 * 請求内訳再発行画面情報取得サービスを実行します。 <br>
	 * 
	 * @param paramBeans 請求内訳再発行サービスフォームBean
	 */
	private void execCHSV0047(X31SDataBeanAccess[] paramBeans) throws Exception
	{
		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CHSV0047);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		CHSV0047_CHSV0047OPDBMapper mapper = new CHSV0047_CHSV0047OPDBMapper();
		mapper.setCHSV004701SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1); // 定額料金手数料一覧照会
		JCHCommonServiceUtil.setSeikySakiInfoStkuCC(paramBeans, inDataMap); // 請求先情報取得CC

// ANK-4475-00-00 ADD START
		mapper.setCHSV004703SC(paramBeans, inDataMap, "10"); // ECH0051B010:請求一覧照会
// ANK-4475-00-00 ADD END
		
		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 下りマッピング
		mapper.getCHSV004701SC(paramBeans, outputMap); // 定額料金手数料一覧照会
		JCHCommonServiceUtil.getSeikySakiInfoStkuCC(paramBeans, outputMap); // 請求先情報取得CC

// ANK-4475-00-00 ADD START
		mapper.getCHSV004703SC(paramBeans, outputMap); // ECH0051B010:請求一覧照会

		// 画面表示に使用する宛名出力有無を設定します。
		X31SDataBeanAccessArray atena_output_info = paramBeans[0].getDataBeanArray(CHW00109SFConst.ATENA_OUTPUT_INFO);
		X31SDataBeanAccess subbean1 = atena_output_info.getDataBean(0);
		subbean1.sendMessage(CHW00109SFConst.ATENA_OUTPUT_CD_LIST_04, X31CWebConst.DATABEAN_CLEAR);
		subbean1.sendMessage(CHW00109SFConst.ATENA_OUTPUT_NM_LIST_04, X31CWebConst.DATABEAN_CLEAR);
		subbean1.sendMessageString(CHW00109SFConst.ATENA_OUTPUT_CD_LIST_04, X31CWebConst.DATABEAN_ADD_VALUE, "1");
		subbean1.sendMessageString(CHW00109SFConst.ATENA_OUTPUT_NM_LIST_04, X31CWebConst.DATABEAN_ADD_VALUE, "有");
		subbean1.sendMessageString(CHW00109SFConst.ATENA_OUTPUT_CD_LIST_04, X31CWebConst.DATABEAN_ADD_VALUE, "0");
		subbean1.sendMessageString(CHW00109SFConst.ATENA_OUTPUT_NM_LIST_04, X31CWebConst.DATABEAN_ADD_VALUE, "無");

		// 画面表示に使用する　請求年月（開始）請求年月（終了）のを設定します。
		X31SDataBeanAccessArray seiky_ym_info = paramBeans[0].getDataBeanArray(CHW00109SFConst.SEIKY_YM_INFO);
		X31SDataBeanAccess subbean2 = seiky_ym_info.getDataBean(0);

		X31SDataBeanAccessArray seiky_ym_from_info = paramBeans[0].getDataBeanArray(CHW00109SFConst.SEIKY_YM_FROM_INFO);
		X31SDataBeanAccess subbean3 = seiky_ym_from_info.getDataBean(0);
		subbean3.sendMessage(CHW00109SFConst.SEIKY_YM_FROM_LIST_06, X31CWebConst.DATABEAN_CLEAR);

		X31SDataBeanAccessArray seiky_ym_to_info = paramBeans[0].getDataBeanArray(CHW00109SFConst.SEIKY_YM_TO_INFO);
		X31SDataBeanAccess subbean4 = seiky_ym_to_info.getDataBean(0);
		subbean4.sendMessage(CHW00109SFConst.SEIKY_YM_TO_LIST_07, X31CWebConst.DATABEAN_CLEAR);

		int seiky_ym_count = ((Integer) subbean2.sendMessage(CHW00109SFConst.SEIKY_YM_LIST_05, X31CWebConst.DATABEAN_GET_COUNT)).intValue();
		String bef_wind_Seiky_YM = paramBeans[0].sendMessageString(CHW00109SFConst.SEIKY_YM, X31CWebConst.DATABEAN_GET_VALUE);
		String bef_Seiky_ym = "";
		
		// 編集したリスト内から遷移元の指定した請求年月の場所を特定する用
		ArrayList<String> Seiky_Ym_check = new ArrayList<String>();

		for (int i = 0; i < seiky_ym_count; i++) {
			String Seiky_Ym = subbean2.sendMessageString(CHW00109SFConst.SEIKY_YM_LIST_05, X31CWebConst.DATABEAN_GET_VALUE, i);

			// 前件と同じ請求年月であればスキップする。
			if (bef_Seiky_ym.equals(Seiky_Ym)) {
				continue;
			} else {
				// 請求年月を格納する。
				subbean3.sendMessageString(CHW00109SFConst.SEIKY_YM_FROM_LIST_06, X31CWebConst.DATABEAN_ADD_VALUE, JPCFomatString.formatYears(Seiky_Ym));
				subbean4.sendMessageString(CHW00109SFConst.SEIKY_YM_TO_LIST_07, X31CWebConst.DATABEAN_ADD_VALUE, JPCFomatString.formatYears(Seiky_Ym));
				// 前件と同じ請求年月かを比較できるよう格納する。
				bef_Seiky_ym = Seiky_Ym;
				Seiky_Ym_check.add(Seiky_Ym);
			}
		}

		// 前画面の請求年月が同一であればそのindex値を初期値として格納する（初期表示時のプルダウンリスト位置）
		for (int i = 0; i < Seiky_Ym_check.size(); i++) {
			if (bef_wind_Seiky_YM.equals(Seiky_Ym_check.get(i))) {
				subbean3.sendMessageString(CHW00109SFConst.SEIKY_YM_FROM_SEL_06, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(i));
				subbean4.sendMessageString(CHW00109SFConst.SEIKY_YM_TO_SEL_07, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(i));
			}
		}
		
// ANK-4475-00-00 ADD END
		
		// 手数料有無非活性制御判定
		this.jdgTesuryoDisabled(paramBeans);

	}

	/**
	 * 請求内訳再発行サービスを実行します。 <br>
	 * 
	 * @param paramBeans 請求内訳再発行サービスフォームBean
	 * @param outputMap 下り格納マップ
	 */
	@SuppressWarnings("unchecked")
	private void execCHSV0048(X31SDataBeanAccess[] paramBeans, String funcCd, String userId, HashMap<String, Object> outputMap) throws Exception
	{
		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CHSV0048);
		// 上り格納マップ
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();

		// ファイル格納マップ
		HashMap<String, Object> attachMap = new HashMap<String, Object>();

		CHSV0048_CHSV0048OPDBMapper mapper = new CHSV0048_CHSV0048OPDBMapper();
		mapper.setCHSV004801SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_2); // 料金スケジュール定義一意照会
		mapper.setCHSV004802SC(paramBeans, inDataMap, funcCd); // 一時金登録
		mapper.setTAIOKIROKADDCC(paramBeans, inDataMap, funcCd, this); // 顧客対応記録登録CC
		mapper.setADDHOTVOICCC(paramBeans, inDataMap, funcCd, this); // ホットボイスCC
		mapper.setPRCTAIOKIROKADDCC(paramBeans, inDataMap, funcCd, this); // 料金対応記録登録CC
		mapper.setTUSHINSVCPRCCHOHYOCC(paramBeans, inDataMap, funcCd); // 通信サービス料金帳票CC

		// NGワードチェックフラグを設定
		((HashMap)inDataMap.get(JACStrConst.PRCTAIOKIROKADDCC_MAP_ID)).put(JACStrConst.KEY_NGWORD_CHECK_FLG, "1");

		HashMap<String, Object> ccMap = (HashMap<String, Object>) inDataMap.get(MAP_CC_ID);

		// ユーザーID
		ccMap.put("user_id", userId);

// ANK-4475-00-00 ADD START
		mapper.setSKSATENACHOHYOCC(paramBeans, inDataMap, funcCd); // 請求書（宛名）帳票CC
		HashMap<String, Object> ccMap2 = (HashMap<String, Object>) inDataMap.get("SKSATENACHOHYOCC");
		// ユーザーID
		ccMap2.put("user_id", userId);
// ANK-4475-00-00 ADD END
		
		// サービスの呼び出し（チェックのみ）
		invokeService(paramMap, inDataMap, outputMap, attachMap);
		if(JPCModelConstant.FUNC_CD_1.equals(funcCd)){
			
// ANK-4475-00-00 MOD START
//			// 出力する帳票の情報を取得
//			HashMap outFileInfMap = (HashMap)((ArrayList)attachMap.get("TELEGRAM_INFO_ATTACH_FILE_LIST")).get(0);
//			// 出力するファイルデータを取得
//			byte[] outFileData = (byte[])outFileInfMap.get("TELEGRAM_INFO_ATTACH_FILE");
//			// 出力するファイル名を取得
//			String outFileName = (String)outFileInfMap.get("TELEGRAM_INFO_ATTACH_ITEM_NAMAE");
//			// 出力するファイルをセッションに格納する
//			HashMap<String, Object> printInfo = new HashMap<String, Object>();
//			printInfo.put("output_chohyo", outFileData);
//			printInfo.put("chohyo_name", outFileName + ".pdf");
//
//			JCCWebCommon.setScreenInfo(this, JACScreenConst.SCREEN_ID_ACW00699, printInfo);
//			// サービスフォームBean アクセスクラスの取得
//			X31SDataBeanAccess svcFormBean = super.getServiceFormBean();
//			svcFormBean.sendMessageString(CHW00109SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "1");
//
			ArrayList outFileInfList = (ArrayList) attachMap.get("TELEGRAM_INFO_ATTACH_FILE_LIST");
			ArrayList printInfoList = new ArrayList();
			HashMap<String, Object> printInfoMap = new HashMap<String, Object>();

			if (outFileInfList != null) {
				for (int i = 0; i < outFileInfList.size(); i++) {
					// 出力する帳票の情報を取得
					HashMap outFileInfMap = (HashMap) outFileInfList.get(i);
					// 出力するファイルデータを取得
					byte[] outFileData = (byte[]) outFileInfMap.get("TELEGRAM_INFO_ATTACH_FILE");
					// 出力するファイル名を取得
					String outFileName = (String) outFileInfMap.get("TELEGRAM_INFO_ATTACH_ITEM_NAMAE");
					// ダウンロード部品を呼出
					// 出力するファイルをセッションに格納する
					HashMap<String, Object> printInfo = new HashMap<String, Object>();
					printInfo.put("output_chohyo", outFileData);
					printInfo.put("chohyo_name", outFileName + String.valueOf(i) + ".pdf");

					printInfoList.add(printInfo);
				}
				printInfoMap.put("print_info_list", printInfoList);

				// サービスフォームBean アクセスクラスの取得
				X31SDataBeanAccess svcFormBean = super.getServiceFormBean();

				JCCWebCommon.setScreenInfo(this, JACScreenConst.SCREEN_ID_ACW00699, printInfoMap);

				if (outFileInfList.size() == 1) {
					svcFormBean.sendMessageString(CHW00109SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "1");
				} else {
					svcFormBean.sendMessageString(CHW00109SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "2");
				}
				
// ANK-4475-00-00 MOD END

			}
		}
	}

	/**
	 * 手数料有無の非活性制御を判定します。 <br>
	 * 
	 * @param bean 請求内訳再発行情報Bean
	 */
	private void jdgTesuryoDisabled(X31SDataBeanAccess[] bean)
	{
		String tokusokuStat = JACStrConst.KARA_MOJI;
		X31SDataBeanAccess seikyInfo = bean[0].getDataBeanArray(CHW00109SFConst.SEIKY_INFO).getDataBean(0);
		tokusokuStat = (String)seikyInfo.sendMessageString(CHW00109SFConst.TOKUSOKU_STAT_03, X31CWebConst.DATABEAN_GET_VALUE);

		// 手数料有無の選択を可にする。
		bean[0].sendMessageString(CHW00109SFConst.DSBL_CTL_JSF_TESURYO, X31CWebConst.DATABEAN_SET_VALUE, JACStrConst.CTL_VALUE_FALSE);

		if (tokusokuStat != null && !JACStrConst.KARA_MOJI.equals(tokusokuStat))
		{
			if (JDG_TOKUSOKU_STAT_INT < Integer.parseInt(tokusokuStat))
			{
				// 督促ステータスが30 〜 99の場合、手数料有無の選択を不可にする。
				bean[0].sendMessageString(CHW00109SFConst.DSBL_CTL_JSF_TESURYO, X31CWebConst.DATABEAN_SET_VALUE, JACStrConst.CTL_VALUE_TRUE);
			}
		}
	}

	/**
	 * 指定したリストより選択位置の指定した名称を取得します。 <br>
	 * 
	 * @param bean 請求内訳再発行情報Bean
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyListMei 値リストを示すキー名称
	 * @param keySelMei 選択位置を示すキー名称
	 * @return 名称
	 */
	private String convSelIndexToTarget(X31SDataBeanAccess[] bean, String keyInfoMei, String keyListMei, String keySelMei)
	{
		X31SDataBeanAccess infoBean = bean[0].getDataBeanArray(keyInfoMei).getDataBean(0);

		return this.getValueFromListBySelIndex(infoBean, keyListMei, keySelMei);
	}

	/**
	 * 指定したリストより選択位置の値を取得します。 <br>
	 * 
	 * @param infoBean 値リスト、選択位置が格納されている親Bean
	 * @param keyList 値リストを示すキー
	 * @param keySel 選択位置を示すキー
	 * @return 名称
	 */
	private String getValueFromListBySelIndex(X31SDataBeanAccess infoBean, String keyList, String keySel)
	{
		String value = null;

		if (null != infoBean)
		{
			int idxSel;

			try
			{
				idxSel = Integer.parseInt(infoBean.sendMessageString(keySel, X31CWebConst.DATABEAN_GET_VALUE));
			}
			catch (NumberFormatException ex)
			{
				idxSel = -1;
			}

			if (0 <= idxSel)
			{
				value = infoBean.sendMessageString(keyList, X31CWebConst.DATABEAN_GET_VALUE, idxSel);
			}
		}

		return value;
	}

// ANK-4475-00-00 ADD END	
	/**
	 * 通信サービス料金帳票出力CCのリターンMapより、帳票出力Skipフラグを文字列のリストとして返します。
	 * 
	 * @param outputMap 通信サービス料金帳票出力CCのリターンMap
	 * @return 帳票出力Skipフラグリスト
	 */
	@SuppressWarnings("unchecked")
	public static ArrayList<String> getSkip_Flg_List(HashMap<String, Object> outputMap) {

		ArrayList<String> skip_Flg_List = new ArrayList<String>();

		HashMap<String, Object> parentMap = null;
		if (outputMap.containsKey("TUSHINSVCPRCCHOHYOCC")) {
			parentMap = (HashMap<String, Object>) outputMap.get("TUSHINSVCPRCCHOHYOCC");
		}
		if (parentMap != null && parentMap.containsKey("tushin_svc_prc_output_list")) {
			ArrayList<HashMap<String, String>> childList = (ArrayList<HashMap<String, String>>) parentMap.get("tushin_svc_prc_output_list");
			for (int i = 0; i < childList.size(); i++) {
				HashMap<String, String> childMap = (HashMap<String, String>) childList.get(i);
				if (childMap != null) {
					skip_Flg_List.add((String) childList.get(i).get("list_skip_flg"));
				}
			}
		}
		return skip_Flg_List;
	}
// ANK-4475-00-00 ADD END
	
	/**
	 * 請求書再発行確認画面 印刷確定処理
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
// ANK-4475-00-00 MOD START
//
//	public boolean printFin() throws Exception
//	{
//		// サービスフォームBeanのデータBeanアクセスクラスを取得。
//		X31SDataBeanAccess bean = super.getServiceFormBean();
//		
//		HashMap<String, Object> printInfo = JCCWebCommon.getScreenInfo(this, JACScreenConst.SCREEN_ID_ACW00699);
//		if(printInfo != null && printInfo.containsKey("output_chohyo") && printInfo.containsKey("chohyo_name"))
//		{
//			JCCWebCommon.setTempDownloadFile(this, (byte[])printInfo.get("output_chohyo")
//					, (String)printInfo.get("chohyo_name"));
//			
//			bean.sendMessageString(CHW00109SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
//			JCCWebCommon.removeScreenInfo(this, JACScreenConst.SCREEN_ID_CHW00109);
//		}
//		return true;
//	}
//
	public boolean printFin() throws Exception {
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		String outputFlg = bean.sendMessageString(CHW00109SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_GET_VALUE);

		HashMap<String, Object> printInfoMap = JCCWebCommon.getScreenInfo(this, JACScreenConst.SCREEN_ID_ACW00699);
		if (printInfoMap != null) {
			ArrayList printInfoList = (ArrayList) printInfoMap.get("print_info_list");

			HashMap<String, Object> printInfo = (HashMap) printInfoList.get(0);
			if (printInfo != null && printInfo.containsKey("output_chohyo") && printInfo.containsKey("chohyo_name")) {
				JCCWebCommon.setTempDownloadFile(this, (byte[]) printInfo.get("output_chohyo"), (String) printInfo.get("chohyo_name"));

				if ("1".equals(outputFlg)) {
					bean.sendMessageString(CHW00109SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
					JCCWebCommon.removeScreenInfo(this, JACScreenConst.SCREEN_ID_CHW00109);
				}
			}
		}

		return true;
	}

	/**
	 * 請求書再発行確認画面 印刷確定処理(宛名帳票)
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean printFin2() throws Exception {
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		HashMap<String, Object> printInfoMap = JCCWebCommon.getScreenInfo(this, JACScreenConst.SCREEN_ID_ACW00699);
		if (printInfoMap != null) {
			ArrayList printInfoList = (ArrayList) printInfoMap.get("print_info_list");

			HashMap<String, Object> printInfo = (HashMap) printInfoList.get(1);
			if (printInfo != null && printInfo.containsKey("output_chohyo") && printInfo.containsKey("chohyo_name")) {
				JCCWebCommon.setTempDownloadFile(this, (byte[]) printInfo.get("output_chohyo"), (String) printInfo.get("chohyo_name"));

				bean.sendMessageString(CHW00109SFConst.OUTPUT_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
				JCCWebCommon.removeScreenInfo(this, JACScreenConst.SCREEN_ID_CHW00109);
			}
		}

		return true;
	}

// ANK-4475-00-00 MOD END
	/**
	 * アンロード処理.<br>
	 * 自画面がクローズした時、呼び元に戻る。
	 * 
	 * @return boolean
	 * @throws Exception
	 */
	public boolean unload() throws Exception
	{
		return this.close();
	}
	
//ANK-4543-00-00 ADD START	
	/**
	 * 通信サービス料金帳票出力CCのリターンMapより、NTTエラーフラグを文字列のリストとして返します。
	 * 
	 * @param outputMap 通信サービス料金帳票出力CCのリターンMap
	 * @return NTTエラーフラグリスト
	 */
	@SuppressWarnings("unchecked")
	public static ArrayList<String> getNtt_Flg_List(HashMap<String, Object> outputMap) {

		ArrayList<String> Ntt_Flg_List = new ArrayList<String>();

		HashMap<String, Object> parentMap = null;
		if (outputMap.containsKey("TUSHINSVCPRCCHOHYOCC")) {
			parentMap = (HashMap<String, Object>) outputMap.get("TUSHINSVCPRCCHOHYOCC");
		}
		if (parentMap != null && parentMap.containsKey("tushin_svc_prc_output_list")) {
			ArrayList<HashMap<String, String>> childList = (ArrayList<HashMap<String, String>>) parentMap.get("tushin_svc_prc_output_list");
			for (int i = 0; i < childList.size(); i++) {
				HashMap<String, String> childMap = (HashMap<String, String>) childList.get(i);
				if (childMap != null) {
					Ntt_Flg_List.add((String) childList.get(i).get("ntt_err_flg"));
				}
			}
		}
		return Ntt_Flg_List;
	}
//ANK-4543-00-00 ADD END
}
