/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCHSeikyEoAplShokaiCC
*	ソースファイル名：JCHSeikyEoAplShokaiCC.java
*	作成者			：FJ)吉田
*	日付			：2023年1月25日
*＜機能概要＞
*	請求情報照会の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v64.00.00	2023/01/25	FJ)吉田		【ANK-4316-00-00】ｅｏアプリ対応
*   v64.00.01	2023/03/01	FJ)吉田		【IT1-2023-0000007】請求情報返却値不正
*   v64.00.02	2023/03/07	FJ)吉田		【ANK-4316-04-00】求額合計０円時のレスポンス仕様変更
*   v66.00.00	2023/04/27	FJ)吉田		【ANK-4317-00-00】マイページの請求明細表示変更に伴う請求情報参照APIの作成
*   v66.00.01	2023/04/27	FJ)吉田		【ANK-4317-02-00】仮計算中の返却文言変更
*   v66.00.02	2023/05/17	FJ)吉田		【ANK-4317-04-00】「ご請求額合計」の表示区分の変更
*   v66.00.03	2023/05/17	FJ)吉田		【ANK-4317-05-00】インターフェース項目のラベル変更
*   v66.00.04	2023/05/17	FJ)吉田		【ANK-4317-06-00】請求スキップ翌月の＜翌月合算分調整＞行の追加
*   v66.00.05	2023/05/17	FJ)吉田		【IT1-2023-0000018】卸請求合計金額計上誤り
*   v66.00.06	2023/06/01	FJ)吉田		【ST-2023-0000006】課金が発生しない請求先が取得される
*   v66.00.07	2023/06/02	FJ)吉田		【IT1-2023-0000019】当月請求額なしの場合、内訳が返却される
*   v66.00.08	2023/06/08	FJ)吉田		【IT1-2023-0000020】コンテンツクレカ課金請求なし時返却誤り
*   v66.00.09	2023/06/29  FJ)吉田		【#82423】CHIFE528でシステムエラー
*   v66.00.10	2023/07/17  FJ)吉田		【#82554】CHIFE528：2明細ある再エネ賦課金が1明細しか返却できていない
*   v67.00.00	2023/07/02  FJ)吉田		【ANK-4401-00-00】インボイス対応
*   v67.00.01	2023/07/10  FJ)吉田		【ANK-4401-12-00】インボイス対応 編集仕様変更
*   v67.00.02	2023/09/12  FJ)吉田		【ST-2023-0000011】当月請求なしを確定期間で照会したらシステムエラー
*   v69.00.00	2023/12/11  FJ)吉田		【ANK-4346-00-00】【eo定期】CCMG再構築対応
*   v69.00.01	2023/12/27  FJ)吉田		【ANK-4346-00-00】【eo定期】CCMG再構築対応
*   v69.00.02	2024/01/24  FJ)吉田		【ST-2024-0000001】クレジットカード決済、ISP決済両方計上される
*   v71.00.00   2024/03/28  FJ)張       【ANK-4543-00-00】【eo定期】NTT卸対応：Step0
*   v71.00.01   2024/04/08  FJ)久山		【ANK-4468-00-00】eo光ネット「シンプルプラン」追加対応
*   v71.00.02   2024/05/23  FJ)久山		【ANK-4468-00-01】eo光ネット「シンプルプラン」追加対応
*   v72.00.00   2024/10/21  GDC)wj.grabillo		【ANK-4628-00-00】eoアプリのお得額表示・お得提案対応
*   v73.00.00   2024/12/02  FJ）久山	【ANK-4427-10-00】NTT卸対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYbpmLog;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.jcc.util.JCCStringConverter;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.common.check.DatetimeCheck;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.bp.x21.values.MessageID;

import eo.common.constant.JACStrConst;
import eo.common.constant.JCKStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCHCommonFormatUtil;
import eo.common.util.JCHStringUtil;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCDateUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.ECH0051B070CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0101B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0101B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECH0391A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0391A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECH0401B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0401B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECH0501B020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0501B020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECH0551B030CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0891A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B028CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B028CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B042CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B042CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B012CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B012CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321B010CBSMsg1List;

/**
 * 請求情報照会の共通コンポーネントクラスです。
 * <br>
 * @author FJ
 */
public class JCHSeikyInfoShokaiAPICC extends AbstractCommonComponent
{
	/*
	 * ============
	 * CCパラメータ
	 * ============
	 */
	/** CC共通パラメータ：ボディ情報 */
	public static final String BODY_INFO = "BODY_INFO";
	
	/** CC入力パラメータ：SYSID */
	public static final String IN_SYSID = "sysid";
	/** CC入力パラメータ：取得年月 */
	public static final String IN_ACQUISITION_YEAR_MONTH = "acquisitionYearMonth";
	/** CC入力パラメータ：取得月数 */
	public static final String IN_ACQUISITION_NUMBER = "acquisitionNumber";
	/** CC入力パラメータ：取得区分 */
	public static final String IN_ACQUISITION_CATEGORY = "acquisitionCategory";
	// ANK-4317-00-00 ADD START
	/** CC入力パラメータ：請求契約番号 */
	public static final String IN_BILLING_CONTRACTNUMBER = "billingContractNumber";
	// ANK-4317-00-00 ADD END
	
	/** CC出力パラメータ：請求契約リスト */
	public static final String OUT_BILLING_CONTRACT_LIST = "billingContractList";
	/** CC出力パラメータ：請求種別 */
	public static final String OUT_BILLING_TYPE = "billingType";
	/** CC出力パラメータ：請求契約番号 */
	public static final String OUT_BILLING_CONTRACT_NUMBER = "billingContractNumber";
	// ANK-4628-00-00 ADD START
	/** CC出力パラメータ：お得額表示フラグ */
	public static final String OUT_PROFIT_DISPLAY_FLG = "profitDisplayFlg";
	// ANK-4628-00-00 ADD END
	/** CC出力パラメータ：請求リスト */
	public static final String OUT_BILLING_LIST = "billingList";
	/** CC出力パラメータ：年月 */
	public static final String OUT_YEAR_MONTH = "yearMonth";
	/** CC出力パラメータ：金額確定フラグ */
	public static final String OUT_AMOUNT_CONFIRM_FLG = "amountConfirmFlg";
	/** CC出力パラメータ：補足説明 */
	public static final String OUT_SUPPLEMENTARY_EXPLANATION = "supplementaryExplanation";
	/** CC出力パラメータ：合計金額 */
	public static final String OUT_TOTAL_AMOUNT = "totalAmount";
	/** CC出力パラメータ：合計金額差異 */
	// ANK-4317-05-00 MOD START
//	public static final String OUT_TOTAL_AMOUNT_DEFFERENCE = "totalAmountDefference";
	public static final String OUT_TOTAL_AMOUNT_DEFFERENCE = "totalAmountDifference";
	// ANK-4317-05-00 MOD END
	// ANK-4317-00-00 ADD START
	/** CC出力パラメータ：請求スキップ区分 */
	// ANK-4317-05-00 MOD START
//	public static final String OUT_BILLING_SKIP_FLG = "billingSkipFlg";
	public static final String OUT_BILLING_SKIP_FLG = "billingSkipDivision";
	// ANK-4317-05-00 MOD END
	// ANK-4401-00-00 ADD START
	/** CC出力パラメータ：料金変更有無 */
	public static final String OUT_PRC_TEISE_UM = "prcTeiseUm";
	// ANK-4401-00-00 ADD END
	/** CC出力パラメータ：請求内訳リスト */
	public static final String OUT_BILLING_BREAKDOWN_LIST = "billingBreakdownList";
	/** CC出力パラメータ：請求書表紙内訳書区分 */
	public static final String OUT_COVER_SPECIFICATION_DIVISION = "coverSpecificationDivision";
	/** CC出力パラメータ：請求内訳表示区切り */
	public static final String OUT_DISPLAY_SEPARATOR = "displaySeparator";
	/** CC出力パラメータ：請求内訳タイトル内訳行区分 */
	public static final String OUT_TITLE_BREAKDOWN_DIVISION = "titleBreakdownDivision";
	/** CC出力パラメータ：金額表示列 */
	public static final String OUT_AMOUNT_DISPLAY_COLUMN = "amountDisplayColumn";
	/** CC出力パラメータ：金額税区分 */
	public static final String OUT_AMOUNT_TAX_DIVISION = "amountTaxDivision";
	/** CC出力パラメータ：金額表示括弧有無区分 */
	public static final String OUT_AMOUNT_BRACKETS_DIVISION = "amountBracketsDivision";
	/** CC出力パラメータ：合算請求分年月 */
	public static final String OUT_TOTALING_YEAR_MONTH = "totalingYearMonth";
	/** CC出力パラメータ：整理番号 */
	public static final String OUT_ORGANIZE_NUMBER = "organizeNumber";
	/** CC出力パラメータ：料金名称 */
	public static final String OUT_FEE_NAME = "feeName";
	/** CC出力パラメータ：料金説明コード */
	public static final String OUT_FEE_EXPLANATION_CODE = "feeExplanationCode";
	/** CC出力パラメータ：料金説明 */
	public static final String OUT_FEE_EXPLANATION = "feeExplanation";
	/** CC出力パラメータ：当月金額 */
	public static final String OUT_TARGET_MONTH_AMOUNT = "targetMonthAmount";
	/** CC出力パラメータ：当月金額利用期間 */
	public static final String OUT_USAGE_PERIOD = "usagePeriod";
	/** CC出力パラメータ：前月金額 */
	public static final String OUT_PREVIOUS_MONTH_AMOUNT = "previousMonthAmount";
	/** CC出力パラメータ：金額差異 */
	public static final String OUT_AMOUNT_DIFFERENCE = "amountDifference";
	// ANK-4317-00-00 ADD END
	
	/** CC出力パラメータ：エラー情報 */
	public static final String ERROR_INFO = "ERROR_INFO";
	/** CC出力パラメータ：エラーコード */
	public static final String ERROR_CODE = "errorCode";
	/** CC出力パラメータ：エラーメッセージ */
	public static final String ERROR_MESSAGE = "errorMessage";
	
	/*
	 * ==============
	 * テンプレートID
	 * ==============
	 */
	/** テンプレートID：お客様一意照会 */
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	// ANK-4317-00-00 ADD START
	/** テンプレートID：請求契約一意照会 */
	private static final String TEMPLATE_ID_EKK0491A010 = "EKK0491A010";
	// ANK-4317-00-00 ADD END
	/** テンプレートID：料金スケジュール定義一覧照会 */
	private static final String TEMPLATE_ID_ECH0501B020 = "ECH0501B020";
	// ANK-4317-00-00 DEL START
// 	/** テンプレートID：業務規制一意照会 */
//	private static final String TEMPLATE_ID_ECC0051A010 = "ECC0051A010";
	// ANK-4317-00-00 DEL END
 	/** テンプレートID：請求契約番号一覧照会(CMP) */
	private static final String TEMPLATE_ID_EKK0321B012 = "EKK0321B012";
	// ST-2023-0000006 ADD START
 	/** テンプレートID：サービス契約番号(代表)一覧照会(CMP) */
	private static final String TEMPLATE_ID_EKK0081B042 = "EKK0081B042";
 	/** テンプレートID：サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	// ST-2023-0000006 ADD END
	// IT1-2023-0000007 DEL START
//	/** テンプレートID：月別請求契約_お客様一覧照会 */
//	private static final String TEMPLATE_ID_ECH0891B010 = "ECH0891B010";
	// IT1-2023-0000007 DEL END
	/** テンプレートID：月別請求契約_お客様一意照会 */
	private static final String TEMPLATE_ID_ECH0891A010 = "ECH0891A010";
	// ANK-4317-00-00 MOD START
//	/** テンプレートID：請求内訳一覧照会（請求情報照会） */
//	private static final String TEMPLATE_ID_ECH0101B040 = "ECH0101B040";
//	/** テンプレートID：支払方法入力支援一覧照会 */
//	private static final String TEMPLATE_ID_ECN0131B008 = "ECN0131B008";
//	/** テンプレートID：コンテンツクレカ課金分請求書情報照会(PMP連携用) */
//	private static final String TEMPLATE_ID_ECN0071B002 = "ECN0071B002";
	/** テンプレートID：請求内訳一覧照会 */
	private static final String TEMPLATE_ID_ECH0101B010 = "ECH0101B010";
	/** テンプレートID：料金項目抽出変換一覧照会 */
	private static final String TEMPLATE_ID_ECH0401B010 = "ECH0401B010";
	/** テンプレートID：業務パラメータ管理一覧照会 */
	private static final String TEMPLATE_ID_EZM0321B010 = "EZM0321B010";
	/** テンプレートID：料金対応記録一覧照会(初回窓口スキップ) */
	private static final String TEMPLATE_ID_ECH0551B030 = "ECH0551B030";
	/** テンプレートID：債権一覧照会 */
	private static final String TEMPLATE_ID_ECH0051B070 = "ECH0051B070";
	// ANK-4346-00-00 MOD START
//	/** テンプレートID：コンテンツクレカ課金分請求書情報照会 */
//	private static final String TEMPLATE_ID_ECN0071B003 = "ECN0071B003";
	/** テンプレートID：課金参照(CCMG) */
	private static final String TEMPLATE_ID_ECNA0180001 = "ECNA0180001";
	// ANK-4346-00-00 MOD END
	// ANK-4317-00-00 MOD END
	//ANK-4468-00-00 ADD START
	/** テンプレートID：料金項目出力名称一意照会 */
	private static final String TEMPLATE_ID_ECH0391A010 = "ECH0391A010";
	//ANK-4468-00-00 ADD END
	// ANK-4628-00-00 ADD START
	/** テンプレートID：請求元サービス契約一覧照会 */
	private static final String TEMPLATE_ID_EKK0081B028 = "EKK0081B028";
	// ANK-4628-00-00 ADD END
	
	/*
	 * ========
	 * 共通定数
	 * ========
	 */
	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";
	
	/* 
	 * ============
	 * 資産固有定数
	 * ============
	 */
	 // ANK-4317-00-00 ADD START
	/** 定数：取得月数(区分値1：1ヵ月) */
	private static final String CONST_ACQUISITION_NUMBER_1MONTH = "1";
	/** 定数：取得月数(区分値3：3ヵ月) */
	private static final String CONST_ACQUISITION_NUMBER_3MONTH = "3";
	/** 定数：取得区分(区分値1：合計のみ) */
	private static final String CONST_ACQUISITION_CATEGORY_GOKEI = "1";
	/** 定数：取得区分(区分値2：明細行) */
	private static final String CONST_ACQUISITION_CATEGORY_MEISAI = "2";
	// ANK-4317-00-00 ADD END
	/** 定数：ゼロ */
	private static final String CONST_ZERO = "0";
	/** 定数：請求種別(回線料金) */
	private static final String CONST_BILLINGTYPE_KAISEN = "1";
	/** 定数：請求種別(コンテンツ個別クレカ) */
	private static final String CONST_BILLINGTYPE_CONTENTS = "2";
	/** 定数：金額確定フラグ(未確定) */
	private static final String CONST_AMOUNTCONFIRMFLG_UNCONFIRMED = "0";
	/** 定数：金額確定フラグ(確定) */
	private static final String CONST_AMOUNTCONFIRMFLG_CONFIRMED = "1";
	/** 定数：料金項目コード(当月以外請求額) */
	private static final String CONST_PRC_KMK_CD_TOGETUGAI_SEIKY_AMNT = "00900704601";
	/** 定数：照会可能請求年月範囲 */
	private static final int CONST_SEIKY_RANGE = 24;
	/** 定数：取得年月規定値(eoアプリ呼出時設定値) */
	private static final String ACQUISITION_YEAR_MONTH_ALL_ZERO = "000000";
	/** 定数：エラーメッセージ(お客様が見つかりません) */
	private static final String CONST_ERROR_MSG_NOTFOUND_CUST = "お客様がみつかりません。";
	// ANK-4317-00-00 ADD START
	/** 定数：エラーメッセージ(請求先が見つかりません) */
	private static final String CONST_ERROR_MSG_NOTFOUND_SEIKYKEI = "請求先がみつかりません。";
	// ANK-4317-00-00 ADD END
	
	// ANK-4317-02-00 MOD START
	/** 定数：補足説明文言(請求が未確定) */
//	private static final String CONST_SUPPLEMENTARY_EXPLANATION_CALCULATING = "計算中(毎月%日頃に確定します)";
	private static final String CONST_SUPPLEMENTARY_EXPLANATION_CALCULATING = "計算中(%日頃に確定します)";
	// ANK-4317-02-00 MOD END
	/** 定数：補足説明文言(請求料金が存在しない) */
	private static final String CONST_SUPPLEMENTARY_EXPLANATION_NON_SEIKY = "ご請求料金はございません";
	/** 定数：補足説明文言(当月以外の料金がある) */
	private static final String CONST_SUPPLEMENTARY_EXPLANATION_OTHER_SEIKY = "当月以外のご請求料金が含まれています";
	/** 定数：補足説明文言(隔月請求/初回窓口請求スキップ) */
	private static final String CONST_SUPPLEMENTARY_EXPLANATION_GASSAN = "翌月に合算してご請求いたします";
	// ANK-4317-00-00 ADD START
	/** 定数：請求スキップ区分(隔月合算請求スキップ月) */
	private static final String CONST_BILLING_SKIP_FLG_KKGTSKIP = "1";
	/** 定数：請求スキップ区分(隔月合算請求合算月) */
	private static final String CONST_BILLING_SKIP_FLG_KKGTGSAN = "2";
	/** 定数：請求スキップ区分(初回窓口請求スキップ月) */
	private static final String CONST_BILLING_SKIP_FLG_MDGTSKIP = "3";
	/** 定数：請求スキップ区分(初回窓口請求合算月) */
	private static final String CONST_BILLING_SKIP_FLG_MDGTGSAN = "4";
	/** 定数：請求スキップ区分(前月未納) */
	private static final String CONST_BILLING_SKIP_FLG_UNPAID = "5";
	/** 定数：請求書表紙内訳書区分(請求書表紙の内訳) */
	private static final String CONST_COVER_SPECIFICATION_DIVISION_HYOSHI = "0";
	/** 定数：請求書表紙内訳書区分(請求内訳書の内訳) */
	private static final String CONST_COVER_SPECIFICATION_DIVISION_UCWK = "1";
	/** 定数：請求内訳表示区切り(順番に表示) */
	private static final String CONST_DISPLAY_SEPARATOR_DSP = "1";
	/** 定数：請求内訳表示区切り(ブレイクする) */
	private static final String CONST_DISPLAY_SEPARATOR_BREAK = "2";
	/** 定数：請求内訳表示区切り(空白行を表示) */
	private static final String CONST_DISPLAY_SEPARATOR_BLANK = "3";
	/** 定数：請求内訳タイトル内訳行区分(タイトル行) */
	private static final String CONST_TITLE_BREAKDOWN_DIVISION_TITLE = "1";
	/** 定数：請求内訳タイトル内訳行区分(内訳行) */
	private static final String CONST_TITLE_BREAKDOWN_DIVISION_DTL = "2";
	/** 定数：金額表示列(金額欄) */
	private static final String CONST_AMOUNT_DISPLAY_COLUMN_AMNT = "1";
	/** 定数：金額表示列(金額内訳欄) */
	private static final String CONST_AMOUNT_DISPLAY_COLUMN_DTLAMNT = "2";
	/** 定数：金額表示列(両方) */
	private static final String CONST_AMOUNT_DISPLAY_COLUMN_BOTH = "3";
	/** 定数：金額税区分(内税) */
	private static final String CONST_AMOUNT_TAX_DIVISION_INCLUDE = "＊";
	/** 定数：金額表示括弧有無区分(括弧無しで表示) */
	private static final String CONST_AMOUNT_BRACKETS_DIVISION_NOJOIN = "1";
	/** 定数：金額表示括弧有無区分(括弧付きで表示) */
	private static final String CONST_AMOUNT_BRACKETS_DIVISION_JOIN = "2";
	/** 定数：料金名称(＜翌月合算分調整＞) */
	private static final String CONST_FEE_NAME_YOKUGETU_GSAN = "＜翌月合算分調整＞";
	/** 定数：料金名称(ご請求額合計) */
	private static final String CONST_FEE_NAME_SEIKY_AMNT_GOKEI = "ご請求額合計";
	/** 整理番号（区切り） */
	private static final String SEIRI_NO_DIV = "-";
	/** 業務規制解除時間(hhMMss) */
	private static final String WORK_KISEI_TIME = "080000";
	// ANK-4317-00-00 ADD END
	
	/*
	 * ==============
	 * グローバル変数
	 * ==============
	 */
	/** 業務処理用work */
	HashMap<Object, Object> workMap = new HashMap<Object, Object>();
	
	/*
	 * ============================================
	 * workMap用key定数(SIF結果は必要時にテンプレートIDを使用)
	 * ============================================
	 */
	/** (workMap用)料金業務規制フラグ */
	private static final String WORK_PRC_WORK_KISI_FLG = "WORK_PRC_WORK_KISI_FLG";
	/** (workMap用)請求処理日翌日 */
	private static final String WORK_SEIKY_TRN_YMD_AF = "WORK_SEIKY_TRN_YMD_AF";
	/** (workMap用)金額確定フラグ */
	private static final String WORK_AMOUNTCONFIRMFLG = "WORK_AMOUNTCONFIRMFLG";
	// ANK-4317-00-00 ADD START
	/** (workMap用)呼出区分 */
	private static final String WORK_CALL_TYPE = "WORK_CALL_TYPE";
	
	/** (workMap用)金額欄／金額内訳欄の両方に表示する対象キーリスト */
	private static final String WORK_KEY_LIST_CALL_BOTH_DSP = "KEY_LIST_CALL_BOTH_DSP";
	/** (workMap用)請求内訳表示対象業務機能識別コード */
	private static final Object WORK_KEY_DSP_SEIKY_UCWK = "KEY_DSP_SEIKY_UCWK";
	/** (workMap用)請求書表紙内訳書区分判定用キーリスト */
	private static final String WORK_KEY_LIST_COVER_SPECIFICATION_DIVISION = "KEY_LIST_COVER_SPECIFICATION_DIVISION";
	/** (workMap用)請求内訳表示区切り判定用キーリスト */
	private static final String WORK_KEY_LIST_DISPLAY_SEPARATOR = "KEY_LIST_DISPLAY_SEPARATOR";
	/** (workMap用)請求内訳タイトル内訳行区分判定用キーリスト */
	private static final String WORK_KEY_LIST_TITLE_BREAKDOWN_DIVISION = "KEY_LIST_TITLE_BREAKDOWN_DIVISION";
	
	/** (workMap用)請求情報退避マップ(当月分) */
	private static final String WORK_KEY_SEIKY_INFO_TAIHI_TOGETU = "SEIKY_UCWK_TOGETU";
	/** (workMap用)請求情報退避マップ(翌月分) */
	private static final String WORK_KEY_SEIKY_INFO_TAIHI_YOKUGETU = "SEIKY_UCWK_YOKUGETU";
	
	/** (workMap用)退避情報：請求額合計(型式：String) */
	private static final String WORK_KEY_TAIHI_SEIKY_AMNT_GOUKEI = "TAIHI_SEIKY_AMNT_GOUKEI";
	/** (workMap用)退避情報：隔月請求スキップフラグ(型式：String) */
	private static final String WORK_KEY_TAIHI_KAKGT_SEIKY_SKIP_FLG = "TAIHI_KAKGT_SEIKY_SKIP_FLG";
	/** (workMap用)退避情報：初回窓口請求スキップフラグ(型式：String) */
	private static final String WORK_KEY_TAIHI_FIRST_MDGT_SEIKY_SKIP_FLG = "TAIHI_FIRST_MDGT_SEIKY_SKIP_FLG";
	/** (workMap用)退避情報：請求内訳情報(型式：CAANMsg[]) */
	private static final String WORK_KEY_TAIHI_SEIKY_UCWK = "TAIHI_SEIKY_UCWK";
	// IT1-2023-0000019 ADD START
	/** (workMap用)退避情報：請求内訳返却フラグ(型式：CAANMsg[]) */
	private static final String WORK_KEY_TAIHI_SEIKY_UCWK_RETURN_FLG = "TAIHI_SEIKY_UCWK_RETURN_FLG";
	// IT1-2023-0000019 ADD END
	/** (workMap用)請求内訳整理番号出力済キー情報マップ */
	private static final String WORK_KEY_MAP_ALREADY_OUTKEY_ORGANIZE_NUMBER = "ALREADY_OUTKEY_ORGANIZE_NUMBER";
	//ANK-4468-00-00 ADD START
	/** (workMap用)業務パラメータ設定値(シンプルプランID計)判定用キーリスト */
	private static final String WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_IDKEI = "WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_IDKEI";
	/** (workMap用)業務パラメータ設定値(シンプルプラン料金グループ計)判定用キーリスト */
	private static final String WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_GRPKEI = "WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_GRPKEI";
	//ANK-4468-00-01 MOD START
//	/** (workMap用)料金項目名称(シンプルプラン料金項目名称)判定用キーリスト */
//	private static final String WORK_KEY_SIMPLE_PRC_KMK_NM = "WORK_KEY_SIMPLE_PRC_KMK_NM";
	/** (workMap用)料金項目情報(シンプルプラン料金項目コード、料金項目名称)判定用キーリスト */
	private static final String WORK_KEY_LIST_SIMPLE_PRC_KMK = "WORK_KEY_LIST_SIMPLE_PRC_KMK";
	//ANK-4468-00-01 MOD END
	//ANK-4468-00-00 ADD END
	
	/*
	 * ============================================
	 * workMap用key定数(SIF結果は必要時にテンプレートIDを使用)
	 * ============================================
	 */
	/** 業務処理用定数：取得区分(区分値1：合計のみ) */
	private static final String WORK_VALUE_CALTYPE_1 = "1";
	/** 業務処理用定数：取得区分(区分値3：明細行) */
	private static final String WORK_VALUE_CALTYPE_2 = "2";
	/** 業務処理用定数：取得区分(区分値3：明細行) */
	private static final String WORK_VALUE_CALTYPE_3 = "3";
	
	/*
	 * ==========================
	 * 資産固有定数（内部処理用）
	 * ==========================
	 */
	/**
	 * 定数：業務パラメータＩＤ(業務機能識別コード＿請求内訳表示用)
	 * ※請求内訳取得時の対象内訳を判別するために使用
	 */
	private static final String CONST_WORK_PARAM_ID_UW_DSP = "CH_WKS_SEIKY_UW_DSP";
	/**
	 * 定数：業務パラメータＩＤ(業務機能識別コード＿請求内訳データ作成（合計）)
	 * ※請求内訳が合計額情報かどうかを判別するために使用
	 */
	private static final String CONST_WORK_PARAM_ID_GKEI_DSP = "CH_WKS_SIKY_UW_D_GKI";
	/**
	 * 定数：業務パラメータＩＤ(業務機能識別コード＿料金項目コード（請求内訳両出力）)
	 * ※金額欄／金額内訳欄の両方に出力する対象の料金項目かどうか判別するために使用
	 */
	private static final String CONST_WORK_PARAM_ID_BOTH_DSP = "CH_WKS_SK_BOTH_DISP";
	/**
	 * 定数：業務パラメータＩＤ(業務機能識別コード＿料金項目コード（請求内訳表示区切り判定）)
	 * ※請求内訳表示区切りの判定処理に使用
	 */
	private static final String  CONST_WORK_PARAM_ID_DISPLAY_SEPARATOR = "CH_CHIFE054_KMK1_";
	/**
	 * 定数：業務パラメータＩＤ(業務機能識別コード＿料金項目コード（請求内訳タイトル内訳行区分判定）)
	 * ※請求内訳タイトル内訳行区分の判定処理に使用
	 */
	private static final String CONST_WORK_PARAM_ID_TITLE_BREAKDOWN_DIVISION = "CH_CHIFE054_KMK2_";
	
