/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCHCommonFormatUtil
*   ソースファイル名：JCHCommonFormatUtil.java
*   作成者          ：富士通
*   日付            ：2012年06月08日
*＜機能概要＞
*   請求収納システム共通編集クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v3.00.00    2012/06/08   FJ          新規作成
*
**********************************************************************/
package eo.common.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//import eo.business.common.JACbatDebugLogUtil;
import eo.common.constant.JACStrConst;


/**
 * 請求収納システム共通編集クラスです。<p>
 * <BR>
 * @author 富士通
 */
public class JCHCommonBarcodeEdit
{
	// ▼▼ カスタマーバーコード取得 ▼▼
	
	/** カスタマーバーコード取得処理判定フラグ */
	public static final int CUSTMOR_CODE = 1;
	
	/** スタートビットコード */
	private static final String CUSTOMER_STA_BIT = "<";
	
	/** ストップビットコード */
	private static final String CUSTOMER_STP_BIT = ">";
	
	/** 英字用制御コードマップキー */
	private static final String[] EIJI_KEY = {"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"};
	
	/** 英字用制御コードデータ項目 */
	private static final String[] EIJI_DATA = {"+", "&", "\\\\\\"};
	
	/** アルファベット制御コードデータ項目 */
	private static final String[] ALPHA_DATA = {"+", "&", "\\"};
	
	/** チェックデジット計算用マップキー */
	private static final String[] CALCY_O_KEY = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "+", "&", "\\", "*"};
	
	/** チェックデジット計算後マップキー */
	private static final String[] CLC_AF_DATA = {"-", "+", "&", "\\", "*", "@", "=", "_", "?"};
	
	/** 代表番号 */
	private static final String DAIHYO_NO = "00";
	
	/** 郵便番号判定用文字列 */
	private static final String PCD_CHK_MOJI = "[1234567890]{2,}";
	
	/** カスタマーバーコード用特定文字 */
	private static final String[] CUSTOMER_TKUT_MOJI = {"丁目", "丁", "番地", "番", "号", "地割", "線", "の", "ノ"};
	
	/** 漢数字マップ作製用文字列 */
	private static final String[][] KANSUJI_MAP_MAKE_VALUE = {{"九", "９"}, {"八", "８"}, {"七", "７"}, {"六", "６"}, {"五", "５"}, {"四", "４"}, {"三", "３"}, {"二", "２"}, {"一", "１"}, {"○", "０"}};
	
	/** 漢数字（桁） */
	private static final String[][] KANSUJI_DIG_MAP_MAKE_VALUE =
	{
		{"十", "10"}, {"百", "100"}, {"千", "1000"}, {"万", "10000"}
	};
	
	/** 漢数字判定用文字列（十、百、千） */
	private static final String KANSUJI_JDG_10_TO_1000 = "[十百千]";
	
	/** 漢数字判定用文字列（十万、百万、千万） */
	private static final String KANSUJI_JDG_1000000_TO_10000000 = "([十百千]万)";
	
	/** 「地割」退避用文字 */
	private static final String CHIWARI_TAIHI = "割";
	
	/** ハイフン変換対象文字列 */
	private static final String HAIHUN_CHG_TRG_MOJI = "[^１２３４５６７８９０‐―−ーＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ]";
	
	/** ハイフン変換対象アルファベット */
	private static final String HAIHUN_CHG_TRG_ABC = "([ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ]{2,})";
	
	/** ハイフン */
	private static final String HAIHUN = "‐";
	
	/** ハイフン判定用 */
	private static final String HAIHUN_JDGE = "(‐|―|−|ー|-)";
	
	/** 連続ハイフン判定用文字列 */
	private static final String RE_HAIHUN_JDGE = "(‐|―|−|ー|-){2,}";
	
	/** 先頭終端ハイフン判定用文字 */
	private static final String STA_END_HAIHUN_JDGE = "^(‐|―|−|ー|-)|(‐|―|−|ー|-)$";
	
	/** アスタリスク */
	private static final char ASTERISK = '*';
	
	/** アルファベット */
	private static final String[] ABC = {"Ａ", "Ｂ", "Ｃ", "Ｄ", "Ｅ", "Ｆ", "Ｇ", "Ｈ", "Ｉ", "Ｊ", "Ｋ", "Ｌ", "Ｍ", "Ｎ", "Ｏ", "Ｐ", "Ｑ", "Ｒ", "Ｓ", "Ｔ", "Ｕ", "Ｖ", "Ｗ", "Ｘ", "Ｙ", "Ｚ"};
	
	/** 数字 */
	private static final String[] NUMBER = {"０", "１", "２", "３", "４", "５", "６", "７", "８", "９"};
	
	/** 全角英数字⇒半角英数字変換用文字 */
	private static final char[][] ZEN_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'}, {'０', '0'}, {'１', '1'}, {'２', '2'}, {'３', '3'},
		{'４', '4'}, {'５', '5'}, {'６', '6'}, {'７', '7'}, {'８', '8'}, {'９', '9'}, {'‐', '-'}, {'―', '-'}, {'−', '-'}, {'ー', '-'}
	};
	
	/** 半角文字⇒全角文字変換用文字 */
	private static final char[][] HAN_ZEN_CHG_MOJI =
	{
		{'-', '‐'}, {'･', '・'}, {'/', '／'}, {'&', '＆'}, {'.', '．'}, {'ﾉ', 'ノ'}
	};
	
	/** カスタマーバーコード空文字変換対象文字 */
	private static final String CUSTOMER_KARA_CHG_TRG = "(＆|・|／|．)";
	
	/** カスタマーバーコードスタートビットのindex */
	public static final int CUSTM_STA_BIT_ITEM_NO = 0;
	
	/** カスタマーバーコード郵便番号のindex */
	public static final int CUSTM_PSCD_ITEM_NO = 1;
	
	/** カスタマーバーコード住所表示番号のindex */
	public static final int CUSTM_ADDR_DISP_ITEM_NO = 2;
	
	/** カスタマーバーコードCDのindex */
	public static final int CUSTM_CHKDIGT_ITEM_NO = 3;
	
	/** カスタマーバーコードストップビットコードのindex */
	public static final int CUSTM_STP_BIT_ITEM_NO = 4;
	
	/** カスタマーバーコード帳票用空文字変換対象文字 */
	private static final String CUSTOMER_CHOHYO_KARA_CHG_AST = "*";
	
	/** カスタマーバーコード帳票用空文字変換対象文字 */
	private static final String CUSTOMER_CHOHYO_KARA_CHG_PLUS = "+";
	
	/** カスタマーバーコード帳票用空文字変換対象文字 */
	private static final String CUSTOMER_CHOHYO_KARA_CHG_ANP = "&";
	
	/** カスタマーバーコード帳票用空文字変換対象文字 */
	private static final String CUSTOMER_CHOHYO_KARA_CHG_EN = "\\";
	
	/** 英字用制御コードマップ */
	private static HashMap<String, String> eijiYoCdMap = null;
	
	/** チェックデジット計算用マップ */
	private static HashMap<String, Integer> chkdigitCalcYoMap = null;
	
	/** チェックデジット計算後マップ */
	private static HashMap<Integer, String> chkdigitCalcAfYoMap = null;
	
	/** 漢数字（桁）マップ */
	private static HashMap<String, String> kansujiDigMap = null;
	
	/** 漢数字マップ */
	private static HashMap<String, String> kansujiMap = null;

	/** アルファベット制御コードマップ */
	private static HashMap<String, String> alphabetCdMap = null;
	
	// ▲▲ カスタマーバーコード取得 ▲▲
	
	// ▼▼ EANバーコード情報取得 ▼▼
	
