/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCHCommonFormatUtil
*   ソースファイル名：JCHCommonFormatUtil.java
*   作成者          ：富士通
*   日付            ：2012年06月08日
*＜機能概要＞
*   請求収納システム共通編集クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v3.00.00    2012/06/08   FJ          新規作成
*	v4.00		2012/12/22   FJ）後藤	 formatSeiriNo（整理番号編集）をJCHbatSeikyKaknoBusinessUtilから移行
*	v5.00		2013/06/29   FJ) 早崎	【XXX-2013-XXXXXXX】getBcutStr(指定バイト数切り出し文字列取得部品)追加
*	v5.01		2013/07/02   FJ）林	    【LT-2013-0000205】バッチ用の印刷用住所編集処理部品（JCHbatAddressEdit.java）を移動
*	v5.02		2013/09/27   FJ）垣内	【OM-2013-0002587】OCR番号のバージョン情報を取り除く
*	v5.03		2013/09/27   FJ）伊藤	【OM-2013-0002625】住所編集時、建物名と部屋番号の前に全角スペースを挿入する
*	v6.00		2013/12/03   FJ) 早崎	【OM-2013-0004828】請求書発行シーケンス取得処理にて比較対象を請求書発行シーケンスの1桁目のみとする
*	v8.00.00	2013/12/16   FJ）小野	【ANK-1584-00-00】サービス詳細識別番号編集メソッド(formatSvcDtlSkbtNo)を追加。
*	v8.00.01	2014/02/14   FJ) 林	    【OM-2013-0005255】料金調整画面、請求作成機能追加。バッチの請求方法コード判定処理を移動。
*	v8.00.02	2014/02/20   FJ) 林     【OM-2014-0000814】抱き合わせ。請求書固定明細作成機能追加。
*	v8.00.03	2014/03/12   FJ) 林		【TG1-2014-0000004】消費税に伴う料金施策（増税対応）
*	v9.00.00	2014/04/21   FJ) 林		【OM-2014-0001510】EANバーコード印紙フラグ設定不備対応
*   v16.00.00   2015/05/26   FJ) 田枝   【ANK-2480-00-00】新電力対応(通信量編集後に単位の置換を行う処理を追加)
*	v36.00.00	2016/12/25   FJ）清原   【ANK-3296-00-00】標準工事費分割請求
*	v52.00.00	2020/10/26   FJ）鈴木   【ANK-3838-00-00】窓口払い手数料の顧客負担方式導入
*	v52.00.01	2021/01/09   FJ）星野   【ANK-3838-32-00】コンビニ会社コードの４分割化
*	v54.00.00	2021/09/01	 FJ) 西窪	【ANK-4102-00-00】窓口払い手数料の顧客負担方式導入 STEP3
*	v54.00.01	2021/09/01	 FJ) 西窪	【IT2-2021-0000029】EANバーコード設定値修正
*	v54.00.02	2021/10/01	 FJ) 山地	【ANK-4068-00-00】IBUKI：020番号の14桁化対応
*	v57.00.00	2022/02/25   FJ）西窪	【ANK-4206-00-00】請求書再発行時の発行回数改善対応
*	v59.00.00	2022/07/15	 FJ) 西窪	【OM-2022-0001026】請求金額30万円以上の請求書再発行でシステムエラー
**********************************************************************/
package eo.common.util;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.fujitsu.futurity.common.JCCWebAddTrnId;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;

import eo.common.constant.JACStrConst;


/**
 * 請求収納システム共通編集クラスです。<p>
 * <BR>
 * @ author 富士通
 */
public class JCHCommonFormatUtil {

	// ▼▼ 通信量編集 ▼▼
	
	/** 退避．通信量桁あふれチェック値 */
	private BigDecimal tmpTsryoDgtChkValue = BigDecimal.ZERO;
	
	/** 退避．通信量桁あふれ付加文字 */
	private String tmpTsryoDgtChoDsp = null;
	
	/** 退避．通信量付加文字 */
	private String tmpTsryoDsp = null;
	
	/** 退避．通信量文字数 */
	private int tmpTsryoDspLen = 0;
	
// v16.00.00 ADD START
	/** 退避．電気使用量付加文字 */
	private String tmpDenkiryoDsp = null;
// v16.00.00 ADD END
	
	/** 印紙税対象金額 */
	private String inshiTaxTgAmnt = null;
	// ANK-3838-00-00 DEL START
//	/** メーカーコード（通常） */
//	private String makerCodeNormal = null;

//	/** 会社コード（通常） */
//	private String compCodeNormal = null;
	
//	/** メーカーコード（リアル） */
//	private String makerCodeReal = null;

//	/** 会社コード（リアル） */
//	private String compCodeReal = null;
	// ANK-3838-00-00 DEL END
	
	/** 呼び出し元 */
	private String caller = null;
	
	/** 固定値：-1 */
	private static final BigDecimal MINUS_ONE = new BigDecimal("-1");
	
	/** 半角英数字⇒全角英数字変換用文字 */
	private static final char[][] ZEN_TO_HAN_CHG_MOJI = 
	{
		{'A', 'Ａ'}, {'B', 'Ｂ'}, {'C', 'Ｃ'}, {'D', 'Ｄ'}, {'E', 'Ｅ'}, {'F', 'Ｆ'}, {'G', 'Ｇ'}, {'H', 'Ｈ'}, {'I', 'Ｉ'}, {'J', 'Ｊ'}, {'K', 'Ｋ'}, {'L', 'Ｌ'}, {'M', 'Ｍ'}, {'N', 'Ｎ'},
		{'O', 'Ｏ'}, {'P', 'Ｐ'}, {'Q', 'Ｑ'}, {'R', 'Ｒ'}, {'S', 'Ｓ'}, {'T', 'Ｔ'}, {'U', 'Ｕ'}, {'V', 'Ｖ'}, {'W', 'Ｗ'}, {'X', 'Ｘ'}, {'Y', 'Ｙ'}, {'Z', 'Ｚ'}, 
		{'a', 'ａ'}, {'b', 'ｂ'}, {'c', 'ｃ'}, {'d', 'ｄ'}, {'e', 'ｅ'}, {'f', 'ｆ'}, {'g', 'ｇ'}, {'h', 'ｈ'}, {'i', 'ｉ'}, {'j', 'ｊ'}, {'k', 'ｋ'}, {'l', 'ｌ'}, {'m', 'ｍ'}, {'n', 'ｎ'}, 
		{'o', 'ｏ'}, {'p', 'ｐ'}, {'q', 'ｑ'}, {'r', 'ｒ'}, {'s', 'ｓ'}, {'t', 'ｔ'}, {'u', 'ｕ'}, {'v', 'ｖ'}, {'w', 'ｗ'}, {'x', 'ｘ'}, {'y', 'ｙ'}, {'z', 'ｚ'},
		{'0', '０'}, {'1', '１'}, {'2', '２'}, {'3', '３'}, {'4', '４'}, {'5', '５'}, {'6', '６'}, {'7', '７'}, {'8', '８'}, {'9', '９'}
	};
	
	/** 半角文字⇒全角文字変換用文字 */
	private static final char[][] HAN_TO_ZEN_CHG_MOJI =
	{
		{'!', '！'}, {'\"', '”'}, {'#', '＃'}, {'$', '＄'}, {'%', '％'}, {'&', '＆'}, {'\'', '’'}, {'(', '（'}, {')', '）'}, {'^', '＾'}, {'\\', '￥'}, {'=', '＝'}, {'~', '￣'},
		{'|', '｜'}, {'@', '＠'}, {'[', '［'}, {';', '；'}, {':', '：'}, {']', '］'}, {',', '，'}, {'.', '．'}, {'/', '／'}, {'`', '‘'}, {'{', '｛'}, {'+', '＋'}, {'*', '＊'}, {'}', '｝'}, 
		{'<', '＜'}, {'>', '＞'}, {'?', '？'}, {'_', '＿'}, {'･', '・'}, {' ', '　'}
	};
	
	/** 空文字 */
	private static final String BLANK = "";
	
	/** 利用期間文字変換前の文字セット */
	private static final String[] CONV_RIYO_KIKAN_BF = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " ", "-"};
	
	/** 利用期間文字変換後の文字セット */
	private static final String[] CONV_RIYO_KIKAN_AF = {"０", "１", "２", "３", "４", "５", "６", "７", "８", "９", "　", "‐"};
	
	// ANK-3838-00-00 ADD START	
	/** メーカーコード（さくらＫＣＳ）（顧客負担：通常） */
	private String makerCodeNormalCust = null;
	
	/** メーカーコード（さくらＫＣＳ）（顧客負担：リアル） */
	private String makerCodeRealCust = null;
	
	/** メーカーコード（さくらＫＣＳ）（企業負担：通常） */
	private String makerCodeNormalComp = null;
	
	/** メーカーコード（さくらＫＣＳ）（企業負担：リアル） */
	private String makerCodeRealComp = null;
	
// ANK-3838-32-00対応 20210109 星野 MOD START
//	/** 会社コード（さくらＫＣＳ）（通常） */
//	private String compCodeNormalSakura = null;
//
//	/** 会社コード（さくらＫＣＳ）（リアル） */
//	private String compCodeRealSakura = null;
	
	/** 会社コード（さくらＫＣＳ）（顧客負担：通常） */
	private String compCodeNormalCust = null;

	/** 会社コード（さくらＫＣＳ）（顧客負担：リアル） */
	private String compCodeRealCust = null;

	/** 会社コード（さくらＫＣＳ）（企業負担：通常） */
	private String compCodeNormalComp = null;
	
	/** 会社コード（さくらＫＣＳ）（企業負担：リアル） */
	private String compCodeRealComp = null;