	/** 定数：データマージ時キー情報 */
	private static final String CONST_UCWK_MARGE_KEY = "UCWK_MARGE_KEY";
	/** 定数：データマージ時ソートキー情報 */
	private static final String CONST_UCWK_SORT_KEY = "UCWK_SORT_KEY";
	/** 定数：データマージ時データ情報 */
	private static final String CONST_UCWK_DATA = "UCWK_DATA";
	/** 定数：データマージ時翌月金額情報 */
	private static final String CONST_UCWK_YOKUGETU_AMNT = "UCWK_YOKUGETU_AMNT";
	/** 定数：データマージ時当月金額情報 */
	private static final String CONST_UCWK_TOUGETU_AMNT = "UCWK_TOUGETU_AMNT";
	//ANK-4468-00-00 ADD START
	/** 定数：データマージ時シンプルプランID計フラグ */
	private static final String CONST_UCWK_SIMPLE_FLG = "CONST_UCWK_SIMPLE_FLG";
	//ANK-4468-00-00 ADD END
	//ANK-4468-00-01 ADD START
	/** 定数：データマージ時請求内訳料金項目コード情報 */
	private static final String CONST_UCWK_SEIKYU_PRC_KMK_CD = "CONST_UCWK_SEIKYU_PRC_KMK_CD";
	//ANK-4468-00-01 ADD END
	// IT1-2023-0000019 ADD START
	/** 定数：データマージ時データ情報区分 */
	private static final String CONST_UCWK_KBN = "UCWK_KBN";
	/** 定数：データマージ時データ情報区分（1:前月分） */
	private static final String CONST_UCWK_KBN_ZENGETU = "1";
	// IT1-2023-0000019 ADD END
	/** 定数：データソート時ソートキー１ */
	private static final String CONST_UCWK_SORT_KEY_1 = "UCWK_SORT_KEY_1";
	/** 定数：データソート時ソートキー２ */
	private static final String CONST_UCWK_SORT_KEY_2 = "UCWK_SORT_KEY_2";
	/** 定数：データソート時ソートキー３ */
	private static final String CONST_UCWK_SORT_KEY_3 = "UCWK_SORT_KEY_3";
	/** 定数：データソート時ソートキー４ */
	private static final String CONST_UCWK_SORT_KEY_4 = "UCWK_SORT_KEY_4";
	/** 定数：データソート時ソートキー５ */
	private static final String CONST_UCWK_SORT_KEY_5 = "UCWK_SORT_KEY_5";
	/** 定数：データソート時ソートキー６ */
	private static final String CONST_UCWK_SORT_KEY_6 = "UCWK_SORT_KEY_6";
	/** 定数：データソート時ソートキー７ */
	private static final String CONST_UCWK_SORT_KEY_7 = "UCWK_SORT_KEY_7";
	/** 定数：データソート時ソートキー８ */
	private static final String CONST_UCWK_SORT_KEY_8 = "UCWK_SORT_KEY_8";
	/** 定数：データソート時ソートキー９ */
	private static final String CONST_UCWK_SORT_KEY_9 = "UCWK_SORT_KEY_9";
	/** 定数：データソート時ソートキー１０ */
	private static final String CONST_UCWK_SORT_KEY_10 = "UCWK_SORT_KEY_10";
	/** 定数：データソート時ソートキー１１ */
	private static final String CONST_UCWK_SORT_KEY_11 = "UCWK_SORT_KEY_11";
	// ANK-4317-00-00 ADD END
	// ANK-4486-00-01 ADD START
	/** 料金項目コード（料金内訳グループ計） */
	public static final String GROUP_PRC_KMK_CD = "00900701601";
	// ANK-4486-00-01 ADD END
	// ANK-4628-00-00 ADD START
	/*
	 * ==========================
	 * お得額表示フラグ定数
	 * ==========================
	 */
	/** 定数： お得額表示フラグ定数０ */
	private static final String CONST_VALUE_DISPLAY_FLAG_0 = "0";
	/** 定数： お得額表示フラグ定数１ */
	private static final String CONST_VALUE_DISPLAY_FLAG_1 = "1";
	// ANK-4628-00-00 ADD END
	
	/**
	 * 契約情報から請求情報を照会する。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		try
		{
			// 単項目チェック
			if (!checkUnitParam(handle, param, fixedText))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}
			
			// 関連チェック
			if (!checkParameter(handle, param, fixedText))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}
			
			// 請求情報照会処理
			searchSeikyInfo(handle, param, fixedText);
			
			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		catch (Throwable throwable)
		{
			// 出力用設定値:エラーリスト
			ArrayList<HashMap<String, String>> errList = new ArrayList<HashMap<String, String>>();
			// 必須チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_9000, JACStrConst.KARA_MOJI));
			ccMsg.put(ERROR_INFO, errList);
			throw throwable;
		}
		
		return param;
	}

	/**
	 * 単項目チェックを行います。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return true:異常なし false:異常あり
	 * @throws Exception 例外が発生した場合
	 */
	private boolean checkUnitParam(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		// 出力用設定値:エラーリスト
		ArrayList<HashMap<String, String>> errList = new ArrayList<HashMap<String, String>>();
		
		String itemValue = null;
		String errorMessage = null;
		
		// ANK-4317-00-00 ADD START
		// 取得月数
		itemValue = (String)ccMsg.get(IN_ACQUISITION_NUMBER);
		errorMessage = IN_ACQUISITION_NUMBER + JACStrConst.COLON + itemValue;
		// 必須チェック
		if (JCHStringUtil.isNullBlank(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage));
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 1))
		{
			// 桁数チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage));
		}
		else if (!CONST_ACQUISITION_NUMBER_3MONTH.equals(itemValue) && !CONST_ACQUISITION_NUMBER_1MONTH.equals(itemValue))
		{
			// 月数チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1004, errorMessage));
		}
		
		// 取得区分
		itemValue = (String)ccMsg.get(IN_ACQUISITION_CATEGORY);
		errorMessage = IN_ACQUISITION_CATEGORY + JACStrConst.COLON + itemValue;
		// 必須チェック
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 必須チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage));
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 1))
		{
			// 桁数チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage));
		}
		else if (!CONST_ACQUISITION_CATEGORY_GOKEI.equals(itemValue) && !CONST_ACQUISITION_CATEGORY_MEISAI.equals(itemValue))
		{
			// 月数チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1004, errorMessage));
		}
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		// 組み合わせチェックと呼出区分を判定します
		if(!JudgeCallType(handle, param, fixedText))
		{
			errorMessage = IN_ACQUISITION_NUMBER + JACStrConst.COLON + (String)ccMsg.get(IN_ACQUISITION_NUMBER);
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1005, errorMessage));
			errorMessage = IN_ACQUISITION_CATEGORY + JACStrConst.COLON + (String)ccMsg.get(IN_ACQUISITION_CATEGORY);
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1005, errorMessage));
			
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		// 判定した呼出区分を取得
		String workCallType = (String)workMap.get(WORK_CALL_TYPE);
		// ANK-4317-00-00 ADD END
		
		// SYSID
		itemValue = (String)ccMsg.get(IN_SYSID);
		errorMessage = IN_SYSID + JACStrConst.COLON + itemValue;
		// 必須チェック
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 必須チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 10))
		{
			// 桁数チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage));
		}
		
		// 取得年月
		itemValue = (String)ccMsg.get(IN_ACQUISITION_YEAR_MONTH);
		errorMessage = IN_ACQUISITION_YEAR_MONTH + JACStrConst.COLON + itemValue;
		// 必須チェック
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 必須チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage));
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 6))
		{
			// 桁数チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage));
		}
		else if (WORK_VALUE_CALTYPE_1.equals(workCallType))
		{
			// 固定値でなければエラー
			if (!ACQUISITION_YEAR_MONTH_ALL_ZERO.equals(itemValue))
			{
				errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1006, errorMessage));
			}
		}
		else
		{
			// 取得年月が固定値でなければ日付チェックを行う
			if (!DatetimeCheck.isYearMonthCheck(itemValue))
			{
				// 属性チェックエラー
				errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1006, errorMessage));
			}
			// 月差がマイナス(運用年月≦取得年月)ならエラー
			else if(JPCBPCommon.getOpeDate(null).substring(0, 6).compareTo(itemValue)<= 0)
			{
				// 取得年月の未来日チェックエラー
				errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1006, errorMessage));
			}
			// 月差が25ヵ月以上ある場合はエラー
			else if (!checkRangeSeikyYm(itemValue))
			{
				// 取得年月の過去日範囲チェックエラー
				errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1006, errorMessage));
			}
		}
		
		// ANK-4317-00-00 DEL START (呼出区分判定の為、チェックを上流に移動)
//		// 取得月数
//		itemValue = (String)ccMsg.get(IN_ACQUISITION_NUMBER);
//		errorMessage = IN_ACQUISITION_NUMBER + JACStrConst.COLON + itemValue;
//		// 必須チェック
//		if (JCHStringUtil.isNullBlank(itemValue) )
//		{
//			// 必須チェックエラー
//			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage));
//		}
//		else if (!HalfCharCheck.isNumber1Check(itemValue))
//		{
//			// 属性チェックエラー
//			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage));
//		}
//		else if (!LengthCheck.isLength1Check(itemValue, 1))
//		{
//			// 桁数チェックエラー
//			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage));
//		}
//		else if (!"3".equals(itemValue))
//		{
//			// 月数チェックエラー
//			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1004, errorMessage));
//		}
//		
//		// 取得区分
//		itemValue = (String)ccMsg.get(IN_ACQUISITION_CATEGORY);
//		errorMessage = IN_ACQUISITION_CATEGORY + JACStrConst.COLON + itemValue;
//		// 必須チェック
//		if (JCHStringUtil.isNullBlank(itemValue))
//		{
//			// 必須チェックエラー
//			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage));
//		}
//		else if (!HalfCharCheck.isNumber1Check(itemValue))
//		{
//			// 属性チェックエラー
//			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage));
//		}
//		else if (!LengthCheck.isLength1Check(itemValue, 1))
//		{
//			// 桁数チェックエラー
//			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage));
//		}
//		else if (!"1".equals(itemValue))
//		{
//			// 月数チェックエラー
//			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1004, errorMessage));
//		}
		// ANK-4317-00-00 DEL END (呼出区分判定の為、チェックを上流に移動)
		// ANK-4317-00-00 ADD START
		// 呼出区分２、または、呼出区分３の場合
		if(WORK_VALUE_CALTYPE_2.equals(workCallType) || WORK_VALUE_CALTYPE_3.equals(workCallType))
		{
			// 請求契約番号
			itemValue = (String)ccMsg.get(IN_BILLING_CONTRACTNUMBER);
			errorMessage = IN_BILLING_CONTRACTNUMBER + JACStrConst.COLON + itemValue;
			// 必須チェック
			if (JCHStringUtil.isNullBlank(itemValue))
			{
				// 必須チェックエラー
				errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage));
			}
			else if (!HalfCharCheck.isNumber1Check(itemValue))
			{
				// 属性チェックエラー
				errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage));
			}
			else if (!LengthCheck.isLength1Check(itemValue, 10))
			{
				// 桁数チェックエラー
				errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage));
			}
		}
		// ANK-4317-00-00 ADD END
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		return true;
	}
	
	// ANK-4317-00-00 ADD START
	/** 
	 * 呼出区分の判定を行います。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 */
	private boolean JudgeCallType(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		String acquisitionNumber = (String)ccMsg.get(IN_ACQUISITION_NUMBER);
		String acquisitionCategory = (String)ccMsg.get(IN_ACQUISITION_CATEGORY);
		
		// 呼出区分1の場合
		if(CONST_ACQUISITION_NUMBER_3MONTH.equals(acquisitionNumber)
				&& CONST_ACQUISITION_CATEGORY_GOKEI.equals(acquisitionCategory))
		{
			workMap.put(WORK_CALL_TYPE, WORK_VALUE_CALTYPE_1);
		}
		// 呼出区分2の場合
		else if(CONST_ACQUISITION_NUMBER_1MONTH.equals(acquisitionNumber)
				&& CONST_ACQUISITION_CATEGORY_GOKEI.equals(acquisitionCategory))
		{
			workMap.put(WORK_CALL_TYPE, WORK_VALUE_CALTYPE_2);
		}
		
		// 呼出区分3の場合
		else if(CONST_ACQUISITION_NUMBER_1MONTH.equals(acquisitionNumber)
				&& CONST_ACQUISITION_CATEGORY_MEISAI.equals(acquisitionCategory))
		{
			workMap.put(WORK_CALL_TYPE, WORK_VALUE_CALTYPE_3);
		}
		// 上記以外の場合はエラーとする。
		// (エラー内容は呼出元で設定)
		else
		{
			return false;
		}
		
		return true;
	}
	// ANK-4317-00-00 ADD END

	/**
	 * 関連チェックを行います。<br>
	 * ※後続処理に必要な情報の取得も行う。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return true:異常なし false:異常あり
	 * @throws Throwable 例外が発生した場合
	 */
	private boolean checkParameter(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		// 返却用設定値:エラーリスト
		ArrayList<HashMap<String, String>> errList = new ArrayList<HashMap<String, String>>();
		
		// お客様一意照会明細
		CAANMsg[] eck0011a010MsgList = null;
		// ANK-4317-00-00 ADD START
		// 請求契約一意照会明細
		CAANMsg[] ekk0491a010MsgList = null;
		// ANK-4317-00-00 ADD END
		
		// 会員種別コード
		String memberSbtCd = null;
		// 卸事業者コード
		String orsjgsCd = null;
		
		// ANK-4317-00-00 ADD START
		// 業務マップ：呼出区分
		String workCalType = (String)workMap.get(WORK_CALL_TYPE);
		// ANK-4317-00-00 ADD END
		
		// お客様一意照会(機能コード2)
		eck0011a010MsgList = callECK0011A010_FUNC2(handle, param, fixedText
				, (String)ccMsg.get(IN_SYSID)
				, JPCBPCommon.getOpeDate(null)
		);
		
		/*
		 *  ＝＝＝SYSID存在チェック＝＝＝
		 */
		// 照会結果が0件の場合エラー
		if (eck0011a010MsgList == null || eck0011a010MsgList.length == 0)
		{
			// SYSID存在チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_2001, CONST_ERROR_MSG_NOTFOUND_CUST));
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		// 会員種別取得
		memberSbtCd = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
		orsjgsCd    = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.ORSJGS_CD);
		
		/*
		 *  ＝＝＝会員種別チェック＝＝＝
		 */
		// ANK-4317-00-00 MOD START
		// 会員種別が非eo会員、あるいは、卸事業者コードが設定されてる（パートナー）の場合エラー
//		if (JCKStrConst.CD00039_NOT_EO_MMB.equals(memberSbtCd)
//				|| !JCHStringUtil.isNullBlank(orsjgsCd))
		if (JCKStrConst.CD00039_NOT_EO_MMB.equals(memberSbtCd))
		// ANK-4317-00-00 MOD END
		{
			// 会員種別チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_2001, CONST_ERROR_MSG_NOTFOUND_CUST));
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		// 後続で使用するためお客様一意照会明細を退避
		workMap.put(TEMPLATE_ID_ECK0011A010, eck0011a010MsgList);
		
		// ANK-4317-00-00 ADD START
		// 呼出区分２、または、呼出区分３の場合
		if(WORK_VALUE_CALTYPE_2.equals(workCalType) || WORK_VALUE_CALTYPE_3.equals(workCalType))
		{
			// 請求契約一意照会(機能コード2)
			ekk0491a010MsgList = callEKK0491A010_FUNC2(handle, param, fixedText
					, (String)ccMsg.get(IN_BILLING_CONTRACTNUMBER)
					, JPCBPCommon.getOpeDate(null)
			);
			
			// 照会結果が0件の場合エラー
			if (ekk0491a010MsgList == null || ekk0491a010MsgList.length == 0)
			{
				// SYSID存在チェックエラー
				errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_2002, CONST_ERROR_MSG_NOTFOUND_SEIKYKEI));
				ccMsg.put(ERROR_INFO, errList);
				return false;
			}
		}
		// ANK-4317-00-00 ADD END
		
		return true;
	}
	
	/**
	 * 請求年月が運用年月基準で取得範囲内かどうかチェックします。<br>
	 * <br>
	 * @param seikyYm
	 * @return
	 */
	private boolean checkRangeSeikyYm(String seikyYm)
	{
		// 運用年月
		String opeDate = JPCBPCommon.getOpeDate(null);
		String seikyYmd = seikyYm + "01";
		
		int diff = JPCUtilCommon.subtractMonth(opeDate, seikyYmd);
		
		if (diff > CONST_SEIKY_RANGE)
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * 請求情報検索処理を行います。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg 請求情報照会(LINE)CCマップ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	private void searchSeikyInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		HashMap<String, Object> bodyMap = new HashMap<String, Object>();
		ArrayList<HashMap<String, Object>> outBillingContractList = new ArrayList<HashMap<String, Object>>();
		ArrayList<HashMap<String, Object>> kaisenSeikyMap = new ArrayList<HashMap<String, Object>>();
		ArrayList<HashMap<String, Object>> contSeikyMap = new ArrayList<HashMap<String, Object>>();
		
		// 取得年月が"000000"の場合
		if (ACQUISITION_YEAR_MONTH_ALL_ZERO.equals(ccMsg.get(IN_ACQUISITION_YEAR_MONTH)))
		{
			// 運用年月-1を取得年月として以降扱う
			String seikyYm = JPCUtilCommon.addMonth(JPCBPCommon.getOpeDate(null), -1).substring(0,6);
			ccMsg.put(IN_ACQUISITION_YEAR_MONTH, seikyYm);
		}
		
		// 請求情報取得前処理
		getKaisenSeikyInfoInit(handle, param, fixedText);
		
		// 回線請求情報取得
		kaisenSeikyMap = getKisenSeikyInfo(handle, param, fixedText);
		
		// コンテンツ請求情報取得
		contSeikyMap = getContSeikyInfo(handle, param, fixedText);
		
		outBillingContractList.addAll(kaisenSeikyMap);
		outBillingContractList.addAll(contSeikyMap);
		// IT1-2023-0000007 ADD START
		// 取得結果がある場合のみ返却する
		if(outBillingContractList.size() > 0)
		{
		// IT1-2023-0000007 ADD END
			bodyMap.put(OUT_BILLING_CONTRACT_LIST, outBillingContractList);
		// IT1-2023-0000007 ADD START
		}
		// IT1-2023-0000007 ADD END
		
		ccMsg.put(BODY_INFO, bodyMap);
	}
	
	/**
	 * 請求情報照会処理に使用する情報を取得します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 */
	private void getKaisenSeikyInfoInit(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// 料金スケジュール定義一覧照会明細
		CAANMsg[] ech0501b020MsgList = null;
		// 業務規制一意照会
		CAANMsg[] ecc0051a010MsgList = null;
		// ANK-4317-00-00 ADD START
		// 業務パラメータ一覧照会
		CAANMsg[] ech0401b010MsgList = null;
		// 請求内訳表示対象抽出用業務識別CD
		String dspTgWrokKinoSkbtCd =JACStrConst.KARA_MOJI;
		// ANK-4317-00-00 ADD END
		
		// 料金スケジュール定義一覧照会
		// サービスIF実行
		ech0501b020MsgList = callECH0501B020_FUNC2(handle, param, fixedText
				, (String)ccMsg.get(IN_ACQUISITION_YEAR_MONTH)
				, JACStrConst.EVENT_CD_SIKY_TRN_DAY
		);
		
		// 請求処理日を取得
		String sikyTrnYmd = ech0501b020MsgList[0].getString(ECH0501B020CBSMsg1List.EVENT_YMD);
		// 請求処理日翌日を取得
		String sikyTrnYmdAf = JPCUtilCommon.addDay(sikyTrnYmd, 1);
		
		// 後続で使用するため請求処理日翌日を退避
		workMap.put(WORK_SEIKY_TRN_YMD_AF, sikyTrnYmdAf);
		
		// 業務規制フラグ
		String workKiseiPCGKW0004 = JKKStrConst.CD_DIV_UM_NASHI;
		// 運用日が請求処理日翌日と同じなら業務規制情報を取得する。
		if (JPCBPCommon.getOpeDate(null).compareTo(sikyTrnYmdAf) == 0)
		{
			// ANK-4317-00-00 MOD START
//			// 業務規制一意照会
//			// サービスIF実行
//			ecc0051a010MsgList = callECC0051A010_FUNC2(handle, param, fixedText
//					, "PCGKW0004"
//			);
//			
//			workKiseiPCGKW0004 = ecc0051a010MsgList[0].getString(ECC0051A010CBSMsg1List.WORK_KISEI_FLG);
			
			String opedateTime = JPCBPCommon.getOpeDateTime(null);
			String opeTime = opedateTime.substring(8, 14);
			// 運用時間が08:00未満なら規制中とする
			if (WORK_KISEI_TIME.compareTo(opeTime) > 0)
			{
				workKiseiPCGKW0004 = JKKStrConst.CD_DIV_UM_ARI;
			}
			else
			{
				workKiseiPCGKW0004 = JKKStrConst.CD_DIV_UM_NASHI;
			}
			// ANK-4317-00-00 MOD END
		}
		
		// 後続で使用するため業務規制情報を退避
		workMap.put(WORK_PRC_WORK_KISI_FLG, workKiseiPCGKW0004);
		
		// 運用日が入力.取得年月の請求処理日翌日より過去、あるいは、（請求処理日翌日かつ）業務規制フラグが"1"(規制中)の場合
		if (JPCBPCommon.getOpeDate(null).compareTo(sikyTrnYmdAf) < 0 || JKKStrConst.CD_DIV_UM_ARI.equals(workKiseiPCGKW0004))
		{
			// 後続の処理で使用するため退避
			workMap.put(WORK_AMOUNTCONFIRMFLG, CONST_AMOUNTCONFIRMFLG_UNCONFIRMED);
		}
		// 請求処理日翌日より後の場合
		else
		{
			// 後続の処理で使用するため退避
			workMap.put(WORK_AMOUNTCONFIRMFLG, CONST_AMOUNTCONFIRMFLG_CONFIRMED);
		}
		
		// ANK-4317-00-00 ADD START
		// 表示対象請求内訳取得要
		// 料金項目抽出変換一覧照会
		// サービスIF実行
		ech0401b010MsgList = callEZM0321B010_FUNC1(handle, param, fixedText, CONST_WORK_PARAM_ID_UW_DSP);
		for(CAANMsg ech0401b010child : ech0401b010MsgList)
		{
			dspTgWrokKinoSkbtCd = ech0401b010child.getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
			workMap.put(WORK_KEY_DSP_SEIKY_UCWK, dspTgWrokKinoSkbtCd);
		}
		
		// 呼出区分３の場合、内訳情報作成時に使用するデータを取得する。
		if(WORK_VALUE_CALTYPE_3.equals(workMap.get(WORK_CALL_TYPE)))
		{
			seikyUcwkInfoEditInit(handle, param, fixedText);
		}
		// ANK-4317-00-00 ADD END
	}
	
	/**
	 * 回線請求情報を取得します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 
	 * @throws Throwable 例外が発生した場合
	 */
	private ArrayList<HashMap<String, Object>> getKisenSeikyInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// 月別請求契約_お客様一意照会
		CAANMsg[] ech0891a010MsgList = null;
		// ANK-4317-00-00 MOD START
//		CAANMsg[] ech0101b040MsgList = null;
		CAANMsg[] ech0101b010MsgList = null;
		// ANK-4317-00-00 MOD END
		
		// 請求契約リスト
		ArrayList<HashMap<String, Object>> outBillingContractList = new ArrayList<HashMap<String, Object>>();
		
		// ANK-4317-00-00 ADD START
		// 業務マップ：呼出区分
		String workCalType = (String)workMap.get(WORK_CALL_TYPE);
		// ANK-4317-00-00 ADD END
		
		// ====================
		// 回線請求情報取得判定
		// ====================
		// 回線請求情報を取得する対象かどうか判定する。
		if (!judgeKaisenSeikyInfoGet(handle, param, fixedText))
		{
			// 取得対象外なら回線請求情報は取得しない
			return outBillingContractList;
		}
		
		// ====================
		// 回線請求情報照会処理
		// ====================
		// 照会対象の請求契約番号を取得する。
		// 請求契約番号リスト
		ArrayList<String> seikyKeiNoList = getSeikyKeiNoList(handle, param, fixedText);
		
		// ================
		// 請求内訳情報取得
		// ================
		
		// 入力パラメータ.取得月数
		String acquisitionNumber =  (String)ccMsg.get(IN_ACQUISITION_NUMBER);
		int acquisitionNumberInt = Integer.parseInt(acquisitionNumber);
		
		// 請求契約番号毎にデータを取得する。
		for (String seikyKeiNo : seikyKeiNoList)
		{
			// 請求リスト
			ArrayList<HashMap<String, Object>> outBillingList = new ArrayList<HashMap<String, Object>>();
			
			// 取得月数分の請求データを取得する。(差額情報を出すため、+1ヵ月分取得する)
			for (int i = 0; i <= acquisitionNumberInt; i++)
			{
				// ANK-4317-00-00 ADD START
				ech0101b010MsgList = new CAANMsg[0];
				// ANK-4317-00-00 ADD END
				// 入力パラメータ.取得年月
				String acquisitionYearMonth =  (String)ccMsg.get(IN_ACQUISITION_YEAR_MONTH);
				// 請求年月
				String seikyYm = JPCUtilCommon.addMonth(acquisitionYearMonth + "01", -i).substring(0,6);
				
				// 照会可能範囲を超えていないかチェックする。
				if (!checkRangeSeikyYm(seikyYm))
				{
					// 当該SYSID、請求年月、請求契約番号に紐づく請求データは存在しないものとする
					// 請求マップ
					// ANK-4317-00-00 MOD START
//					HashMap<String, Object> outBillingMap = setOutParamBillingMap(
//							 seikyYm
//							,CONST_AMOUNTCONFIRMFLG_CONFIRMED
//							,CONST_SUPPLEMENTARY_EXPLANATION_NON_SEIKY
//							,JACStrConst.KARA_MOJI
//							,JACStrConst.KARA_MOJI
//					);
					HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
							, seikyYm
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, ech0101b010MsgList
					);
					// ANK-4317-00-00 MOD END
					
					// 請求リストに請求情報を設定する
					editOutBillingList(handle, param, fixedText
							, outBillingList
							, outBillingMap
							, i
							, acquisitionNumberInt
					);
					
					continue;
				}
				
				// IT1-2023-0000007 MOD START
//				// 入力パラメータ.取得年月より過去月を照会する場合は、請求情報が存在するかチェックする
//				// (入力パラメータ.取得年月の当月は、請求契約番号取得前処理にてチェック済み)
//				if (i > 0)
				// 未確定期間かどうかチェックする
				if (i == 0 && CONST_AMOUNTCONFIRMFLG_UNCONFIRMED.equals(workMap.get(WORK_AMOUNTCONFIRMFLG)))
				{
					// 当月請求で未確定期間で照会する場合は料金計算中とする
					// 請求マップ
					HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
							, seikyYm
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							// ANK-4317-00-00 ADD START
							, ech0101b010MsgList
							// ANK-4317-00-00 ADD END
					);
					
					// 請求リストに請求情報を設定する
					editOutBillingList(handle, param, fixedText
							, outBillingList
							, outBillingMap
							, i
							, acquisitionNumberInt
					);
					
					continue;
				}
				else
				// IT1-2023-0000007 MOD END
				{
					// 月別請求契約_お客様基準でデータが存在するかチェックする。
					// 月別請求契約_お客様一意照会
					// サービスIF実行
					ech0891a010MsgList = callECH0891A010_FUNC1(handle, param, fixedText
							, seikyYm
							, seikyKeiNo
							, (String)ccMsg.get(IN_SYSID)
					);
					
					// 照会結果が0件の場合
					if (ech0891a010MsgList == null || ech0891a010MsgList.length == 0)
					{
						// 当該SYSID、請求年月、請求契約番号に紐づく請求データは存在しないものとする
						// 請求マップ
						// ANK-4317-00-00 MOD START
//						HashMap<String, Object> outBillingMap = setOutParamBillingMap(
//								 seikyYm
//								,CONST_AMOUNTCONFIRMFLG_CONFIRMED
//								,CONST_SUPPLEMENTARY_EXPLANATION_NON_SEIKY
//								,JACStrConst.KARA_MOJI
//								,JACStrConst.KARA_MOJI
//						);
						HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
								, seikyYm
								, JACStrConst.KARA_MOJI
								, JACStrConst.KARA_MOJI
								, JACStrConst.KARA_MOJI
								, JACStrConst.KARA_MOJI
								, ech0101b010MsgList
						);
						// ANK-4317-00-00 MOD END
						
						// 請求リストに請求情報を設定する
						editOutBillingList(handle, param, fixedText
								, outBillingList
								, outBillingMap
								, i
								, acquisitionNumberInt
						);
						
						continue;
					}
				}
				
				// 請求情報を取得する。
				// ANK-4317-00-00 MOD START