//	/** EANバーコード種別コード（通常） */
//	private static final String EAN_BARCODE_SBT_NORM = "10";
//	
	/** EANコード識別子（91） */
	private static final String EAN_SKBTS = "91";
	
	/** EANコード識別子（XX） */
	private static final String EAN_SKBTS_XX = "XX";
	
	/** EAN支払期限日ALL9 */
	private static final String EAN_PAY_KIGEN_DAY_9 = "999999";
	
	/** EAN印紙フラグ（不要） */
	private static final String EAN_INS_FRG_HUYO = "0";
	
	/** EAN印紙フラグ（200円） */
	private static final String EAN_INS_FRG_ARI = "1";
	
	/** EANバーコード取得処理判定フラグ */
	public static final int EAN_CODE = 0;
	
	/** EAN識別子のindex */
	public static final int EAN_SKBTS_ITEM_NO = 0;
	
	/** EANメーカコードのindex */
	public static final int EAN_MAKER_CD_ITEM_NO = 1;
	
	/** EAN会社コードのindex */
	public static final int EAN_COMP_CD_ITEM_NO = 2;
	
	/** EAN請求月のindex */
	public static final int EAN_SEI_MON_ITEM_NO = 3;
	
	/** EAN請求年のindex */
	public static final int EAN_SEI_YEAR_ITEM_NO = 4;
	
	/** EAN群番号のindex */
	public static final int EAN_GUN_ITEM_NO = 5;
	
	/** EAN発行シーケンスのindex */
	public static final int EAN_HSKKO_SEQ_ITEM_NO = 6;
	
	/** EAN請求契約番号のindex */
	public static final int EAN_SEIKY_KEI_NO_ITEM_NO = 7;
	
	/** EAN再発行区分のindex */
	public static final int EAN_SAIHAKKO_DIV_ITEM_NO = 8;
	
	/** EAN支払期限日のindex */
	public static final int EAN_PAY_KIGEN_DAY_ITEM_NO = 9;
	
	/** EAN印紙フラグのindex */
	public static final int EAN_INSHI_FLG_ITEM_NO = 10;
	
	/** EAN支払金額のindex */
	public static final int EAN_PAY_AMNT_ITEM_NO = 11;
	
	/** EANCDのindex */
	public static final int EAN_CHKDIGIT_ITEM_NO = 12;
	