// ANK-3838-32-00対応 20210109 星野 MOD END
	
	// ANK-3838-00-00 ADD END
	// ▲▲ 通信量編集 ▲▲
	
	// ▼▼ DBアクセス部品 ▼▼
	
	/**
	 * データ有効フラグ
	 */
	private static final String YUKO_FLG = "MK_FLG" ;
	
	/**
	 * データ有効フラグ（有効）
	 */
	private static final String YUKO = "0" ;
	
	/**
	 * 業務パラメータＩＤ
	 */
	private static final String WORK_PARAM_ID = "WORK_PARAM_ID" ;
	
	/**
	 * 業務パラメータ適用開始年月日
	 */
	private static final String WORK_PARAM_TSTAYMD = "WORK_PARAM_TSTAYMD" ;
	
	/**
	 * 業務パラメータ適用終了年月日
	 */
	private static final String WORK_PARAM_TENDYMD = "WORK_PARAM_TENDYMD" ;

	/** 編集結果（正常） */ 
	public static final String EDIT_RESULT_NORMAL = "0";
	
	/** 編集結果（折返し発生） */ 
	public static final String EDIT_RESULT_ORIKAESHI = "1";
	
	/** 編集結果（字数・行数オーバー） */ 
	public static final String EDIT_RESULT_CNT_OVER = "2";

	/** 折返し有無（折返しなし） */
	private static final int ORIKAESHI_UMU_NSI = 0;
	
	/** 折返し有無（折返しあり） */
	private static final int ORIKAESHI_UMU_ARI = 1;
	
	/** 空白削除コード（前後空白削除） */
	private static final int TRIM_CD_FR = 0;
	
	/** 空白削除コード（後空白のみ削除） */
	private static final int TRIM_CD_R = 1;
	
	/** 全角スペース */
	private static final String SPACE = "　";
	
	/** 行末連続全角スペース置換用 */
	private static final String SEQ_SPACE_END = "[　]{2,}$";
	
	// インデックス
	/** 編集後住所配列インデックス（結果） */
	private static final int INDEX_EDIT_ADDR_ARRAY_RESULT = 0;
	
	/** 編集後住所配列インデックス（住所要素開始インデックス） */ 
	private static final int INDEX_EDIT_ADDR_ARRAY_ADDR_STA = 1;
	
	/** ルールリストインデックス（住所項目） */
	private static final int INDEX_RULE_LIST_ADDR = 1;
	
	/** ルールリストインデックス（印刷欄行） */
	private static final int INDEX_RULE_LIST_PRINT_GYO = 2;
	
	/** ルールリストインデックス（折返し有無） */
	private static final int INDEX_RULE_LIST_ORIKAESHI_UMU = 3;
	
	/** ルールリストインデックス（最大文字数） */
	private static final int INDEX_RULE_LIST_ROW_STR_CNT = 4;
	
	/** ルールリスト */
	private int[][] RULE_LIST = null;
	
	/** 住所項目：建物名 */
	private static final int ADDR_BUILD_NAME = 5;
	
	/** 住所項目：部屋番号 */
	private static final int ADDR_ROOM_NO = 6;
	
	// IT2-2021-0000029 DEL START
//	// ANK-4102-00-00 ADD START
//	/**
//	 * 請求書再発行確認画面の画面ID
//	 */
//	public static final String SCREEN_ID_CHW00107 = "CHW00107";
//	
//	/**
//	 * 随時請求書登録確認画面の画面ID
//	 */
//	public static final String SCREEN_ID_CHW00902 = "CHW00902";
//
//	/**
//	 * 請求書分割発行確認画面の画面ID
//	 */
//	public static final String SCREEN_ID_CHW02202 = "CHW02202";
//
//	// ANK-4102-00-00 ADD END
	// IT2-2021-0000029 DEL END

	// ▲▲ DBアクセス部品 ▲▲

	/**
	 * コンストラクタ<br>
	 */
	public JCHCommonFormatUtil()throws Exception
	{
	}

	/**
	 * コンストラクタ<br>
     * @param caller 呼出し元
	 * @param con DBコネクション
	 * @param opeDate 運用日
	 */
	public JCHCommonFormatUtil(String caller, Connection con, String opeDate)throws Exception
	{
		// 業務パラメータ取得
		this.inshiTaxTgAmnt			= JCHStampDutyUtil.getTaxableAmount(caller, con, opeDate);
		// ANK-3838-00-00 MOD START
//		this.makerCodeNormal		=  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_MAKER_CODE_NORMAL, opeDate);
//		this.compCodeNormal		    =  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_COMP_CODE_NORMAL, opeDate);
//		this.makerCodeReal		    =  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_MAKER_CODE_REAL, opeDate);
//		this.compCodeReal		    =  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_COMP_CODE_REAL, opeDate);
		this.caller					=  caller;

		this.makerCodeNormalCust	=  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_MAKER_NCU_SAKURA, opeDate);
		this.makerCodeRealCust	    =  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_MAKER_RCU_SAKURA, opeDate);
		this.makerCodeNormalComp	=  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_MAKER_NCO_SAKURA, opeDate);
		this.makerCodeRealComp	    =  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_MAKER_RCO_SAKURA, opeDate);
// ANK-3838-32-00対応 20210109 星野 MOD START
//		this.compCodeNormalSakura	=  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_COMP_NOR_SAKURA, opeDate);
//		this.compCodeRealSakura	    =  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_COMP_REA_SAKURA, opeDate);
		this.compCodeNormalCust	=  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_COMP_NCU_SAKURA, opeDate);
		this.compCodeRealCust	    =  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_COMP_RCU_SAKURA, opeDate);
		this.compCodeNormalComp	=  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_COMP_NCO_SAKURA, opeDate);
		this.compCodeRealComp	    =  this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_COMP_RCO_SAKURA, opeDate);
// ANK-3838-32-00対応 20210109 星野 MOD END
		// ANK-3838-00-00 MOD END
	}
	
	/**
	 * コンストラクタ<br>
	 * @param con DBコネクション
	 * @param opeDate 運用日
	 */
	public JCHCommonFormatUtil(Connection con, String opeDate)throws Exception
	{
		// 業務パラメータ取得
		this.tmpTsryoDgtChkValue 	= new BigDecimal(this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_TSRYO_DGT_CHK, opeDate));	// 通信量桁あふれチェック値
		this.tmpTsryoDgtChoDsp 		= this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_TSRYO_DGT_CHO_DSP, opeDate);				// 通信量桁あふれ付加文字
		this.tmpTsryoDsp 			= this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_TSRYO_DSP, opeDate);						// 通信量付加文字
		this.tmpTsryoDspLen 		= Integer.parseInt(this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_TSRYO_DSP_LEN, opeDate));	// 通信量文字数
// v16.00.00 ADD START
		this.tmpDenkiryoDsp 		= this.getWorkParamSetteValue(con, JACStrConst.WKPARA_CH_DENKIRYO_DSP, opeDate);						// 電気使用量付加文字
// v16.00.00 ADD END
	}

	/**
	 * コンストラクタ<br>
	 * @param workParam 業務パラメータ設定値配列
	 */
	public JCHCommonFormatUtil(String[] workParam)throws Exception
	{
		// 業務パラメータ取得
		this.tmpTsryoDgtChkValue 	= new BigDecimal(workParam[0]);		// 通信量桁あふれチェック値
		this.tmpTsryoDgtChoDsp 		= workParam[1];						// 通信量桁あふれ付加文字
		this.tmpTsryoDsp 			= workParam[2];						// 通信量付加文字
		this.tmpTsryoDspLen 		= Integer.parseInt(workParam[3]);	// 通信量文字数
	}

	/**
	 * 指定された金額を通信量に編集します。
	 * @param arg0 通信量用金額	
	 * @param arg1 埋込み料金名称文字付加コード
	 * @return ArrayList<String> [0]:通信量桁あふれ付加文字、[1]:編集後の文字列
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	public ArrayList<String> formatTushin(String arg0, String arg1) throws Exception
	{
		// リスト生成
		ArrayList<String> list = new ArrayList<String>();
		list.add(JACStrConst.KARA_MOJI);
		list.add(JACStrConst.KARA_MOJI);
		
		// 通信量用金額退避
		String amnt = arg0;
		 
		// 通信量用金額退避 ＝ null の場合
		if(amnt == null)
		{
			// 退避．通信量用金額　←　全角空白1桁 
			amnt = JACStrConst.FULL_SPACE_1;
		}
		else
		{
		//  「埋込み料金名称文字付加コード」 ＝ "01"（「超」を付加する） の場合
			if(JACStrConst.UMKM_PRC_NM_MOJI_HUKA_CD_OVER.equals(arg1))
			{
				// 「退避．通信量用金額の絶対値」 ＞ 退避．通信量桁あふれチェック値 の場合
				
				BigDecimal bdAmnt = new BigDecimal(amnt);
				if(bdAmnt.abs().compareTo(this.tmpTsryoDgtChkValue) > 0)
				{
					// 退避．編集エリアリスト[11]　←　退避．通信量桁あふれ付加文字
					list.set(0, this.tmpTsryoDgtChoDsp);
					// 退避．通信量用金額 ＞ 0 の場合
					if(bdAmnt.compareTo(BigDecimal.ZERO) > 0)
					{
						// 退避．通信量用金額　←　退避．通信量桁あふれチェック値
						amnt = this.tmpTsryoDgtChkValue.toString();
					}
					// 退避．通信量用金額 ＜ 0 の場合
					else if(bdAmnt.compareTo(BigDecimal.ZERO) < 0)
					{
						// 退避．通信量用金額　←　退避．通信量桁あふれチェック値 × -1
						amnt = this.tmpTsryoDgtChkValue.multiply(MINUS_ONE).toString();
					}
				}
			}
			// 共通部品「文字列書式変換部品」の数値書式編集処理メソッドを呼び出す。（-999999⇒-999,999）
			amnt = JPCUtilCommon.formatNumber(amnt);
			
			// 共通部品「請求収納業務共通部品」の半角全角変換メソッドを呼び出す。（-999,999⇒−９９９，９９９）
			amnt = formatHanToZen(amnt, JACStrConst.HAN_TO_ZEN_SUCHI);
			
		}
		// 共通部品「文字列編集部品」の全角空白文字充填処理メソッドを呼び出す。
		amnt = JPCUtilCommon.fillSpace(amnt, this.tmpTsryoDspLen, false);
		
		// 編集後の文字列 ＋ 退避．通信量付加文字（「−−−−，−−−ＭＢ」形式変換）
		StringBuffer strBuf = new StringBuffer();
		strBuf.append(amnt);
		strBuf.append(this.tmpTsryoDsp);
		amnt = strBuf.toString();
		// リスト[1] ← 編集後の文字列
		list.set(1, amnt);
		
		return list;
	}

// v16.00.00 ADD START
	/**
	 * 指定された金額を通信量編集後、料金グループコードにより単位を置換します。
	 * @param arg0 通信量用金額	
	 * @param arg1 埋込み料金名称文字付加コード
	 * @param arg2 料金グループコード
	 * @return ArrayList<String> [0]:通信量桁あふれ付加文字、[1]:編集後の文字列
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	public ArrayList<String> formatTushinTaniTikan(String arg0, String arg1, String arg2) throws Exception
	{
		// 通信量編集処理 formatList[0]⇒桁あふれ付加文字(超)、formatList[1]⇒使用量＋単位(○○ＭＢ）
		ArrayList<String> formatList = this.formatTushin(arg0, arg1);
		if (formatList != null && 1 < formatList.size() && formatList.get(1) != null && arg2 != null)
		{
			// 使用量＋単位(○○ＭＢ）
			String formatAmnt = formatList.get(1);
			
			// 料金グループコードが「17(ｅｏ電気サービス)」
			if (JACStrConst.PRC_GRP_CD_DENKI.equals(arg2))
			{
				//「−−−−，−−−ＭＢ」の「ＭＢ」を「ｋＷｈ」に置換する
				formatList.set(1, formatAmnt.replace(this.tmpTsryoDsp, this.tmpDenkiryoDsp));
			}
		}
		
		return formatList;
	}
// v16.00.00 ADD END

	/**
	 * サービス詳細識別番号（電話番号）を編集します。
	 * 第1引数の文字列が11文字の場合、「999-9999-9999」形式に編集します。
	 * 第1引数の文字列が14文字の場合、「999-9999-9999999」形式に編集します。
	 * 第1引数の文字列は半角文字を想定するものとする。
	 * @param inSvcDtlSkbtNo 編集前の文字列
	 * @return 編集後の文字列
	 */
	public static String formatSvcDtlSkbtNo(String inSvcDtlSkbtNo) throws Exception
	{
		// 引数文字列がnullまたは空文字の場合、空文字をリターンする。
		if (JCRUtilCommon.isNull(inSvcDtlSkbtNo))
		{
			return "";
		}

//ANK-4068-00-00 MOD START
//		// 引数文字列が11文字でない場合、引数文字列をそのままリターンする。
//		if (inSvcDtlSkbtNo.length() != 11)
		// 引数文字列が「11文字、14文字」でない場合、引数文字列をそのままリターンする。
		if (inSvcDtlSkbtNo.length() != 11 && inSvcDtlSkbtNo.length() != 14)
//ANK-4068-00-00 MOD END
		{
			return inSvcDtlSkbtNo;
		}

		String retString1 = inSvcDtlSkbtNo.substring(0, 3);
		String retString2 = inSvcDtlSkbtNo.substring(3, 7);
//ANK-4068-00-00 MOD START
//		String retString3 = inSvcDtlSkbtNo.substring(7, 11);
		// 引数文字列の8文字目以降を取得する。引数文字列が11文字の場合は8文字目から11文字目、引数文字列が14文字の場合は8文字目から14文字目までを取得する
		String retString3 = inSvcDtlSkbtNo.substring(7);
//ANK-4068-00-00 MOD END

		StringBuilder retStr = new StringBuilder();

		retStr.append(retString1)
				.append(JACStrConst.HYPHEN)
				.append(retString2)
				.append(JACStrConst.HYPHEN)
				.append(retString3);

		// 半角全角変換メソッドを呼び出し、リターン。
		return formatHanToZen(retStr.toString(), JACStrConst.HAN_TO_ZEN_SUCHI);
	}

	/**
	 * 半角文字列を全角文字に変換して返します。
	 * @param arg0 対象文字列
	 * @param arg1 変換用文字列（数値："−" 文字列："‐"）
	 * @return 編集後の文字列
	 * @throws Exception 例外が発生した場合
	 */