//				ech0101b040MsgList = callECH0101B040_FUNC1(handle, param, fixedText
//						, seikyKeiNo
//						, seikyYm
//				);
				ech0101b010MsgList = callECH0101B010_FUNC7(handle, param, fixedText
						, seikyKeiNo
						, seikyYm
				);
				// ANK-4317-00-00 MOD END
				// ANK-4317-00-00 MOD START
//				// (ありえないと思うが)照会結果が0件の場合
//				if (ech0101b040MsgList == null || ech0101b040MsgList.length == 0)
				if (ech0101b010MsgList == null || ech0101b010MsgList.length == 0)
				// ANK-4317-00-00 MOD END
				{
					// 当該SYSID、請求年月、請求契約番号に紐づく請求データは存在しないものとする
					// 請求マップ
					// ANK-4317-00-00 MOD START
//					HashMap<String, Object> outBillingMap = setOutParamBillingMap(
//							 seikyYm
//							,CONST_AMOUNTCONFIRMFLG_CONFIRMED
//							,CONST_SUPPLEMENTARY_EXPLANATION_NON_SEIKY
//							,JACStrConst.KARA_MOJI
//							,JACStrConst.KARA_MOJI
//					);
					HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
							, seikyYm
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, ech0101b010MsgList
					);
					// ANK-4317-00-00 MOD END
					
					// 請求リストに請求情報を設定する
					editOutBillingList(handle, param, fixedText
							, outBillingList
							, outBillingMap
							, i
							, acquisitionNumberInt
					);
					
					continue;
				}
				
//ANK-4543-00-00 ADD START
				//NTT卸契約エラー判定
				String NTT_ERR = "";	
				if(ech0101b010MsgList != null || ech0101b010MsgList.length != 0){
					for(int j = 0; j < ech0101b010MsgList.length; j++ ){
						NTT_ERR = ech0101b010MsgList[j].getString(ECH0101B010CBSMsg1List.NTT_ERR_FLG);
						if (NTT_ERR.equals("1")){
							String msg = "CHIFE528_NTT卸契約が複数件存在します";
							StringBuffer buslog = new StringBuffer(msg);
							JSYejbLog.println(JSYLogBase.EXECUTION, this.getClass() ,
									buslog.toString());
						}
					}
				}								
//ANK-4543-00-00 ADD END				
				
				/* 
				 * ============
				 * 請求情報格納
				 * ============
				 */
				// ANK-4317-00-00 MOD START
//				// 隔月請求スキップフラグ
//				String kakgtSeikySkipFlg = ech0101b040MsgList[0].getString(ECH0101B040CBSMsg1List.KAKGT_SEIKY_SKIP_FLG);
//				// 初回窓口請求スキップフラグ
//				String firstMdgcSeikySkipFlg = ech0101b040MsgList[0].getString(ECH0101B040CBSMsg1List.FIRST_MDGC_SEIKY_SKIP_FLG);
//				// 当月以外請求料金有無フラグ
//				String togetuOutSeikyAmntUmFlg = checkTogetuOutSeikyAmntUm(handle, param, fixedText, ech0101b040MsgList);
//				
//				// 合計金額
//				String totalAmount = getTotalAmountKaisen(handle, param, fixedText, ech0101b040MsgList);
		
				// 隔月請求スキップフラグ
				String kakgtSeikySkipFlg = ech0101b010MsgList[0].getString(ECH0101B010CBSMsg1List.KAKGT_SEIKY_SKIP_FLG);
				// 初回窓口請求スキップフラグ
				String firstMdgcSeikySkipFlg = getFirstMdgtSeikySkip(handle, param, fixedText, seikyKeiNo, seikyYm);
				// 当月以外請求料金有無フラグ
				String togetuOutSeikyAmntUmFlg = checkTogetuOutSeikyAmntUm(handle, param, fixedText, ech0101b010MsgList);
				
				// 合計金額
				String totalAmount = getTotalAmountKaisen(handle, param, fixedText, ech0101b010MsgList);
				// ANK-4317-00-00 MOD END
				
				// 請求マップ
				HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
						, seikyYm
						, totalAmount
						, togetuOutSeikyAmntUmFlg
						, kakgtSeikySkipFlg
						, firstMdgcSeikySkipFlg
						// ANK-4317-00-00 ADD START
						, ech0101b010MsgList
						// ANK-4317-00-00 ADD END
				);
				
				// 請求リストに請求情報を設定する
				editOutBillingList(handle, param, fixedText
						, outBillingList
						, outBillingMap
						, i
						, acquisitionNumberInt
				);
			}
			// ANK-4628-00-00 ADD START
			CAANMsg[] ekk0081b028MsgList = null;
			// お得額表示フラグ
			String profitDisplayFlg = CONST_VALUE_DISPLAY_FLAG_0;
			// お得額表示対象の取得
			ekk0081b028MsgList = callEKK0081B028_FUNC3(handle, param, fixedText, seikyKeiNo);
			
			// 取得できなかった場合
			if(ekk0081b028MsgList == null || ekk0081b028MsgList.length == 0){
				profitDisplayFlg = CONST_VALUE_DISPLAY_FLAG_0;
			}else{
				String svcKeiNo = ekk0081b028MsgList[0].getString(EKK0081B028CBSMsg1List.KK0081_SVC_KEI_NO);
				
				if(svcKeiNo != null){
					profitDisplayFlg = CONST_VALUE_DISPLAY_FLAG_1;
				}
			}
			// ANK-4628-00-00 ADD END
			/* 
			 * ================
			 * 請求契約情報格納
			 * ================
			 */
			// 請求契約マップ
			HashMap<String, Object> outBillingContractMap = setOutParamBillingContractMap(
					  CONST_BILLINGTYPE_KAISEN
					, seikyKeiNo
					// ANK-4628-00-00 ADD START
					, profitDisplayFlg
					// ANK-4628-00-00 ADD END
					, outBillingList
			);
			
			// 請求契約リストに追加
			outBillingContractList.add(outBillingContractMap);
		}
		
		return outBillingContractList;
	}
	
	// ANK-4317-00-00 ADD START
	/**
	 * 初回窓口請求スキップかどうか判定します。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return 1:初回窓口請求スキップ
	 * @throws  
	 */
	private String getFirstMdgtSeikySkip(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String seikyKeiNo, String seikyYm)
	throws Throwable
	{
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// 料金対応記録一覧照会(初回窓口スキップ)
		CAANMsg[] ech0551b030MsgList = null;
		
		// 料金対応記録一覧照会(初回窓口スキップ)
		// サービスIF実行
		ech0551b030MsgList = callECH0551B030_FUNC1(handle, param, fixedText
				, seikyKeiNo
				, seikyYm
		);
		
		// 照会結果が0件の場合
		if (ech0551b030MsgList == null || ech0551b030MsgList.length == 0)
		{
			return JACStrConst.KARA_MOJI;
		}
		
		return JACStrConst.UM_ARI;
	}
	// ANK-4317-00-00 ADD END
	
	/**
	 * コンテンツ個別クレカ請求情報を取得します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 
	 * @throws Throwable 例外が発生した場合
	 */
	private ArrayList<HashMap<String, Object>> getContSeikyInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// ANK-4317-00-00 MOD START
//		// コンテンツクレカ課金分請求書情報照会(PMP連携用)
//		CAANMsg[] ecn0071b002MsgList = null;
		// ANK-4346-00-00 MOD START
//		// コンテンツクレカ課金分請求書情報照会
//		CAANMsg[] ecn0071b003MsgList = null;
		// 課金参照
		CAANMsg ecna0180001Msg = null;
		// ANK-4346-00-00 MOD END
		// ANK-4317-00-00 MOD END
		
		// 請求契約リスト
		ArrayList<HashMap<String, Object>> outBillingContractList = new ArrayList<HashMap<String, Object>>();
		// 請求リスト	
		ArrayList<HashMap<String, Object>> outBillingList = new ArrayList<HashMap<String, Object>>();
		
		// コンテンツ個別クレカ請求情報取得判定
		if (!judgeContCreSeikyInfoGet(handle, param, fixedText))
		{
			// コンテンツ個別クレカ請求情報は取得しない
			return outBillingContractList;
		}
		
		// 入力パラメータ.取得月数
		String acquisitionNumber = (String)ccMsg.get(IN_ACQUISITION_NUMBER);
		int acquisitionNumberInt = Integer.parseInt(acquisitionNumber);
		// IT1-2023-0000020 ADD START
		// 請求返却フラグ
		boolean seikyResFlg = false;
		// IT1-2023-0000020 ADD END
		
		for (int i = 0; i <= acquisitionNumberInt; i++)
		{
			// 入力パラメータ.取得年月
			String acquisitionYearMonth = (String)ccMsg.get(IN_ACQUISITION_YEAR_MONTH);
			// 請求年月
			String seikyYm = JPCUtilCommon.addMonth(acquisitionYearMonth + "01", -i).substring(0,6);
			
			// 照会可能範囲を超えていないかチェックする。
			if (!checkRangeSeikyYm(seikyYm))
			{
				// 請求マップ
				HashMap<String, Object> outBillingMap = setOutParamBillingMap(
						 seikyYm
						,CONST_AMOUNTCONFIRMFLG_CONFIRMED
						,CONST_SUPPLEMENTARY_EXPLANATION_NON_SEIKY
						,JACStrConst.KARA_MOJI
						,JACStrConst.KARA_MOJI
				);
				// 請求リストに請求情報を設定する
				editOutBillingList(handle, param, fixedText
						, outBillingList
						, outBillingMap
						, i
						, acquisitionNumberInt
				);
				
				continue;
			}
			// IT1-2023-0000020 DEL START 処理位置を後続に移動
//			// ANK-4317-00-00 ADD START
//			// 未確定期間かどうかチェックする
//			if (i == 0 && CONST_AMOUNTCONFIRMFLG_UNCONFIRMED.equals(workMap.get(WORK_AMOUNTCONFIRMFLG)))
//			{
//				// 当月請求で未確定期間で照会する場合は料金計算中とする
//				// 請求マップ
//				HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
//						, seikyYm
//						, JACStrConst.KARA_MOJI
//						, JACStrConst.KARA_MOJI
//						, JACStrConst.KARA_MOJI
//						, JACStrConst.KARA_MOJI
//						, null
//				);
//				
//				// 請求リストに請求情報を設定する
//				editOutBillingList(handle, param, fixedText
//						, outBillingList
//						, outBillingMap
//						, i
//						, acquisitionNumberInt
//				);
//				
//				continue;
//			}
//			// ANK-4317-00-00 ADD END
			// IT1-2023-0000020 DEL END 処理位置を後続に移動
			
			// コンテンツクレカ課金分請求書情報照会
			// サービスIF実行
			// ANK-4317-00-00 MOD START
//			ecn0071b002MsgList = callECN0071B002_FUNC1(handle, param, fixedText
//					, (String)ccMsg.get(IN_SYSID)
//					, seikyYm
//					);
			// ANK-4346-00-00 MOD START
//			ecn0071b003MsgList = callECN0071B003_FUNC1(handle, param, fixedText
//					, (String)ccMsg.get(IN_SYSID)
//					, seikyYm
//			);
			ecna0180001Msg = callECNA0180001_FUNC1(handle, param, fixedText
					, (String)ccMsg.get(IN_SYSID)
					, seikyYm
			);
			// ANK-4346-00-00 MOD END
			// ANK-4317-00-00 MOD END
			
			// 照会結果が0件の場合
			// ANK-4317-00-00 MOD START
//			if (ecn0071b002MsgList == null || ecn0071b002MsgList.length == 0)
			// ANK-4346-00-00 MOD START
//			if (ecn0071b003MsgList == null || ecn0071b003MsgList.length == 0)
			if (ecna0180001Msg == null 
					|| ecna0180001Msg.getCAANMsgList(ECNA0180001CBSMsg.ECNA0180001CBSMSG1LIST) == null
					|| ecna0180001Msg.getCAANMsgList(ECNA0180001CBSMsg.ECNA0180001CBSMSG1LIST).length == 0)
			// ANK-4346-00-00 MOD END
			// ANK-4317-00-00 MOD END
			{
				// 請求マップ
				// ANK-4317-00-00 MOD START
//				HashMap<String, Object> outBillingMap = setOutParamBillingMap(
//						 seikyYm
//						,CONST_AMOUNTCONFIRMFLG_CONFIRMED
//						,CONST_SUPPLEMENTARY_EXPLANATION_NON_SEIKY
//						,JACStrConst.KARA_MOJI
//						,JACStrConst.KARA_MOJI
//				);
				HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
						, seikyYm
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, null
				);
				// ANK-4317-00-00 MOD END
				// 請求リストに請求情報を設定する
				editOutBillingList(handle, param, fixedText
						, outBillingList
						, outBillingMap
						, i
						, acquisitionNumberInt
				);
				
				continue;
			}
			
			// IT1-2023-0000020 ADD START
			//返却対象の請求情報が存在するとしてフラグを立てる
			if(i < acquisitionNumberInt)
			{
				seikyResFlg = true;
			}
			// 未確定期間かどうかチェックする
			if (i == 0 && CONST_AMOUNTCONFIRMFLG_UNCONFIRMED.equals(workMap.get(WORK_AMOUNTCONFIRMFLG)))
			{
				// 当月請求で未確定期間で照会する場合は料金計算中とする
				// 請求マップ
				HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
						, seikyYm
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, null
				);
				
				// 請求リストに請求情報を設定する
				editOutBillingList(handle, param, fixedText
						, outBillingList
						, outBillingMap
						, i
						, acquisitionNumberInt
				);
				
				continue;
			}
			// IT1-2023-0000020 ADD END
			
			//請求料金
			long amnt = 0;
			//請求先合計料金
			long seikyGokeiRyokinOut = 0;
			// 金額を集計する。
			// ANK-4317-00-00 MOD START
//			for(int j = 0; j < ecn0071b002MsgList.length; j++)
//			{
//			 	amnt = Long.parseLong(nullToZero(ecn0071b002MsgList[j].getString(ECN0071B002CBSMsg1List.AMNT)));
//			 	seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
//			}
			// ANK-4346-00-00 MOD START
//			for(int j = 0; j < ecn0071b003MsgList.length; j++)
//			{
//			 	amnt = Long.parseLong(nullToZero(ecn0071b003MsgList[j].getString(ECN0071B003CBSMsg1List.AMNT)));
//			 	seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
//			}
			
			CAANMsg[] ecna0180001Msg1List = ecna0180001Msg.getCAANMsgList(ECNA0180001CBSMsg.ECNA0180001CBSMSG1LIST);
			// 金額を集計する。
			for(CAANMsg ecna0180001Msg1Map : ecna0180001Msg1List)
			{
				// 課金参照.課金額を加算する。
				amnt = Long.parseLong(nullToZero(ecna0180001Msg1Map.getString(ECNA0180001CBSMsg1List.CHARGE_AMOUNT)));
				// ANK-4346-00-00 DEL START
//				seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
				// ANK-4346-00-00 DEL END
				
				// 課金訂正情報あれば、値引き額を減算する。
				CAANMsg[] ecna0180001Msg2List = ecna0180001Msg1Map.getCAANMsgList(ECNA0180001CBSMsg1List.ECNA0180001CBSMSG2LIST);
				if (ecna0180001Msg2List != null && ecna0180001Msg2List.length > 0)
				{
					CAANMsg ecna0180001Msg2Map = ecna0180001Msg2List[0];
					
					// ANK-4346-00-00 MOD START
//					// 値引き額を減算する。
//					amnt = Long.parseLong(nullToZero(ecna0180001Msg2Map.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)));
//					seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
					// 訂正区分
					String correctedDivision = ecna0180001Msg2Map.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION);
					
					// 訂正区分が"2":売上減の場合
					if("2".equals(correctedDivision))
					{
						// 課金額から訂正額を引いた金額を加算額とする。
						Long discountAmnt = Long.parseLong(nullToZero(ecna0180001Msg2Map.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)));
						amnt = amnt - discountAmnt;
					}
					// 訂正区分が"1":取消の場合
					else
					{
					 	// 加算額を0円とする
						amnt = 0;
					}
					// ANK-4346-00-00 MOD END
				}
				// ANK-4346-00-00 ADD START
				seikyGokeiRyokinOut = seikyGokeiRyokinOut + amnt;
				// ANK-4346-00-00 ADD END
			}
			// ANK-4346-00-00 MOD END
			// ANK-4317-00-00 MOD END
			
			/* 
			 * ============
			 * 請求情報格納
			 * ============
			 */
			// 合計金額
			String totalAmount = Long.toString(seikyGokeiRyokinOut);
			
			// 請求マップ
			HashMap<String, Object> outBillingMap = editBillingMap(handle, param, fixedText
					, seikyYm
					, totalAmount
					, JACStrConst.KARA_MOJI
					, JACStrConst.KARA_MOJI
					, JACStrConst.KARA_MOJI
					// ANK-4317-00-00 ADD START
					, null
					// ANK-4317-00-00 ADD END
			);
			
			// 請求リストに請求情報を設定する
			editOutBillingList(handle, param, fixedText
					, outBillingList
					, outBillingMap
					, i
					, acquisitionNumberInt
			);
			
		}
		// IT1-2023-0000020 ADD START
		if(!seikyResFlg)
		{
			return outBillingContractList;
		}
		// IT1-2023-0000020 ADD END
		// 請求契約マップ
		HashMap<String, Object> outBillingContractMap = setOutParamBillingContractMap(
				  CONST_BILLINGTYPE_CONTENTS
				, JACStrConst.KARA_MOJI
				// ANK-4628-00-00 ADD START
				, JACStrConst.KARA_MOJI
				// ANK-4628-00-00 ADD END
				, outBillingList
		);
		
		// 請求契約リストに追加
		outBillingContractList.add(outBillingContractMap);
		
		return outBillingContractList;
	}
	
	/**
	 * 回線請求情報を取得する対象かどうかチェックします。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return true:取得対象 false:対象外
	 */
	private boolean judgeKaisenSeikyInfoGet(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		
		// お客様一意照会明細
		CAANMsg[] eck0011a010MsgList = (CAANMsg[]) workMap.get(TEMPLATE_ID_ECK0011A010);
		
		// 会員種別コード
		String memberSbtCd = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
		// お客様入退会コード
		String custNTaikai = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.CUST_NTAIKAI_CD);
		// 解約後請求書参照可否
		String dslAfSkssnsKh = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.DSL_AF_SKSSNS_KH);
		
		// ======================
		// 請求書参照可否チェック
		// ======================
		// 退会済であれば解約後請求書参照可否から取得可能か判定する
		// お客様入退会コードが「退会済」の場合
		if (!JCHStringUtil.isNullBlank(custNTaikai) && JCKStrConst.CD00260_TAIKAI.equals(custNTaikai))
		{
			// 解約後請求書参照可否が「否」の場合
			if (JCHStringUtil.isNullBlank(dslAfSkssnsKh) || JCKStrConst.CD00003_FAIL.equals(dslAfSkssnsKh))
			{
				// 回線請求情報を取得しない
				return false;
			}
		}
		
		// ========================
		// 回線請求参照可否チェック
		// ========================
		// ANK-4317-00-00 DEL START
//		// 上記に該当しなかった場合、会員種別毎に参照可能か判定する。
//		// 会員種別が「ファミリー会員」の場合
//		if (JCKStrConst.CD00039_FAMILY_KOJIN.equals(memberSbtCd) || JCKStrConst.CD00039_FAMILY_HOJIN.equals(memberSbtCd))
//		{
//			// 回線請求情報を取得しない
//			return false;
//		}
//		// 会員種別が「オープン会員」の場合
//		else if(JCKStrConst.CD00039_OPEN.equals(memberSbtCd))
//		{
//			// お客様入退会コードが「入会済」の場合
//			if (!JCHStringUtil.isNullBlank(custNTaikai) && JCKStrConst.CD00260_JOIN.equals(custNTaikai))
//			{
//				// 回線請求情報を取得しない
//				return false;
//			}
//		}
		// ANK-4317-00-00 DEL END
		
		return true;
	}
	
	/**
	 * 照会対象の請求契約番号を取得します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param workKiseiFlg 業務規制フラグ
	 * @return 照会対象請求契約番号リスト
	 * @throws Throwable 例外が発生した場合
	 */
	private ArrayList<String> getSeikyKeiNoList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		// 請求契約番号リスト
		ArrayList<String> seikyKeiNoList = new ArrayList<String>();
		
		// 請求契約番号一覧照会(CMP)
		CAANMsg[] ekk0321b012MsgList = null;
		// ST-2023-0000006 ADD START
		// サービス契約番号(代表)一覧照会(CMP)
		CAANMsg[] ekk0081b042MsgList = null;
		// サービス契約一意照会
		CAANMsg[] ekk0081a010MsgList = null;
		// ST-2023-0000006 ADD END
		// 月別請求契約_お客様一覧照会
		CAANMsg[] ech0891b010MsgList = null;
		
		/*
		 * workMapから退避情報を取得
		 */
		// ANK-4317-00-00 ADD START
		// 呼出区分
		String workCallType = (String)workMap.get(WORK_CALL_TYPE);
		
		// 呼出区分２、または、呼出区分３の場合
		if(WORK_VALUE_CALTYPE_2.equals(workCallType) || WORK_VALUE_CALTYPE_3.equals(workCallType))
		{
			// リクエストされた請求契約番号を使用する。
			seikyKeiNoList.add((String)ccMsg.get(IN_BILLING_CONTRACTNUMBER));
			return seikyKeiNoList;
		}
		// ANK-4317-00-00 ADD END
		
		// 金額確定フラグ
		String amountconfirmFlg = (String)workMap.get(WORK_AMOUNTCONFIRMFLG);
		
		// IT1-2023-0000007 DEL START
//		// 請求処理日翌日より過去、あるいは、（請求処理日翌日かつ）業務規制フラグが"1"(規制中)の場合
//		if (CONST_AMOUNTCONFIRMFLG_UNCONFIRMED.equals(amountconfirmFlg))
//		{
		// IT1-2023-0000007 DEL END
		// 課金先基準で請求契約番号を取得する。
		// 請求契約番号一覧照会(CMP)
		// サービスIF実行
		ekk0321b012MsgList = callEKK0321B012_FUNC1(handle, param, fixedText
				, (String)ccMsg.get(IN_SYSID)
		);
		
		// 照会結果が0件の場合
		if (ekk0321b012MsgList == null || ekk0321b012MsgList.length == 0)
		{
			// 回線請求情報は取得しない
			return seikyKeiNoList;
		}
		
		// 取得できる請求契約番号をすべてリストに格納する
		for (CAANMsg childEkk0321b012MsgList :ekk0321b012MsgList)
		{
			// ST-2023-0000006 ADD START
			// 請求契約番号に紐づくサービスの状態を取得し、取得対象のサービスかどうか判定する
			// 請求契約番号
			String seikyKeiNo  = childEkk0321b012MsgList.getString(EKK0321B012CBSMsg1List.SEIKY_KEI_NO);
			
			// サービス契約番号(代表)一覧照会(CMP)
			// サービスIF実行
			ekk0081b042MsgList = callEKK0081B042_FUNC2(handle, param, fixedText
					, seikyKeiNo
			);
			
			// (ありえないと思うが)取得できなかった場合
			if(ekk0081b042MsgList == null || ekk0081b042MsgList.length == 0)
			{
				// 当該請求契約番号は対象外とする
				continue;
			}
			
			// 取得できた場合、判定に必要な情報を取得し、照会可能な請求契約番号か判定する。
			for(CAANMsg childEkk0081b042MsgList :ekk0081b042MsgList)
			{
				String svcKeiNo  = childEkk0081b042MsgList.getString(EKK0081B042CBSMsg1List.SVC_KEI_NO);
				
				// サービス契約一意照会
				// サービスIF実行
				ekk0081a010MsgList = callEKK0081A010_FUNC2(handle, param, fixedText
						, svcKeiNo
				);
				
				// (ありえないと思うが)取得できなかった場合
				if(ekk0081a010MsgList == null || ekk0081a010MsgList.length == 0)
				{
					// 当該請求契約番号は対象外のする
					continue;
				}
				
				String svcKeiStat = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
				String sysid = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.SYSID);
				// サービス契約ステータスが受付済、照査済、締結済、キャンセル済以外のステータスを持つサービスが存在する場合
				// ※上記のステータスのみの請求先は請求が発生しないため照会対象としない
				if ( !(JKKStrConst.CD00037_UK_ZM.equals(svcKeiStat) || JKKStrConst.CD00037_SHOSA_ZUMI.equals(svcKeiStat) || JKKStrConst.CD00037_CNC_ZM.equals(svcKeiStat) || JKKStrConst.CD00037_CANCEL_ZM.equals(svcKeiStat))
						&& sysid.equals((String)ccMsg.get(IN_SYSID)) ) 
				{
			// ST-2023-0000006 ADD END
					seikyKeiNoList.add(childEkk0321b012MsgList.getString(EKK0321B012CBSMsg1List.SEIKY_KEI_NO));
			// ST-2023-0000006 ADD START
					break;
				}
			}
			// ST-2023-0000006 ADD END
		}
		// IT1-2023-0000007 DEL START
//		}
//		// 請求処理日翌日より後の場合
//		else if (CONST_AMOUNTCONFIRMFLG_CONFIRMED.equals(amountconfirmFlg))
//		{
//			// 月別請求契約_お客様一覧基準で請求契約番号を取得する。
//			// 月別請求契約_お客様一覧照会
//			ech0891b010MsgList = callECH0891B010_FUNC1(handle, param, fixedText
//					, (String)ccMsg.get(IN_SYSID)
//					, (String)ccMsg.get(IN_ACQUISITION_YEAR_MONTH)
//			);
//			
//			// 照会結果が0件の場合
//			if (ech0891b010MsgList == null || ech0891b010MsgList.length == 0)
//			{
//				// 回線請求情報は取得しない
//				return seikyKeiNoList;
//			}
//			
//			// 取得できる請求契約番号をすべてリストに格納する
//			for (CAANMsg childEch0891b010MsgListt :ech0891b010MsgList)
//			{
//				seikyKeiNoList.add(childEch0891b010MsgListt.getString(ECH0891B010CBSMsg1List.SEIKY_KEI_NO));
//			}
//			
//		}
		// IT1-2023-0000007 DEL END
		
		return seikyKeiNoList;
	}
	
	/**
	 * コンテンツ個別クレカ請求情報を取得する対象かどうかチェックします。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return true:取得対象 false:対象外
	 */
	private boolean judgeContCreSeikyInfoGet(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// お客様一意照会明細
		CAANMsg[] eck0011a010MsgList = (CAANMsg[]) workMap.get(TEMPLATE_ID_ECK0011A010);
		// ANK-4317-00-00 ADD START
		// 業務マップ：呼出区分
		String workCalType = (String)workMap.get(WORK_CALL_TYPE);
		// ANK-4317-00-00 ADD END
		
		// お客様入退会コード
		String custNTaikai = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.CUST_NTAIKAI_CD);
		// 解約後請求書参照可否
		String dslAfSkssnsKh = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.DSL_AF_SKSSNS_KH);
		
		// ======================
		// 請求書参照可否チェック
		// ======================
		// 退会済であれば解約後請求書参照可否から取得可能か判定する
		// お客様入退会コードが「退会済み」の場合
		if (!JCHStringUtil.isNullBlank(custNTaikai) && JCKStrConst.CD00260_TAIKAI.equals(custNTaikai))
		{
			// 解約後請求書参照可否が「否」の場合
			if (JCHStringUtil.isNullBlank(dslAfSkssnsKh) || JCKStrConst.CD00003_FAIL.equals(dslAfSkssnsKh))
			{
				// 回線請求情報を取得しない
				return false;
			}
		}
		
		// ==============================
		// コンテンツ請求参照可否チェック
		// ==============================
		// ANK-4317-00-00 DEL START