//	/** 印紙税対象金額 */
//	private String inshiTaxTgAmnt = null;
//	
//	/** メーカーコード（通常） */
//	private String makerCodeNormal = null;
//	
//	/** メーカーコード（リアル） */
//	private String makerCodeReal = null;
//	
//	/** 会社コード（通常） */
//	private String compCodeNormal = null;
//	
//	/** 会社コード（リアル） */
//	private String compCodeReal = null;
//	
	// ▲▲ EANバーコード情報取得 ▲▲

	/** 半角スペース */
	private static final String SPACE = " ";
	
	/**
	 * コンストラクタ<br>
	 * @param commonItem バッチ共通パラメータ電文
	 * @param caseFlg 処理の判定フラグ （0:EANバーコード情報取得、1:カスタマーバーコード取得）
	 *  @throws Exception 例外が発生した場合
	 */
	public JCHCommonBarcodeEdit() throws Exception
	{
		// 静的インスタンスの初期化処理
		initStaticInstance();
	}
	
	/**
	 * 静的インスタンスの初期化をします。
	 * 
	 * @throws Exception 例外が発生した場合
	 */
	public static synchronized void initStaticInstance() throws Exception
	{
		if (eijiYoCdMap == null)
		{
			eijiYoCdMap = new HashMap<String, String>();
			
			// 英字用制御コードマップに値を設定
			for(int i = 0; i < EIJI_KEY.length; i++)
			{
				eijiYoCdMap.put(EIJI_KEY[i], EIJI_DATA[i / 10].concat(String.valueOf(i % 10)));
			}
		}
		
		if (chkdigitCalcYoMap == null)
		{
			// チェックデジット計算用マップに値を設定
			chkdigitCalcYoMap = new HashMap<String, Integer>();

			for(int i = 0; i < CALCY_O_KEY.length; i++)
			{
				chkdigitCalcYoMap.put(CALCY_O_KEY[i], i);
			}
		}
		
		if (chkdigitCalcAfYoMap == null)
		{
			// チェックデジット計算後用マップに値を設定
			chkdigitCalcAfYoMap = new HashMap<Integer, String>();
			
			for(int i = 0; i < CLC_AF_DATA.length; i++)
			{
				chkdigitCalcAfYoMap.put(i + 10, CLC_AF_DATA[i]);
			}
		}
		
		if (kansujiMap == null)
		{
			// 漢数字マップ
			kansujiMap = new HashMap<String, String>();
			
			for(int i = 0; i < KANSUJI_MAP_MAKE_VALUE.length; i++)
			{
				kansujiMap.put(KANSUJI_MAP_MAKE_VALUE[i][0], KANSUJI_MAP_MAKE_VALUE[i][1]);
			}
		}
		
		if (kansujiDigMap == null)
		{
			// 漢数字（桁）マップ
			kansujiDigMap = new HashMap<String, String>();
			
			for(int i = 0; i < KANSUJI_DIG_MAP_MAKE_VALUE.length; i++)
			{
				kansujiDigMap.put(KANSUJI_DIG_MAP_MAKE_VALUE[i][0], KANSUJI_DIG_MAP_MAKE_VALUE[i][1]);
			}
		}
		
	}

	/**
	 * カスタマーバーコードを取得します。
	 * 
	 * @param pcd 郵便番号
	 * @param adrr1 大字通り名
	 * @param adrr2 字丁目名
	 * @param adrr3 住所番地号
	 * @param adrr4 住所補記・建物名
	 * @param adrr5 住所補記・部屋番号
	 * @return ArrayList<String> カスタマーバーコードのリスト
	 * @throws Exception 例外が発生した場合
	 */
	public static ArrayList<String> getCustomerBarcode(String pcd, String adrr1, String adrr2, String adrr3, String adrr4, String adrr5) throws Exception
	{
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getCustomerBarcode]");
//		assert pcd != null ? JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getCustomerBarcode][pcd=" + pcd + "]") : true;
//		assert adrr1 != null ? JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getCustomerBarcode][addr1=" + adrr1 + "]") : true;
//		assert adrr2 != null ? JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getCustomerBarcode][addr2=" + adrr2 + "]") : true;
//		assert adrr3 != null ? JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getCustomerBarcode][addr3=" + adrr3 + "]") : true;
//		assert adrr4 != null ? JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getCustomerBarcode][addr4=" + adrr4 + "]") : true;
//		assert adrr5 != null ? JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getCustomerBarcode][addr5=" + adrr5 + "]") : true;
		
		ArrayList<String> cstmerBacdList = null;
		
		// 郵便番号が""（空文字）でなく、かつ、郵便番号下二けたが"00"（代表番号）でなく、かつ、数字以外が入力されておらず、かつ、7桁である場合
		if(!pcd.equals(JACStrConst.KARA_MOJI) && !pcd.substring(pcd.length() - 2).equals(DAIHYO_NO) && pcd.matches(PCD_CHK_MOJI) && pcd.length() == 7)
		{
			// 住所連結
			String rtnAdrr = makeBcAdrr(adrr1, adrr2, adrr3, adrr4, adrr5);
			
			// 半角文字を全角文字に変換
			rtnAdrr = chgHanZenMoji(rtnAdrr);
			
			// 英数字を大文字に変換
			rtnAdrr = rtnAdrr.toUpperCase();
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getCustomerBarcode][rtnAdrr=" + rtnAdrr + "]");
			
			// 空文字変換対象の文字を空文字に変換
			rtnAdrr = rtnAdrr.replaceAll(CUSTOMER_KARA_CHG_TRG, JACStrConst.KARA_MOJI);
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getCustomerBarcode][rtnAdrr=" + rtnAdrr + "]");
			
			// 漢数字で英数字に変換対象のものを変換
			rtnAdrr = setKansujiChg(rtnAdrr);
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getCustomerBarcode][rtnAdrr=" + rtnAdrr + "]");
			
			// 連続しているアルファベットをハイフンに変換
			rtnAdrr = rtnAdrr.replaceAll(HAIHUN_CHG_TRG_ABC, HAIHUN);
			// 算用文字、ハイフン、アルファベット以外をハイフンに変換
			rtnAdrr = rtnAdrr.replaceAll(HAIHUN_CHG_TRG_MOJI, HAIHUN);
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getCustomerBarcode][rtnAdrr=" + rtnAdrr + "]");
			
			// 算用数字に続く連続していない「Ｆ」をハイフンに変換
			for(int i = 0; i < NUMBER.length; i++)
			{
				rtnAdrr = rtnAdrr.replaceAll(NUMBER[i].concat(ABC[5]), NUMBER[i].concat(HAIHUN));
			}
			
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getCustomerBarcode][rtnAdrr=" + rtnAdrr + "]");
			
			// 先頭、終端、アルファベット前後のハイフンを空文字に、連続するハイフンは一つになるように変換
			rtnAdrr = chgHaihun(rtnAdrr);
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getCustomerBarcode][rtnAdrr=" + rtnAdrr + "]");
			
			// 全角文字を半角文字に変換
			for(char[] pattern : ZEN_HAN_CHG_MOJI)
			{
				rtnAdrr = rtnAdrr.replace(pattern[0], pattern[1]);
			}
			
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getCustomerBarcode][rtnAdrr=" + rtnAdrr + "]");
			
			// チェックデジット付加前コード作成
			String chkdigtBfCd = makeChkdigtBfCd(pcd, rtnAdrr);
			
			// チェックデジット算出
			String chkdigit = getChkdigitCustm(chkdigtBfCd);
			
			cstmerBacdList = new ArrayList<String>();
			
			// カスタマーバーコード情報リストに値を設定
			// スタートビット
			cstmerBacdList.add(CUSTOMER_STA_BIT);
			// 郵便番号
			cstmerBacdList.add(pcd);
			// 住所表示番号（チェックデジット付加前コードの下13桁）
			cstmerBacdList.add(chkdigtBfCd.substring(chkdigtBfCd.length() - 13));
			// チェックデジット
			cstmerBacdList.add(chkdigit);
			// ストップビットコード
			cstmerBacdList.add(CUSTOMER_STP_BIT);
		}
		