//v16.00.00 2015/06/04 Mod Start
	//private static String formatHanToZen(String arg0, String arg1) throws Exception
	public static String formatHanToZen(String arg0, String arg1) throws Exception
//v16.00.00 2015/06/04 Mod End
	{
		String rtnStr = arg0;

		if(rtnStr != null)
		{
			// 半角英数字を全角英数字文字に変換
			for(char[] pattern : ZEN_TO_HAN_CHG_MOJI)
			{
				rtnStr = rtnStr.replace(pattern[0], pattern[1]);
			}
			// 半角文字を全角文字に変換
			for(char[] pattern : HAN_TO_ZEN_CHG_MOJI)
			{
				rtnStr = rtnStr.replace(pattern[0], pattern[1]);
			}
			// ハイフンを指定の文字列に変換
			rtnStr = rtnStr.replace(JACStrConst.HYPHEN, arg1);
			// 半角カナを全角カナに変換
			rtnStr = JPCUtilCommon.convHalfToFullByKata(rtnStr);
		}
		return rtnStr;
	}

	/**
	 * 業務パラメータ管理スキーマの業務パラメータ設定値を取得します。
	 * @param con         DBコネクション
	 * @param workParamId 業務パラメータＩＤ
	 * @param opeDate     バッチ運用日
	 * @return String     業務パラメータ設定値
	 * @throws Exception 業務パラメータ設定値の取得に失敗した場合
	 */
	private String getWorkParamSetteValue(Connection con, String workParamId, String opeDate) throws Exception 
	{
		
		// コネクションチェック
		if (con == null) {
			throw new Exception("Connectionがnullです。");
		}
		
		String wkVal = null;
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT ");
		sql.append(" WORK_PARAM_SETTE_VALUE ");
		sql.append(" FROM ").append("ZM_M_WORK_PARAM_KNRI");
		sql.append(" WHERE " + WORK_PARAM_ID + "=").append("'").append(workParamId).append("'");
		sql.append(" AND " + WORK_PARAM_TSTAYMD + "<=").append(opeDate);
		sql.append(" AND " + WORK_PARAM_TENDYMD + ">=").append(opeDate);
		sql.append(" AND " + YUKO_FLG + "=" + YUKO);
		
		Statement stmt = null;
		ResultSet rs = null;
		// コネクションからステートメントを取得する
		try {
			stmt = con.createStatement();
			
			// SQLを発行
			rs = stmt.executeQuery(sql.toString());
			
			if (rs.next()) {
				// 値の取得
				wkVal = rs.getString("WORK_PARAM_SETTE_VALUE");
			} else {
				throw new Exception(workParamId+":業務パラメータＩＤ");
			}
			
		} catch (SQLException e) {
			throw new Exception(workParamId+":業務パラメータＩＤ",e);
		} finally {
			
			if (stmt != null) {
				stmt.close();
			}
			if (rs != null) {
				rs.close();
			}
		}
		return wkVal;
	}

	/**
	 * 指定された整理番号をxxxxxxxxxx-xxxx形式に編集します。
	 * ※ 下4桁はゼロサプレスされます。
	 * 形式不正の場合、入力をそのまま返却します。
	 * 
	 * @param arg0 対象文字列
	 * @return String[] 編集後の文字列
	 * @throws Exception
	 */
	public static String formatSeiriNo(String arg0) throws Exception
	{
		// 整理番号の確認
		// 整理番号 = null もしくは 整理番号．サイズ = 0 の場合
		if(arg0 == null || arg0.length() == 0)
		{
			return arg0;
		}
		// 整理番号．サイズ != 0 の場合
		else if(arg0.trim().length() != 14)
		{
			return arg0;
		}
		
		StringBuffer strBuf = new StringBuffer();
		strBuf.append(arg0.substring(0, 10));
		strBuf.append(JACStrConst.HYPHEN);
		strBuf.append(toZeroSuppress(arg0.substring(10, 14)));
		
		return strBuf.toString();
	}
	
	/**
	 * 対象文字列に対しゼロサプレスを行います。
	 * ※ NULLを引数に渡すことはできません。
	 * ※ 対象文字列が数値のみで構成されていること。
	 * 
	 * @param pData 対象文字列
	 * @return ゼロサプレス後の文字列
	 */
	public static String toZeroSuppress(String pData)
	{
		Pattern ptn = Pattern.compile("^0+([0-9]+.*)");
		Matcher m = ptn.matcher(pData);
		
		if (m.matches())
		{
			return m.group(1);
		}
		else
		{
			return pData;
		}
	}

	/**
	 * NULLを空文字に置き換える
	 * 
	 * @param obj null又は文字列
	 * @param str 置換文字列
	 * @return 文字列
	 */
	private static String replaceNull(Object obj, String str)
	{
		if (obj == null)
		{
			return str;
		}
		else
		{
			return obj.toString();
		}
	}

	/**
	 * 利用期間の文字列を変換する(半角→全角)
	 * 
	 * @param riyoKikan 変換前利用期間
	 * @return 変換後利用期間
	 */
	public static String convRiyoKikan(String riyoKikan)
	{
		StringBuilder riyoKikanAf = new StringBuilder();
		String riyoKikanBf = replaceNull(riyoKikan, BLANK);
		char[] chars = riyoKikanBf.toCharArray();

		// 文字数分繰り返し
		for (int i = 0; i < chars.length; i++)
		{
			// 1文字分取り出し
			String value = String.valueOf(chars[i]);
			
			// 変換済フラグをリセット
			boolean convFlg = false;
			
			// 変換対象文字数文繰り返し
			for(int j = 0; j < CONV_RIYO_KIKAN_BF.length; j++)
			{
				// 変換対象文字列かどうか判定
				if (value.equals(CONV_RIYO_KIKAN_BF[j]))
				{
					// 変換対象の場合、変換後文字を追加する
					riyoKikanAf.append(CONV_RIYO_KIKAN_AF[j]);
					
					// 変換済に設定
					convFlg = true;
					break;
				}
			}
			// 変換済みかどうか判定
			if (!convFlg)
			{
				// 変換済みでない場合、元の文字を追加
				riyoKikanAf.append(value);
			}
		}
		return riyoKikanAf.toString();
	}

	 /**
	 * <p>
	 * 請求書発行シーケンス取得処理
	 * 再発行・随時請求書発行を合わせた回数を取得し発行シーケンスを採番し返却する。
	 * </p>
	 * @param seikyKeiNo  請求契約番号
	 * @param seikyYm     請求年月
	 * @param opedate     運用日
	 * @param hakkoKbn    発行区分("1":再発行、随時請求 それ以外:SMAPS即時決済)
	 * @return 請求書発行シーケンス
	 */
	// ANK-4206-00-00 MOD START
	//public static int getSksHakkoSeq(String seikyKeiNo, String seikyYm, String opeDate)
	public static int getSksHakkoSeq(String seikyKeiNo, String seikyYm, String opeDate, String hakkoKbn)
	// ANK-4206-00-00 MOD END
	{
		// コネクション
		Connection con = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		// 請求書発行シーケンス
		int sksHakkoSeq = 0;
		// 請求書発行シーケンス最大値
		int maxSksHakkoSeq = 0;

		try{
			con = JSYejbConnection.getConnection("CH_T_SEIKY");
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append(" SELECT ")
					.append("     CH0051.SKS_HAKKO_SEQ ")
					.append("   FROM ")
					.append("     CH_T_SEIKY CH0051 ")
					.append("  WHERE ")
					.append("        CH0051.SEIKY_KEI_NO = ? ")
					.append("    AND CH0051.SEIKY_YM = ? ")
					.append("    AND CH0051.SEIKY_SBT_CD in ('1', '3') ")
					// ANK-4206-00-00 MOD START
					//.append("    AND CH0051.MK_FLG = '0' ")
					.append("    AND CH0051.MK_FLG = '0' ");
					if("1".equals(hakkoKbn))
					{
						// OM-2022-0001026 MOD START
						//sql_Buff.append("    AND (SUBSTR (CH0051.EAN_BARCODE,18,1) in ('1','2','3','4','5','7','8','9') ")
						//		.append("    OR CH0051.EAN_BARCODE IS NULL) ");
						sql_Buff.append("    AND (SUBSTR (CH0051.OCR_BARCODE,19,1) in ('1','2','3','4','5','7','8','9') ")
						.append("    OR CH0051.OCR_BARCODE IS NULL) ");
						// OM-2022-0001026 MOD END
					}
					else
					{
						// OM-2022-0001026 MOD START
						//sql_Buff.append("    AND SUBSTR (CH0051.EAN_BARCODE,18,1) = '6' ");
						sql_Buff.append("    AND SUBSTR (CH0051.OCR_BARCODE,19,1) = '6' ");
						// OM-2022-0001026 MOD END
					}
					//.append("  ORDER BY ")
			sql_Buff.append("  ORDER BY ")
					// ANK-4206-00-00 MOD END
					.append("     CH0051.SEIKY_NO DESC ");

			// prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			CAANJDBCUtil.setParam(pstmt, 1, seikyKeiNo);
			CAANJDBCUtil.setParam(pstmt, 2, seikyYm);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			if (rsltQuery.next())
			{
				if (!JPCCommonUtil.isNull(rsltQuery.getString("SKS_HAKKO_SEQ")))
				{
					sksHakkoSeq = Integer.parseInt(rsltQuery.getString("SKS_HAKKO_SEQ").substring(1));
				}
			}

			// 請求書発行シーケンス最大値取得
			String setteValue = getWorkParamSetteValue(JACStrConst.WKPAR_CH_SKS_HAKKO_SEQ_MAX, opeDate);
			
			if (!JPCCommonUtil.isNull(setteValue))
			{
				maxSksHakkoSeq = Integer.parseInt(setteValue);
			}

			if (sksHakkoSeq < maxSksHakkoSeq)
			{
				// 最大値未満の場合 1カウントアップ
				sksHakkoSeq = sksHakkoSeq + 1 ;
			}
			else
			{
				// 最大値以上の場合 1
				sksHakkoSeq = 1 ;
			}

			return sksHakkoSeq;

		} catch(SQLException e) {
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con != null){
					CAANConnectionMgr.getInstance().close(con);
				}
			}catch(SQLException e){
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	 * OCR情報の取得を行います。
	 * 
	 * @param seikyYM     請求年月(yyyyMM)
	 * @param seikykeiNo  請求契約番号
	 * @param sksHakkoSeq 発行シーケンス(1桁)
	 * @param seikyAmnt   請求金額
	 * @param opedate     運用日
	 * 
	 * @return OCR情報リスト
	 * 
	 * @throws Exception 例外が発生した場合
	 */
	// ANK-4206-00-00 MOD START
	//public ArrayList<String> getOcrInf(String seikyYM, String seikykeiNo, int sksHakkoSeq, Long seikyAmnt, String opedate) throws Exception
	public ArrayList<String> getOcrInf(String seikyYM, String seikykeiNo, int sksHakkoSeq, Long seikyAmnt, String opedate, String eanGunNo) throws Exception
	// ANK-4206-00-00 MOD END
	{
		ArrayList<String> ocrInfoList = new ArrayList<String>();

		// ANK-4206-00-00 ADD START
		// 群番号
		String gunNo = JACStrConst.GUN_NO;
		if(null != eanGunNo)
		{
			gunNo = eanGunNo;
		}
		// ANK-4206-00-00 ADD END
		
		ocrInfoList.add(seikyYM.substring(2, 6));                                           // 請求年月(YYMM)
		ocrInfoList.add(seikykeiNo);                                                        // 請求契約番号
		ocrInfoList.add(opedate.substring(4, 6));                                           // 発行月
		ocrInfoList.add(JPCUtilCommon.fillZero(Integer.toString(sksHakkoSeq), 2 ,false));  // 発行シーケンス
		// ANK-4206-00-00 MOD START
		//ocrInfoList.add(JACStrConst.GUN_NO);                                                // 群番
		ocrInfoList.add(gunNo); 
		// ANK-4206-00-00 MOD END
		ocrInfoList.add(JPCEditString.fillZero(seikyAmnt.toString(), 12, false));          // 請求金額

		// チェックディジット算出
		int intChkdigt = getChkdigitOCR(listToString(ocrInfoList));

		ocrInfoList.add(Integer.toString(intChkdigt));                                      // チェックディジット

		return ocrInfoList;
	}

	/**
	 * OCRチェックディジット算出処理
	 * 
	 * @param checkString チェック対象文字列
	 * @return チェックディジット
	 * @throws Exception 例外が発生した場合
	 */
	public static int getChkdigitOCR(String checkString) throws Exception
	{
		int oddTotal = 0;
		int evenTotal = 0;
		int value = 0;
		
		// 対象文字列
		for(int i = 0; i < checkString.length(); i++)
		{
			// 対象桁の値を取得
			value = Integer.parseInt(Character.toString(checkString.charAt(i)));

			if(i % 2 == 0)
			{
				// 奇数桁
				if(value >= 5)
				{
					// (対象桁数の値×2)の(1の位の値)＋(10の位の値)
					oddTotal += (value * 2) % 10 + (value * 2) / 10;
				}
				else
				{
					oddTotal += value * 2;
				}
			}
			else
			{
				// 偶数桁
				evenTotal += value;
			}
		}

		// (奇数桁合計＋偶数桁合計)の1の位の値
		int intChkdigt = (oddTotal + evenTotal) % 10; 

		if(intChkdigt != 0)
		{
			intChkdigt = 10 - intChkdigt;
		}

		return intChkdigt;
	}

	/**
	 * EAN情報の取得を行います。
	 * 
	 * @param con               コネクション
	 * @param seikyYM           請求年月(yyyyMM)
	 * @param seikykeiNo        請求契約番号
	 * @param sksHakkoSeq       発行シーケンス(1桁)
	 * @param barcodeStyleCd    バーコード様式コード 
	 * @param limitYmd          取扱期限日
	 * @param limitEventCd      取扱期限日イベントコード
	 * @param seikyAmnt         請求金額
	 * @param opedate           運用日
	 * @param commisionFtnHsk   手数料負担方式
	 * @param eanGunNo          群番号
	 * 
	 * @return EAN情報リスト
	 * 
	 * @throws Exception 例外が発生した場合
	 */
	// ANK-3838-00-00 MOD START
//	public ArrayList<String> getEanInf(Connection con, String seikyYM, String seikykeiNo, String sksHakkoSeq, String barcodeStyleCd, String limitYmd, String limitEventCd, long seikyAmnt, String opeDate) throws Exception
	// ANK-4206-00-00 MOD START
	// public ArrayList<String> getEanInf(Connection con, String seikyYM, String seikykeiNo, String sksHakkoSeq, String barcodeStyleCd, String limitYmd, String limitEventCd, long seikyAmnt, String opeDate, String commisionFtnHsk) throws Exception
	public ArrayList<String> getEanInf(Connection con, String seikyYM, String seikykeiNo, String sksHakkoSeq, String barcodeStyleCd, String limitYmd, String limitEventCd, long seikyAmnt, String opeDate, String commisionFtnHsk, String eanGunNo) throws Exception
	// ANK-4206-00-00 MOD END
	// ANK-3838-00-00 MOD END
	{
		ArrayList<String> eanInfoList = new ArrayList<String>();
		StringBuffer eanInfo = new StringBuffer();

		String skbtsi = JACStrConst.KARA_MOJI;			// 識別子
		String makerCd = JACStrConst.KARA_MOJI;			// メーカーコード
		String compCd = JACStrConst.KARA_MOJI;			// 会社コード
		String seikyMonth = JACStrConst.KARA_MOJI;		// 請求月
		String seikyYear = JACStrConst.KARA_MOJI;		// 請求年
		String gunNo = JACStrConst.KARA_MOJI;			// 群番号
		String hakkoSeq = JACStrConst.KARA_MOJI;		// 発行シーケンス
		String seikyKeiNo = JACStrConst.KARA_MOJI;		// 請求契約番号
		String tratLimitYmd = JACStrConst.KARA_MOJI;	// 取扱期限日
		String inshiFlg = JACStrConst.KARA_MOJI;		// 印紙フラグ
		String amnt = JACStrConst.KARA_MOJI;			// 請求金額
		String chkdigt = JACStrConst.KARA_MOJI;			// チェックディジット

		// ANK-3838-00-00 MOD START
////		 請求金額1円以上100万円未満の場合
//		if(1 <= seikyAmnt && seikyAmnt < 1000000)
		//	 請求金額1円以上30万円以下の場合
		if(1 <= seikyAmnt && seikyAmnt <= 300000)
		// ANK-3838-00-00 MOD END
		{
			// 識別子
			skbtsi = JACStrConst.EAN_SKBTS;

			if (!JACStrConst.CALLER_BATCH.equals(this.caller))
			{
				/** オンラインの場合、業務パラメータ設定 **/
				setEanInfWorkParam(opeDate);
			}
		
			// ANK-3838-00-00 ADD START
			// 手数料負担方式が顧客負担の場合
			if(JACStrConst.FTN_HOSHIKI_KO.equals(commisionFtnHsk))
			{
			// ANK-3838-00-00 ADD END
				// メーカーコード・会社コード
				if(JACStrConst.BRCD_YSK_CD_NOMAL.equals(barcodeStyleCd))
				{
					// 通常の場合
					// ANK-3838-00-00 MOD START
//					makerCd = this.makerCodeNormal;
//					compCd = this.compCodeNormal;
					makerCd = this.makerCodeNormalCust;
// ANK-3838-32-00対応 20210109 星野 MOD START
//					compCd = this.compCodeNormalSakura;
					compCd = this.compCodeNormalCust;
// ANK-3838-32-00対応 20210109 星野 MOD END
					// ANK-3838-00-00 MOD END
				}
				else
					
				{
					// リアルの場合
					// ANK-3838-00-00 MOD START
//					makerCd = this.makerCodeReal;
//					compCd = this.compCodeReal;
					makerCd = this.makerCodeRealCust;
// ANK-3838-32-00対応 20210109 星野 MOD START
//					compCd = this.compCodeRealSakura;
					compCd = this.compCodeRealCust;
// ANK-3838-32-00対応 20210109 星野 MOD END
					// ANK-3838-00-00 MOD END
				}
			// ANK-3838-00-00 ADD START
			}
			// 手数料負担方式が企業負担
			else if(JACStrConst.FTN_HOSHIKI_KI.equals(commisionFtnHsk))
			{
				// メーカーコード・会社コード
				if(JACStrConst.BRCD_YSK_CD_NOMAL.equals(barcodeStyleCd))
				{
					// 通常の場合
					makerCd = this.makerCodeNormalComp;
// ANK-3838-32-00対応 20210109 星野 MOD START
//					compCd = this.compCodeNormalSakura;
					compCd = this.compCodeNormalComp;
// ANK-3838-32-00対応 20210109 星野 MOD END
				}
				else
				{
					// リアルの場合
					makerCd = this.makerCodeRealComp;
// ANK-3838-32-00対応 20210109 星野 MOD START
//					compCd = this.compCodeRealSakura;
					compCd = this.compCodeRealComp;
// ANK-3838-32-00対応 20210109 星野 MOD END
				}
			}
			
			// ANK-3838-00-00 ADD END

			// IT2-2021-0000029 DEL START
//			// ANK-4102-00-00 ADD START
//			// 共通メッセージからサービス呼び出し元の区分を取得する
//			HashMap<String, Object> commonMsg = JCCWebAddTrnId.get(JCMConstants.ADD_TRN_ID_MESSAGE_COMMON_MAP);
//			// 呼び出し元画面ID
//			String gamenId = (String)commonMsg.get(JCMConstants.INVOKE_GAMEN_ID_KEY);
//			
//			// 呼び出し元機能によって「請求月」「請求年」設定値を分ける
//			if(null != gamenId
//					&&(gamenId.startsWith(SCREEN_ID_CHW00107)
//							|| gamenId.startsWith(SCREEN_ID_CHW00902)
//							|| gamenId.startsWith(SCREEN_ID_CHW02202)))
//			{
//				// 請求月 ※運用日のMM(月)
//				seikyMonth = opeDate.substring(4, 6);
//				// 請求年 ※運用日のDD(日)を設定
//				seikyYear = opeDate.substring(6, 8);
//			}
//			else
//			{
//			// ANK-4102-00-00 ADD END
			// IT2-2021-0000029 DEL END
			// 請求月
			seikyMonth = seikyYM.substring(4, 6);
			// 請求年
			seikyYear = seikyYM.substring(2, 4);
			// IT2-2021-0000029 DEL START
//			// ANK-4102-00-00 ADD START
//			}
//			// ANK-4102-00-00 ADD END
			// IT2-2021-0000029 DEL END

			// 群番号
			// ANK-4206-00-00 ADD START
			if(null != eanGunNo)
			{
				gunNo = eanGunNo;
			}
			else
			{
			// ANK-4206-00-00 ADD END
				gunNo = JACStrConst.GUN_NO;
			// ANK-4206-00-00 ADD START
			}
			// ANK-4206-00-00 ADD END
			// 発行シーケンス
			hakkoSeq = sksHakkoSeq;
			// 請求契約番号
			seikyKeiNo = seikykeiNo;

			if (JACStrConst.CALLER_BATCH.equals(this.caller))
			{
				/** バッチの場合 **/
				if(!limitEventCd.trim().equals(JACStrConst.KARA_MOJI))
				{
					// EAN取扱期限日イベントコード≠""の場合、スケジュール定義より取得
					limitYmd = getEventYmd(con, seikyYM, limitEventCd);
				}
				else
				{
					// ANK-3838-00-00 MOD START
//					limitYmd =  "99999999";
					// 運用日(yyyyMM)
					String opeYm = JPCUtilCommon.addMonth(opeDate, 1).substring(0, 6);
					// 運用日の翌月末日
					limitYmd = opeYm + JPCUtilCommon.getEndOfMonth(opeYm);
					
					// ANK-3838-00-00 MOD END
				}
			}
			else
			{
				/** オンラインの場合 **/
				if(limitYmd.compareTo(JACStrConst.MAX_DATE) >= 0)
				{
					// ANK-3838-00-00 MOD START
//					limitYmd = "99999999";
					
					// 運用日(yyyyMM)
					String opeYm = JPCUtilCommon.addMonth(opeDate, 1).substring(0, 6);
					// 運用日の翌月末日
					limitYmd = opeYm + JPCUtilCommon.getEndOfMonth(opeYm);
					// ANK-3838-00-00 MOD END
				}
			}

			// 取扱期限日
			tratLimitYmd = limitYmd.substring(2,8);

			// 印紙フラグ
			if(seikyAmnt < Long.valueOf(this.inshiTaxTgAmnt))
			{
				inshiFlg = JACStrConst.INSHI_FLG_OFF; 
			}
			else
			{
				inshiFlg = JACStrConst.INSHI_FLG_ON;
			}

			amnt = JPCEditString.fillZero(String.valueOf(seikyAmnt), 6, false);

			eanInfo.append(skbtsi);			// 識別子
			eanInfo.append(makerCd);		// メーカーコード
			eanInfo.append(compCd);			// 会社コード
			eanInfo.append(seikyMonth);		// 請求月
			eanInfo.append(seikyYear);		// 請求年
			eanInfo.append(gunNo);			// 群番号
			eanInfo.append(hakkoSeq);		// 発行シーケンス
			eanInfo.append(seikyKeiNo);		// 請求契約番号
			eanInfo.append(hakkoSeq);		// 再発行区分（発行シーケンス）
			eanInfo.append(tratLimitYmd);	// 支払期限日
			eanInfo.append(inshiFlg);		// 印紙フラグ
			eanInfo.append(amnt);			// 請求金額

			chkdigt = getChkdigitEAN(eanInfo.toString()); // チェックディジット算出
		}
		// ANK-3838-00-00 MOD START
//		else if(1000000 <= seikyAmnt)
		else if(300000 < seikyAmnt)
		{
//			// 請求金額が100万円以上の場合
			// 請求金額が30万円超過の場合
			skbtsi = JACStrConst.EAN_SKBTS_XX;
		// ANK-3838-00-00 MOD END
		}

		if (JACStrConst.CALLER_BATCH.equals(this.caller))
		{
			/** バッチの場合 **/
			eanInfoList.add(fillHalfSpace(skbtsi, 2, true));			// 識別子
			eanInfoList.add(fillHalfSpace(makerCd, 6, true));			// メーカーコード
			eanInfoList.add(fillHalfSpace(compCd, 5, true));			// 会社コード
			eanInfoList.add(fillHalfSpace(seikyMonth, 2, true));		// 請求月
			eanInfoList.add(fillHalfSpace(seikyYear, 2, true));			// 請求年
			eanInfoList.add(fillHalfSpace(gunNo, 1, true));				// 群番号
			eanInfoList.add(fillHalfSpace(hakkoSeq, 1, true));			// 発行シーケンス
			eanInfoList.add(fillHalfSpace(seikyKeiNo, 10, true));		// 請求先番号 
			eanInfoList.add(fillHalfSpace(hakkoSeq, 1, true));			// 再発行区分
			eanInfoList.add(fillHalfSpace(tratLimitYmd, 6, true));		// 支払期限日
			eanInfoList.add(fillHalfSpace(inshiFlg, 1, true));			// 印紙フラグ
			eanInfoList.add(fillHalfSpace(amnt, 6, true));				// 支払金額
			eanInfoList.add(fillHalfSpace(chkdigt, 1, true));			// チェックデジット
		}
		else
		{
			/** オンラインの場合 **/
			// ANK-3838-00-00 MOD START
//			// 請求金額1円以上100万円未満の場合
//			if(1 <= seikyAmnt && seikyAmnt < 1000000)
			// 請求金額1円以上30万円以下の場合
			if(1 <= seikyAmnt && seikyAmnt <= 300000)
			// ANK-3838-00-00 MOD END
			{
				eanInfoList.add(skbtsi);		// 識別子
				eanInfoList.add(makerCd);		// メーカーコード
				eanInfoList.add(compCd);		// 会社コード
				eanInfoList.add(seikyMonth);	// 請求月
				eanInfoList.add(seikyYear);		// 請求年
				eanInfoList.add(gunNo);			// 群番号
				eanInfoList.add(hakkoSeq);		// 発行シーケンス
				eanInfoList.add(seikyKeiNo);	// 請求契約番号
				eanInfoList.add(hakkoSeq);		// 再発行区分（発行シーケンス）
				eanInfoList.add(tratLimitYmd);	// 支払期限日
				eanInfoList.add(inshiFlg);		// 印紙フラグ
				eanInfoList.add(amnt);			// 請求金額
				eanInfoList.add(chkdigt);		// チェックディジット
			}
			// ANK-3838-00-00 MOD START
//			else if(1000000 <= seikyAmnt)
			// 請求金額が30万円超過の場合
			else if(300000 < seikyAmnt)
			// ANK-3838-00-00 MOD END
			{
				eanInfoList.add(skbtsi);		// 識別子
			}
		}

		return eanInfoList;
	}

	
	/**
	 * 指定された桁数まで充填します。
	 * <br>
	 * @param arg0 編集する文字列
	 * @param arg1 編集する長さ
	 * @param arg2 左右判断フラグ
	 * @return String 編集した文字列を返却
	 */
	private static String fillHalfSpace(String arg0, int arg1, boolean arg2) 
	{
		char arg3 = ' ';

		String strRep = arg0;

		if (arg0.length() < arg1) 
		{
			StringBuffer buf = new StringBuffer(arg0);

			if (arg2) 
			{
				for (int i = buf.length(); i < arg1; i++) 
				{
					buf.append(arg3);
				}

			}
			else 
			{
				for (int i = buf.length(); i < arg1; i++) 
				{
					buf.insert(0, arg3);
				}
			}

			strRep = buf.toString();
		}

		return strRep;
	}

	 /**
	 * <p>
	 * 料金スケジュール定義イベント年月日取得 (バッチの資産 CH_M_PRC_SCHDL_TEIGI.sql KEY:CH_SELECT_002よりSQL抜粋)
	 * </p>
	 * @param con        コネクション
	 * @param seikyYM    請求年月
	 * @param eventCd    イベントコード
	 * @return String    イベント年月日
	 * @throws Exception 例外が発生した場合
	 */
	private static String getEventYmd(Connection con, String seikyYM, String eventCd)
	{
		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		String eventYmd = "";

		try
		{
			StringBuffer sql_Buff = new StringBuffer();

			sql_Buff.append(" SELECT ")
					.append("      CH0501.EVENT_YMD ")
					.append("   FROM ")
					.append("      CH_M_PRC_SCHDL_TEIGI CH0501 ")
					.append("  WHERE ")
					.append("        CH0501.SEIKY_YM = ? ")
					.append("    AND CH0501.EVENT_CD = ? ")
					.append("    AND CH0501.MK_FLG = '0' ");
			
			// prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			CAANJDBCUtil.setParam(pstmt, 1, seikyYM);
			CAANJDBCUtil.setParam(pstmt, 2, eventCd);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			if (rsltQuery.next())
			{
				eventYmd = rsltQuery.getString("EVENT_YMD");
			}

			return eventYmd;

		} catch(SQLException e) {
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
			}catch(SQLException e){
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	 * EAN情報業務パラメータ設定
	 * 
	 * @param opeDate 運用日
	 * 
	 * @throws Exception 例外が発生した場合
	 */
	private void setEanInfWorkParam(String opeDate) throws Exception
	{
		// ANK-3838-00-00 MOD START
//		this.makerCodeNormal = getWorkParamSetteValue(JACStrConst.WKPARA_CH_MAKER_CODE_NORMAL, opeDate);
//		this.compCodeNormal = getWorkParamSetteValue(JACStrConst.WKPARA_CH_COMP_CODE_NORMAL, opeDate);
//		this.makerCodeReal = getWorkParamSetteValue(JACStrConst.WKPARA_CH_MAKER_CODE_REAL, opeDate);
//		this.compCodeReal = getWorkParamSetteValue(JACStrConst.WKPARA_CH_COMP_CODE_REAL, opeDate);
		this.inshiTaxTgAmnt = JCHStampDutyUtil.getTaxableAmount(JACStrConst.CALLER_SCREEN, null, opeDate);

		this.makerCodeNormalCust = getWorkParamSetteValue(JACStrConst.WKPARA_CH_MAKER_NCU_SAKURA, opeDate);
		this.makerCodeRealCust = getWorkParamSetteValue(JACStrConst.WKPARA_CH_MAKER_RCU_SAKURA, opeDate);
		this.makerCodeNormalComp = getWorkParamSetteValue(JACStrConst.WKPARA_CH_MAKER_NCO_SAKURA, opeDate);
		this.makerCodeRealComp = getWorkParamSetteValue(JACStrConst.WKPARA_CH_MAKER_RCO_SAKURA, opeDate);
		
// ANK-3838-32-00対応 20210109 星野 MOD START
//		this.compCodeNormalSakura = getWorkParamSetteValue(JACStrConst.WKPARA_CH_COMP_NOR_SAKURA, opeDate);
//		this.compCodeRealSakura = getWorkParamSetteValue(JACStrConst.WKPARA_CH_COMP_REA_SAKURA, opeDate);
		
		this.compCodeNormalCust = getWorkParamSetteValue(JACStrConst.WKPARA_CH_COMP_NCU_SAKURA, opeDate);
		this.compCodeRealCust = getWorkParamSetteValue(JACStrConst.WKPARA_CH_COMP_RCU_SAKURA, opeDate);
		this.compCodeNormalComp = getWorkParamSetteValue(JACStrConst.WKPARA_CH_COMP_NCO_SAKURA, opeDate);
		this.compCodeRealComp = getWorkParamSetteValue(JACStrConst.WKPARA_CH_COMP_RCO_SAKURA, opeDate);
// ANK-3838-32-00対応 20210109 星野 MOD END
		// ANK-3838-00-00 MOD END
	}
	
	/**
	 * EANチェックディジット算出処理
	 * 
	 * @param checkString チェック対象文字列
	 * @return チェックディジット
	 * @throws Exception 例外が発生した場合
	 */
	public static String getChkdigitEAN(String checkString) throws Exception
	{
		int oddTotal = 0;
		int evenTotal = 0;
		int value = 0;

		// チェックディジット領域を追加
		StringBuffer sbCheckString = new StringBuffer(checkString.concat("0"));
		// 文字を反転
		String rvCheckString = sbCheckString.reverse().toString();
		
		for(int i = 0; i < rvCheckString.length(); i++)
		{
			// 対象桁の値を取得
			value = Integer.parseInt(Character.toString(rvCheckString.charAt(i)));
			
			if(i % 2 == 0)
			{
				// 奇数桁
				oddTotal += value;
			}
			else
			{
				// 偶数桁
				evenTotal += value * 3;
			}
		}

		// (奇数桁合計＋偶数桁合計)の1の位の値
		int intChkdigt = (oddTotal + evenTotal) % 10;

		if(intChkdigt != 0)
		{
			intChkdigt = 10 - intChkdigt;
		}

		return  String.valueOf(intChkdigt);
	}

	 /**
	 * <p>
	 * 文字列連結処理（ArrayList→String)
	 * ArrayListの設定値を文字列連結し返却します。
	 * </p>
	 * @param targetList  対象リスト
	 * @return 連結文字
	 */
	public static String listToString(ArrayList<String> targetList)
	{
		StringBuffer sb = new StringBuffer();

		for(String target : targetList)
		{
			sb.append(target);
		}
		
		return sb.toString();
	}

	 /**
	 * <p>
	 * 業務パラメータ設定値取得取得
	 * 業務パラメータ管理スキーマの業務パラメータ設定値を取得します。
	 * </p>
	 * @param workParamId  業務パラメータID
	 * @param opedate      運用日
	 * @return 業務パラメータ設定値
	 */
	private static String getWorkParamSetteValue(String workParamId, String opeDate)
	{
		// コネクション
		Connection con = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		String setteValue = "";

		try{
			con = JSYejbConnection.getConnection("ZM_M_WORK_PARAM_KNRI");
			StringBuffer sql_Buff = new StringBuffer();

			sql_Buff.append(" SELECT ")
					.append("     WORK_PARAM_SETTE_VALUE ")
					.append("   FROM ")
					.append("     ZM_M_WORK_PARAM_KNRI ZM0321 ")
					.append("  WHERE ")
					.append("        ZM0321.WORK_PARAM_ID = ? ")
					.append("    AND ? BETWEEN ZM0321.WORK_PARAM_TSTAYMD AND WORK_PARAM_TENDYMD ")
					.append("    AND ZM0321.MK_FLG = '0' ");

			// prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			CAANJDBCUtil.setParam(pstmt, 1, workParamId);
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			if (rsltQuery.next())
			{
				setteValue = rsltQuery.getString("WORK_PARAM_SETTE_VALUE");
			}

			return setteValue;

		} catch(SQLException e) {
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con != null){
					CAANConnectionMgr.getInstance().close(con);
				}
			}catch(SQLException e){
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	 * 住所編集処理を実施します。
	 * 
	 * @param addr 住所配列
	 * @param rowStrCntMax 1行文字列
	 * @param rowCntMax 最大行数
	 * @return 印刷用編集住所配列
	 */
	public String[] editAddress(String[] addr, int rowStrCntMax, int rowCntMax)
	{
		// パラメータチェック
		if(isEmpty(addr))
		{
			return null;
		}
		
		// 空白削除
		String[] trimAddr = trimAddress(addr, TRIM_CD_FR);
		
		// ルールリストの新規作成
		createRuleList(rowStrCntMax);
		
		// 住所編集
		String[] resultAddr = makeResultAddresArray(trimAddr, rowStrCntMax, rowCntMax);
		
		return resultAddr;
	}

	/**
	 * 住所編集を実施し、編集後住所配列を作成します。
	 * 
	 * @param trimAddr トリム後の住所配列
	 * @param rowStrCntMax 1行文字数
	 * @param rowCntMax 最大行数
	 * @return 編集後住所配列
	 */
	private String[] makeResultAddresArray(String[] trimAddr, int rowStrCntMax, int rowCntMax)
	{
		List<String> resultAddrList = new ArrayList<String>();
		
		// 変数初期化
		int orikaeshiCnt = 0;
		int[] gyoJisu = new int[trimAddr.length];
		int[] ruleList = null;
		int gyoNo = 0;
		int totalIdx = 0;
		
		// 編集後住所配列初期化
		resultAddrList.add(INDEX_EDIT_ADDR_ARRAY_RESULT, EDIT_RESULT_NORMAL);
		resultAddrList.add(INDEX_EDIT_ADDR_ARRAY_ADDR_STA, JACStrConst.KARA_MOJI);
		
		// ルールNo単位に繰り返す
		while (totalIdx < RULE_LIST.length)
		{
			// 編集用変数初期化
			orikaeshiCnt = 0;
			Arrays.fill(gyoJisu, 0);
			
			// 編集後住所配列初期化
			resultAddrList.clear();
			resultAddrList.add(INDEX_EDIT_ADDR_ARRAY_RESULT, EDIT_RESULT_NORMAL);
			resultAddrList.add(INDEX_EDIT_ADDR_ARRAY_ADDR_STA, JACStrConst.KARA_MOJI);
			
			// ルールNoあたりのルールリスト要素数分、処理を繰り返す
			for (int i = 0; i < trimAddr.length; i++)
			{
				ruleList = RULE_LIST[totalIdx];
				String addStrings = JACStrConst.KARA_MOJI;
				
				// 行番号
				gyoNo = ruleList[INDEX_RULE_LIST_PRINT_GYO] + orikaeshiCnt;
				if (rowCntMax < gyoNo)
				{
					// 最大行数超過
					totalIdx = totalIdx + (trimAddr.length - i);
					break;
				}
				if (resultAddrList.size() <= gyoNo)
				{
					// 現在の行数と同等になるまで作成
					while(resultAddrList.size() <= gyoNo)
					{
						resultAddrList.add(new String());
					}
				}
				
				//住所項目が4以下、または現在の行の文字数＝０文字or住所分割文字数の場合、通常処理。
				if(ruleList[INDEX_RULE_LIST_ADDR] < ADDR_BUILD_NAME || gyoJisu[gyoNo] == 0 || gyoJisu[gyoNo] == ruleList[INDEX_RULE_LIST_ROW_STR_CNT])
				{
					// 従来通りに行文字列作成
					addStrings = resultAddrList.get(gyoNo) + trimAddr[ruleList[INDEX_RULE_LIST_ADDR]];
				}
				//それ以外だった場合（住所項目が5以上、かつ行字数が1以上、最大字数未満）
				else
				{
					// 空白を追加して、行末連続空白を一つの空白に置換してから項目を追加し、行文字列作成
					addStrings = (resultAddrList.get(gyoNo) + SPACE).replaceAll(SEQ_SPACE_END, SPACE) + trimAddr[ruleList[INDEX_RULE_LIST_ADDR]];
				}
				
				// 行字数算出
				gyoJisu[gyoNo] = addStrings.length();
				
				// 行字数超過なし
				if (gyoJisu[gyoNo] <= rowStrCntMax)
				{
					resultAddrList.set(gyoNo, addStrings);
				}
				// 行字数超過あり
				else
				{
					// 折返し
					if (ruleList[INDEX_RULE_LIST_ORIKAESHI_UMU] == ORIKAESHI_UMU_ARI)
					{
						if (gyoNo + 1 <= rowCntMax)
						{
							String currentLine = null;
							String nextLine = null;
							// 超過文字数算出
							currentLine = addStrings;
							
							// 現在の行に住所データを追加する余地がある場合、入るだけデータを入力する
							resultAddrList.set(gyoNo, currentLine.substring(0, rowStrCntMax));
							nextLine = currentLine.substring(rowStrCntMax) + SPACE;
							resultAddrList.add(nextLine);
							
							// このデータが住所の最終データかつ、次の行に回した文字数がオーバーしている場合、
							// この時点で編集を行う
							if (ruleList[INDEX_RULE_LIST_ADDR] == ADDR_ROOM_NO && nextLine.length() > rowStrCntMax)
							{
								resultAddrList.set(gyoNo + 1, nextLine.substring(0, rowStrCntMax));
								
								// まだ文字数と行数が残っているなら繰り返す
								if (nextLine.length() - rowStrCntMax > 0 && gyoNo + 2 <= rowCntMax)
								{
									nextLine = nextLine.substring(rowStrCntMax);
									if (nextLine.length() > rowStrCntMax)
									{
										resultAddrList.set(gyoNo + 2, nextLine.substring(0, rowStrCntMax));
									}
									else
									{
										if (resultAddrList.size() <= gyoNo + 2)
										{
											resultAddrList.add(new String());
										}
										
										resultAddrList.set(gyoNo + 2, nextLine);
									}
								}
							}
							
							// 1行文字数算出
							gyoJisu[gyoNo + 1] = resultAddrList.get(gyoNo + 1).length();
							
							// 折返し回数カウントアップ
							orikaeshiCnt++;
							
							// 結果設定（折返し発生）
							resultAddrList.set(INDEX_EDIT_ADDR_ARRAY_RESULT, EDIT_RESULT_ORIKAESHI);
						}
						else
						{
							// 超過文字数算出
							String currentLine = addStrings;
							resultAddrList.set(gyoNo, currentLine.substring(0, rowStrCntMax));
							
							
							totalIdx = totalIdx + (trimAddr.length - i);
							break;
						}
					}
					else if (ruleList[INDEX_RULE_LIST_ORIKAESHI_UMU] == ORIKAESHI_UMU_NSI)
					{
						String currentLine = addStrings;
						resultAddrList.set(gyoNo, currentLine.substring(0, rowStrCntMax));
						
						
						totalIdx = totalIdx + (trimAddr.length - i);
						break;
					}
				}
				
				// 引数の住所すべてを最大行数内で取得できた場合
				if (ruleList[INDEX_RULE_LIST_ADDR] + 1 == trimAddr.length)
				{
					String[] resultAddrArray = new String[resultAddrList.size()];
						
					for (int listIdx = 0; listIdx < resultAddrArray.length; listIdx++)
					{
						resultAddrArray[listIdx] = resultAddrList.get(listIdx).toString();
					}
					
					resultAddrArray = trimAddress(resultAddrArray, TRIM_CD_R);

					return resultAddrArray;
				}
				totalIdx++;
			}
		}
		
		// ルール不一致
		// 結果設定（字数・行数オーバー）
		// 結果設定（折返し発生）
		resultAddrList.set(INDEX_EDIT_ADDR_ARRAY_RESULT, EDIT_RESULT_CNT_OVER);

		return resultAddrList.toArray(new String[1]);
	}

	/**
	 * パラメータチェックを実施します。
	 * 
	 * @param addr 住所配列
	 * @return チェック結果（true:全要素がnullまたは空、false:１つ以上の要素に値あり）
	 */
	private boolean isEmpty(String[] addr)
	{
		// 引数がnullの場合はtrueを返す
		if (addr == null)
		{
			return true;
		}
		
		for (int i = 0; i < addr.length; i++)
		{
			// 配列の要素ひとつでも値が入っていれば正常
			if (addr[i] != null && addr[i].length() != 0)
				{
					return false;
				}
		}
		
		return true;
	}

	/**
	 * 指定された住所（文字列配列）内の全要素に関して、空白削除を実施します。
	 * 
	 * @param addr 住所配列
	 * @param trimCd 空白削除コード（0:前後空白削除、1:後空白のみ削除）
	 * @return トリム後の住所配列
	 */
	private String[] trimAddress(String[] addr, int trimCd)
	{
		String[] trimAddress = new String[addr.length];
		
		for (int i = 0; i < addr.length; i++)
		{
			if (TRIM_CD_FR == trimCd)
			{
				trimAddress[i] = JPCEditString.trim(addr[i]);
			}
			else if (TRIM_CD_R == trimCd)
			{
				trimAddress[i] = JPCEditString.Rtrim(addr[i]);
			}
		}
		
		return trimAddress;
	}
	
	/**
	 * 送付先氏名の編集処理を行う。
	 * 
	 * @param bfSohusNmList 送付先情報リスト
	 * @return ArrayList 編集後送付先情報リスト
	 */
	public ArrayList<String> editSohusNm(ArrayList<String> bfSohusNmList)
	{
		// 編集後送付先情報リスト作成
		ArrayList<String> afSohusNmList = new ArrayList<String>();
		
		afSohusNmList.add(JACStrConst.KARA_MOJI);
		afSohusNmList.add(JACStrConst.KARA_MOJI);
		afSohusNmList.add(JACStrConst.KARA_MOJI);
		
		// 送付先情報[1] ＝ ""（空文字） かつ 送付先情報[2] ＝ ""（空文字） の場合
		if(JACStrConst.KARA_MOJI.equals(JPCEditString.trim(bfSohusNmList.get(1))) && JACStrConst.KARA_MOJI.equals(JPCEditString.trim(bfSohusNmList.get(2))))
		{
			// 編集後送付先情報リスト[2] ← 送付先情報リスト[0]
			afSohusNmList.set(2, bfSohusNmList.get(0));
			
		}
		// 送付先情報[2] ＝ ""（空文字） の場合
		else if(JACStrConst.KARA_MOJI.equals(JPCEditString.trim(bfSohusNmList.get(2))))
		{
			// 編集後送付先情報リスト[1] ← 送付先情報リスト[0]
			// 編集後送付先情報リスト[2] ← 送付先情報リスト[1]
			afSohusNmList.set(1, bfSohusNmList.get(0));
			afSohusNmList.set(2, bfSohusNmList.get(1));
		}
		else
		{
			// 編集後送付先情報リスト[0] ← 送付先情報リスト[0]
			// 編集後送付先情報リスト[1] ← 送付先情報リスト[1]
			// 編集後送付先情報リスト[2] ← 送付先情報リスト[2]
			afSohusNmList = bfSohusNmList;
		}
		
		return afSohusNmList;
	}

	/** JCHbatSeikyKaknoBusinessUtil.java より移動 ↓↓ **/
	/**
	 * 口座・クレジットの状態から、請求方法コードを決定します。
	 * 
	 * @param seikyWayCdBf 判定前請求方法コード
	 * @param kozaStat 口座ステータス
	 * @param crecardStat クレジットカードステータス
	 * @param crecaMkYm クレジットカード無効年月
	 * @param seikyYm 請求年月
	 * @param seikyWayAplyAdjYmd 請求方法適用調整年月日
	 * @return String 判定後請求方法コード
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	public static String seikyWayJudge(String seikyWayCdBf, String kozaStat, String crecardStat, String crecaMkYm, String seikyYm, String seikyWayAplyAdjYmd) throws Exception
	{
		// 判定後請求方法コード
		String seikyWayCdAf = null;
		
		// 判定前請求方法コード ＝　'1'（窓口）の場合
		if(JACStrConst.SEIKY_MADOGUCHI.equals(seikyWayCdBf))
		{
			// 判定後請求方法コード　←　判定前請求方法コード
			seikyWayCdAf = seikyWayCdBf;
		}
		// 判定前請求方法コード ＝　'2'（口振）または'3'（郵振）の場合
		else if(JACStrConst.SEIKY_KHRI.equals(seikyWayCdBf) || JACStrConst.SEIKY_YUFUIRI.equals(seikyWayCdBf))
		{
			// 口座ステータス ＝　'090'（有効性ＮＧ）の場合
			if(JACStrConst.KOZA_STAT_NG.equals(kozaStat))
			{
				// 判定後請求方法コード　←　窓口
				seikyWayCdAf = JACStrConst.SEIKY_MADOGUCHI;
			}
			// 口座ステータス ≠　'090'（有効性ＮＧ）の場合
			else
			{
				// 請求方法適用調整年月日が請求年月26日以降の場合
				if (!isNull(seikyWayAplyAdjYmd) && 0 > seikyYm.concat("25").compareTo(seikyWayAplyAdjYmd))
				{
					// 判定後請求方法コード　←　窓口
					seikyWayCdAf = JACStrConst.SEIKY_MADOGUCHI;
				}
				else
				{
					// 判定後請求方法コード　←　判定前請求方法コード
					seikyWayCdAf = seikyWayCdBf;
				}
			}
		}
		// 判定前請求方法コード ＝　'4'（クレジット）の場合
		else
		{
			// クレジットカードステータス ＝　'190'（無効）の場合
			if(JACStrConst.CRECARD_STAT_MK.equals(crecardStat))
			{
				// 判定後請求方法コード　←　窓口
				seikyWayCdAf = JACStrConst.SEIKY_MADOGUCHI;
			}
			// クレジットカードステータス ≠　'190'（無効）の場合
			else
			{
				//  請求年月　≧　クレジットカード無効年月　の場合
				if(!isNull(crecaMkYm) && seikyYm.compareTo(crecaMkYm) >= 0)
				{
					// 判定後請求方法コード　←　窓口
					seikyWayCdAf = JACStrConst.SEIKY_MADOGUCHI;
				}
				//  請求年月　＜　クレジットカード無効年月　の場合
				else
				{
					// 判定後請求方法コード　←　判定前請求方法コード
					seikyWayCdAf = seikyWayCdBf;
				}
			}
		}
		return seikyWayCdAf;
	}
	/** JCHbatSeikyKaknoBusinessUtil.java より移動 ↑↑ **/

	/** JBSbatCHSikykeiChgeInfoChsht.java より抜粋 ↓↓ **/
	/**
	 * 強制窓口の状態から、請求方法コードを決定します。
	 * 
	 * @param seikyWayCd 請求方法コード
	 * @param seikyYoksiFlg 強制窓口請求抑止フラグ
	 * @param kyoseiMadoguchiFlg 強制窓口フラグ
	 * @return String[] [0]判定後請求方法コード [1]抑止情報作成判定フラグ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	public static String[] seikyWayJudge(String seikyWayCd, String seikyYoksiFlg, String kyoseiMadoguchiFlg) throws Exception
	{
		String[] ret = new String[2];

		ret[0] = seikyWayCd;
		ret[1] = JACStrConst.CTL_VALUE_FALSE;
		
		// 請求方法コード ≠ "1"(窓口)　且つ　強制窓口フラグ ＝ "1"(強制窓口対象) の場合
		if(!JACStrConst.SEIKY_MADOGUCHI.equals(seikyWayCd)
						&& JACStrConst.KYOSEI_MDGC_FLG_SET_ARI.equals(kyoseiMadoguchiFlg))
		{
			// 強制窓口抑止情報に存在している場合
			if(JACStrConst.KYOSEI_MDGC_YOKSI_FLG_TRGT.equals(seikyYoksiFlg))
			{
				// 抑止情報作成判定フラグに制御値(true)を設定する
				ret[1] = JACStrConst.CTL_VALUE_TRUE;
			}
			// 強制窓口抑止情報に未存在の場合
			else
			{
				// 請求方法を"1"(窓口)に設定する
				ret[0] = JACStrConst.SEIKY_MADOGUCHI;
			}
		}
		
		return ret;
	}
	/** JBSbatCHSikykeiChgeInfoChsht.java より抜粋 ↑↑ **/

	/**
	 * 加算処理を行います。
	 * <br>
	 * @param str1 加算対象1
	 * @param str2 加算対象2
	 * @param isNullToZero 加算対象がnullの場合0に変更して計算するか判断するフラグ
	 * @return 加算結果
	 */
	public static String calcAdd(String str1, String str2, Boolean isNullToZero)
	{
		if (isNullToZero)
		{
			if (isNull(str1))
			{
				str1 = "0";
			}

			if (isNull(str2))
			{
				str2 = "0";
			}
		}
		else
		{
			if (isNull(str1) || isNull(str2))
			{
				return null;
			}
		}

		BigDecimal val1 = new BigDecimal(str1);
		BigDecimal val2 = new BigDecimal(str2);

		BigDecimal rtnValue = val1.add(val2);

		return rtnValue.toString();
	}
	
	/**
	 * オブジェクトに値が設定されているか判定します。
	 * <br>
	 * @param arg0 判定するオブジェクト
	 * @return オブジェクトに値が設定されていない場合はtrue
	 */
	public static boolean isNull(Object arg0) 
	{
		if (arg0 == null) 
		{
			return true;
		}

		return 0 == arg0.toString().trim().length();
	}

	/**
	 * オブジェクトに値が設定されていない場合、"0"を返却します。
	 * <br>
	 * @param arg0 判定するオブジェクト
	 * @return オブジェクトに値が設定されていない場合はtrue
	 */
	public static String isNullToZero(Object arg0) 
	{
		if (arg0 == null) 
		{
			return "0";
		}

		if (JACStrConst.KARA_MOJI.equals(arg0.toString().trim())) 
		{
			return "0";
		}
		
		return  arg0.toString();
	}
	
	/**
	 * 住所項目の編集ルールを保持するルールリストを作成します。
	 * ルールリストはPrcAddressEdit.propertiesに記載します。
	 * 
	 * ADDRESS_RULE_LIST_(01から連番、数値2桁)_(住所項目、0-6)
	 * プロパティはカンマ区切りで設定を記述します。
	 * ルール番号,住所項目,印刷欄行数,折り返しフラグ(0：折り返さない 1:折り返す),文字数
	 * 
	 * @param rowStrCntMax 最大文字数
	 */
	private void createRuleList(int rowStrCntMax)
	{
		JCHAddressRuleListCache.setPath();
		boolean readFlg = true;
		List<int[]> readList = new ArrayList<int[]>();
		
		// 01から99まで、読み込みに失敗するまでプロパティファイルよりルールリスト設定を取得
		for (int seq = 1; seq < 100; seq++)
		{
			// 0を左埋めして2ケタに調整
			String listno = JPCUtilCommon.fillZero(Integer.toString(seq), 2, false);

			String[] list = new String[7];
			
			// プロパティの取得とエラーチェック
			for (int count = 0; count < 7; count++)
			{
				try
				{
					list[count] = JCHAddressRuleListCache.getValue("ADDRESS_RULE_LIST_" + listno + "_" + count);
				}
				// 内部エラー発生の場合は読み込みを終了する
				catch(Exception e)
				{
					readFlg = false;
					break;
				}
				
				// ひとつでも取得できていない行がある場合、その時点で終了する
				if (list[count] == null)
				{
					readFlg = false;
					break;
				}
			}
			
			// 読み込みエラーを起こしたら終了
			if (!readFlg)
			{
				break;
			}
			
			// 取得した内容をリストに登録
			for (int count2 = 0; count2 < 7; count2++)
			{
				// プロパティファイルの内容をカンマで分割
				String[] prop = list[count2].split(",");
				int[] rule = new int[prop.length];
				
				for(int count3 = 0; count3 < prop.length; count3++)
				{
					rule[count3] = Integer.parseInt(prop[count3].trim());
				}
				
				// 取得したルールの文字数が引数指定の文字数と異なる場合はスキップする。
				if (rule[INDEX_RULE_LIST_ROW_STR_CNT] == rowStrCntMax)
				{
					readList.add(rule);
				}
			}
		}
		
		// ルールリストの初期化
		RULE_LIST = new int[readList.size()][5];
		
		// ルールリストに投げ込み
		for(int count4 = 0; count4 < readList.size(); count4++)
		{
			RULE_LIST[count4] = readList.get(count4);
		}
	}
	
	 /**
	 * <p>
	 * 指定バイト数切り出し文字列取得
	 * 対象文字列から指定バイト数分の文字列を切出して取得します。
	 * </p>
	 * @param str  対象文字列
	 * @param byteCnt 指定バイト数
	 * @return retStr 指定バイト数で切り出された文字列
	 * @throws UnsupportedEncodingException 
	 */
	protected static String getBcutStr(String str, int byteCnt) throws UnsupportedEncodingException
	{
		
		String retStr = JACStrConst.KARA_MOJI;
		
		if(str == null || byteCnt <= 0)
		{
			return retStr;
		}
		
		// 対象文字列
		retStr = str;
		
		// 対象文字列のバイト数が指定のバイト数を超えていた場合
		if(byteCnt < str.getBytes(JACStrConst.ENCODE_MS932).length)
		{
			// 文字列を指定されたサイズに調整
			retStr = JPCUtilCommon.adjustCharSize(str, byteCnt, JACStrConst.ENCODE_MS932);
			
			// 調整後文字列の末尾の文字と調整前文字列の制限バイト数箇所の文字が異なる場合
			if(!retStr.substring(retStr.length() - 1).equals(str.substring(retStr.length() - 1, retStr.length())))
			{
				// 調整後文字列の末尾文字を除いた文字列を返り値として設定する
				retStr = retStr.substring(0, retStr.length() - 1);
			}
		}
		return retStr;
	}
//v36.00.00 ANK-3296-00-00 Add Start

	/**
	 * 指定された金額を工事費割賦回数に編集します。
	 * @param arg0 工事費割賦回数
	 * @return ArrayList<String> [0]:通信量桁あふれ付加文字、[1]:編集後の文字列
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	public ArrayList<String> formatZenkaku(String arg0) throws Exception
	{
		// リスト生成
		ArrayList<String> list = new ArrayList<String>();
		list.add(JACStrConst.KARA_MOJI);
		list.add(JACStrConst.KARA_MOJI);
		
		// 工事費割賦回数用金額退避
		String amnt = arg0;
		 
		// 工事費割賦回数用金額退避 ＝ null の場合
		if(amnt == null)
		{
			// 退避．工事費割賦回数用金額　←　全角空白1桁 
			amnt = JACStrConst.FULL_SPACE_1;
		}
		else
		{
			// 共通部品「請求収納業務共通部品」の半角全角変換メソッドを呼び出す。（10⇒１０）
			amnt = formatHanToZen(amnt, JACStrConst.HAN_TO_ZEN_SUCHI);
			
		}
		// リスト[1] ← 編集後の文字列
		list.set(1, amnt);
		
		return list;
	}
//v36.00.00 ANK-3296-00-00 Add End
	// ANK-4206-00-00 ADD START
	 /**
	 * <p>
	 * 群番号取得処理
	 * 対象請求年月の請求データの群番号、発行シーケンスをもとに群番号採番し返却する。
	 * </p>
	 * @param seikyKeiNo  請求契約番号
	 * @param seikyYm     請求年月
	 * @param opedate     運用日
	 * @param opedate     今回発行シーケンス
	 * @return 群番号
	 */
	public static String getGunNo(String seikyKeiNo, String seikyYm, String opeDate)
	{
		// コネクション
		Connection con = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		// 前回発行シーケンス
		String bfHakkoSeq = "0";
		// 前回群番号
		String bfGunNo = "1";
		
		
		// 群番号発番リスト {"前回の群番号","今回の群番号"}
		String nextgunNolist[][] = {
				{"1","2"},
				{"2","3"},
				{"3","4"},
				{"4","5"},
				{"5","7"},
				{"7","8"},
				{"8","9"},
				{"9",null},
		};


		try{
			con = JSYejbConnection.getConnection("CH_T_SEIKY");
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append(" SELECT ")
			// OM-2022-0001026 MOD START
			//.append("   SUBSTR (CH0051.EAN_BARCODE,18,1) AS GUNNO ")
			//.append("   ,SUBSTR (CH0051.EAN_BARCODE,19,1) AS HAKKOSEQ ")
			.append("   SUBSTR (CH0051.OCR_BARCODE,19,1) AS GUNNO ")
			.append("   ,SUBSTR (CH0051.OCR_BARCODE,18,1) AS HAKKOSEQ ")
			// OM-2022-0001026 MOD END
			.append("   FROM ")
			.append("     CH_T_SEIKY CH0051 ")
			.append("  WHERE ")
			.append("        CH0051.SEIKY_KEI_NO = ? ")
			.append("    AND CH0051.SEIKY_YM = ? ")
			.append("    AND CH0051.SEIKY_SBT_CD in ('1', '3') ")
			.append("    AND CH0051.MK_FLG = '0' ")
			// OM-2022-0001026 MOD START
			//.append("    AND (SUBSTR (CH0051.EAN_BARCODE,18,1) in ('1','2','3','4','5','7','8','9') ")
			//.append("    OR CH0051.EAN_BARCODE IS NULL) ")
			.append("    AND (SUBSTR (CH0051.OCR_BARCODE,19,1) in ('1','2','3','4','5','7','8','9') ")
			.append("    OR CH0051.OCR_BARCODE IS NULL) ")
			// OM-2022-0001026 MOD END
			.append("  ORDER BY ")
			.append("     CH0051.SEIKY_NO DESC ");

			// prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sql_Buff.toString());

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			CAANJDBCUtil.setParam(pstmt, 1, seikyKeiNo);
			CAANJDBCUtil.setParam(pstmt, 2, seikyYm);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 発行シーケンスカウントアップ回数
			int cnt = 1;
			// 請求書発行シーケンス
			int sksHakkoSeq = 0;
			// 請求書発行シーケンス最大値
			int maxSksHakkoSeq = 0;
			
			while (rsltQuery.next())
			{
				if (JPCCommonUtil.isNull(rsltQuery.getString("GUNNO")))
				{
					cnt++;
				}
				else
				{
					bfGunNo = rsltQuery.getString("GUNNO");
					bfHakkoSeq = rsltQuery.getString("HAKKOSEQ");
					break;
				}
			}
			
			// 請求書発行シーケンス最大値取得
			String setteValue = getWorkParamSetteValue(JACStrConst.WKPAR_CH_SKS_HAKKO_SEQ_MAX, opeDate);
			sksHakkoSeq = Integer.parseInt(bfHakkoSeq);
			
			// 群番号
			String GunNo = bfGunNo;
			
			for (int i = 0; cnt > i; i++)
			{
				// 発行シーケンス判定処理
				if (!JPCCommonUtil.isNull(setteValue))
				{
					maxSksHakkoSeq = Integer.parseInt(setteValue);
				}

				if (sksHakkoSeq < maxSksHakkoSeq)
				{
					// 最大値未満の場合 1カウントアップ
					sksHakkoSeq = sksHakkoSeq + 1 ;
				}
				else
				{
					// 最大値以上の場合 1
					sksHakkoSeq = 1 ;
					
					// 前回の発行シーケンスが"8"の場合は群番号を繰り上げ
					for (String[] nextgunNoData : nextgunNolist)
					{
						// 群番号発番リストにしたがって発番
						 if(nextgunNoData[0].equals(GunNo))
						 {
							 GunNo = nextgunNoData[1];
							 break;
						 }
					}
				}
				

			}
			

			return GunNo;

		} catch(SQLException e) {
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con != null){
					CAANConnectionMgr.getInstance().close(con);
				}
			}catch(SQLException e){
				throw new CAANRuntimeException(e);
			}
		}
	}
	// ANK-4206-00-00 ADD END

}