//		// 支払方法入力支援一覧照会明細
//		CAANMsg[] ecn0131b008MsgList = null;
//		
//		// サービスIF実行
//		ecn0131b008MsgList = callECN0131B008_FUNC1(handle, param, fixedText
//				, (String)ccMsg.get(IN_SYSID)
//				, JCNStrConst.CD00503_CRECARD
//				);
//		
//		// 照会結果が0件の場合
//		if (ecn0131b008MsgList == null || ecn0131b008MsgList.length == 0)
//		{
//			// コンテンツ個別クレカ請求情報は取得しない
//			return false;
//		}
		// ANK-4317-00-00 DEL END
		// ANK-4317-00-00 ADD START
		// 呼出区分２、または、呼出区分３の場合
		if(WORK_VALUE_CALTYPE_2.equals(workCalType) || WORK_VALUE_CALTYPE_3.equals(workCalType))
		{
			// コンテンツ個別クレカ請求情報は取得しない
			return false;
		}
		// ANK-4317-00-00 ADD END
		
		return true;
	}
	/**
	 * 出力：エラーコードとエラーメッセージをセットした業務エラーマップを返却する。<br>
	 * <br>
	 * @return returnMap
	 */
	public static HashMap<String, String> getErrorInfoMap(String errorCode, String errorMessage)
	{
		HashMap<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, errorCode);
		returnMap.put(ERROR_MESSAGE, errorMessage);
		
		return returnMap;
	}
	
	/**
	 * 請求マップを作成します。
	 * 
	 * 
	 */
	private HashMap<String, Object> editBillingMap(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String yearMonth
			, String totalAmount
			, String togetuOutSeikyAmntUmFlg
			, String kakgtSeikySkipFlg
			, String firstMdgcSeikySkipFlg
			// ANK-4317-00-00 ADD START
			, CAANMsg[] ch0101
			// ANK-4317-00-00 ADD END
	)
	throws Throwable
	{
		// ANK-4317-00-00 ADD START
		// 業務マップ：呼出区分
		String workCalType = (String)workMap.get(WORK_CALL_TYPE);
		// ANK-4317-00-00 ADD END
		
		// 設定用：請求年月
		String outYearMonth = JACStrConst.KARA_MOJI;
		// 設定用：金額確定フラグ
		String outAmountConfirmFlg = JACStrConst.KARA_MOJI;
		// 設定用：補足説明
		String outSupplementaryExplanation = JACStrConst.KARA_MOJI;
		// 設定用：合計金額
		String outTotalAmount = JACStrConst.KARA_MOJI;
		// 設定用：合計金額差異
		String outTotalAmountDefference = JACStrConst.KARA_MOJI;
		
		// 金額確定フラグを取得
		String amountConfirmFlg = getAmountConfirmFlg(handle, param, fixedText, yearMonth);
		
		// IT1-2023-0000019 ADD START
		// 請求内訳情報返却フラグ
		String seikyUcekInfoReturnFlg = JACStrConst.KARA_MOJI;
		// IT1-2023-0000019 ADD END
		
		// 請求Map用データを編集する
		// 金額確定フラグが"0"(未確定)なら
		if (CONST_AMOUNTCONFIRMFLG_UNCONFIRMED.equals(amountConfirmFlg))
		{
			// 年月
			outYearMonth = yearMonth;
			
			// 金額確定フラグ
			outAmountConfirmFlg = amountConfirmFlg;
			
			// 補足説明
			// 請求処理日翌日で文言を置換する
			String seikyTrnYmdAf = (String)workMap.get(WORK_SEIKY_TRN_YMD_AF);
			
			SimpleDateFormat instance = new SimpleDateFormat("yyyyMMdd");
			String seikyTrnYmdAfDay = new SimpleDateFormat("d").format(instance.parse(seikyTrnYmdAf));
			outSupplementaryExplanation = CONST_SUPPLEMENTARY_EXPLANATION_CALCULATING.replace("%", seikyTrnYmdAfDay);
			
			// 合計金額
			// 設定しない
			
			// 合計金額差異
			// 設定しない
			
			// IT1-2023-0000019 ADD START
			// 請求内訳情報
			// 設定しない
			// IT1-2023-0000019 ADD END
			
		}
		// 金額確定フラグが"1"(確定)なら
		else if(CONST_AMOUNTCONFIRMFLG_CONFIRMED.equals(amountConfirmFlg))
		{
			// ANK-4316-04-00 MOD START
//			// 請求額が0円の場合
//			if(CONST_ZERO.equals(totalAmount))
			if(JACStrConst.KARA_MOJI.equals(totalAmount))
			// ANK-4316-04-00 MOD END
			{
				// 年月
				outYearMonth = yearMonth;
				
				// 金額確定フラグ
				outAmountConfirmFlg = amountConfirmFlg;
				
				// 補足説明
				outSupplementaryExplanation = CONST_SUPPLEMENTARY_EXPLANATION_NON_SEIKY;
				
				// 合計金額
				// 設定値しない
				
				// 合計金額差異
				// 設定値しない
				
				// IT1-2023-0000019 ADD START
				// 請求内訳情報
				// 設定しない
				// IT1-2023-0000019 ADD END
				
			}
			// 当月以外の料金がある場合
			else if(JACStrConst.UM_ARI.equals(togetuOutSeikyAmntUmFlg))
			{
				// 年月
				outYearMonth = yearMonth;
				
				// 金額確定フラグ
				outAmountConfirmFlg = amountConfirmFlg;
				
				// 補足説明
				outSupplementaryExplanation = CONST_SUPPLEMENTARY_EXPLANATION_OTHER_SEIKY;
				
				// 合計金額
				outTotalAmount = totalAmount;
				
				// 合計金額差異
				// 金額は次月処理時に決定する
				// 出力させるため、一旦"0"を入れておく
				outTotalAmountDefference = CONST_ZERO;
				
				// IT1-2023-0000019 ADD START
				// 請求内訳情報
				// 返却する（返却内容は次月処理時に決定する）
				seikyUcekInfoReturnFlg = JKKStrConst.CD_DIV_UM_ARI;
				// IT1-2023-0000019 ADD END
			}
			// 隔月請求の場合
			else if(JACStrConst.KAKGT_SEIKY_SKIP_FLG_SKIP_M.equals(kakgtSeikySkipFlg))
			{
				// 年月
				outYearMonth = yearMonth;
				
				// 金額確定フラグ
				outAmountConfirmFlg = amountConfirmFlg;
				
				// 補足説明
				outSupplementaryExplanation = CONST_SUPPLEMENTARY_EXPLANATION_GASSAN;
				
				// 合計金額
				// 設定値しない
				
				// 合計金額差異
				// 金額は次月処理時に決定する
				// 出力させるため、一旦"0"を入れておく
				outTotalAmountDefference = CONST_ZERO;
				
				// IT1-2023-0000019 ADD START
				// 請求内訳情報
				// 返却する（返却内容は次月処理時に決定する）
				seikyUcekInfoReturnFlg = JKKStrConst.CD_DIV_UM_ARI;
				// IT1-2023-0000019 ADD END
				
			}
			// 初回窓口請求スキップの場合
			else if(JACStrConst.UM_ARI.equals(firstMdgcSeikySkipFlg))
			{
				// 年月
				outYearMonth = yearMonth;
				
				// 金額確定フラグ
				outAmountConfirmFlg = amountConfirmFlg;
				
				// 補足説明
				outSupplementaryExplanation = CONST_SUPPLEMENTARY_EXPLANATION_GASSAN;
				
				// 合計金額
				// 設定値しない
				
				// 合計金額差異
				// 金額は次月処理時に決定する
				// 出力させるため、一旦"0"を入れておく
				outTotalAmountDefference = CONST_ZERO;
				
				// IT1-2023-0000019 ADD START
				// 請求内訳情報
				// 返却する（返却内容は次月処理時に決定する）
				seikyUcekInfoReturnFlg = JKKStrConst.CD_DIV_UM_ARI;
				// IT1-2023-0000019 ADD END
			}
			// 上記以外の場合
			else
			{
				// 年月
				outYearMonth = yearMonth;
				
				// 金額確定フラグ
				outAmountConfirmFlg = amountConfirmFlg;
				
				// 補足説明
				// 設定しない
				
				// 合計金額
				outTotalAmount = totalAmount;
				
				// 合計金額差異
				// 金額は次月処理時に決定する
				// 出力させるため、一旦"0"を入れておく
				outTotalAmountDefference = CONST_ZERO;
				
				// IT1-2023-0000019 ADD START
				// 請求内訳情報
				// 返却する（返却内容は次月処理時に決定する）
				seikyUcekInfoReturnFlg = JKKStrConst.CD_DIV_UM_ARI;
				// IT1-2023-0000019 ADD END
			}
		}
		
		// ANK-4317-00-00 ADD START
		// 呼出区分３の場合
		if (WORK_VALUE_CALTYPE_3.equals(workCalType))
		{
			// 請求スキップ区分
			// スキップ区分は次月処理時に決定する
			// 判定に必要な情報を退避する。
			
			// 退避用マップ
			HashMap<String, Object> seikyInfo = new HashMap<String, Object>();
			// 合計金額
			seikyInfo.put(WORK_KEY_TAIHI_SEIKY_AMNT_GOUKEI, totalAmount);
			// 隔月請求スキップフラグ
			seikyInfo.put(WORK_KEY_TAIHI_KAKGT_SEIKY_SKIP_FLG, kakgtSeikySkipFlg);
			// 初回窓口請求スキップフラグ
			seikyInfo.put(WORK_KEY_TAIHI_FIRST_MDGT_SEIKY_SKIP_FLG, firstMdgcSeikySkipFlg);
			// 請求内訳情報
			seikyInfo.put(WORK_KEY_TAIHI_SEIKY_UCWK, 	ch0101);
			// IT1-2023-0000019 ADD START
			// 請求内訳情報返却フラグ
			seikyInfo.put(WORK_KEY_TAIHI_SEIKY_UCWK_RETURN_FLG, seikyUcekInfoReturnFlg);
			// IT1-2023-0000019 ADD END
			
			// 当月分の請求内訳情報を退避する。
			// 当月分として格納しておいた請求情報翌月情報として退避する。
			workMap.put(WORK_KEY_SEIKY_INFO_TAIHI_YOKUGETU, workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_TOGETU));
			workMap.put(WORK_KEY_SEIKY_INFO_TAIHI_TOGETU, seikyInfo);
			// ※内訳情報の編集は当月請求リスト作成時に行う。
		}
		// ANK-4317-00-00 ADD END
		
		// 請求マップ作成
		HashMap<String, Object> outBillingMap = setOutParamBillingMap(
				  outYearMonth
				, outAmountConfirmFlg
				, outSupplementaryExplanation
				, outTotalAmount
				, outTotalAmountDefference
		);
		
		return outBillingMap;
	}
	
	// ANK-4317-00-00 ADD START
	/**
	 * 請求スキップ区分を編集します。
	 * 
	 * @param firstMdgcSeikySkipFlg 
	 * @param kakgtSeikySkipFlg 
	 * @param fixedText 
	 * @param param 
	 * @param handle 
	 * @param outBillingList 
	 * @param outBillingList 
	 * @param outBillingMap 
	 * @throws Throwable 
	 */
	private void editSeikySikpFlg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> outBillingMap, ArrayList<HashMap<String, Object>> outBillingList)
	throws Throwable
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 請求リストに何も設定されていないか、
		// 1ヵ月分しか設定されていなければ何もしない
		if(outBillingList == null)
		{
			return ;
		}
		
		int size = outBillingList.size();
		// 請求リストが当月分しかなければ何もしない
		if(size == 0)
		{
			return;
		}
		
		// 翌月分の請求マップを取得する
		HashMap<String, Object> yokugetuBillingMap = outBillingList.get(size-1);
		String amountConfirmFlg = (String)yokugetuBillingMap.get(OUT_AMOUNT_CONFIRM_FLG);
		
		// 未確定なら返却しない
		if(CONST_AMOUNTCONFIRMFLG_UNCONFIRMED.equals(amountConfirmFlg))
		{
			return ;
		}
		
		// 当月の退避情報
		HashMap<String, Object> togetuTaihi = (HashMap<String, Object>)workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_TOGETU);
		// 翌月の退避情報
		HashMap<String, Object> yokugetuTaihi = (HashMap<String, Object>)workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_YOKUGETU);
		
		// 当月の初回窓口請求スキップフラグ
		String togetuFirstMdgtSeikySkipFlg = (String)togetuTaihi.get(WORK_KEY_TAIHI_FIRST_MDGT_SEIKY_SKIP_FLG);
		// 当月の請求情報
		CAANMsg[] togetuSeikyInfo = (CAANMsg[])togetuTaihi.get(WORK_KEY_TAIHI_SEIKY_UCWK);
		
		// 翌月の隔月合算請求スキップフラグ
		String yokugetuKakgtSeikySkipFlg = (String)yokugetuTaihi.get(WORK_KEY_TAIHI_KAKGT_SEIKY_SKIP_FLG);
		// 翌月の初回窓口請求スキップフラグ
		String yokugetuFirstMdgtSeikySkipFlg = (String)yokugetuTaihi.get(WORK_KEY_TAIHI_FIRST_MDGT_SEIKY_SKIP_FLG);
		// 翌月の請求情報
		CAANMsg[] yokugetuSeikyInfo = (CAANMsg[])yokugetuTaihi.get(WORK_KEY_TAIHI_SEIKY_UCWK);
		
		// 請求情報がなければ返却しない
		if(yokugetuSeikyInfo.length == 0)
		{
			return ;
		}
		
		// 隔月合算請求スキップ月の場合
		if(JACStrConst.KAKGT_SEIKY_SKIP_FLG_SKIP_M.equals(yokugetuKakgtSeikySkipFlg))
		{
			value = CONST_BILLING_SKIP_FLG_KKGTSKIP;
		}
		// 隔月合算請求合算月の場合
		else if(JACStrConst.KAKGT_SEIKY_SKIP_FLG_GASSAN_M.equals(yokugetuKakgtSeikySkipFlg))
		{
			value = CONST_BILLING_SKIP_FLG_KKGTGSAN;
		}
		// 初回窓口請求スキップ月の場合
		else if(JACStrConst.UM_ARI.equals(yokugetuFirstMdgtSeikySkipFlg))
		{
			value = CONST_BILLING_SKIP_FLG_MDGTSKIP;
		}
		// 初回窓口請求合算月の場合(当月窓口請求スキップフラグがスキップ月なら翌月は合算月にする。)
		else if(JACStrConst.UM_ARI.equals(togetuFirstMdgtSeikySkipFlg))
		{
			value = CONST_BILLING_SKIP_FLG_MDGTGSAN;
		}
		// 未納の判定
		else
		{
			// 当月の請求年月
			String togetuSeikyYm = (String)outBillingMap.get(OUT_YEAR_MONTH);
			// 翌月の請求番号
			String yokugetuSeikyNo = yokugetuSeikyInfo[0].getString(ECH0101B010CBSMsg1List.SEIKY_NO);
			
			value = judgeUnpaid(handle, param, fixedText, yokugetuSeikyNo, togetuSeikyYm);
		}
		
		// 請求スキップフラグに設定するものがあれば設定する。
		if(!JCHStringUtil.isNullBlank(value))
		{
			yokugetuBillingMap.put(OUT_BILLING_SKIP_FLG, value);
		}
	}

	/**
	 * 未納を判定します。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable 
	 */
	private String judgeUnpaid(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String seikyNo, String seikyYm) throws Throwable
	{
		String value = JACStrConst.KARA_MOJI;
		
		// お客様一意照会明細
		CAANMsg[] ech0051b070MsgList = null;
		
		ech0051b070MsgList = callECH0051B070_FUNC1(handle, param, fixedText, seikyNo, seikyYm);
		
		// 照会結果が0件の場合
		if (ech0051b070MsgList == null || ech0051b070MsgList.length == 0)
		{
			// 未納なしとする。
			return value;
		}
		
		// 照会結果が存在する場合、未納ありとする。
		value = CONST_BILLING_SKIP_FLG_UNPAID;
		return value;
	}
	// ANK-4317-00-00 ADD END
	
	// ANK-4401-00-00 ADD START
	/**
	 * 料金変更有無を編集します。
	 * 
	 * @param firstMdgcSeikySkipFlg 
	 * @param kakgtSeikySkipFlg 
	 * @param fixedText 
	 * @param param 
	 * @param handle 
	 * @param outBillingList 
	 * @param outBillingList 
	 * @param outBillingMap 
	 * @throws Throwable 
	 */
	private void editPrcTeiseUm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> outBillingMap, ArrayList<HashMap<String, Object>> outBillingList)
	throws Throwable
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 請求リストに何も設定されていないか、
		// 1ヵ月分しか設定されていなければ何もしない
		if(outBillingList == null)
		{
			return ;
		}
		
		int size = outBillingList.size();
		// 請求リストが当月分しかなければ何もしない
		if(size == 0)
		{
			return;
		}
		
		// 翌月分の請求マップを取得する
		HashMap<String, Object> yokugetuBillingMap = outBillingList.get(size-1);
		String amountConfirmFlg = (String)yokugetuBillingMap.get(OUT_AMOUNT_CONFIRM_FLG);
		
		// 未確定なら返却しない
		if(CONST_AMOUNTCONFIRMFLG_UNCONFIRMED.equals(amountConfirmFlg))
		{
			return ;
		}
		
		HashMap<String, Object> yokugetuSeikyInfo = (HashMap<String, Object>)workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_YOKUGETU);
		CAANMsg[] seikyUcwkYokugetu = (CAANMsg[])yokugetuSeikyInfo.get(WORK_KEY_TAIHI_SEIKY_UCWK);
		
		// ST-2023-0000011 ADD START
		// 請求情報がなければ返却しない
		if(seikyUcwkYokugetu.length == 0)
		{
			return ;
		}
		// ST-2023-0000011 ADD END
		
		value = seikyUcwkYokugetu[0].getString(ECH0101B010CBSMsg1List.PRC_CHG_FLG);
		
		// 料金訂正フラグに設定するものがあれば設定する。
		if(!JCHStringUtil.isNullBlank(value))
		{
			yokugetuBillingMap.put(OUT_PRC_TEISE_UM, value);
		}
	}
	// ANK-4401-00-00 ADD END
	
	/**
	 * 出力：請求マップを設定します。<br>
	 * 設定値がnull又は空の場合は、パラメータ自体設定しません。<br>
	 * <br>
	 * @param yearMonth 年月
	 * @param amountConfirmFlg 金額確定フラグ
	 * @param supplementaryExplanation 補足説明
	 * @param totalAmount 合計金額
	 * @param totalAmountDefference 合計金額差異
	 * @return 出力用請求マップ
	 */
	private HashMap<String, Object> setOutParamBillingMap(
			  String yearMonth
			, String amountConfirmFlg
			, String supplementaryExplanation
			, String totalAmount
			, String totalAmountDefference
	)
	{
		
		// 請求マップ
		HashMap<String, Object> outBillingMap = new HashMap<String, Object>();
		// 年月
		if (!JCHStringUtil.isNullBlank(yearMonth))
		{
			// null又は空でなければ設定する。
			outBillingMap.put(OUT_YEAR_MONTH, yearMonth);
		}
		// 金額確定フラグ
		if (!JCHStringUtil.isNullBlank(amountConfirmFlg))
		{
			// null又は空でなければ設定する。
			outBillingMap.put(OUT_AMOUNT_CONFIRM_FLG, amountConfirmFlg);
		}
		// 補足説明
		if (!JCHStringUtil.isNullBlank(supplementaryExplanation))
		{
			// null又は空でなければ設定する。
			outBillingMap.put(OUT_SUPPLEMENTARY_EXPLANATION, supplementaryExplanation);
		}
		// 合計金額
		if (!JCHStringUtil.isNullBlank(totalAmount))
		{
			// null又は空でなければ設定する。
			outBillingMap.put(OUT_TOTAL_AMOUNT, totalAmount);
		}
		// 合計金額差異
		if (!JCHStringUtil.isNullBlank(totalAmountDefference))
		{
			// null又は空でなければ設定する。
			outBillingMap.put(OUT_TOTAL_AMOUNT_DEFFERENCE, totalAmountDefference);
		}
		
		return outBillingMap;
	}
	
	/**
	 * 請求リストにレコードを追加します。<br>
	 * また、翌月の請求情報に必要な返却情報を設定します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param outBillingList 請求リスト
	 * @param outBillingMap 請求マップ
	 * @param count 取得月数カウンタ
	 * @param acquisitionNumberInt 取得月数
	 * @throws Throwable 
	 */
	private void editOutBillingList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, ArrayList<HashMap<String, Object>> outBillingList
			, HashMap<String, Object> outBillingMap
			, int count
			, int acquisitionNumberInt
	) throws Throwable
	{
		// ANK-4317-00-00 ADD START
		// 業務マップ：呼出区分
		String workCalType = (String)workMap.get(WORK_CALL_TYPE);
		// ANK-4317-00-00 ADD END
		
		// (翌月分)合計金額差異を編集する
		setTotalAmountDefference(handle, param, fixedText, outBillingMap, outBillingList);
		
		// ANK-4317-00-00 ADD START
		// 呼出区分３の場合
		if (WORK_VALUE_CALTYPE_3.equals(workCalType))
		{
			// (翌月分)請求スキップフラグを編集する。
			editSeikySikpFlg(handle, param, fixedText, outBillingMap, outBillingList);
			
			// ANK-4401-00-00 ADD START
			// (翌月分)料金変更有無を編集する。
			editPrcTeiseUm(handle, param, fixedText, outBillingMap, outBillingList);
			// ANK-4401-00-00 ADD END
			
			// (翌月分)請求内訳リストの編集を行う。
			editBillingBreakdownList(handle, param, fixedText, outBillingMap, outBillingList);
		}
		// ANK-4317-00-00 ADD END
		
		// 照会最終月以外を処理する場合
		if(count < acquisitionNumberInt)
		{
			// 請求リストに追加
			outBillingList.add(outBillingMap);
		}
	}
	
	/**
	 * 出力：請求契約マップを設定します。<br>
	 * 設定値がnull又は空の場合、あるいはリストに何も設定されていない場合は、パラメータ自体設定しません。<br>
	 * <br>
	 * @return
	 * @throws Throwable 
	 */
	private HashMap<String, Object> setOutParamBillingContractMap(
			  String billingType
			, String billingContractNumber
			// ANK-4628-00-00 ADD START
			, String profitDisplayFlg
			// ANK-4628-00-00 ADD END
			, ArrayList<HashMap<String, Object>> billingList
	) throws Throwable
	{
		
		// 請求契約マップ
		HashMap<String, Object> outBillingContractMap = new HashMap<String, Object>();
		// 請求種別
		if (!JCHStringUtil.isNullBlank(billingType))
		{
			// null又は空でなければ設定する。
			outBillingContractMap.put(OUT_BILLING_TYPE, billingType);
		}
		// 請求契約番号
		if (!JCHStringUtil.isNullBlank(billingContractNumber))
		{
			// null又は空でなければ設定する。
			outBillingContractMap.put(OUT_BILLING_CONTRACT_NUMBER, billingContractNumber);
		}
		// ANK-4628-00-00 ADD START
		// お得額表示フラグ
		if(!JCHStringUtil.isNullBlank(profitDisplayFlg))
		{
			// null又は空でなければ設定する。
			outBillingContractMap.put(OUT_PROFIT_DISPLAY_FLG, profitDisplayFlg);
		}
		// ANK-4628-00-00 ADD END
		// 請求リスト
		if (billingList != null && billingList.size() > 0)
		{
			// nullでなく、レコードがあれば設定する。
			outBillingContractMap.put(OUT_BILLING_LIST, billingList);
		}
		
		return outBillingContractMap;
	}
	
	/**
	 * 金額確定フラグを取得します。<br>
	 * <br>
	 * @param param 
	 * @param handle 
	 * @param karaMoji
	 * @return
	 */
	private String getAmountConfirmFlg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String trnSeikyYm
	)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		String seikyYm = (String)ccMsg.get(IN_ACQUISITION_YEAR_MONTH);
		
		// 当月の場合
		if(seikyYm.equals(trnSeikyYm))
		{
			return (String)workMap.get(WORK_AMOUNTCONFIRMFLG);
		}
		else
		{
			return CONST_AMOUNTCONFIRMFLG_CONFIRMED;
		}
	}
	
	/**
	 * 回線請求用の合計金額を取得します。<br>
	 * <br>
	 * @param ech0101b010MsgList 
	 * @return
	 */
	private String getTotalAmountKaisen(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, CAANMsg[] ech0101b010MsgList
	)
	{
		
		// ANK-4316-04-00 MOD START
//		// IT1-2023-0000007 MOD START
////		String amnt = JACStrConst.KARA_MOJI;
//		String amnt = "0";
//		// IT1-2023-0000007 MOD END
		String amnt = JACStrConst.KARA_MOJI;
		// ANK-4316-04-00 MOD END
		
		// ANK-4317-00-00 ADD START
		// お客様一意照会明細
		CAANMsg[] eck0011a010MsgList = (CAANMsg[]) workMap.get(TEMPLATE_ID_ECK0011A010);
		
		// 卸事業者コード
		String orsjgsCd = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.ORSJGS_CD);
		
		// ================
		// ==呼出区分共通==
		// ================
		// パートナー会員の場合
		if (!JCHStringUtil.isNullBlank(orsjgsCd))
		{
			// 取得した請求内訳情報から金額を取得して請求額合計を計算する。
			// 請求先合計料金
			long seikyGokeiRyokinSaikenJyoto = 0;
			// 金額を集計する。
			for(int j = 0; j < ech0101b010MsgList.length; j++)
			{
				// IT1-2023-0000018 ADD START
				String prcSvcCd = ech0101b010MsgList[j].getString(ECH0101B010CBSMsg1List.PRC_SVC_CD);
				if(!JACStrConst.PRC_SVC_CD_SP.equals(prcSvcCd))
				{
				// IT1-2023-0000018 ADD END
				 	Long tmpAmnt = Long.parseLong(nullToZero(ech0101b010MsgList[j].getString(ECH0101B010CBSMsg1List.AMNT)));
				 	seikyGokeiRyokinSaikenJyoto = seikyGokeiRyokinSaikenJyoto + tmpAmnt;
			 	// IT1-2023-0000018 ADD START
				}
				// IT1-2023-0000018 ADD END
			}
			// 合計金額
			amnt = Long.toString(seikyGokeiRyokinSaikenJyoto);
		}
		// eo会員の場合
		else
		{
			// ANK-4317-00-00 ADD END
			// 請求額合計レコードの金額を合計金額とする。
			// 請求内訳を確認する。
			for(CAANMsg ech0101b010child : ech0101b010MsgList)
			{
				String prcKmkCd = ech0101b010child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD);
				
				// 請求額合計の内訳ならば
				if(JACStrConst.PRC_KMK_CD_SEIKY_AMNT.equals(prcKmkCd))
				{
					// 金額を取得する
					amnt = ech0101b010child.getString(ECH0101B010CBSMsg1List.AMNT);
					break;
				}
			}
			// ANK-4317-00-00 ADD START
		}
		// ANK-4317-00-00 ADD END
		
		return amnt;
	}
	
	/**
	 * 合計金額差異を設定します。<br>
	 * <br>
	 * @param handle 
	 * @param param 
	 * @param fixedText 
	 * @param outBillingMap 
	 * @param billingList 設定対象の請求マップ
	 * @param totalAmount 
	 * @return
	 */
	private void setTotalAmountDefference(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, HashMap<String, Object> billingMap
			, ArrayList<HashMap<String, Object>> billingList
	)
	{
		
		// 請求リストに何も設定されていないか、
		// 1ヵ月分しか設定されていなければ何もしない
		if(billingList == null)
		{
			return ;
		}
		
		int size = billingList.size();
		// 請求リストが当月分しかなければ何もしない
		if(size == 0)
		{
			return;
		}
		
		// 翌月分の請求マップを取得する
		HashMap<String, Object> yokugetuBillingMap = billingList.get(size-1);
		// 翌月分の合計金額が設定されていなければなにもしない
		// IT1-2023-0000007 MOD START
//		if(!yokugetuBillingMap.containsKey(OUT_TOTAL_AMOUNT))
		if(!yokugetuBillingMap.containsKey(OUT_TOTAL_AMOUNT_DEFFERENCE))
		// IT1-2023-0000007 MOD END
		{
			return;
		}
		
		// 設定対象の請求マップから合計金額を取得
		String togetuTotalAmount = (String)billingMap.get(OUT_TOTAL_AMOUNT);
		String yokugetuTotalAmount = (String)yokugetuBillingMap.get(OUT_TOTAL_AMOUNT);
		
		long togetuTotalAmountLong = 0;
		long yokugetutotalAmountLong = 0;
		
		// long型に変換する
		if(!JCHStringUtil.isNullBlank(togetuTotalAmount))
		{
			togetuTotalAmountLong = Long.parseLong(togetuTotalAmount);
		}
		if(!JCHStringUtil.isNullBlank(yokugetuTotalAmount))
		{
			yokugetutotalAmountLong = Long.parseLong(yokugetuTotalAmount);
		}
		
		// 差額を計算する。
		long diffAmount = yokugetutotalAmountLong - togetuTotalAmountLong;
		
		// 
		yokugetuBillingMap.put(OUT_TOTAL_AMOUNT_DEFFERENCE, Long.toString(diffAmount));
	}
	
	/**
	 * 当月以外のご請求料金が存在するかチェックします。<br>
	 * <br>
	 * @param ech0101b010MsgList 
	 * @return
	 */
	private String checkTogetuOutSeikyAmntUm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, CAANMsg[] ech0101b010MsgList
	)
	{
		
		// 請求内訳を確認する。
		for(CAANMsg ech0101b010child : ech0101b010MsgList)
		{
			String prcKmkCd = ech0101b010child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD);
			
			// 当月以外のご請求料金の内訳ならば
			if(CONST_PRC_KMK_CD_TOGETUGAI_SEIKY_AMNT.equals(prcKmkCd))
			{
				return JACStrConst.UM_ARI;
			}
		}
		
		return JACStrConst.UM_NASHI;
	}
	
	/**
	 * nullを"0"に置き換え<br>
	 * <br>
	 * @param str 置き換え対象文字列
	 * @return
	 */
	public static String nullToZero(String str)
	{
		if (str == null)
		{
			return "0";
		}
		return str;
	}
	
	/**
	 * サービスインターフェース：お客様一意照会(機能コード２)を実行します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param sysid SYSID
	 * @param rsvAplyYmd 予約適用年月日
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECK0011A010_FUNC2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String sysid
			, String rsvAplyYmd
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		Object[][] eck0011a010In =
		{
			{ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010}
			// 機能コード
			, {ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {ECK0011A010CBSMsg.KEY_SYSID, sysid}
			// ＫＥＹ＿予約適用年月日
			, {ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, rsvAplyYmd}
		};
		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, eck0011a010In)
				.getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
	}
	
	// ANK-4317-00-00 ADD START
	/**
	 * サービスインターフェース：料金スケジュール定義一覧照会(機能コード２)を実行します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param eventCd イベントコード
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callEKK0491A010_FUNC2(SessionHandle handle,IRequestParameterReadWrite param, String fixedText
			, String seikyKeiNo
			, String rsvAplyYmd
	)
	throws Throwable
	{
		
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		Object[][] ekk0491a010In =
		{
			{EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010}
			// 機能コード
			, {EKK0491A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo}
			// ＫＥＹ＿予約適用年月日
			, {EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, rsvAplyYmd}
		};
		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ekk0491a010In)
				.getCAANMsgList(EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
	}
	// ANK-4317-00-00 ADD END
	
	/**
	 * サービスインターフェース：料金スケジュール定義一覧照会(機能コード２)を実行します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param eventCd イベントコード
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECH0501B020_FUNC2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String seikyYm
			, String eventCd
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 料金スケジュール定義一覧照会
		Object[][] ech0501b020In =
		{
			{ECH0501B020CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0501B020}
			// 機能コード
			, {ECH0501B020CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿イベントコード(請求処理日)
			, {ECH0501B020CBSMsg.KEY_SEIKY_YM, seikyYm}
			// ＫＥＹ＿イベントコード(請求処理日)
			, {ECH0501B020CBSMsg.KEY_EVENT_CD, eventCd}
		};
		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ech0501b020In)
				.getCAANMsgList(ECH0501B020CBSMsg.ECH0501B020CBSMSG1LIST);
	}
	
	// ANK-4317-00-00 DEL START
//	/**
//	 * サービスインターフェース：業務規制一意照会(機能コード１)を実行します。<br>
//	 * <br>
//	 * @param handle セッションハンドル
//	 * @param param リクエストパラメータ
//	 * @param fixedText ユーザ定義文字列
//	 * @param eventCd イベントコード
//	 * @return 照会結果
//	 * @throws Throwable 例外が発生した場合
//	 */
//	private CAANMsg[] callECC0051A010_FUNC2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
//			, String workKiseiCd
//	)
//	throws Throwable
//	{
//		// SC呼び出し部品のインスタンス生成
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//		
//		// 業務規制一意照会
//		Object[][] ecc0051a010In =
//		{
//			{ECC0051A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECC0051A010}
//			// 機能コード
//			, {ECC0051A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
//			// ＫＥＹ＿業務規制コード
//			, {ECC0051A010CBSMsg.KEY_WORK_KISEI_CD, workKiseiCd}
//		};
//		// サービスIF実行
//		return callSC(handle, scCall, param, fixedText, ecc0051a010In)
//				.getCAANMsgList(ECC0051A010CBSMsg.ECC0051A010CBSMSG1LIST);
//
//	}
	// ANK-4317-00-00 DEL END
	
	/**
	 * サービスインターフェース：月別請求契約_お客様一意照会(機能コード１)を実行します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param sysid SYSID
	 * @param rsvAplyYmd 予約適用年月日
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECH0891A010_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String seikyYm
			, String seikyKeiNo
			, String sysid
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 月別請求契約_お客様一意照会
		Object[][] ech0891a010In =
		{
			{ECH0891A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0891A010}
			// 機能コード
			, {ECH0891A010CBSMsg.FUNC_CODE,            JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿請求年月
			, {ECH0891A010CBSMsg.KEY_SEIKY_YM,         seikyYm}
			// ＫＥＹ＿請求契約番号
			, {ECH0891A010CBSMsg.KEY_SEIKY_KEI_NO,     seikyKeiNo}
			// ＫＥＹ＿SYSID
			, {ECH0891A010CBSMsg.KEY_SYSID,            sysid}
		};
		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ech0891a010In)
				.getCAANMsgList(ECH0891A010CBSMsg.ECH0891A010CBSMSG1LIST);
	}
	
	
	/**
	 * サービスインターフェース：を実行します。<br>
	 * 請求契約番号一覧照会(CMP)(機能コード１)<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param sysid SYSID
	 * @param rsvAplyYmd 予約適用年月日
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callEKK0321B012_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String sysid
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 請求契約番号一覧照会(CMP)
		Object[][] ekk0321b012In =
		{
			{EKK0321B012CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321B012}
			// 機能コード
			, {EKK0321B012CBSMsg.FUNC_CODE,          JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {EKK0321B012CBSMsg.KEY_SYSID,          sysid}
		};
		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ekk0321b012In)
				.getCAANMsgList(EKK0321B012CBSMsg.EKK0321B012CBSMSG1LIST);
	}
	
// IT1-2023-0000007 DEL START
//	/**
//	 * サービスインターフェースを実行します。<br>
//	 * 月別請求契約_お客様一覧照会(機能コード１)<br>
//	 * <br>
//	 * @param handle セッションハンドル
//	 * @param param リクエストパラメータ
//	 * @param fixedText ユーザ定義文字列
//	 * @return 照会結果
//	 * @throws Throwable 例外が発生した場合
//	 */
//	private CAANMsg[] callECH0891B010_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
//			, String sysid
//			, String seikyYm
//	)
//	throws Throwable
//	{
//		// SC呼び出し部品のインスタンス生成
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//		
//		// 月別請求契約_お客様一覧照会
//		Object[][] ech0891b010In =
//		{
//			{ECH0891B010CBSMsg.TEMPLATEID,  TEMPLATE_ID_ECH0891B010}
//			// 機能コード
//			, {ECH0891B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
//			// ＫＥＹ＿ＳＹＳＩＤ
//			, {ECH0891B010CBSMsg.KEY_SYSID, sysid}
//			// ＫＥＹ＿
//			, {ECH0891B010CBSMsg.KEY_SEIKYU_YM_FROM, seikyYm}
//			// ＫＥＹ＿ＳＹＳＩＤ
//			, {ECH0891B010CBSMsg.KEY_SEIKYU_YM_TO, seikyYm}
//		};
//		// サービスIF実行
//		return callSC(handle, scCall, param, fixedText, ech0891b010In)
//				.getCAANMsgList(ECH0891B010CBSMsg.ECH0891B010CBSMSG1LIST);
//	}
// IT1-2023-0000007 DEL END
	
	// ANK-4317-00-00 MOD START