//		assert cstmerBacdList != null ?  JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getCustomerBarcode][cstmerBacdList=" + cstmerBacdList.toString() + "]") : true;
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][getCustomerBarcode]");
		return cstmerBacdList;
	}
	
	/**
	 * カスタマーバーコードを帳票出力用に編集します。
	 * 
	 * @param customerBarCode カスタマーバーコード
	 * @return outCustomerBarCd 出力用カスタマーバーコード
	 * @throws Exception 例外が発生した場合
	 */
	public static String outputListCreator(String customerBarCode) throws Exception
	{
		String outCustomerBarCd = JACStrConst.KARA_MOJI;
		alphabetCdMap = new HashMap<String, String>();
		
		// アルファベット制御コードマップに値を設定
		for(int i = 0; i < EIJI_KEY.length; i++)
		{
			alphabetCdMap.put(ALPHA_DATA[i / 10].concat(String.valueOf(i % 10)), EIJI_KEY[i]);  
		}

		// カスタマバーコードが空でない、かつ23桁の場合
		if(!"".equals(customerBarCode) && customerBarCode.length() == 23)
		{
			// 郵便番号(7桁)と住所表示番号(23桁)を抜き出す
			outCustomerBarCd = customerBarCode.substring(1, 21);
			
			if(outCustomerBarCd.endsWith(CUSTOMER_CHOHYO_KARA_CHG_PLUS) || outCustomerBarCd.endsWith(CUSTOMER_CHOHYO_KARA_CHG_ANP)
					|| outCustomerBarCd.endsWith(CUSTOMER_CHOHYO_KARA_CHG_EN))
			{
				outCustomerBarCd = outCustomerBarCd.substring(0, 19);  
			}
			// "*"（アスタリスク）を空文字に変換
			outCustomerBarCd = outCustomerBarCd.replace(CUSTOMER_CHOHYO_KARA_CHG_AST, JACStrConst.KARA_MOJI);
			
			// 英字用制御コードをアルファベット文字に変換
			outCustomerBarCd = chgEijiAlpha(outCustomerBarCd, CUSTOMER_CHOHYO_KARA_CHG_PLUS);
			outCustomerBarCd = chgEijiAlpha(outCustomerBarCd, CUSTOMER_CHOHYO_KARA_CHG_ANP);
			outCustomerBarCd = chgEijiAlpha(outCustomerBarCd, CUSTOMER_CHOHYO_KARA_CHG_EN);
		}
		return outCustomerBarCd;
	}
	
	/**
	 * EANバーコード情報取得を行います。
	 * 
	 * @param eanBarcodeSbtCd EANバーコード種別コード（10:通常、20:リアル）
	 * @param seiYm 請求年月（yyyyMM）
	 * @param gunNo 群番号
	 * @param hakkoSeq 発行シーケンス
	 * @param seikyKeiNo 請求契約番号
	 * @param reHakkoDiv 再発行区分
	 * @param eanTratKigenEventCd EAN取扱期限日イベントコード
	 * @param seikyAmnt 請求金額（当月請求金額税込　＋　合算未納金額合計）
	 * @param recDev レコード区分
	 * @return ArrayList<String> EANバーコード情報のリスト
	 * @throws Exception 例外が発生した場合
	 */
	public ArrayList<String> getEanBarcodeInf(String eanBarcodeSbtCd, String seiYm, String gunNo, String hakkoSeq,
			String seikyKeiNo, String reHakkoDiv, String eanTratKigenEventCd, long seikyAmnt, String recDev,
			long inshiTaxTgAmnt, String makerCode, String compCode, String payKigenYmd) throws Exception
	{
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf][eanBarcodeSbtCd=" + eanBarcodeSbtCd + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf][seiYm=" + seiYm + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf][gunNo=" + gunNo + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf][hakkoSeq=" + hakkoSeq + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf][seikyKeiNo=" + seikyKeiNo + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf][reHakkoDiv=" + reHakkoDiv + "]");
//		assert eanTratKigenEventCd != null ? JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(),
//				"[S][getEanBarcodeInf][eanTratKigenEventCd=" + eanTratKigenEventCd + "]") : true;
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf][seikyAmnt=" + seikyAmnt + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getEanBarcodeInf][recDev=" + recDev + "]");
		
		// 初期値設定
		// 識別子
		String skbtsi = SPACE;
		// メーカコード
		String makerCd = SPACE;
		// 会社コード
		String compCd = SPACE;
		// 請求月
		String seiMon = SPACE;
		// 請求年
		String seiYear = SPACE;
		// 群番号
		String outGunNo = SPACE;
		// 発行シーケンス
		String outHakkoSeq = SPACE;
		// 請求契約番号
		String outSeikyKeiNo = SPACE;
		// 再発行区分
		String saihakkoDiv = SPACE;
		// 支払期限日
		String payKigenDay = SPACE;
		// 印紙フラグ
		String inshiFlg = SPACE;
		// 支払金額
		String payAmnt = SPACE;
		// チェックデジット
		String chkdigit = SPACE;
		
		// レコード区分　≠　"2"（領収のみ）
		if(!JACStrConst.REC_DIV_RYOSYU.equals(recDev))
		{
			// 請求金額一円以上１００万円未満の場合
			if(1 <= seikyAmnt && seikyAmnt < 1000000)
			{
//				assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getEanBarcodeInf][請求金額一円以上１００万円未満の場合]");
				// 識別子
				skbtsi = EAN_SKBTS;
				// EANバーコード種別コード　＝　"10"(通常)の場合
//				if(eanBarcodeSbtCd.equals(EAN_BARCODE_SBT_NORM))
//				{
//					// メーカーコード（通常）
//					makerCd = makerCodeNormal;
//					// 会社コード（通常）
//					compCd = compCodeNormal;
//				}
//				// 上記以外の場合
//				else
//				{
//					// メーカーコード（リアル）
//					makerCd = makerCodeReal;
//					// 会社コード（リアル）
//					compCd = compCodeReal;
//				}

				// メーカーコード
				makerCd = makerCode;
				// 会社コード
				compCd = compCode;
				// 請求月
				seiMon = JPCEditString.toMonthFromYm(seiYm);
				// 請求年（西暦の下2桁）
				seiYear = seiYm.substring(2, 4);
				// 群番号
				outGunNo = gunNo;
				// 発行シーケンス
				outHakkoSeq = hakkoSeq;
				// 請求契約番号
				outSeikyKeiNo = seikyKeiNo;
				// 再発行区分
				saihakkoDiv = reHakkoDiv;
				
				// EAN取扱期限日イベントコード　≠　""の場合
				if(!eanTratKigenEventCd.equals(JACStrConst.KARA_MOJI))
				{
					// 取得した支払期限日の下６桁（YYMMDD）を設定
//					payKigenDay = getPayKigenDay(seiYm, eanTratKigenEventCd).substring(2, 8);
					payKigenDay = payKigenYmd;
				}
				// 上記以外の場合
				else
				{
					payKigenDay = EAN_PAY_KIGEN_DAY_9;
				}
				// 支払金額が印紙税対象金額未満のとき
				if(seikyAmnt < Long.valueOf(inshiTaxTgAmnt))
				{
					// 印紙フラグ（不要）
					inshiFlg = EAN_INS_FRG_HUYO;
				}
				// 上記以外の場合
				else
				{
					// 印紙フラグ（200円）
					inshiFlg = EAN_INS_FRG_ARI;
				}
				// 支払金額（下6桁）
				payAmnt = JPCEditString.fillZero(String.valueOf(seikyAmnt), 12, false);
				payAmnt = payAmnt.substring(payAmnt.length() - 6);
				
				StringBuffer bufData = new StringBuffer();
				
				// 上記項目を結合
				// 識別子
				bufData.append(skbtsi);
				// メーカーコード
				bufData.append(makerCd);
				// 会社コード
				bufData.append(compCd);
				// 請求月
				bufData.append(seiMon);
				// 請求年
				bufData.append(seiYear);
				// 群番号
				bufData.append(outGunNo);
				// 発行シーケンス
				bufData.append(outHakkoSeq);
				// 請求契約番号
				bufData.append(outSeikyKeiNo);
				// 再発行区分
				bufData.append(saihakkoDiv);
				// 支払期限日
				bufData.append(payKigenDay);
				// 印紙フラグ
				bufData.append(inshiFlg);
				// 支払金額
				bufData.append(payAmnt);
				// チェックデジット算出
				chkdigit = getChkdigitEan(bufData.toString());
			}
			// 請求金額が100万円以上の場合
			else if(1000000 <= seikyAmnt)
			{
//				assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getEanBarcodeInf][請求金額が100万円以上の場合]");
				// 識別子
				skbtsi = EAN_SKBTS_XX;
			}
		}
		
		ArrayList<String> eanInfoList = new ArrayList<String>();
		
		// 識別子
		eanInfoList.add(JPCEditString.fillHalfSpace(skbtsi, 2, true));
		// メーカーコード
		eanInfoList.add(JPCEditString.fillHalfSpace(makerCd, 6, true));
		// 会社コード
		eanInfoList.add(JPCEditString.fillHalfSpace(compCd, 5, true));
		// 請求月
		eanInfoList.add(JPCEditString.fillHalfSpace(seiMon, 2, true));
		// 請求年
		eanInfoList.add(JPCEditString.fillHalfSpace(seiYear, 2, true));
		// 群番号
		eanInfoList.add(outGunNo);
		// 発行シーケンス
		eanInfoList.add(outHakkoSeq);
		// 請求先番号
		eanInfoList.add(JPCEditString.fillHalfSpace(outSeikyKeiNo, 10, true));
		// 再発行区分
		eanInfoList.add(saihakkoDiv);
		// 支払期限日
		eanInfoList.add(JPCEditString.fillHalfSpace(payKigenDay, 6, true));
		// 印紙フラグ
		eanInfoList.add(inshiFlg);
		// 支払金額
		eanInfoList.add(JPCEditString.fillHalfSpace(payAmnt, 6, true));
		// チェックデジット
		eanInfoList.add(chkdigit);
		
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getEanBarcodeInf][eanInfoList=" + eanInfoList.toString() + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][getEanBarcodeInf]");
		
		return eanInfoList;
	}

	/**
	 * 住所を連結し、BC住所を作成します。
	 * 
	 * @param adrr1 大字通り名
	 * @param adrr2 字丁目名
	 * @param adrr3 住所番地号
	 * @param adrr4 住所補記・建物名
	 * @param adrr5 住所補記・部屋番号
	 * @return String BC住所
	 * @throws Exception 例外が発生した場合
	 */
	private static String makeBcAdrr(String adrr1, String adrr2, String adrr3, String adrr4, String adrr5) throws Exception
	{
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][makeBcAdrr]");
		
		StringBuffer buf = new StringBuffer();
		
		buf.append(chgNullToKara(adrr1));
		buf.append(chgNullToKara(adrr2));
		buf.append(chgNullToKara(adrr3));
		buf.append(chgNullToKara(adrr4));
		buf.append(chgNullToKara(adrr5));
		
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][makeBcAdrr][rtnAddr=" + buf.toString() + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][makeBcAdrr]");
		
		return buf.toString();
	}
	
	/**
	 * 入力情報がnullの場合""（空文字）にして返します。
	 * 
	 * @param trg 対象文字
	 * @return String 空文字または入力文字
	 * @throws Exception 例外が発生した場合
	 */
	private static String chgNullToKara(String trg) throws Exception
	{
		String rtnStr = trg;
		
		if(rtnStr == null)
		{
			rtnStr = JACStrConst.KARA_MOJI;
		}
		
		return rtnStr;
	}
	
	/**
	 * 半角文字列を全角文字に変換して返します。
	 * 
	 * @param trg 対象文字
	 * @return 変換実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public static String chgHanZenMoji(String trg) throws Exception
	{
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][chgHanZenMoji]");

		String rtnStr = trg;

		if(rtnStr != null)
		{

			// 半角文字を全角文字に変換
			for(char[] pattern : ZEN_HAN_CHG_MOJI)
			{
				rtnStr = rtnStr.replace(pattern[1], pattern[0]);
			}
			// 半角文字を全角文字に変換
			for(char[] pattern : HAN_ZEN_CHG_MOJI)
			{
				rtnStr = rtnStr.replace(pattern[0], pattern[1]);
			}

		}
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][chgHanZenMoji][rtnStr=" + rtnStr + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][chgHanZenMoji]");

		return rtnStr;
	}

	/**
	 * 特定文字前にある漢数字を算数字に変換します。
	 * 
	 * @param adrr BC住所
	 * @return String 変換後BC住所
	 * @throws Exception 例外が発生した場合
	 */
	private static String setKansujiChg(String adrr) throws Exception
	{
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][setKansujiChg]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][setKansujiChg][adrr=" + adrr + " ]");
		String rtnAdrr = adrr;
		
		// 変換可否フラグ（true:可、false:否）
		boolean flg = false;
		// 退避文字列
		String tempAdrr = JACStrConst.KARA_MOJI;
		// 漢数字（桁）退避用文字列
		String tempKanNo = JACStrConst.KARA_MOJI;
		// 漢数字退避用文字列
		String tempKanNoMoji = JACStrConst.KARA_MOJI;
		// 変換後合計値
		int tempChgAf = 0;
		// 「地割」用退避文字
		String tempChiWari = JACStrConst.KARA_MOJI;
		
		// BC住所の長さ分繰り返し
		for(int i = rtnAdrr.length() - 1; i > -1; i--)
		{
			// 漢数字マップに対象文字が存在しており、かつ、変換可否フラグが可の場合
			if(kansujiMap.containsKey(String.valueOf(rtnAdrr.charAt(i))) && flg)
			{
				// 漢数字（桁）退避用文字列に漢数字が退避されており一文字のみ退避されている場合
				if(tempKanNo.length() == 1)
				{
					// 変換後合計値に加算
					tempChgAf += Integer.parseInt(kansujiMap.get(String.valueOf(rtnAdrr.charAt(i)))) * Integer.parseInt(kansujiDigMap.get(tempKanNo));
					// 漢数字退避用文字列に値が設定されている場合
					if(tempKanNoMoji.length() > 0)
					{
						// 変換後合計値に加算
						tempChgAf += Integer.parseInt(kansujiMap.get(tempKanNoMoji));
						// 漢数字退避用文字列の初期化
						tempKanNoMoji = JACStrConst.KARA_MOJI;
					}
				}
				// 漢数字（桁）退避用文字列に漢数字が退避されており退避されている文字が一文字より大きい場合
				else if(tempKanNo.length() > 1)
				{
					// 変換後合計値に加算
					tempChgAf += Integer.parseInt(kansujiMap.get(String.valueOf(rtnAdrr.charAt(i)))) * Integer.parseInt(kansujiDigMap.get(tempKanNo.substring(tempKanNo.length() - 1)))
									* Integer.parseInt(kansujiDigMap.get(tempKanNo.substring(0, tempKanNo.length() - 1)));
					// 漢数字退避用文字列に値が設定されている場合
					if(tempKanNoMoji.length() > 0)
					{
						// 変換後合計値に加算
						tempChgAf += Integer.parseInt(kansujiMap.get(tempKanNoMoji));
						// 漢数字退避用文字列の初期化
						tempKanNoMoji = JACStrConst.KARA_MOJI;
					}
				}
				// 漢数字退避用文字列に値が設定されている場合
				else if(tempKanNoMoji.length() > 0)
				{
					// 退避文字列に漢数字退避用文字列の値を追加
					tempAdrr = kansujiMap.get(String.valueOf(tempKanNoMoji)).concat(tempAdrr);
					// 漢数字退避用文字列に対象文字を退避
					tempKanNoMoji = String.valueOf(rtnAdrr.charAt(i));
				}
				// 上記以外の場合
				else
				{
					// 漢数字退避用文字列に対象文字を退避
					tempKanNoMoji = String.valueOf(rtnAdrr.charAt(i));
				}
				// 漢数字（桁）退避用文字列が"万、十万、百万、千万"の場合
				if(tempKanNo.equals(KANSUJI_DIG_MAP_MAKE_VALUE[3][0]) ||tempKanNo.matches(KANSUJI_JDG_1000000_TO_10000000))
				{
					// 漢数字（桁）退避用文字列を"万"に設定
					tempKanNo = KANSUJI_DIG_MAP_MAKE_VALUE[3][0];
				}
				// 上記以外の場合
				else
				{
					// 漢数字（桁）退避用文字列を初期化
					tempKanNo = JACStrConst.KARA_MOJI;
				}
				
			}
			// 漢数字（桁）マップに対象文字が存在しており、かつ、変換可否フラグが可の場合
			else if(kansujiDigMap.containsKey(String.valueOf(rtnAdrr.charAt(i))) && flg)
			{
				// 漢数字（桁）退避用文字列に"十"、"百"、"千"値が設定されており、対象文字列が"十"、"百"、"千"、"万"場合
				if(tempKanNo.matches(KANSUJI_JDG_10_TO_1000) && ((String.valueOf(rtnAdrr.charAt(i)).matches(KANSUJI_JDG_10_TO_1000)) || String.valueOf(rtnAdrr.charAt(i)).equals(KANSUJI_DIG_MAP_MAKE_VALUE[3][0])))
				{
					// 漢数字（桁）退避用文字列を合計値に加算
					tempChgAf += Integer.parseInt(kansujiDigMap.get(tempKanNo));
					tempKanNo = JACStrConst.KARA_MOJI;
				}
				// 漢数字（桁）退避用文字列に"十万"、"百万"、"千万"の値が設定されている場合
				else if(tempKanNo.matches(KANSUJI_JDG_1000000_TO_10000000) && String.valueOf(rtnAdrr.charAt(i)).matches(KANSUJI_JDG_10_TO_1000))
				{
					// 漢数字（桁）退避用文字列を合計値に加算
					tempChgAf += Integer.parseInt(kansujiDigMap.get(tempKanNo.substring(tempKanNo.length() - 1)))
					* Integer.parseInt(kansujiDigMap.get(tempKanNo.substring(0, tempKanNo.length() - 1)));
					// 退避文字を"万"に設定
					tempKanNo = KANSUJI_DIG_MAP_MAKE_VALUE[3][0];
				}
				// 対象文字を退避文字に追加
				tempKanNo = String.valueOf(rtnAdrr.charAt(i)).concat(tempKanNo);
			}
			// 上記以外の場合
			else
			{
				// 漢数字（桁）退避用文字列に値が設定されている場合
				if(tempKanNo.length() > 0)
				{
					// 漢数字（桁）退避用文字列に"十、百、千"値が設定されている場合
					if(tempKanNo.matches(KANSUJI_JDG_10_TO_1000))
					{
						// 漢数字（桁）退避用文字列を合計値に加算
						tempChgAf += Integer.parseInt(kansujiDigMap.get(tempKanNo));
					}
					// 漢数字（桁）退避用文字列に"十万、百万、千万"値が設定されている場合
					else if(tempKanNo.matches(KANSUJI_JDG_1000000_TO_10000000) )
					{
						// 漢数字（桁）退避用文字列を合計値に加算
						tempChgAf += Integer.parseInt(kansujiDigMap.get(tempKanNo.substring(tempKanNo.length() - 1)))
						* Integer.parseInt(kansujiDigMap.get(tempKanNo.substring(0, tempKanNo.length() - 1)));
					}
					// 初期化
					tempKanNo = JACStrConst.KARA_MOJI;
				}
				// 漢数字退避用文字列に値が設定されている場合
				if(tempKanNoMoji.length() > 0)
				{
					// 変換後合計値に値を追加
					tempChgAf += Integer.parseInt(kansujiMap.get(tempKanNoMoji));
					// 初期化
					tempKanNoMoji = JACStrConst.KARA_MOJI;
				}
				// 変換後合計値が0でない場合場合
				if(tempChgAf != 0)
				{
					// 退避文字列に追加
					tempAdrr = String.valueOf(tempChgAf).concat(tempAdrr);
					// 初期化
					tempChgAf = 0;
				}

				
				
				// 特定文字の数だけ繰り返す
				for(int j = 0; j < CUSTOMER_TKUT_MOJI.length; j++)
				{
					// 対象文字が特定文字か判定
					if(String.valueOf(rtnAdrr.charAt(i)).equals(CUSTOMER_TKUT_MOJI[j]))
					{
						// 変換可否フラグを可に設定
						flg = true;
						break;
					}
					// 地割のパターンの判定
					else if(String.valueOf(rtnAdrr.charAt(i)).concat(tempChiWari).equals(CUSTOMER_TKUT_MOJI[j]))
					{
						// 変換可否フラグを可に設定
						flg = true;
						break;
					}
					// 可否フラグを否に設定
					flg = false;
				}
				// 対象文字が「割」であった場合
				if(String.valueOf(rtnAdrr.charAt(i)).equals(CHIWARI_TAIHI))
				{
					// 退避文字に対象文字を退避
					tempChiWari = CHIWARI_TAIHI;
				}
				// 対象文字が「割」でない場合
				else
				{
					// 退避文字を空文字に変更
					tempChiWari = JACStrConst.KARA_MOJI;
				}
				
				// 対象文字を追加
				tempAdrr = String.valueOf(rtnAdrr.charAt(i)).concat(tempAdrr);
			}
		}
		
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][setKansujiChg][tempAdrr=" + tempAdrr + "]");
		
		// 半角文字を全角文字に変換
		tempAdrr = chgHanZenMoji(tempAdrr);
		
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][setKansujiChg]");
		return tempAdrr;
	}
	
	/**
	 * 空文字変換対象ハイフンを空文字に置換します。
	 * 
	 * @param adrr BC住所
	 * @return String 変換後BC住所
	 * @throws Exception 例外が発生した場合
	 */
	private static String chgHaihun(String adrr) throws Exception
	{
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][dlHaihun]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][dlHaihun][adrr=" + adrr + "]");
		String rtnAdrr = adrr;
		// 連続するハイフンを一つに
		rtnAdrr = rtnAdrr.replaceAll(RE_HAIHUN_JDGE, HAIHUN);
		// 先頭、終端のハイフンを空文字に置換
		rtnAdrr = rtnAdrr.replaceAll(STA_END_HAIHUN_JDGE, JACStrConst.KARA_MOJI);
		// アルファベットの数だけループ
		for(int i = 0; i < ABC.length; i++)
		{
			// 英数字の前のハイフンを空文字に置換
			rtnAdrr = rtnAdrr.replaceAll(HAIHUN_JDGE.concat(ABC[i]), ABC[i]);
			// 英数字の後ろのハイフンを空文字に置換
			rtnAdrr = rtnAdrr.replaceAll(ABC[i].concat(HAIHUN_JDGE), ABC[i]);
		}