//	/**
//	 * サービスインターフェースを実行します。<br>
//	 * コンテンツクレカ課金分請求書情報照会(PMP連携用)(機能コード１)<br>
//	 * <br>
//	 * @param handle セッションハンドル
//	 * @param param リクエストパラメータ
//	 * @param fixedText ユーザ定義文字列
//	 * @return 照会結果
//	 * @throws Throwable 例外が発生した場合
//	 */
//	private CAANMsg[] callECN0071B002_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
//			, String sysid
//			, String chrgTrgtYm
//	)
//	throws Throwable
//	{
//		// SC呼び出し部品のインスタンス生成
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//		
//		// コンテンツクレカ課金分請求書情報照会(PMP連携用)
//		Object[][] ecn0071b002In =
//		{
//			{ECN0071B002CBSMsg.TEMPLATEID,         TEMPLATE_ID_ECN0071B002}
//			// 機能コード
//			, {ECN0071B002CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_1}
//			// ＫＥＹ＿ＳＹＳＩＤ
//			, {ECN0071B002CBSMsg.KEY_SYSID,        sysid}
//			// ＫＥＹ＿課金対象年月
//			, {ECN0071B002CBSMsg.KEY_CHRG_TRGT_YM, chrgTrgtYm}
//		};
//		// サービスIF実行
//		return callSC(handle, scCall, param, fixedText, ecn0071b002In)
//				.getCAANMsgList(ECN0071B002CBSMsg.ECN0071B002CBSMSG1LIST);
//	}
	// ANK-4346-00-00 MOD START
//	/**
//	 * サービスインターフェースを実行します。<br>
//	 * コンテンツクレカ課金分請求書情報照会(PMP連携用)(機能コード１)<br>
//	 * <br>
//	 * @param handle セッションハンドル
//	 * @param param リクエストパラメータ
//	 * @param fixedText ユーザ定義文字列
//	 * @return 照会結果
//	 * @throws Throwable 例外が発生した場合
//	 */
//	private CAANMsg[] callECN0071B003_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
//			, String sysid
//			, String chrgTrgtYm
//	)
//	throws Throwable
//	{
//		// SC呼び出し部品のインスタンス生成
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//		
//		// コンテンツクレカ課金分請求書情報照会(PMP連携用)
//		Object[][] ecn0071b003In =
//		{
//			{ECN0071B003CBSMsg.TEMPLATEID,         TEMPLATE_ID_ECN0071B003}
//			// 機能コード
//			, {ECN0071B003CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_1}
//			// ＫＥＹ＿ＳＹＳＩＤ
//			, {ECN0071B003CBSMsg.KEY_SYSID,        sysid}
//			// ＫＥＹ＿課金対象年月
//			, {ECN0071B003CBSMsg.KEY_CHRG_TRGT_YM, chrgTrgtYm}
//		};
//		// サービスIF実行
//		return callSC(handle, scCall, param, fixedText, ecn0071b003In)
//				.getCAANMsgList(ECN0071B003CBSMsg.ECN0071B003CBSMSG1LIST);
//	}
//	
	/**
	 * サービスインターフェースを実行します。<br>
	 * コンテンツクレカ課金分請求書情報照会(PMP連携用)(機能コード１)<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callECNA0180001_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String sysid
			, String chrgTrgtYm
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// コンテンツクレカ課金分請求書情報照会(PMP連携用)
		Object[][] ecnA0180001In =
		{
			{ECNA0180001CBSMsg.TEMPLATEID,         TEMPLATE_ID_ECNA0180001}
			// 機能コード
			, {ECNA0180001CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {ECNA0180001CBSMsg.KEY_SYSID,        sysid}
			// ＫＥＹ＿課金対象年月
			, {ECNA0180001CBSMsg.KEY_TARGET_DATE, chrgTrgtYm}
			// ST-2024-0000001 ADD START
			// ＫＥＹ＿決済方法番号
			, {ECNA0180001CBSMsg.KEY_SETTLEMENT_WAY_NUMBER, "1"}
			// ST-2024-0000001 ADD END
		};
		// サービスIF実行
		return callSC(handle, scCall, param, fixedText, ecnA0180001In);
	}
	
	// ANK-4346-00-00 MOD END
	
	// ANK-4317-00-00 DEL START
//	/**
//	 * サービスインターフェースを実行します。<br>
//	 * 支払方法入力支援一覧照会(機能コード１)<br>
//	 * <br>
//	 * @param handle セッションハンドル
//	 * @param param リクエストパラメータ
//	 * @param fixedText ユーザ定義文字列
//	 * @return 照会結果
//	 * @throws Throwable 例外が発生した場合
//	 */
//	private CAANMsg[] callECN0131B008_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
//			, String sysid
//			, String paywayInputShienCd
//	)
//	throws Throwable
//	{
//		// SC呼び出し部品のインスタンス生成
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//		
//		// 支払方法入力支援一覧照会
//		Object[][] ecn0131b008In =
//		{
//			{ECN0131B008CBSMsg.TEMPLATEID,                  TEMPLATE_ID_ECN0131B008}
//			// 機能コード
//			, {ECN0131B008CBSMsg.FUNC_CODE,                 JPCModelConstant.FUNC_CD_1}
//			// ＫＥＹ＿ＳＹＳＩＤ
//			, {ECN0131B008CBSMsg.KEY_SYSID,                 sysid}
//			// ＫＥＹ＿支払い方法入力支援コード
//			, {ECN0131B008CBSMsg.KEY_PAYWAY_INPUT_SHIEN_CD, paywayInputShienCd}
//		};
//		
//		return callSC(handle, scCall, param, fixedText, ecn0131b008In)
//				.getCAANMsgList(ECN0131B008CBSMsg.ECN0131B008CBSMSG1LIST);
//	}
	// ANK-4317-00-00 DEL END
	
	// ANK-4317-00-00 MOD START
//	/**
//	 * サービスインターフェースを実行します。<br>
//	 * 請求内訳一覧照会（請求情報照会）(機能コード１)<br>
//	 * @param handle セッションハンドル
//	 * @param param リクエストパラメータ
//	 * @param fixedText ユーザ定義文字列
//	 * @return 照会結果
//	 * @throws Throwable 例外が発生した場合
//	 */
//	private CAANMsg[] callECH0101B040_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
//			, String seikyKeiNo
//			, String seikyYm
//	)
//	throws Throwable
//	{
//		// SC呼び出し部品のインスタンス生成
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//		
//		// 支払方法入力支援一覧照会
//		Object[][] ech0101b040In =
//		{
//			{ECH0101B040CBSMsg.TEMPLATEID,         TEMPLATE_ID_ECH0101B040}
//			// 機能コード
//			, {ECH0101B040CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_1}
//			// ＫＥＹ＿請求契約番号
//			, {ECH0101B040CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo}
//			// ＫＥＹ＿請求年月
//			, {ECH0101B040CBSMsg.KEY_SEIKY_YM,     seikyYm}
//		};
//		
//		return callSC(handle, scCall, param, fixedText, ech0101b040In)
//				.getCAANMsgList(ECH0101B040CBSMsg.ECH0101B040CBSMSG1LIST);
//	}
	/**
	 * サービスインターフェースを実行します。<br>
	 * 料金項目抽出変換(機能コード１)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECH0401B010_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String workKinoSkbtCd
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 支払方法入力支援一覧照会
		Object[][] ech0401b010In =
		{
			{ECH0401B010CBSMsg.TEMPLATEID,               TEMPLATE_ID_ECH0401B010}
			// 機能コード
			, {ECH0401B010CBSMsg.FUNC_CODE,              JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿システムコード
			, {ECH0401B010CBSMsg.KEY_SYS_CD,             JACStrConst.SYS_CD_CH}
			// ＫＥＹ＿業務機能識別コード
			, {ECH0401B010CBSMsg.KEY_WORK_KINO_SKBT_CD,  workKinoSkbtCd}
			// ＫＥＹ＿抽出変換コード
			, {ECH0401B010CBSMsg.KEY_CHSHT_CHG_CD,       JACStrConst.CHSHT_CHG_CD_CST}
		};
		
		return callSC(handle, scCall, param, fixedText, ech0401b010In)
				.getCAANMsgList(ECH0401B010CBSMsg.ECH0401B010CBSMSG1LIST);
	}
	
	/**
	 * サービスインターフェースを実行します。<br>
	 * 業務パラメータ一覧照会(機能コード１)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callEZM0321B010_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String workParamId
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 支払方法入力支援一覧照会
		Object[][] ezm0321b010In =
		{
			{EZM0321B010CBSMsg.TEMPLATEID,               TEMPLATE_ID_EZM0321B010}
			// 機能コード
			, {EZM0321B010CBSMsg.FUNC_CODE,              JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿業務パラメータID
			, {EZM0321B010CBSMsg.KEY_WORK_PARAM_ID,      workParamId}

		};
		
		return callSC(handle, scCall, param, fixedText, ezm0321b010In)
				.getCAANMsgList(EZM0321B010CBSMsg.EZM0321B010CBSMSG1LIST);
	}
	
	/**
	 * サービスインターフェースを実行します。<br>
	 * 請求内訳一覧照会(機能コード５)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECH0101B010_FUNC7(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String seikyKeiNo
			, String seikyYm
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 支払方法入力支援一覧照会
		Object[][] ech0101b010In =
		{
			{ECH0101B010CBSMsg.TEMPLATEID,              TEMPLATE_ID_ECH0101B010}
			// 機能コード
			, {ECH0101B010CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_7}
			// ＫＥＹ＿請求契約番号
			, {ECH0101B010CBSMsg.KEY_SEIKY_KEI_NO,      seikyKeiNo}
			// ＫＥＹ＿請求年月
			, {ECH0101B010CBSMsg.KEY_SEIKY_YM,          seikyYm}
			// ＫＥＹ＿請求種別コード
			, {ECH0101B010CBSMsg.KEY_SEIKY_SBT_CD,      JACStrConst.SIKYSHBTS_TEIGK_SEIKY}
			// ＫＥＹ＿システムコード
			, {ECH0101B010CBSMsg.KEY_SYS_CD,            JACStrConst.SYS_CD_CH}
			// ＫＥＹ＿業務機能識別コード
			, {ECH0101B010CBSMsg.KEY_WORK_KINO_SKBT_CD, (String)workMap.get(WORK_KEY_DSP_SEIKY_UCWK)}
			// ＫＥＹ＿料金項目名称種別コード
			, {ECH0101B010CBSMsg.KEY_PRC_KMK_NM_SBT_CD, JACStrConst.PRC_KMK_NM_SBT_CD_PRC_KMK}
		};
		
		return callSC(handle, scCall, param, fixedText, ech0101b010In)
				.getCAANMsgList(ECH0101B010CBSMsg.ECH0101B010CBSMSG1LIST);
	}
	
	/**
	 * サービスインターフェースを実行します。<br>
	 * 料金対応記録一覧照会(初回窓口スキップ)(機能コード１)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECH0551B030_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String seikyKeiNo
			, String seikyYm
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 料金対応記録一覧照会(初回窓口スキップ)
		Object[][] ech0551b030In =
		{
			{ECH0551B030CBSMsg.TEMPLATEID,              TEMPLATE_ID_ECH0551B030}
			// 機能コード
			, {ECH0551B030CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿請求契約番号
			, {ECH0551B030CBSMsg.KEY_SEIKY_KEI_NO,      seikyKeiNo}
			// ＫＥＹ＿請求年月
			, {ECH0551B030CBSMsg.KEY_SEIKY_YM,          seikyYm}
		};
		
		return callSC(handle, scCall, param, fixedText, ech0551b030In)
				.getCAANMsgList(ECH0551B030CBSMsg.ECH0551B030CBSMSG1LIST);
	}
	
	/**
	 * サービスインターフェースを実行します。<br>
	 * 債権一覧照会(請求番号)(機能コード１)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECH0051B070_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String seikyNo
			, String seikyYm
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 債権一覧照会(請求番号)
		Object[][] ech0051b070In =
		{
			{ECH0051B070CBSMsg.TEMPLATEID,              TEMPLATE_ID_ECH0051B070}
			// 機能コード
			, {ECH0051B070CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿請求番号
			, {ECH0051B070CBSMsg.KEY_SEIKY_NO,          seikyNo}
			// ＫＥＹ＿請求年月
			, {ECH0051B070CBSMsg.KEY_SEIKY_YM,          seikyYm}
		};
		
		return callSC(handle, scCall, param, fixedText, ech0051b070In)
				.getCAANMsgList(ECH0051B070CBSMsg.ECH0051B070CBSMSG1LIST);
	}
	// ANK-4317-00-00 MOD END
	// ST-2023-0000006 ADD START
	/**
	 * サービスインターフェースを実行します。<br>
	 * 債権一覧照会(請求番号)(機能コード１)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callEKK0081B042_FUNC2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String seikyKeiNo
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// サービス契約番号(代表)一覧照会(CMP)
		Object[][] ekk0081b042In =
		{
			{EKK0081B042CBSMsg.TEMPLATEID,              TEMPLATE_ID_EKK0081B042}
			// 機能コード
			, {EKK0081B042CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿請求契約番号
			, {EKK0081B042CBSMsg.KEY_SEIKY_KEI_NO,      seikyKeiNo}
		};
		
		return callSC(handle, scCall, param, fixedText, ekk0081b042In)
				.getCAANMsgList(EKK0081B042CBSMsg.EKK0081B042CBSMSG1LIST);
	}
	
	/**
	 * サービスインターフェースを実行します。<br>
	 * サービス契約一意照会(機能コード１)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callEKK0081A010_FUNC2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText
			, String svcKeiNo
	)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// サービス契約一意照会
		Object[][] ekk0081a010In =
		{
			{EKK0081A010CBSMsg.TEMPLATEID,              TEMPLATE_ID_EKK0081A010}
			// 機能コード
			, {EKK0081A010CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿サービス契約番号
			, {EKK0081A010CBSMsg.KEY_SVC_KEI_NO,        svcKeiNo}
			// ＫＥＹ＿予約適用年月日
			, {EKK0081A010CBSMsg.KEY_RSV_APLY_YMD,      JPCBPCommon.getOpeDate(null)}
		};
		
		return callSC(handle, scCall, param, fixedText, ekk0081a010In)
				.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
	}
	// ST-2023-0000006 ADD END
	
	//ANK-4468-00-00 ADD START
	/**
	 * サービスインターフェースを実行します。<br>
	 * 料金項目出力名称一意照会(機能コード３)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	// ANK-4427-10-00 MOD START
//	private CAANMsg[] callECH0391A010_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	private CAANMsg[] callECH0391A010_FUNC1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String seikyEndD) throws Throwable
	// ANK-4427-10-00 MOD END
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 料金項目出力名称一意照会
		Object[][] ech0391a010In =
		{
			{ECH0391A010CBSMsg.TEMPLATEID,              TEMPLATE_ID_ECH0391A010}
			// ANK-4427-10-00 MOD START
			// 機能コード
//			, {ECH0391A010CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_3}
			, {ECH0391A010CBSMsg.FUNC_CODE,             JPCModelConstant.FUNC_CD_4}
			// ANK-4427-10-00 MOD END
			// ＫＥＹ＿料金グループコード
			, {ECH0391A010CBSMsg.KEY_PRC_GRP_CD,        JACStrConst.PRC_GRP_CD_NET_HOME}
			// ＫＥＹ＿料金コースコード
			, {ECH0391A010CBSMsg.KEY_PCRS_CD,           JACStrConst.PCRS_CD_SP}
			// ＫＥＹ＿料金サービスコード
			, {ECH0391A010CBSMsg.KEY_PRC_SVC_CD,        JACStrConst.PRC_SVC_CD_SP}
			// ＫＥＹ＿料金項目コード
			, {ECH0391A010CBSMsg.KEY_PRC_KMK_CD,        JACStrConst.SIMPLE_PLAN_PRC_KMK_CD}
			// ANK-4427-10-00 ADD START
			// ＫＥＹ＿請求年月月末日
			, {ECH0391A010CBSMsg.KEY_END_SEIKY_YMD,     seikyEndD}
			// ANK-4427-10-00 ADD END
		};
		
		return callSC(handle, scCall, param, fixedText, ech0391a010In)
				.getCAANMsgList(ECH0391A010CBSMsg.ECH0391A010CBSMSG1LIST);
	}
	// ANK-4628-00-00 ADD START
	/**
	 * サービスインターフェースを実行します。<br>
	 * 請求元サービス契約一覧照会(機能コード３)<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return 照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callEKK0081B028_FUNC3(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String fixedText,
			String seikyKeiNo
	) throws Throwable{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 請求元サービス契約一覧照会
		Object[][] ekk0081b028In = 
		{
				{EKK0081B028CBSMsg.TEMPLATEID,               TEMPLATE_ID_EKK0081B028}
				// 機能コード
				,{EKK0081B028CBSMsg.FUNC_CODE,                JPCModelConstant.FUNC_CD_3}
				// ＫＥＹ＿請求契約番号
				,{EKK0081B028CBSMsg.KEY_SEIKY_KEI_NO,         seikyKeiNo}
		};
		
		return callSC(handle, scCall, param, fixedText, ekk0081b028In)
		.getCAANMsgList(EKK0081B028CBSMsg.EKK0081B028CBSMSG1LIST);
	}
	//ANK-4628-00-00 ADD END
	/**
	 * SC(サービスインターフェイス）を呼び出します。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @return サービスインターフェイス実行結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData)
	throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object RETURN_CODE = result.get(JCMConstants.RET_CD_INT_KEY);
		
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)RETURN_CODE, dataMapKey);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if (!("0".equals(RETURN_CODE.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", RETURN_CODE.toString(), status);
		}
		
		return msg;
	}
	
	/**
	 * 共通項目のメッセージを作成します。
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData)
	throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				if ("".equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		
		templates[0] = template;
		
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * エラー情報を取得します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param errorCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param, CAANMsg[] templates, int errorCode, String dataMapKey)
	throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != errorCode)
		{
			templateStatus = 9000;
		}
		
		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(dataMapKey);
		
		HashMap map = template.getHashMap();
		Iterator it = map.keySet().iterator();
		while (it.hasNext())
		{
			String key = (String)it.next();
			Object value = map.get(key);
			if (value instanceof HashMap[])
			{
				HashMap[] childMapList = (HashMap[])value;
				for (HashMap childMap : childMapList)
				{
					Iterator childIt = childMap.keySet().iterator();
					while (childIt.hasNext())
					{
						String childKey = (String)childIt.next();
						if (childKey.endsWith(ERRITEM_SUFFIX))
						{
							int keyIdx = childKey.lastIndexOf(ERRITEM_SUFFIX);
							if (inMap.containsKey(childKey.substring(0, keyIdx)))
							{
								inMap.put(childKey, childMap.get(childKey));
							}
						}
					}
				}
			}
			else
			{
				if (key.endsWith(ERRITEM_SUFFIX))
				{
					int keyIdx = key.lastIndexOf(ERRITEM_SUFFIX);
					if (inMap.containsKey(key.substring(0, keyIdx)))
					{
						inMap.put(key, map.get(key));
					}
				}
			}
		}
		
		return param;
	}
	// ANK-4317-00-00 ADD START
	/**
	 * 請求内訳情報を作成します。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param outBillingList 
	 * @param yougetuOutBillingMap2 
	 * @throws Throwable 
	 */
	private void editBillingBreakdownList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> outBillingMap, ArrayList<HashMap<String, Object>> outBillingList)
	throws Throwable
	{
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
			
		// 請求リストに何も設定されていないか、
		// 1ヵ月分しか設定されていなければ何もしない
		if(outBillingList == null)
		{
			return ;
		}
		
		int size = outBillingList.size();
		// 請求リストが当月分しかなければ何もしない
		if(size == 0)
		{
			return;
		}
		
		// 翌月分の請求マップを取得する
		HashMap<String, Object> yokugetuBillingMap = outBillingList.get(size-1);
		// IT1-2023-0000019 MOD START
//		String amountConfirmFlg = (String)yokugetuBillingMap.get(OUT_AMOUNT_CONFIRM_FLG);
//		
//		// 未確定なら返却しない
//		if(CONST_AMOUNTCONFIRMFLG_UNCONFIRMED.equals(amountConfirmFlg))
//		{
//			return ;
//		}
		
		// 請求情報退避マップ
		HashMap<String, Object> yokugetuSeikyInfo = (HashMap<String, Object>)workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_YOKUGETU);
		
		String seikyUcekInfoReturnFlg = (String)yokugetuSeikyInfo.get(WORK_KEY_TAIHI_SEIKY_UCWK_RETURN_FLG);
		// 請求内訳返却フラグが"1"以外の場合
		if(!JKKStrConst.CD_DIV_UM_ARI.equals(seikyUcekInfoReturnFlg))
		{
			return;
		}
		// IT1-2023-0000019 MOD END
		
		// 請求内訳マージ処理
		resultList = seikyUcwkInfomerge();
		
		// 請求内訳情報編集処理
		seikyUcwkInfoEdit(resultList, outBillingMap, yokugetuBillingMap);
	}
	
	/**
	 * 請求内訳情報の編集に必要な情報を取得します。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 */
	private void seikyUcwkInfoEditInit(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// 料金項目抽出変換一覧照会
		CAANMsg[] ech0401b010MsgList = null;
		// 業務パラメータ管理
		CAANMsg[] ezm0321b010MsgList = null;
		//ANK-4468-00-00 ADD START
		// 料金項目出力名称
		CAANMsg[] ech0391a010MsgList = null;
		//ANK-4468-00-00 ADD END
		// 業務機能識別コード
		String workKinoSkbtCd = JACStrConst.KARA_MOJI;
		
		// 請求書表紙内訳書区分請求書表紙の内訳表示対象キーリスト
		ArrayList<String> titleKeyList = new ArrayList<String>();
		// 金額欄／金額内訳欄の両方に表示する対象キーリスト
		ArrayList<String> bothDspKeyList = new ArrayList<String>();
		// 請求内訳表示区切りブレイク対象キーリスト
		ArrayList<String> breakKeyList = new ArrayList<String>();
		// 請求内訳タイトル内訳行区分内内訳行表示対象キーリスト
		ArrayList<String> ucwkList = new ArrayList<String>();
		//ANK-4468-00-00 ADD START
		// シンプルプランID計業務パラメータ設定値データリスト
		ArrayList<String> idWorkParamValueList = new ArrayList<String>();
		// シンプルプラン料金グループ計業務パラメータ設定値データリスト
		ArrayList<String> groupWorkParamValueList = new ArrayList<String>();
		//ANK-4468-00-01 MOD START
//		// シンプル料金項目名称
//		String simplePlanPrcKmkNm = "";
		//ANK-4468-00-00 ADD END
		// シンプルプラン料金項目コード、料金項目名称データリスト
		ArrayList<String> simplePlanPrcKmkList = new ArrayList<String>();
		//ANK-4468-00-01 MOD END
		
		// タイトル行表示の対象とする料金項目を取得する。
		// 業務パラメータ管理
		ezm0321b010MsgList = callEZM0321B010_FUNC1(handle, param, fixedText, CONST_WORK_PARAM_ID_GKEI_DSP);
		workKinoSkbtCd = ezm0321b010MsgList[0].getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
		// 料金項目抽出変換一覧照会
		// サービスIF実行
		ech0401b010MsgList = callECH0401B010_FUNC1(handle, param, fixedText, workKinoSkbtCd);
		// タイトル行表示キーリストの作成
		titleKeyList = createPrcKmkKeyList(ech0401b010MsgList);
		
		
		// 金額欄／金額内訳欄の両方に金額を出力する料金項目を取得する。
		// 業務パラメータ管理
		ezm0321b010MsgList = callEZM0321B010_FUNC1(handle, param, fixedText, CONST_WORK_PARAM_ID_BOTH_DSP);
		workKinoSkbtCd = ezm0321b010MsgList[0].getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
		// 料金項目抽出変換一覧照会
		// サービスIF実行
		ech0401b010MsgList = callECH0401B010_FUNC1(handle, param, fixedText, workKinoSkbtCd);
		// 金額欄／金額内訳欄の両方表示キーリストの作成
		bothDspKeyList = createPrcKmkKeyList(ech0401b010MsgList);
		
		
		// 請求内訳表示区切り判定用
		// 料金項目抽出変換一覧照会
		// サービスIF実行
		ech0401b010MsgList = callEZM0321B010_FUNC1(handle, param, fixedText, CONST_WORK_PARAM_ID_DISPLAY_SEPARATOR);
		for(CAANMsg ech0401b010child : ech0401b010MsgList)
		{
			breakKeyList.add(ech0401b010child.getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
		}
		
		// 請求内訳タイトル内訳行区分判定用
		// 料金項目抽出変換一覧照会
		// サービスIF実行
		ech0401b010MsgList = callEZM0321B010_FUNC1(handle, param, fixedText, CONST_WORK_PARAM_ID_TITLE_BREAKDOWN_DIVISION);
		for(CAANMsg ech0401b010child : ech0401b010MsgList)
		{
			ucwkList.add(ech0401b010child.getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
		}
		
		//ANK-4468-00-00 ADD START
		// シンプルプランID計業務パラメータ設定値を取得する。
		ezm0321b010MsgList = callEZM0321B010_FUNC1(handle, param, fixedText, JACStrConst.WK_PARA_ID_SMPLN_IDKEI);
		for(CAANMsg ezm0321b010child : ezm0321b010MsgList)
		{
			idWorkParamValueList.add(ezm0321b010child.getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
		}
		
		// シンプルプラン料金グループ計業務パラメータ設定値を取得する。
		ezm0321b010MsgList = callEZM0321B010_FUNC1(handle, param, fixedText, JACStrConst.WK_PARA_ID_SMPLN_GRPKEI);
		for(CAANMsg ezm0321b010child : ezm0321b010MsgList)
		{
			groupWorkParamValueList.add(ezm0321b010child.getString(EZM0321B010CBSMsg1List.WORK_PARAM_SETTE_VALUE));
		}
		
		// ANK-4427-10-00 ADD START
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		//請求年月を取得する
		String seikyYm = (String)ccMsg.get(IN_ACQUISITION_YEAR_MONTH);
		//請求年月の末日を算出する
		String seikyEndD = seikyYm + JPCDateUtil.getEndOfMonth(seikyYm);
		// ANK-4427-10-00 ADD END
		
		// ANK-4427-10-00 MOD START
		// シンプルプラン料金項目名称を取得する。
//		ech0391a010MsgList = callECH0391A010_FUNC1(handle, param, fixedText);
		ech0391a010MsgList = callECH0391A010_FUNC1(handle, param, fixedText, seikyEndD);
		// ANK-4427-10-00 MOD END
		for(CAANMsg ezm0391a010child : ech0391a010MsgList)
		{
			//ANK-4468-00-01 MOD START
//			simplePlanPrcKmkNm = ezm0391a010child.getString(ECH0391A010CBSMsg1List.PRC_KMK_NM);
			simplePlanPrcKmkList.add(ezm0391a010child.getString(ECH0391A010CBSMsg1List.PRC_KMK_CD));
			simplePlanPrcKmkList.add(ezm0391a010child.getString(ECH0391A010CBSMsg1List.PRC_KMK_NM));
			//ANK-4468-00-01 MOD END
		}
		//ANK-4468-00-00 ADD END
		
		// 後続の処理で使用するため退避
		workMap.put(WORK_KEY_LIST_COVER_SPECIFICATION_DIVISION, titleKeyList);
		workMap.put(WORK_KEY_LIST_CALL_BOTH_DSP, bothDspKeyList);
		workMap.put(WORK_KEY_LIST_DISPLAY_SEPARATOR, breakKeyList);
		workMap.put(WORK_KEY_LIST_TITLE_BREAKDOWN_DIVISION, ucwkList);
		//ANK-4468-00-00 ADD START
		workMap.put(WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_IDKEI, idWorkParamValueList);
		workMap.put(WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_GRPKEI, groupWorkParamValueList);
		//ANK-4468-00-01 MOD START
//		workMap.put(WORK_KEY_SIMPLE_PRC_KMK_NM, simplePlanPrcKmkNm);
		workMap.put(WORK_KEY_LIST_SIMPLE_PRC_KMK, simplePlanPrcKmkList);
		//ANK-4468-00-01 MOD END
		//ANK-4468-00-00 ADD END
		
	}
	
	/**
	 * 料金項目抽出変換からキー情報を抜き出したMapListを作成します。
	 * 
	 * @param ch0401MsgList
	 */
	private ArrayList<String> createPrcKmkKeyList(CAANMsg[] ch0401MsgList)
	{
		ArrayList<String> keyList = new ArrayList<String>();
		
		// 照会結果が0件の場合
		if (ch0401MsgList == null || ch0401MsgList.length == 0)
		{
			// リストを返却する。
			return keyList;
		}
		
		for(CAANMsg ch0401child: ch0401MsgList)
		{
			String prcGrpCd = ch0401child.getString(ECH0401B010CBSMsg1List.PRC_GRP_CD);
			String pcrsCd   = ch0401child.getString(ECH0401B010CBSMsg1List.PCRS_CD);
			String prcSvcCd = ch0401child.getString(ECH0401B010CBSMsg1List.PRC_SVC_CD);
			String prcKmkCd = ch0401child.getString(ECH0401B010CBSMsg1List.PRC_KMK_CD);
			StringBuilder key = new StringBuilder();
			key.append(prcGrpCd);
			key.append(pcrsCd);
			key.append(prcSvcCd);
			key.append(prcKmkCd);
			keyList.add(key.toString());
		}
		
		return keyList;
	}

	/**
	 * 当月請求内訳と前月請求内訳をマージします。
	 * 当月の内訳に対して前月にしかないデータを追加します。
	 * @param fixedText 
	 * @param param 
	 * @param handle 
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> seikyUcwkInfomerge()
	throws Throwable
	{
		// 当月請求
		
		// resultList
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
		
		// 請求情報退避マップ
		HashMap<String, Object> togetuSeikyInfo = (HashMap<String, Object>)workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_TOGETU);
		HashMap<String, Object> yokugetuSeikyInfo = (HashMap<String, Object>)workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_YOKUGETU);
		
		CAANMsg[] seikyUcwkTougetu = (CAANMsg[])togetuSeikyInfo.get(WORK_KEY_TAIHI_SEIKY_UCWK);
		CAANMsg[] seikyUcwkYokugetu = (CAANMsg[])yokugetuSeikyInfo.get(WORK_KEY_TAIHI_SEIKY_UCWK);
		
		//ANK-4468-00-01 ADD START
		boolean simplePlanIdYokugetsuFlg = false;
		boolean simplePlanIdTogetsuFlg = false ;
		//シンプルプラン業務パラメータ設定値
		ArrayList<String> idWorkParamValueList1 = (ArrayList<String>)workMap.get(WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_IDKEI);
		ArrayList<String> groupWorkParamValueList1 = (ArrayList<String>)workMap.get(WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_GRPKEI);
		
		String simplePrcKmkNm = "";
		String simplePrcKmkCd = "";
		String seikyuPrcKmkCd = "";
		
		ArrayList<String> simplePrcKmkList = (ArrayList<String>) workMap.get(WORK_KEY_LIST_SIMPLE_PRC_KMK);
		if(!JKKStringUtil.isNullEmpty(simplePrcKmkList))
		{
			//シンプルプラン料金項目コード
			Object objectSimplePrcKmkCd = (simplePrcKmkList).get(0);
			simplePrcKmkCd = objectSimplePrcKmkCd.toString();
			//シンプルプラン料金項目名称
			Object objectSimplePrcKmkNm = (simplePrcKmkList).get(1);
			simplePrcKmkNm = objectSimplePrcKmkNm.toString();
		}
		
		// 翌月分シンプルプランのID計との一致を判定する。
		for(CAANMsg ch0101child : seikyUcwkYokugetu)
		{
			simplePlanIdYokugetsuFlg = simpleIdJudge(ch0101child, idWorkParamValueList1);
			if(simplePlanIdYokugetsuFlg)
			{
				break;
			}
		}
		
		// 当月分シンプルプランのID計との一致を判定する。
		for(CAANMsg ch0101child : seikyUcwkTougetu)
		{
			simplePlanIdTogetsuFlg = simpleIdJudge(ch0101child, idWorkParamValueList1);
			if(simplePlanIdTogetsuFlg)
			{
				break;
			}
		}
		//ANK-4468-00-01 ADD END
		
		// 翌月分の内訳情報はすべて出力する
		// 翌月の取得結果をresultListに変換する
		for(CAANMsg ch0101child : seikyUcwkYokugetu)
		{
			if(JACStrConst.PRC_KMK_CD_SEIKY_AMNT.equals(ch0101child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD)))
			{
				// 請求額合計レコードは除く
				continue;
			}
			
			//ANK-4468-00-01 ADD START
			boolean simplePlanCdFlg = false ;
			seikyuPrcKmkCd = "";
			if(simplePlanIdYokugetsuFlg)
			{
				// シンプルプラン料金グループ計の業務パラメータ設定値が請求内訳の料金グループコード、料金コースコード、料金サービスコード、料金項目コードと一致する場合
				if (groupWorkParamValueList1.contains(simpleCdJoin(ch0101child)))
				{
					seikyuPrcKmkCd = ch0101child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD);
					// シンプルプラン料金項目コードに置き換え
					if(!JKKStringUtil.isNullEmpty(simplePrcKmkCd))
					{
						ch0101child.set(ECH0101B010CBSMsg1List.PRC_KMK_CD, simplePrcKmkCd);
					}
					// シンプルプラン料金項目名称に置き換え
					if(!JKKStringUtil.isNullEmpty(simplePrcKmkNm))
					{
						ch0101child.set(ECH0101B010CBSMsg1List.PRC_KMK_NM, simplePrcKmkNmInd(ch0101child, simplePrcKmkNm));
					}
					simplePlanCdFlg = true ;
				}
			}
			//ANK-4468-00-01 ADD END
			
			HashMap<String, Object> resultMap = new HashMap<String, Object>();
			
			//ANK-4468-00-01 DEL START
//			//ANK-4468-00-00 ADD START
//			//シンプルプランのID計との一致を判定する。
//			simpleIdJudge(ch0101child);
//			//ANK-4468-00-00 ADD END
			//ANK-4468-00-01 DEL END
			
			// マージキー情報を取得
			// #82554 MOD START
//			String margeKey = createMargeKey(ch0101child);
			String margeKey = createMargeKey(ch0101child, JACStrConst.KARA_MOJI);
			// #82554 MOD END
			// ソートキー情報を取得
			HashMap<String, String> sortKey = createSortKey(ch0101child, JACStrConst.KARA_MOJI);
			
			//ANK-4468-00-01 ADD START
			resultMap.put(CONST_UCWK_SEIKYU_PRC_KMK_CD, seikyuPrcKmkCd);
			resultMap.put(CONST_UCWK_SIMPLE_FLG, simplePlanCdFlg);
			//ANK-4468-00-01 ADD END
			resultMap.put(CONST_UCWK_MARGE_KEY, margeKey.toString());
			resultMap.put(CONST_UCWK_SORT_KEY, sortKey);
			resultMap.put(CONST_UCWK_DATA, ch0101child);
			resultMap.put(CONST_UCWK_YOKUGETU_AMNT, ch0101child.getString(ECH0101B010CBSMsg1List.AMNT));
			
			resultList.add(resultMap);
		}
		
		// 当月の取得結果がresultListに登録されていなければ追加する
		for(CAANMsg ch0101child : seikyUcwkTougetu)
		{
			if(JACStrConst.PRC_KMK_CD_SEIKY_AMNT.equals(ch0101child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD)))
			{
				// 請求額合計レコードは除く
				continue;
			}
			
			//ANK-4468-00-01 ADD START
			boolean simplePlanCdFlg = false ;
			seikyuPrcKmkCd = "";
			if(simplePlanIdTogetsuFlg)
			{
				// シンプルプラン料金グループ計の業務パラメータ設定値が請求内訳の料金グループコード、料金コースコード、料金サービスコード、料金項目コードと一致する場合
				if (groupWorkParamValueList1.contains(simpleCdJoin(ch0101child)))
				{
					seikyuPrcKmkCd = ch0101child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD);
					// シンプルプラン料金項目コードに置き換え
					if(!JKKStringUtil.isNullEmpty(simplePrcKmkCd))
					{
						ch0101child.set(ECH0101B010CBSMsg1List.PRC_KMK_CD, simplePrcKmkCd);
					}
					// シンプルプラン料金項目名称に置き換え
					if(!JKKStringUtil.isNullEmpty(simplePrcKmkNm))
					{
						ch0101child.set(ECH0101B010CBSMsg1List.PRC_KMK_NM, simplePrcKmkNmInd(ch0101child, simplePrcKmkNm));
					}
					simplePlanCdFlg = true ;
				}
			}
			//ANK-4468-00-01 ADD END
			
			//ANK-4468-00-01 DEL START
//			//ANK-4468-00-00 ADD START
//			//シンプルプランのID計との一致を判定する。
//			simpleIdJudge(ch0101child);
//			//ANK-4468-00-00 ADD END
			//ANK-4468-00-01 DEL END
			// マージキー情報を取得
			// #82554 MOD START
//			String key = createMargeKey(ch0101child);
			String key = createMargeKey(ch0101child, "1");
			// #82554 MOD END
			
			// 翌月の内訳情報に存在するかチェックする。
			// 当月情報が翌月情報に含まれていれば対象のデータを取得する。
			HashMap<String, Object> resultmap = existsUcwkInfo(resultList, ch0101child, key);
			
			// データが取得できた場合
			if(!resultmap.isEmpty())
			{
				// 当月データ金額の情報を付与する
				resultmap.put(CONST_UCWK_TOUGETU_AMNT, ch0101child.getString(ECH0101B010CBSMsg1List.AMNT));
			}
			else{
				HashMap<String, Object> data = new HashMap<String, Object>();
				
				// ソートキー情報を取得
				HashMap<String, String> sortKey = createSortKey(ch0101child, "1");
				
				//ANK-4468-00-01 ADD START
				data.put(CONST_UCWK_SEIKYU_PRC_KMK_CD, seikyuPrcKmkCd);
				data.put(CONST_UCWK_SIMPLE_FLG, simplePlanCdFlg);
				//ANK-4468-00-01 ADD END
				data.put(CONST_UCWK_MARGE_KEY, key.toString());
				data.put(CONST_UCWK_SORT_KEY, sortKey);
				data.put(CONST_UCWK_DATA, ch0101child);
				data.put(CONST_UCWK_TOUGETU_AMNT, ch0101child.getString(ECH0101B010CBSMsg1List.AMNT));
				// IT1-2023-0000019 ADD START
				data.put(CONST_UCWK_KBN, "1");
				// IT1-2023-0000019 ADD START
				
				resultList.add(data);
			}
		}
		
		// ソートします。
		sortSeikyUcwklist(resultList);
		
		return resultList;
	}

	/**
	 * 当月内訳に対象のキー情報が存在するかチェックします。
	 * @param resultList
	 * @param ch0101child
	 * @param key
	 * @return
	 */
	private HashMap<String, Object> existsUcwkInfo(ArrayList<HashMap<String, Object>> resultList, CAANMsg ch0101child, String key) {
			
		for(HashMap<String, Object> resultMap : resultList)
		{
			String margeKey = (String)resultMap.get(CONST_UCWK_MARGE_KEY);
			// キー情報が一致していれば
			if(margeKey.equals(key))
			{
				// そのデータを返却する
				return resultMap;
			}
		}
		
		return new HashMap<String, Object>();
	}
	
	/**
	 * 請求内訳一覧照会結果からマージに使用するキー情報を取得します。
	 * 
	 * @param ch0401child
	 * @return
	 * @throws Throwable 
	 */
	// #82554 MOD START
//	private String createMargeKey(CAANMsg ch0401child) {
	private String createMargeKey(CAANMsg ch0401child, String mode) throws Throwable {
	// #82554 MOD END
		// key情報
		// #82554 ADD START
		// 整理番号
		String seiriNo      = JKKStringUtil.nullToBlank(ch0401child.getString(ECH0101B010CBSMsg1List.SEIRI_NO));
		// #82554 ADD END
		// サービス契約番号
		String svcKeiNo     = ch0401child.getString(ECH0101B010CBSMsg1List.SVC_KEI_NO);
		// 料金グループコード
		String prcGrpCd     = ch0401child.getString(ECH0101B010CBSMsg1List.PRC_GRP_CD);
		// 料金コースコード
		String pcrsCd       = ch0401child.getString(ECH0101B010CBSMsg1List.PCRS_CD);
		// 料金サービスコード
		String prcSvcCd     = ch0401child.getString(ECH0101B010CBSMsg1List.PRC_SVC_CD);
		// 料金項目コード
		String prcKmkCd     = ch0401child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD);
		// サービス詳細識別番号
		String svcDtlSkbtNo = JKKStringUtil.nullToBlank(ch0401child.getString(ECH0101B010CBSMsg1List.SVC_DTL_SKBT_NO));
		// #82554 ADD START
		// 請求内訳番号
		String seikyUcwkNo = JKKStringUtil.nullToBlank(ch0401child.getString(ECH0101B010CBSMsg1List.SEIKY_UCWK_NO));
		// #82554 ADD END
		// 合算請求年月
		String gssnSekiyYm = ch0401child.getString(ECH0101B010CBSMsg1List.GSAN_SEIKY_YM);
		
		StringBuilder key = new StringBuilder();
		// #82554 ADD START
		key.append(seiriNo);
		// #82554 ADD END
		key.append(svcKeiNo);
		key.append(prcGrpCd);
		key.append(pcrsCd);
		key.append(prcSvcCd);
		key.append(prcKmkCd);
		key.append(svcDtlSkbtNo);
		// #82554 ADD START
		key.append(seikyUcwkNo);
		// #82554 ADD END
		if("00900110601".equals(prcKmkCd))
		{
			key.append(gssnSekiyYm);
		}
		// #82554 ADD START
		else
		{
			if("1".equals(mode))
			{
				// 当月分の内訳情報の合算請求年月は+1ヵ月しておく
				String tmpValue = ch0401child.getString(ECH0101B010CBSMsg1List.GSAN_SEIKY_YM);
				gssnSekiyYm = JPCUtilCommon.addMonth(tmpValue + "01", 1).substring(0,6);
			}
			key.append(gssnSekiyYm);
		}
		// #82554 ADD END
		
		return key.toString();
	}
	
	/**
	 * 請求内訳一覧照会結果からマージ結果をソートする際に使用するキー情報を取得します。
	 * ソート詳細はUIA28_CH_25を参照
	 * 
	 * @param ch0401child
	 * @return
	 * @throws T 
	 */
	private HashMap<String, String> createSortKey(CAANMsg ch0401child, String mode)
	throws Throwable {
		// key情報
		HashMap<String, String> sortKeyMap = new HashMap<String, String>();
		
		String gsanSeikyYm = JACStrConst.KARA_MOJI;
		if("1".equals(mode))
		{
			// 当月分の内訳情報の合算請求年月は+1ヵ月しておく
			String tmpValue = ch0401child.getString(ECH0101B010CBSMsg1List.GSAN_SEIKY_YM);
			gsanSeikyYm = JPCUtilCommon.addMonth(tmpValue + "01", 1).substring(0,6);
		}
		else {
			gsanSeikyYm = ch0401child.getString(ECH0101B010CBSMsg1List.GSAN_SEIKY_YM);
		}
		
		// ソートキー：１
		sortKeyMap.put(CONST_UCWK_SORT_KEY_1, JKKStringUtil.nullToBlank(getSortDspJunType(ch0401child)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_2, JKKStringUtil.nullToBlank(gsanSeikyYm));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_3, JKKStringUtil.nullToBlank(getSortApartmenKbn(ch0401child)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_4, JKKStringUtil.nullToBlank(getSortSeiriNo(ch0401child)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_5, JKKStringUtil.nullToBlank(getSortDspJunCores(ch0401child)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_6, JKKStringUtil.nullToBlank(getSortRoomNo(ch0401child)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_7, JKKStringUtil.nullToBlank(getSortCustId(ch0401child)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_8, JKKStringUtil.nullToBlank(ch0401child.getString(ECH0101B010CBSMsg1List.SVC_DTL_SKBT_NO)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_9, JKKStringUtil.nullToBlank(ch0401child.getString(ECH0101B010CBSMsg1List.DSP_JUN)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_10, JKKStringUtil.nullToBlank(getSortTaxKbn(ch0401child)));
		sortKeyMap.put(CONST_UCWK_SORT_KEY_11, JKKStringUtil.nullToBlank(ch0401child.getString(ECH0101B010CBSMsg1List.SEIKY_UCWK_NO)));
		
		return sortKeyMap;
	}
	
	/**
	 * 請求内訳一覧明細編集処理
	 * 
	 * @param seikyUcwkDtl 請求内訳一覧明細
	 * @param yougetuOutBillingMap 
	 * @param yougetuOutBillingMap 
	 * @param kngkDspColNms 金額表示カラム名を格納した配列
	 * @param gkKeyList 合計判定用キーリスト
	 * @return 請求書内訳結果リスト
	 */
	private void seikyUcwkInfoEdit(ArrayList<HashMap<String, Object>> seikyUcwkDtl, HashMap<String, Object> outBillingMap, HashMap<String, Object> yougetuOutBillingMap)
	{
		// 請求書内訳結果リストを作成
		ArrayList<HashMap<String, Object>> seikyUcwkResultList = new ArrayList<HashMap<String, Object>>();
		
		// 内部生成レコード出力フラグ
		boolean internalRecodeFlg = true;
		
		// 請求内訳一覧明細件数分繰り返す
		for (HashMap<String, Object> seikyUcwkChild : seikyUcwkDtl)
		{
			// 請求内訳情報マップを生成する
			HashMap<String, String> seikyUcwkInfMap = new HashMap<String, String>();
			
			CAANMsg seikyUcwk = (CAANMsg)seikyUcwkChild.get(CONST_UCWK_DATA);
			
			// 請求書表紙内訳書区分
			String coverSpecificationDivision = JACStrConst.KARA_MOJI;
			// 請求内訳表示区切り
			String displaySeparator = JACStrConst.KARA_MOJI;
			// 請求内訳タイトル内訳行区分
			String titleBreakdownDivision = JACStrConst.KARA_MOJI;
			// 金額表示列
			String amountDisplayColumn = JACStrConst.KARA_MOJI;
			// 金額税区分
			String amountTaxDivision = JACStrConst.KARA_MOJI;
			// 金額表示括弧有無区分
			String amountBracketsDivision = JACStrConst.KARA_MOJI;
			// 合算請求分年月
			String totalingYearMonth = JACStrConst.KARA_MOJI;
			// 整理番号
			String organizeNumber = JACStrConst.KARA_MOJI;
			// 料金名称
			String feeName = JACStrConst.KARA_MOJI;
			// 料金説明コード
			String feeExplanationCode = JACStrConst.KARA_MOJI;
			// 料金説明
			String feeExplanation = JACStrConst.KARA_MOJI;
			// 当月金額
			String targetMonthAmount = JACStrConst.KARA_MOJI;
			// 当月金額利用期間
			String usagePeriod = JACStrConst.KARA_MOJI;
			// 前月金額
			String previousMonthAmount = JACStrConst.KARA_MOJI;
			// 金額差異
			String amountDifference = JACStrConst.KARA_MOJI;
			
			//ANK-4468-00-01 ADD START
			//シンプルプラン料金グループ計特定のために化かした料金項目コードを戻す。
			boolean simplePlanIdFlg = (Boolean)seikyUcwkChild.get(CONST_UCWK_SIMPLE_FLG);
			if(simplePlanIdFlg)
			{
				seikyUcwk.set(ECH0101B010CBSMsg1List.PRC_KMK_CD, (String)seikyUcwkChild.get(CONST_UCWK_SEIKYU_PRC_KMK_CD));
			}
			//ANK-4468-00-01 ADD END
			
			// 合計判定用キーを作成
			String key = createKeyString((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_GRP_CD),
							(String)seikyUcwk.getString(ECH0101B010CBSMsg1List.PCRS_CD),
							(String)seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_SVC_CD),
							(String)seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD));
			
			
			// ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
			// 他項目処理時に必要な項目を先に処理する。
			// ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
			// 合算請求分年月
			totalingYearMonth = editTotalingYearMonth(seikyUcwk);
			// 整理番号
			organizeNumber = editOrganizeNumber(seikyUcwk, totalingYearMonth);
			// 料金名称
			feeName = editFeeName(seikyUcwk);
			
			// ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
			// 他項目の影響を受けない項目を処理する。
			// ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
			// 請求書表紙内訳書区分
			coverSpecificationDivision = editCoverSpecificationDivision(seikyUcwk, key);
			// 請求内訳表示区切り（処理で必要なため、整理番号を処理してから実行する。）
			displaySeparator = editDisplaySeparator(seikyUcwk, organizeNumber, key);
			// 請求内訳タイトル内訳行区分
			titleBreakdownDivision = editTitleBreakdownDivision(seikyUcwk, feeName, key);
			// 金額表示列
			// IT1-2023-0000018 MOD START
//			amountDisplayColumn = editAmountDisplayColumn(seikyUcwk);
			amountDisplayColumn = editAmountDisplayColumn(seikyUcwk, key);
			// IT1-2023-0000018 MOD END
			// 金額税区分
			amountTaxDivision = editAmountTaxDivision(seikyUcwk);
			// 金額表示括弧有無区分
			amountBracketsDivision = editAmountBracketsDivision(seikyUcwk);
			// 料金説明コード
			feeExplanationCode = editFeeExplanationCode(seikyUcwk);
			// 料金説明
			feeExplanation = editFeeExplanation(seikyUcwk);
			// 当月金額
			targetMonthAmount = editTargetMonthAmount(seikyUcwk, (String)seikyUcwkChild.get(CONST_UCWK_YOKUGETU_AMNT));
			// 当月金額利用期間
			// IT1-2023-0000019 MOD START
//			usagePeriod = editUsagePeriod(seikyUcwk);
			usagePeriod = editUsagePeriod(seikyUcwk, (String)seikyUcwkChild.get(CONST_UCWK_KBN));
			// IT1-2023-0000019 MOD END
			// 前月金額
			previousMonthAmount = editPreviousMonthAmount(seikyUcwk, (String)seikyUcwkChild.get(CONST_UCWK_TOUGETU_AMNT));
			// 金額差異
			amountDifference = editAmountDifference(seikyUcwk, targetMonthAmount, previousMonthAmount);
			
			
			// ＝＝＝＝
			// 追加処理
			// ＝＝＝＝
			// 空白行の追加を判定します。
			if(judgeInsertBlankRecode(seikyUcwk))
			{
				// 処理中のレコードの情報を一部利用して空白行を追加する。
				HashMap<String, Object> blankRecodeMap = setOutParamBillingBreakdownMap(
						  coverSpecificationDivision
						, CONST_DISPLAY_SEPARATOR_BLANK
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
				);
				
				seikyUcwkResultList.add(blankRecodeMap);
			}
			
			// #82423 20230629 ADD START
			// 埋め込み項目コードが"4"：タブレット端末番号の場合の処理を行う。
			if(JACStrConst.UMKM_KMK_CD_SVC_DTL_SKBT_NO_TNAME_SIZO_NO.equals(seikyUcwk.getString(ECH0101B010CBSMsg1List.UMKM_KMK_CD)))
			{
				String katasikiNm = "";
				if (!(seikyUcwk.isNull(JACStrConst.ECH0101CBSMSG2LIST_TCHISHO_YO_TKMDL_NM)))
				{
					/** インデントの編集 */
					String strIndCnt = seikyUcwk.getString(ECH0101B010CBSMsg1List.INDENT_CNT);
					
					int iIndent = 0;
					if (strIndCnt != null)
					{
						iIndent = Integer.parseInt(strIndCnt);
					}
					// インデントを作成。
					StringBuffer sbIndent = new StringBuffer(10);
					for (int ix=0; ix<iIndent; ix++)
					{
						sbIndent.append("　");
					}
					
					// 料金項目名称を取得し、インデントを付加する
					StringBuffer sbIndent2 = new StringBuffer(sbIndent);
					
					katasikiNm =JCCStringConverter.toWide((seikyUcwk.getString(JACStrConst.ECH0101CBSMSG2LIST_TCHISHO_YO_TKMDL_NM)));
					
					// 編集元となった料金項目コードのインデント数に従いインデントする。
					katasikiNm = sbIndent.append(katasikiNm).toString();
					
					// 処理中のレコードの情報を一部利用して空白行を追加する。
					HashMap<String, Object> blankRecodeMap = setOutParamBillingBreakdownMap(
							coverSpecificationDivision
							, displaySeparator
							, titleBreakdownDivision
							, amountDisplayColumn
							, amountTaxDivision
							, amountBracketsDivision
							, totalingYearMonth
							, organizeNumber
							, katasikiNm
							, feeExplanationCode
							, feeExplanation
							, targetMonthAmount
							, usagePeriod
							, previousMonthAmount
							, amountDifference
					);
					
					seikyUcwkResultList.add(blankRecodeMap);
				}
			}
			// #82423 20230629 ADD END
			
			// 処理中のレコードを出力する。
			HashMap<String, Object> blankRecodeMap = setOutParamBillingBreakdownMap(
					coverSpecificationDivision
					, displaySeparator
					, titleBreakdownDivision
					, amountDisplayColumn
					, amountTaxDivision
					, amountBracketsDivision
					, totalingYearMonth
					, organizeNumber
					, feeName
					, feeExplanationCode
					, feeExplanation
					, targetMonthAmount
					, usagePeriod
					, previousMonthAmount
					, amountDifference
			);
			
			seikyUcwkResultList.add(blankRecodeMap);
		}
		
		// 内部生成レコードの追加を行います。
		for(int i = 0; i < seikyUcwkResultList.size(); i++)
		{
			HashMap<String, Object> seikyUcwkResultMap = seikyUcwkResultList.get(i);
			// 請求書表紙内訳書区分
			String coverSpecificationDivision = (String)seikyUcwkResultMap.get(OUT_COVER_SPECIFICATION_DIVISION);
			
			// リストの上から処理していき、表紙の一番下に追加する
			if (!CONST_COVER_SPECIFICATION_DIVISION_HYOSHI.equals(coverSpecificationDivision))
			{
				// 翌月の退避情報
				HashMap<String, Object> yokugetuTaihi = (HashMap<String, Object>)workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_YOKUGETU);
				// ANK-4317-06-00 ADD START
				// 当月の退避情報
				HashMap<String, Object> togetuTaihi = (HashMap<String, Object>)workMap.get(WORK_KEY_SEIKY_INFO_TAIHI_TOGETU);
				// ANK-4317-06-00 ADD END
				
				// 翌月の隔月合算請求スキップフラグ
				String yokugetuKakgtSeikySkipFlg = (String)yokugetuTaihi.get(WORK_KEY_TAIHI_KAKGT_SEIKY_SKIP_FLG);
				// 翌月の初回窓口請求スキップフラグ
				String yokugetuFirstMdgtSeikySkipFlg = (String)yokugetuTaihi.get(WORK_KEY_TAIHI_FIRST_MDGT_SEIKY_SKIP_FLG);
				// ANK-4317-06-00 ADD START
				// 当月の初回窓口請求スキップフラグ
				String togetuFirstMdgtSeikySkipFlg = (String)togetuTaihi.get(WORK_KEY_TAIHI_FIRST_MDGT_SEIKY_SKIP_FLG);
				// ANK-4317-06-00 ADD END
				
				// 隔月合算請求スキップ月もしくは初回窓口請求スキップ月の場合
				if(JACStrConst.KAKGT_SEIKY_SKIP_FLG_SKIP_M.equals(yokugetuKakgtSeikySkipFlg)
						|| JACStrConst.UM_ARI.equals(yokugetuFirstMdgtSeikySkipFlg))
				{
					String togetuAmnt = (String)yokugetuTaihi.get(WORK_KEY_TAIHI_SEIKY_AMNT_GOUKEI);
					// IT1-2023-0000019 MOD START
//					if(JCHStringUtil.isNullBlank(togetuAmnt) || CONST_ZERO.equals(togetuAmnt))
//					{
//						togetuAmnt = CONST_ZERO;
//					}
//					else 
//					{
//						togetuAmnt = "-" + togetuAmnt;
//					}
					String diffAmnt = JACStrConst.KARA_MOJI;
					
					long togetuAmountLong = 0;
					long zengetuAmountLong = 0;
					
					// long型に変換する
					if(!JCHStringUtil.isNullBlank(togetuAmnt))
					{
						togetuAmountLong = Long.parseLong(togetuAmnt);
					}
					// 当月金額をマイナス値とする
					togetuAmountLong = -togetuAmountLong;
					
					// 差額を計算する。
					long diffAmount = togetuAmountLong - zengetuAmountLong;
					
					diffAmnt = Long.toString(diffAmount);
					togetuAmnt = Long.toString(togetuAmountLong);
					// IT1-2023-0000019 MOD END
					
					// 処理中のレコードの情報を一部利用して翌月合算分調整を追加する。
					HashMap<String, Object> blankRecodeMap = setOutParamBillingBreakdownMap(
							  CONST_COVER_SPECIFICATION_DIVISION_HYOSHI
							, CONST_DISPLAY_SEPARATOR_DSP
							// ANK-4401-12-00 MOD START
//							, CONST_TITLE_BREAKDOWN_DIVISION_DTL
							, CONST_TITLE_BREAKDOWN_DIVISION_TITLE
							// ANK-4401-12-00 MOD END
							, CONST_AMOUNT_DISPLAY_COLUMN_DTLAMNT
							, JACStrConst.KARA_MOJI
							, CONST_AMOUNT_BRACKETS_DIVISION_NOJOIN
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, CONST_FEE_NAME_YOKUGETU_GSAN
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, togetuAmnt
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							// IT1-2023-0000019 MOD START
//							, togetuAmnt
							, diffAmnt
							// IT1-2023-0000019 MOD END
					);
					
					seikyUcwkResultList.add(i, blankRecodeMap);
					i++;
				}
				// ANK-4317-06-00 ADD START
				// 隔月合算請求合算月もしくは初回窓口請求合算月(1か月前が初回窓口請求スキップ)の場合
				else if(JACStrConst.KAKGT_SEIKY_SKIP_FLG_GASSAN_M.equals(yokugetuKakgtSeikySkipFlg)
						|| JACStrConst.UM_ARI.equals(togetuFirstMdgtSeikySkipFlg))
				{
					String zengetuAmnt = (String)togetuTaihi.get(WORK_KEY_TAIHI_SEIKY_AMNT_GOUKEI);
					// IT1-2023-0000019 MOD START
//					String diffAmnt = (String)togetuTaihi.get(WORK_KEY_TAIHI_SEIKY_AMNT_GOUKEI);
//					if(JCHStringUtil.isNullBlank(zengetuAmnt) || CONST_ZERO.equals(zengetuAmnt))
//					{
//						zengetuAmnt = CONST_ZERO;
//						diffAmnt = CONST_ZERO;
//					}
//					else 
//					{
//						zengetuAmnt = "-" + zengetuAmnt;
//					}
					
					String diffAmnt = JACStrConst.KARA_MOJI;
					
					long togetuAmountLong = 0;
					long zengetuAmountLong = 0;
					
					// long型に変換する
					if(!JCHStringUtil.isNullBlank(zengetuAmnt))
					{
						zengetuAmountLong = Long.parseLong(zengetuAmnt);
					}
					
					// 前月金額をマイナス値とする
					zengetuAmountLong = -zengetuAmountLong;
					
					// 差額を計算する。
					long diffAmount = togetuAmountLong - zengetuAmountLong;
					
					diffAmnt = Long.toString(diffAmount);
					if(!JCHStringUtil.isNullBlank(zengetuAmnt))
					{
						zengetuAmnt = Long.toString(zengetuAmountLong);
					}
					// IT1-2023-0000019 MOD END
					
					// 処理中のレコードの情報を一部利用して翌月合算分調整を追加する。
					HashMap<String, Object> blankRecodeMap = setOutParamBillingBreakdownMap(
							  CONST_COVER_SPECIFICATION_DIVISION_HYOSHI
							, CONST_DISPLAY_SEPARATOR_DSP
							// ANK-4401-12-00 MOD START
//							, CONST_TITLE_BREAKDOWN_DIVISION_DTL
							, CONST_TITLE_BREAKDOWN_DIVISION_TITLE
							// ANK-4401-12-00 MOD END
							, CONST_AMOUNT_DISPLAY_COLUMN_DTLAMNT
							, JACStrConst.KARA_MOJI
							, CONST_AMOUNT_BRACKETS_DIVISION_NOJOIN
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, CONST_FEE_NAME_YOKUGETU_GSAN
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, JACStrConst.KARA_MOJI
							, zengetuAmnt
							, diffAmnt
					);
					
					seikyUcwkResultList.add(i, blankRecodeMap);
					i++;
				}
				// ANK-4317-06-00 ADD END
				// IT1-2023-0000019 ADD START
				String togetuAmnt = (String)yougetuOutBillingMap.get(OUT_TOTAL_AMOUNT);
				String zengetuAmnt = (String)outBillingMap.get(OUT_TOTAL_AMOUNT);
				
				long togetuAmountLong = 0;
				long zengetuAmountLong = 0;
				
				// long型に変換する
				if(!JCHStringUtil.isNullBlank(togetuAmnt))
				{
					togetuAmountLong = Long.parseLong(togetuAmnt);
				}
				if(!JCHStringUtil.isNullBlank(zengetuAmnt))
				{
					zengetuAmountLong = Long.parseLong(zengetuAmnt);
				}
				
				// 差額を計算する。
				long diffAmount = togetuAmountLong - zengetuAmountLong;
				
				String diffAmountvalue = Long.toString(diffAmount);
				// IT1-2023-0000019 ADD END
				// 処理中のレコードの情報を一部利用して請求額合計レコードを追加する。
				HashMap<String, Object> blankRecodeMap = setOutParamBillingBreakdownMap(
						  CONST_COVER_SPECIFICATION_DIVISION_HYOSHI
						, CONST_DISPLAY_SEPARATOR_DSP
						// ANK-4317-04-00 MOD START
//						, CONST_TITLE_BREAKDOWN_DIVISION_DTL
//						, CONST_AMOUNT_DISPLAY_COLUMN_DTLAMNT
						, CONST_TITLE_BREAKDOWN_DIVISION_TITLE
						, CONST_AMOUNT_DISPLAY_COLUMN_AMNT
						// ANK-4317-04-00 MOD END
						, JACStrConst.KARA_MOJI
						, CONST_AMOUNT_BRACKETS_DIVISION_NOJOIN
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, CONST_FEE_NAME_SEIKY_AMNT_GOKEI
						, JACStrConst.KARA_MOJI
						, JACStrConst.KARA_MOJI
						, (String)yougetuOutBillingMap.get(OUT_TOTAL_AMOUNT)
						, JACStrConst.KARA_MOJI
						, (String)outBillingMap.get(OUT_TOTAL_AMOUNT)
						// IT1-2023-0000019 MOD START
//						, (String)yougetuOutBillingMap.get(OUT_TOTAL_AMOUNT_DEFFERENCE)
						, diffAmountvalue
						// IT1-2023-0000019 MOD END
				);
				
				seikyUcwkResultList.add(i, blankRecodeMap);
				i++;
				break;
			}
			
		}
		// 請求書内訳結果リストを返却
		if(seikyUcwkResultList.size() != 0)
		{
			yougetuOutBillingMap.put(OUT_BILLING_BREAKDOWN_LIST, seikyUcwkResultList);
		}
	}
	
	/**
	 * 空白行の挿入を判定します。
	 * 
	 * @param seikyUcwk
	 * @return
	 */
	private boolean judgeInsertBlankRecode(CAANMsg seikyUcwk)
	{
		// 空行挿入フラグ
		String kugyoInsFlg = JKKStringUtil.nullToBlank(seikyUcwk.getString(ECH0101B010CBSMsg1List.KUGYO_INS_FLG));
		
		if(kugyoInsFlg.equals(JACStrConst.EMP_FLG_Y))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * 出力：請求内訳マップを設定します。<br>
	 * 設定値がnull又は空の場合、あるいはリストに何も設定されていない場合は、パラメータ自体設定しません。<br>
	 * @param coverSpecificationDivision 請求書表紙内訳書区分
	 * @param displaySeparator 請求内訳表示区切り
	 * @param titleBreakdownDivision 請求内訳タイトル内訳行区分
	 * @param amountDisplayColumn 金額表示列
	 * @param amountTaxDivision 金額税区分
	 * @param amountBracketsDivision 金額表示括弧有無区分
	 * @param totalingYearMonth 合算請求分年月
	 * @param organizeNumber 整理番号
	 * @param feeName 料金名称
	 * @param feeExplanationCode 料金説明コード
	 * @param feeExplanation 料金説明
	 * @param targetMonthAmount 当月金額
	 * @param usagePeriod 当月金額利用期間
	 * @param previousMonthAmount 前月金額
	 * @param amountDifference 金額差異
	 * @return
	 */
	private HashMap<String, Object> setOutParamBillingBreakdownMap(
			  String coverSpecificationDivision
			, String displaySeparator
			, String titleBreakdownDivision
			, String amountDisplayColumn
			, String amountTaxDivision
			, String amountBracketsDivision
			, String totalingYearMonth
			, String organizeNumber
			, String feeName
			, String feeExplanationCode
			, String feeExplanation
			, String targetMonthAmount
			, String usagePeriod
			, String previousMonthAmount
			, String amountDifference
	) {
		// 請求内訳一覧マップ
		HashMap<String, Object> outBillingBreakdownMap = new HashMap<String, Object>();
		
		// 請求書表紙内訳書区分
		if (!JCHStringUtil.isNullBlank(coverSpecificationDivision))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_COVER_SPECIFICATION_DIVISION, coverSpecificationDivision);
		}
		// 請求内訳表示区切り
		if (!JCHStringUtil.isNullBlank(displaySeparator))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_DISPLAY_SEPARATOR, displaySeparator);
		}
		// 請求内訳タイトル内訳行区分
		if (!JCHStringUtil.isNullBlank(titleBreakdownDivision))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_TITLE_BREAKDOWN_DIVISION, titleBreakdownDivision);
		}
		// 金額表示列
		if (!JCHStringUtil.isNullBlank(amountDisplayColumn))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_AMOUNT_DISPLAY_COLUMN, amountDisplayColumn);
		}
		// 金額税区分
		if (!JCHStringUtil.isNullBlank(amountTaxDivision))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_AMOUNT_TAX_DIVISION, amountTaxDivision);
		}
		// 金額表示括弧有無区分
		if (!JCHStringUtil.isNullBlank(amountBracketsDivision))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_AMOUNT_BRACKETS_DIVISION, amountBracketsDivision);
		}
		// 合算請求分年月
		if (!JCHStringUtil.isNullBlank(totalingYearMonth))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_TOTALING_YEAR_MONTH, totalingYearMonth);
		}
		// 整理番号
		if (!JCHStringUtil.isNullBlank(organizeNumber))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_ORGANIZE_NUMBER, organizeNumber);
		}
		// 料金名称
		if (!JCHStringUtil.isNullBlank(feeName))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_FEE_NAME, feeName);
		}
		// 料金説明コード
		if (!JCHStringUtil.isNullBlank(feeExplanationCode))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_FEE_EXPLANATION_CODE, feeExplanationCode);
		}
		// 料金説明
		if (!JCHStringUtil.isNullBlank(feeExplanation))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_FEE_EXPLANATION, feeExplanation);
		}
		// 当月金額
		if (!JCHStringUtil.isNullBlank(targetMonthAmount))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_TARGET_MONTH_AMOUNT, targetMonthAmount);
		}
		// 当月金額利用期間
		if (!JCHStringUtil.isNullBlank(usagePeriod))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_USAGE_PERIOD, usagePeriod);
		}
		// 前月金額
		if (!JCHStringUtil.isNullBlank(previousMonthAmount))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_PREVIOUS_MONTH_AMOUNT, previousMonthAmount);
		}
		// 金額差異
		if (!JCHStringUtil.isNullBlank(amountDifference))
		{
			// null又は空でなければ設定する。
			outBillingBreakdownMap.put(OUT_AMOUNT_DIFFERENCE, amountDifference);
		}
		
		return outBillingBreakdownMap;
	}

	/**
	 * 請求書表紙内訳書区分を編集します。
	 * @param seikyUcwk
	 */
	private String editCoverSpecificationDivision(CAANMsg seikyUcwk, String key) {
		String value = JACStrConst.KARA_MOJI;
		
		// 合計判別用キーリスト
		ArrayList<String> gkKeyList = (ArrayList<String>)workMap.get(WORK_KEY_LIST_COVER_SPECIFICATION_DIVISION);
		
		if (gkKeyList.contains(key))
		{
			// 請求内訳情報マップに内訳表示区分(合計)を編集する
			value = CONST_COVER_SPECIFICATION_DIVISION_HYOSHI;
		}
		else
		{
			// 請求内訳情報マップに内訳表示区分(明細)を編集する
			value = CONST_COVER_SPECIFICATION_DIVISION_UCWK;
		}
		
		return value;
	}

	/**
	 * 請求内訳表示区切りを編集します。
	 * @param seikyUcwk
	 */
	private String editDisplaySeparator(CAANMsg seikyUcwk, String organizeNumber, String key) {
		String value = JACStrConst.KARA_MOJI;
		
		// 初期値(ブレイクなし)を設定
		value = CONST_DISPLAY_SEPARATOR_DSP;

		// 「整理番号」に登録証Noが設定されている場合
		if (!JACStrConst.KARA_MOJI.equals(organizeNumber))
		{
			// ブレイクありを設定
			value = CONST_DISPLAY_SEPARATOR_BREAK;
			
		}
		else
		{
			// 料金項目が請求内訳表示区切りブレイクあり対象料金項目かどうかを判定
			// 請求内訳表示区切りブレイクあり対象料金項目リストの取得
			ArrayList<String> chife054Kmk1Map = (ArrayList<String>)workMap.get(WORK_KEY_LIST_DISPLAY_SEPARATOR);
			for (int i=0; i < chife054Kmk1Map.size(); i++)
			{
				String chife054Kmk1 = (String) chife054Kmk1Map.get(i);
				// 請求内訳表示区切りブレイクあり対象料金項目の場合
				if (chife054Kmk1.equals((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD)) || chife054Kmk1.equals(key))
				{
					// ブレイクありを設定
					value = CONST_DISPLAY_SEPARATOR_BREAK;
				}
			}
		}
		
		return value;
	}

	/**
	 * 請求内訳タイトル内訳行区分を編集します。
	 * @param seikyUcwk
	 */
	private String editTitleBreakdownDivision(CAANMsg seikyUcwk, String feeName, String key)
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 初期値(1：タイトル行)を設定
		value = CONST_TITLE_BREAKDOWN_DIVISION_TITLE;

		// 「料金項目名称」が全角スペースで始まる(＝インデント数が1以上)場合
		// 「料金項目名称」が空の場合
		if (feeName != null && feeName.trim().length() == 0)
		{
			// 2：内訳行を設定
			value = CONST_TITLE_BREAKDOWN_DIVISION_DTL;
		}
		else if (seikyUcwk.getString(ECH0101B010CBSMsg1List.INDENT_CNT) != null && Integer.parseInt(seikyUcwk.getString(ECH0101B010CBSMsg1List.INDENT_CNT).toString()) >= 1)
		{
			// 2：内訳行を設定
			value = CONST_TITLE_BREAKDOWN_DIVISION_DTL;
		}
		else
		{
			// CMP請求表示行識別区分：内訳行対象料金項目かどうかを判定
			// CMP請求表示行識別区分：内訳行対象料金項目リストの取得
			ArrayList<String> chife054Kmk2Map = (ArrayList<String>)workMap.get(WORK_KEY_LIST_TITLE_BREAKDOWN_DIVISION);
			for (int i=0; i < chife054Kmk2Map.size(); i++)
			{
				String chife054Kmk2 = (String) chife054Kmk2Map.get(i);
				// CMP請求表示行識別区分：内訳行対象料金項目の場合
				if (chife054Kmk2.equals((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD)) || chife054Kmk2.equals(key))
				{
					// 2：内訳行を設定
					value = CONST_TITLE_BREAKDOWN_DIVISION_DTL;
				}
			}
		}
		
		return value;
	}
	
	/**
	 * 金額表示列を編集します。
	 * @param seikyUcwk
	 */
	// IT1-2023-0000018 MOD START