//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][dlHaihun][rtnAdrr=" + rtnAdrr + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][dlHaihun]");
		return rtnAdrr;
	}
	
	/**
	 * チェックデジット付与前コードを作成します。
	 * 
	 * @param pcd 郵便番号
	 * @param adrr BC住所
	 * @return String チェックデジット付与前コード
	 * @throws Exception 例外が発生した場合
	 */
	private static String makeChkdigtBfCd(String pcd, String adrr) throws Exception
	{
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][makeChkdigtBfCd]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][makeChkdigtBfCd][pcd=" + pcd + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][makeChkdigtBfCd][adrr=" + adrr + "]");
		
		// パターンをアルファベットに設定
		Pattern pattern = Pattern.compile("[A-Z]");
		// 対象を郵便番号　＋　BC住所に設定
		Matcher macther = pattern.matcher(pcd.concat(adrr));
		
		StringBuffer bufData = new StringBuffer();
		// パターンに一致している間ループ
		while(macther.find())
		{
			// 英字用マップのキーに該当する値で置換
			macther.appendReplacement(bufData, eijiYoCdMap.get(macther.group()));
		}
		macther.appendTail(bufData);
		
		String chkdigtBfCd = bufData.toString();
		
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][makeChkdigtBfCd][chkdigtBfCd_桁調整前=" + chkdigtBfCd + "]");
		
		// 20桁より上の場合
		if(chkdigtBfCd.length() > 20)
		{
			chkdigtBfCd = chkdigtBfCd.substring(0, 20);
		}
		// 20桁未満の場合
		else if(chkdigtBfCd.length() < 20)
		{
			StringBuffer buf = new StringBuffer(chkdigtBfCd);
			// 20桁になるまでループ
			for (int i = buf.length(); i < 20; i++) 
			{
				// アスタリスクでパディング
				buf.append(ASTERISK);
			}
			chkdigtBfCd = buf.toString();
		}
		
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][makeChkdigtBfCd][chkdigtBfCd_桁調整後=" + chkdigtBfCd + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][makeChkdigtBfCd]");
		return chkdigtBfCd;
	}
	
	/**
	 * チェックデジットを算出します。
	 * 
	 * @param chkdigtBfCd チェックデジット付与前コード
	 * @return String チェックデジット
	 * @throws Exception 例外が発生した場合
	 */
	
	private static String getChkdigitCustm(String chkdigtBfCd) throws Exception
	{
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getChkdigitCustm]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getChkdigitCustm][chkdigtBfCd=" + chkdigtBfCd + "]");
		
		int trgDate = 0;
		// チェックデジット付与前コードの桁分ループ
		for(int i = 0; i < chkdigtBfCd.length(); i++)
		{
			// 桁の値を集計
			trgDate += chkdigitCalcYoMap.get(Character.toString(chkdigtBfCd.charAt(i)));
		}
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getChkdigitCustm][trgDate=" + trgDate + "]");
		int intChkdigt = trgDate % 19;
		
		// 集計結果を19で割った余りが0の場合
		if(intChkdigt == 0)
		{
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getChkdigitCustm][intChkdigt=" + intChkdigt + "]");
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][getChkdigitCustm]");
			return String.valueOf(intChkdigt);
		}
		// 集計結果を19から引く
		intChkdigt = 19 - intChkdigt;
		// 計算結果が10以上で19以外の場合
		if(intChkdigt >= 10)
		{
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getChkdigitCustm][intChkdigt=" + intChkdigt + "]");
//			assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][getChkdigitCustm]");
			// チェックデジット計算後マップのキーに概要する値を設定
			return chkdigitCalcAfYoMap.get(intChkdigt);
		}
		// 算出結果を設定
		return String.valueOf(intChkdigt);
	}

	/**
	 * 英字用制御コードをアルファベット文字に変換します。
	 * 
	 * @param editCustomerBarCd カスタマバーコード
	 * @param patternCd 検索用文字列
	 * @return String 編集したカスタマーバーコード
	 * @throws Exception 例外が発生した場合
	 */
	
	private static String chgEijiAlpha(String editCustomerBarCd, String patternCd) throws Exception
	{
		// パターンを設定
		String editPattern = "\\" + patternCd + "\\d";
		Pattern pattern = Pattern.compile(editPattern);
		
		StringBuffer bufData = new StringBuffer();

		// 対象を設定
		Matcher macther = pattern.matcher(editCustomerBarCd);

		// パターンに一致している間ループ
		while(macther.find())
		{
			// 英字用マップのキーに該当する値で置換
			macther.appendReplacement(bufData, alphabetCdMap.get(macther.group()));
		}
		macther.appendTail(bufData);
		
		String rtnCustmBcd = bufData.toString();
		return rtnCustmBcd;
	}

	/**
	 * チェックデジットを算出します。
	 * 
	 * @param trgStr 対象文字列
	 * @return String チェックデジット
	 * @throws Exception 例外が発生した場合
	 */
	private String getChkdigitEan(String trgStr) throws Exception
	{

//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getChkdigit]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[S][getChkdigit][trgStr=" + trgStr + "]");
		
		// 奇数桁
		int kisu = 0;
		// 偶数桁
		int gusu = 0;
		// 対象桁の値
		int trgData = 0;
		
		// 対象文字列桁数分以下の処理を繰り返す。
		for(int i = trgStr.length() - 1; i > -1; i--)
		{
			// 対象桁の値を取得
			trgData = Integer.parseInt(Character.toString(trgStr.charAt(i)));
			
			// 奇数桁
			if(i % 2 == 0)
			{
				kisu += trgData;
			}
			// 偶数桁
			else
			{
				gusu += trgData;
			}
		}
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getChkdigit][反転後偶数桁合計=" + kisu + ", 反転後奇数桁合計=" + gusu + "]");
		// 
		int intChkdigt = kisu * 3 + gusu;
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getChkdigit][反転後偶数桁合計×３と反転後奇数桁合計の値=" + intChkdigt + "]");
		
		intChkdigt = intChkdigt % 10;
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getChkdigit][intChkdigt_調整前=" + intChkdigt + "]");
		// 合算結果の一の位の値が０でない場合
		if(intChkdigt != 0)
		{
			// 10 - 合算結果をチェックデジットに設定
			intChkdigt = 10 - intChkdigt;
		}
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[L][getChkdigit][intChkdigt_調整後=" + intChkdigt + "]");
//		assert JACbatDebugLogUtil.printDebugLog(commonItem.getLogPrint(), "[E][getChkdigit]");
		return String.valueOf(intChkdigt);
		
	}
}