//	private String editAmountDisplayColumn(CAANMsg seikyUcwk)
	private String editAmountDisplayColumn(CAANMsg seikyUcwk, String judgeKey)
	// IT1-2023-0000018 MOD END
	{
		String value = JACStrConst.KARA_MOJI;
		ArrayList<String> bothDspTgKeyList = (ArrayList<String>)workMap.get(WORK_KEY_LIST_CALL_BOTH_DSP);
		// 金額編集カラム名を要素番号を取得
		// ECH0101B010CBSMsg1List.AMNT_DSP_COLUM_CNT ->「金額欄の表示カラム数」
		String amntDspColumCnt = seikyUcwk.getString(ECH0101B010CBSMsg1List.AMNT_DSP_COLUM_CNT);
		
		//金額欄／金額内訳欄の両方に 両方に出力する対象かどうかチェックする。
		for (String key : bothDspTgKeyList)
		{
			// 金額欄／金額内訳欄の両方に表示する対象の場合
			// IT1-2023-0000018 MOD START
//			if(seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD).equals(key))
			if(judgeKey.equals(key))
			// IT1-2023-0000018 MOD END
			{
				// 両方で表示する
				value = CONST_AMOUNT_DISPLAY_COLUMN_BOTH;
				return value;
			}
		}
		
		// 金額編集カラム数
		if (amntDspColumCnt.equals("1"))
		{
			// 金額欄表示とする。
			value = CONST_AMOUNT_DISPLAY_COLUMN_AMNT;
		}
		else if(amntDspColumCnt.equals("2"))
		{
			// 金額内訳欄に表示とする。
			value = CONST_AMOUNT_DISPLAY_COLUMN_DTLAMNT;
		}
		else
		{
			// 定義されていないので何も設定しない
			value = JACStrConst.KARA_MOJI;
			return value;
		}
		
		return value;
	}

	/**
	 * 金額税区分を編集します。
	 * @param seikyUcwk
	 */
	private String editAmountTaxDivision(CAANMsg seikyUcwk)
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 税区分表示フラグが"1"（課税対象外）の場合
		if (JACStrConst.TAX_DIV_DSP_FLG_ON.equals(seikyUcwk.getString(ECH0101B010CBSMsg1List.TAX_DIV_DSP_FLG)))
		{
			value = CONST_AMOUNT_TAX_DIVISION_INCLUDE;
		}
		else
		{
			value = JACStrConst.KARA_MOJI;
		}
		
		return value;
	}

	/**
	 * 金額表示括弧有無区分を編集します。
	 * @param seikyUcwk
	 */
	private String editAmountBracketsDivision(CAANMsg seikyUcwk)
	{
		String value = JACStrConst.KARA_MOJI;
		
		String amntDspColumCnt = seikyUcwk.getString(ECH0101B010CBSMsg1List.AMNT_DSP_COLUM_CNT);
		// 金額編集カラム数
		if (amntDspColumCnt.equals("1") || amntDspColumCnt.equals("2"))
		{
			if(JACStrConst.AMNT_HENSHU_PTN_CD_END_SPASE.equals(seikyUcwk.getString(ECH0101B010CBSMsg1List.AMNT_HENSHU_PTN_CD)))
			{
				value = CONST_AMOUNT_BRACKETS_DIVISION_NOJOIN;
			}
			else if(JACStrConst.AMNT_HENSHU_PTN_CD_PAREN.equals(seikyUcwk.getString(ECH0101B010CBSMsg1List.AMNT_HENSHU_PTN_CD)))
			{
				value = CONST_AMOUNT_BRACKETS_DIVISION_JOIN;
			}
		}
		
		return value;
	}

	/**
	 * 合算請求分年月を編集します。
	 * @param seikyUcwk
	 */
	private String editTotalingYearMonth(CAANMsg seikyUcwk)
	{
		String value = JACStrConst.KARA_MOJI;
		
		value = seikyUcwk.getString(ECH0101B010CBSMsg1List.GSAN_SEIKY_YM);
		
		return value;
	}

	/**
	 * 整理番号を編集します。
	 * 
	 * @param seikyUcwk
	 * @param totalingYearMonth 
	 * @return 編集後の整理番号
	 */
	private String editOrganizeNumber(CAANMsg seikyUcwk, String totalingYearMonth)
	{
		// すでに出力済みの「"整理番号"＋"合算請求年月"」をキーとして保持するmap(重複は上書き)
		HashMap<String, String> alreadyOutkeyOrganizeNumber = (HashMap<String, String>)workMap.get(WORK_KEY_MAP_ALREADY_OUTKEY_ORGANIZE_NUMBER);
		if(alreadyOutkeyOrganizeNumber == null)
		{
			alreadyOutkeyOrganizeNumber = new HashMap<String, String>();
		}
		
		// 整理番号
		StringBuilder tmpOrganizeNumber = new StringBuilder(JACStrConst.KARA_MOJI);
		String value = JACStrConst.KARA_MOJI;
		
		// マンションＩＤ表示制御フラグが"1"（表示対象）の場合
		if (JACStrConst.MANS_ID_DSP_CTRL_FLG_ON.equals(seikyUcwk.getString(ECH0101B010CBSMsg1List.MANS_ID_DSP_CTRL_FLG)))
		{
			// ＮＯ項目にマンションＩＤを追加
			tmpOrganizeNumber.append(replaceNull(seikyUcwk.getString(ECH0101B010CBSMsg1List.MANSION_ID)));
		}
		// 整理番号表示フラグが"1"（表示あり）の場合
		if (JACStrConst.SEIRI_NO_DSP_CTRL_FLG_ON.equals(seikyUcwk.getString(ECH0101B010CBSMsg1List.SEIRI_NO_DSP_CTRL_FLG)))
		{
			// ＮＯ項目に整理番号を編集して追加
			tmpOrganizeNumber.append(editSeiriNo(seikyUcwk.getString(ECH0101B010CBSMsg1List.SEIRI_NO)));
		}
		
		// IT1-2023-0000020 ADD START
		value = tmpOrganizeNumber.toString();
		// IT1-2023-0000020 ADD END
		
		// すでに出力済みの「"整理番号"」をキーとして保持するmap(重複は上書き)
		if (!JCHStringUtil.isNullBlank(value))
		{
			// マップキーを作成
			// IT1-2023-0000020 MOD START
//			String sKey = value.concat(totalingYearMonth);
			String sKey = value;
			// IT1-2023-0000020 MOD END
			
			// 出力済みの「"整理番号"」と同一の場合は請求内訳情報の整理番号を消去する
			if (alreadyOutkeyOrganizeNumber.containsKey(sKey))
			{
				tmpOrganizeNumber = new StringBuilder(JACStrConst.KARA_MOJI);
			}
			alreadyOutkeyOrganizeNumber.put(sKey, null);
			// IT1-2023-0000020 ADD START
			workMap.put(WORK_KEY_MAP_ALREADY_OUTKEY_ORGANIZE_NUMBER, alreadyOutkeyOrganizeNumber);
			// IT1-2023-0000020 ADD END
		}
		
		return tmpOrganizeNumber.toString();
	}

	/**
	 * 料金名称を編集します。
	 * @param seikyUcwk
	 */
	private String editFeeName(CAANMsg seikyUcwk)
	{
		String value = JACStrConst.KARA_MOJI;
		
		String prcKmkNm = seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_KMK_NM);
		//ANK-4468-00-01 DEL START
//		//ANK-4468-00-00 ADD START
//		//シンプルプランID計判定フラグチェック
//		String simplePlanIdFlg = (String)workMap.get(CONST_UCWK_SIMPLE_FLG);
//		if(!JCHStringUtil.isNullBlank(simplePlanIdFlg) && simplePlanIdFlg.equals(JACStrConst.SIMPLE_ID_ARI_FLG_TRGT))
//		{
//			StringBuffer str_Buff = new StringBuffer();
//			str_Buff.append(seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_GRP_CD));
//			str_Buff.append(",");
//			str_Buff.append(seikyUcwk.getString(ECH0101B010CBSMsg1List.PCRS_CD));
//			str_Buff.append(",");
//			str_Buff.append(seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_SVC_CD));
//			str_Buff.append(",");
//			str_Buff.append(seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD));
//			String cdJoin = str_Buff.toString();
//		
//			ArrayList<String> groupWorkParamValueList1 = (ArrayList<String>)workMap.get(WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_GRPKEI);
//			// シンプルプラン料金グループ計の業務パラメータ設定値が請求内訳の料金グループコード、料金コースコード、料金サービスコード、料金項目コードと一致する場合
//			if (groupWorkParamValueList1.contains(cdJoin))
//			{
//				//シンプルプランの料金項目名称に文言変更
//				prcKmkNm = (String)workMap.get(WORK_KEY_SIMPLE_PRC_KMK_NM);
//			}
//		}
//		//ANK-4468-00-00 ADD END
		//ANK-4468-00-01 DEL END
		// 30文字を超えている分は削除する。
		if (prcKmkNm.length() > 30)
		{
			value = prcKmkNm.substring(0, 30);
		}
		else
		{
			//ANK-4468-00-00 MOD START
//			value = seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_KMK_NM);
			value = prcKmkNm;
			//ANK-4468-00-00 MOD END
		}
		
		return value;
	}

	/**
	 * 料金説明コードを編集します。
	 * @param seikyUcwk
	 */
	private String editFeeExplanationCode(CAANMsg seikyUcwk)
	{
		String value = JACStrConst.KARA_MOJI;
		
		value = seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_SETMEI_CD);
		
		return value;
	}

	/**
	 * 料金説明を編集します。
	 * @param seikyUcwk
	 */
	private String editFeeExplanation(CAANMsg seikyUcwk)
	{
		String value = JACStrConst.KARA_MOJI;
		
		value = seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_SETMEI);
		
		return value;
	}

	/**
	 * 当月金額を編集します。
	 * @param seikyUcwk
	 */
	private String editTargetMonthAmount(CAANMsg seikyUcwk, String togetuAmnt)
	{
		String value = JACStrConst.KARA_MOJI;
		
		String amntDspColumCnt = seikyUcwk.getString(ECH0101B010CBSMsg1List.AMNT_DSP_COLUM_CNT);
		// 金額編集カラム数
		if (amntDspColumCnt.equals("1") || amntDspColumCnt.equals("2"))
		{
			value = togetuAmnt;
		}
		
		return value;
	}

	/**
	 * 当月金額利用期間を編集します。
	 * @param seikyUcwk
	 */
	// IT1-2023-0000019 MOD START
//	private String editUsagePeriod(CAANMsg seikyUcwk)
	private String editUsagePeriod(CAANMsg seikyUcwk, String ucwkKbn)
	// IT1-2023-0000019 MOD END
	{
		String value = JACStrConst.KARA_MOJI;
		
		// IT1-2023-0000019 ADD START
		// 前月の内訳ならば当月利用期間は設定しない
		if (!JCHStringUtil.isNullBlank(ucwkKbn) && CONST_UCWK_KBN_ZENGETU.equals(ucwkKbn))
		{
			return value;
		}
		// IT1-2023-0000019 ADD END
		
		// 利用期間表示制御フラグが"1"（表示対象）の場合
		if (JACStrConst.USE_PRD_DSP_CTRL_FLG_ON.equals(seikyUcwk.getString(ECH0101B010CBSMsg1List.USE_PRD_DSP_CTRL_FLG)))
		{
			//料金グループコード　＝　"51"(ｍｉｎｅｏ)  かつ　利用終了年月日の年月　＜　請求年月の場合、空文字返却
			if ((seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_GRP_CD) != null && seikyUcwk.getString(ECH0101B010CBSMsg1List.PRC_GRP_CD).equals("51"))
					&& ((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.USE_ENDYMD) != null && ((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.USE_ENDYMD)).length() == 8)
					&& ((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.SEIKY_YM) != null && ((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.SEIKY_YM)).length() == 6)
					&& (((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.USE_ENDYMD)).substring(0,6).compareTo((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.SEIKY_YM)) < 0)
				)
			{
				value = JACStrConst.KARA_MOJI;
			}
			else
			{
				value = JCHCommonFormatUtil.convRiyoKikan((String)seikyUcwk.getString(ECH0101B010CBSMsg1List.USE_KIKAN));
			}
		}
		else
		{
			value = JACStrConst.KARA_MOJI;
		}
		
		return value;
	}

	/**
	 * 前月金額を編集します。
	 * @param seikyUcwk
	 */
	private String editPreviousMonthAmount(CAANMsg seikyUcwk, String zengetuAmnt)
	{
		String value = JACStrConst.KARA_MOJI;
		
		String amntDspColumCnt = seikyUcwk.getString(ECH0101B010CBSMsg1List.AMNT_DSP_COLUM_CNT);
		// 金額編集カラム数
		if (amntDspColumCnt.equals("1") || amntDspColumCnt.equals("2"))
		{
			value = zengetuAmnt;
		}
		
		return value;
	}

	/**
	 * 金額差異を編集します。
	 * @param seikyUcwk
	 */
	private String editAmountDifference(CAANMsg seikyUcwk, String togetuAmnt, String zengetuAmnt)
	{
		String value = JACStrConst.KARA_MOJI;
		
		String amntDspColumCnt = seikyUcwk.getString(ECH0101B010CBSMsg1List.AMNT_DSP_COLUM_CNT);
		// 金額編集カラム数
		if (amntDspColumCnt.equals("1") || amntDspColumCnt.equals("2"))
		{
			long togetuAmountLong = 0;
			long zengetuAmountLong = 0;
			
			// long型に変換する
			if(!JCHStringUtil.isNullBlank(togetuAmnt))
			{
				togetuAmountLong = Long.parseLong(togetuAmnt);
			}
			if(!JCHStringUtil.isNullBlank(zengetuAmnt))
			{
				zengetuAmountLong = Long.parseLong(zengetuAmnt);
			}
			
			// 差額を計算する。
			long diffAmount = togetuAmountLong - zengetuAmountLong;
			
			value = Long.toString(diffAmount);
		}
		
		return value;
	}
	
	/**
	 * 整理番号を編集する。
	 * 
	 * @param seiriNo 整理番号
	 * @return 編集後の整理番号
	 */
	private String editSeiriNo(Object seiriNo)
	{
		String str = replaceNull(seiriNo).trim();
		if (str.length() >= 10)
		{
			String str1 = str.substring(0, 10);
			String str2 = str.substring(10).trim();

			// 11桁目から4桁(最後まで)の前ゼロを削除する
			try
			{
				long no = Long.parseLong(str2);
				str2 = String.valueOf(no);
			}
			catch(NumberFormatException e)
			{
				// 数値変換できなかった場合はそのまま返す
			}
			return str1.concat(SEIRI_NO_DIV).concat(str2);
		}
		else
		{
			return str;
		}
	}
	
	/**
	 * NULLを空文字に置き換える
	 * 
	 * @param obj null又は文字列
	 * @param str 置換文字列
	 * @return 文字列
	 */
	private String replaceNull(Object obj, String str)
	{
		if (obj == null)
		{
			return str;
		}
		else
		{
			return obj.toString();
		}
	}
	
	/**
	 * NULLを空文字に置き換える
	 * 
	 * @param obj null又は文字列
	 * @return 文字列
	 */
	private String replaceNull(Object obj)
	{
		return replaceNull(obj, JACStrConst.KARA_MOJI);
	}
	
	/**
	 * キー文字列の作成
	 * 
	 * @param prcGrpCd 料金グループコード
	 * @param pcrsCd 料金コースコード
	 * @param prcSvcCd 料金サービスコード
	 * @param prcKmkCd 料金項目コード
	 * @return キー文字列
	 */
	private String createKeyString(String prcGrpCd, String pcrsCd, String prcSvcCd, String prcKmkCd)
	{
		StringBuilder key = new StringBuilder();
		key.append(JPCUtilCommon.fillHalfSpace(prcGrpCd, 2, true));
		key.append(JPCUtilCommon.fillHalfSpace(pcrsCd, 3, true));
		key.append(JPCUtilCommon.fillHalfSpace(prcSvcCd, 12, true));
		key.append(JPCUtilCommon.fillHalfSpace(prcKmkCd, 11, true));
		return key.toString();
	}
	
	//ANK-4468-00-00 ADD START
	/**
	 * シンプルプランID計の判定。
	 * 
	 * @param ch0101child
	 * @param idWorkParamValueList1
	 * @throws Exception 
	 */
	//ANK-4468-00-01 MOD START
//	private void simpleIdJudge(CAANMsg ch0101child)
	private static boolean simpleIdJudge(CAANMsg ch0101child, ArrayList<String> idWorkParamValueList1) throws Exception
	//ANK-4468-00-01 MOD END
	{
		//ANK-4468-00-01 ADD START
		boolean simpleIdFlg = false;
		//ANK-4468-00-01 ADD END
		
		//ANK-4468-00-01 DEL START
//		StringBuffer str_Buff = new StringBuffer();
//		str_Buff.append(ch0101child.getString(ECH0101B010CBSMsg1List.PRC_GRP_CD));
//		str_Buff.append(",");
//		str_Buff.append(ch0101child.getString(ECH0101B010CBSMsg1List.PCRS_CD));
//		str_Buff.append(",");
//		str_Buff.append(ch0101child.getString(ECH0101B010CBSMsg1List.PRC_SVC_CD));
//		str_Buff.append(",");
//		str_Buff.append(ch0101child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD));
//		String cdJoin = str_Buff.toString();
//		
//		ArrayList<String> idWorkParamValueList1 = (ArrayList<String>)workMap.get(WORK_KEY_LIST_WK_PARA_VALUE_SMPLN_IDKEI);
		//ANK-4468-00-01 DEL END
		// シンプルプランID計の業務パラメータ設定値が請求内訳の料金グループコード、料金コースコード、料金サービスコード、料金項目コードと一致する場合
		//ANK-4468-00-01 MOD START
//		if (idWorkParamValueList1.contains(cdJoin))
		if (idWorkParamValueList1.contains(simpleCdJoin(ch0101child)))
		//ANK-4468-00-01 MOD END
		{
			//シンプルプランＩＤ計判定フラグ
			//ANK-4468-00-01 MOD START
			simpleIdFlg = true;
//			workMap.put(CONST_UCWK_SIMPLE_FLG, JACStrConst.SIMPLE_ID_ARI_FLG_TRGT);
			//ANK-4468-00-01 MOD END
		}
		//ANK-4468-00-01 ADD START
		return simpleIdFlg;
		//ANK-4468-00-01 ADD END
	}

	//ANK-4468-00-00 ADD END
	
	//ANK-4468-00-01 ADD START
	/**
	 * シンプルプランコードの文字列結合。
	 * 
	 * @param ch0101child
	 * @throws Exception 
	 */
	
	private static String simpleCdJoin(CAANMsg ch0101child) throws Exception
	{
		StringBuffer str_Buff = new StringBuffer();
		str_Buff.append(ch0101child.getString(ECH0101B010CBSMsg1List.PRC_GRP_CD));
		str_Buff.append(",");
		str_Buff.append(ch0101child.getString(ECH0101B010CBSMsg1List.PCRS_CD));
		str_Buff.append(",");
		str_Buff.append(ch0101child.getString(ECH0101B010CBSMsg1List.PRC_SVC_CD));
		str_Buff.append(",");
		str_Buff.append(ch0101child.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD));
		
		return str_Buff.toString();
	}
	
	/**
	 * シンプルプランの料金項目名称にインデント付加します。
	 * 
	 * @param ch0101child
	 * @param simplePrcKmkNm
	 * @throws Exception 
	 */
	
	private String simplePrcKmkNmInd(CAANMsg ch0101child, String simplePrcKmkNm) throws Exception
	{
		/** インデントの編集 */
		String strIndCnt = ch0101child.getString(ECH0101B010CBSMsg1List.INDENT_CNT);
		
		int iIndent = 0;
		if (strIndCnt != null)
		{
			iIndent = Integer.parseInt(strIndCnt);
		}
		// インデントを作成。
		StringBuffer sbIndent = new StringBuffer(10);
		for (int ix=0; ix<iIndent; ix++)
		{
			sbIndent.append("　");
		}
		// 料金項目名称にインデントを付加する
		String simplePrcKmkNmInd = sbIndent.append(simplePrcKmkNm).toString();
		
		return simplePrcKmkNmInd;

	}
	//ANK-4468-00-01 ADD END
	
	/**
	 * 請求内訳リストをソートします。
	 * 
	 * @param resultList
	 */
	private void sortSeikyUcwklist(ArrayList<HashMap<String, Object>> resultList) {
		// ［UIA28のソート条件に従ってソートする(ECH0101B010(funccode:4)のソート条件を参考)］
		Comparator<Map<String, Object>> opComparator = new Comparator<Map<String, Object>>() {
			/**
			 * ソート基準を設定します。
			 * 
			 * @param o1 
			 * @param o2 
			 * @return
			 */
			public int compare(Map<String, Object> o1, Map<String, Object> o2) {
				
				HashMap<String, String> dataMap1 = (HashMap<String, String>)o1.get(CONST_UCWK_SORT_KEY);
				HashMap<String, String> dataMap2 = (HashMap<String, String>)o2.get(CONST_UCWK_SORT_KEY);
				
				String key1 = JACStrConst.KARA_MOJI;
				String key2 = JACStrConst.KARA_MOJI;
				
				int result = 0;
				// ==================
				// 表示順(種類)(昇順)
				// ==================
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_1);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_1);
				
				result = key1.compareTo(key2);
				if (result != 0) {
					return result;
				}
				
				// ==================
				// 合算請求年月(降順)
				// ==================
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_2);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_2);
				
				result = key2.compareTo(key1);
				if (result != 0) {
					return result;
				}
				
				// ====================
				// マンション区分(昇順)
				// ====================
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_3);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_3);
				
				result = key1.compareTo(key2);
				if (result != 0) {
					return result;
				}
				
				// ==============
				// 整理番号(昇順)
				// ==============
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_4);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_4);
				
				result = key1.compareTo(key2);
				if (result != 0) {
					return result;
				}
				
				// ============================================
				// 表示順(種類＋コース＋サービス詳細識別)(昇順)
				// ============================================
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_5);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_5);
				
				result = key1.compareTo(key2);
				if (result != 0) {
					return result;
				}
				
				// ==============
				// 部屋番号(昇順)
				// ==============
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_6);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_6);
				
				result = key1.compareTo(key2);
				if (result != 0) {
					return result;
				}
				
				// ================
				// お客さまID(昇順)
				// ================
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_7);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_7);
				result = key1.compareTo(key2);
				if (result != 0) {
					return result;
				}
				
				// ==========================
				// サービス詳細識別番号(昇順)
				// ==========================
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_8);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_8);
				result = key1.compareTo(key2);
				if (result != 0) {
					return result;
				}
				
				// ============
				// 表示順(昇順)
				// ============
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_9);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_9);
				result = key1.compareTo(key2);
				if (result != 0) {
					return result;
				}
				
				// ================
				// 消費税区分(降順)
				// ================
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_10);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_10);
				result = key2.compareTo(key1);
				if (result != 0) {
					return result;
				}
				
				// ==================
				// 請求内訳番号(昇順)
				// ==================
				key1 = dataMap1.get(CONST_UCWK_SORT_KEY_11);
				key2 = dataMap2.get(CONST_UCWK_SORT_KEY_11);
				// #82554 ADD START
				result = key1.compareTo(key2);
				// #82554 ADD END
				if (result != 0) {
					return result;
				}
				
				return result;
			}
		};
		Collections.sort(resultList, opComparator);
	}
	
	/**
	 * ソート条件１：表示順(種類)を取得します。
	 * 
	 * @param dataMap
	 * @return
	 */
	private String getSortDspJunType(CAANMsg dataMap)
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 整理番号
		String seiriNo = dataMap.getString(ECH0101B010CBSMsg1List.SEIRI_NO);
		// 整理番号が空埋めされていれば
		if(JACStrConst.SEIRI_NO_SP.equals(seiriNo))
		{
			String dspJun = dataMap.getString(ECH0101B010CBSMsg1List.DSP_JUN);
			// 表示順を12桁まで左0埋めして最初の1文字を取得する
			value = String.format("%12s", dspJun).replace(JACStrConst.SPACE_1, "0").substring(0, 1);
			// 3の場合は2に変換する
			if("3".equals(value))
			{
				value = "2";
			}
		}
		else
		{
			value = "2";
		}
		
		return value;
	}
	
	/**
	 * ソート条件２：マンション区分を取得します。
	 * 
	 * @param dataMap1
	 * @return
	 */
	private String getSortApartmenKbn(CAANMsg dataMap)
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 整理番号
		String seiriNo = dataMap.getString(ECH0101B010CBSMsg1List.SEIRI_NO);
		// 整理番号が空埋めされていれば
		if(JACStrConst.SEIRI_NO_SP.equals(seiriNo))
		{
			value = "0";
		}
		else
		{
			// 整理番号を14桁まで右空白埋めして11〜14文字目の4文字を取得する
			String tmpValue = String.format("%-14s", seiriNo).substring(10, 14);
			if("    ".equals(tmpValue))
			{
				value = "1";
			}
			else
			{
				value = "0";
			}
		}
		
		return value;
	}
	
	/**
	 * ソート条件４：整理番号を判定します。
	 */
	private String getSortSeiriNo(CAANMsg dataMap)
	{
		String value = JACStrConst.KARA_MOJI;
		// 表示順
		String dspJun = dataMap.getString(ECH0101B010CBSMsg1List.DSP_JUN);
		String tmpValue = String.format("%12s", dspJun).substring(0, 1);
		
		if("4".equals(tmpValue))
		{
			value = JACStrConst.SEIRI_NO_SP;
		}
		else
		{
			value = JKKStringUtil.nullToBlank(dataMap.getString(ECH0101B010CBSMsg1List.SEIRI_NO));
		}
		
		return value;
	}
	
	/**
	 * ソート条件５：表示順(種類＋コース＋サービス詳細識別)を判定します
	 */
	private String getSortDspJunCores(CAANMsg dataMap)
	{
		String value = JACStrConst.KARA_MOJI;
		// 表示順
		String dspJun = dataMap.getString(ECH0101B010CBSMsg1List.DSP_JUN);
		value = String.format("%12s", dspJun).replace(JACStrConst.SPACE_1, "0").substring(0, 5);
		
		return value;
	}
	
	/**
	 * ソート条件６：部屋番号を判定します
	 */
	private String getSortRoomNo(CAANMsg dataMap)
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 料金グループコード
		String prcGrpCd = dataMap.getString(ECH0101B010CBSMsg1List.PRC_GRP_CD);
		// 回線場所部屋番号
		String kaisenPlaceAdrrm = JKKStringUtil.nullToBlank(dataMap.getString(ECH0101B010CBSMsg1List.KAISEN_PLACE_ADRRM));
		// マンションオーナーの場合
		if(JACStrConst.MANSOWN_PRC_GRP_CD.equals(prcGrpCd))
		{
			// サービス契約番号
			String svcKeiNo = dataMap.getString(ECH0101B010CBSMsg1List.SVC_KEI_NO);
			
			if (JACStrConst.MINYUKYO_SVCKEINO.equals(svcKeiNo))
			{
				value = "zzzzz";
			}
			else
			{
				if(JCHStringUtil.isNullBlank(kaisenPlaceAdrrm))
				{
					value = "     ";
				}
				else{
					value = String.format("%5s", kaisenPlaceAdrrm).replace(JACStrConst.SPACE_1, "0");
				}
			}
		}
		else
		{
			if(JCHStringUtil.isNullBlank(kaisenPlaceAdrrm))
			{
				value = "     ";
			}
			else{
				value = String.format("%5s", kaisenPlaceAdrrm).replace(JACStrConst.SPACE_1, "0");
			}
		}
		
		return value;
	}
	
	/**
	 * ソート条件７：お客さまIDを判定します
	 */
	private String getSortCustId(CAANMsg dataMap)
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 表示順
		String dspJun = dataMap.getString(ECH0101B010CBSMsg1List.DSP_JUN);
		String tmpvalue = String.format("%12s", dspJun).replace(JACStrConst.SPACE_1, "0").substring(0, 1);
		
		if("2".equals(tmpvalue))
		{
			value = dataMap.getString(ECH0101B010CBSMsg1List.SVC_KEI_NO);
		}
		else
		{
			value = JACStrConst.SVC_KEI_NO_SP;
		}
		
		return value;
	}
	
	/**
	 * ソート条件１０：消費税区分を判定します
	 */
	private String getSortTaxKbn(CAANMsg dataMap)
	{
		String value = JACStrConst.KARA_MOJI;
		
		// 料金項目コード
		String prcKmkCd = dataMap.getString(ECH0101B010CBSMsg1List.PRC_KMK_CD);
		
		value = prcKmkCd.substring(0, 1);
		
		return value;
	}
	// ANK-4317-00-00 ADD END
}
