/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCustinfoFileOput
*	ソースファイル名	：JBSbatKKCustinfoFileOput.java
*	作成者				：富士通　
*	作成日				：2012年02月28日
*＜機能概要＞
*　顧客情報抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/02/28   富士通		新規作成
*	v4.00.00	2013/04/23   FJ)上田	【IT1-2013-0001020】出力ファイル名の変更
*   v9.00.00	2014/06/04	 FJ)森脇	【ANK-2100-00-00】ヘッダ追加
 * v23.00.00    2016/02/16   FJ)森脇	【OM-2016-0000043】zipファイル出力、及びFTP転送処理を削除
*********************************************************************/
package eo.business.service;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.common.JKKBatFTPUtil;
import eo.business.util.file.JBSbatKKIFM292;
import eo.common.util.JCCCompressFileUtil;
import eo.common.util.JZMAdEdit;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.application.JCCbatFrameworkException;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatDateUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKCustinfoFileOput extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約)*/
//	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** テーブル(ダウンロードファイル管理)*/
//	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";

	/** SQL定義キー(KK_SELECT_140)*/
//	private static final String KK_T_SVC_KEI_KK_SELECT_140 = "KK_SELECT_140";

	/** テーブルアクセスクラス(サービス契約)*/
//	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
//	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 書き出し行数（オーバーフローを考慮し、一定量で書き出す。） */
	private static final int WRITER_FLUSH_LIMIT_ROW_NUM = 10000;

	// テーブル項目 - サービス契約
	/** サービス契約ステータス */
	//private static final String SVC_KEI_STAT_NM = "SVC_KEI_STAT_NM";

	/** 審査結果コード */
	//private static final String SKEKKA_CD_NM = "SKEKKA_CD_NM";

	// テーブル項目 - お客様

	/** 契約者タイプコード */
	//private static final String KEISHA_TYPE_CD_NM = "KEISHA_TYPE_CD_NM";

	/** 職業コード */
	//private static final String SHOKUGYO_CD_NM = "SHOKUGYO_CD_NM";

	/** お客様性別コード */
	//private static final String CUST_SEX_CD_NM = "CUST_SEX_CD_NM";

	// テーブル項目 - お客様＜法人＞

	/** 法人格種別コード */
	//public static final String HOJIN_SBT_CD_NM = "HOJIN_SBT_CD_NM";

	// テーブル項目 - 申込＿代理店

	/** 代理店コード(1) */
	//private static final String AGNT_CD_1 = "AGNT_CD_1";

	/** 代理店コード(2) */
	//private static final String AGNT_CD_2 = "AGNT_CD_2";

	/** 代理店コード(3) */
	//private static final String AGNT_CD_3 = "AGNT_CD_3";

	/** 代理店コード(4) */
	//private static final String AGNT_CD_4 = "AGNT_CD_4";

	// テーブル項目 - 代理店

	/** 代理店名(1) */
	//private static final String AGNT_NM_1 = "AGNT_NM_1";

	/** 代理店名(2) */
	//private static final String AGNT_NM_2 = "AGNT_NM_2";

	/** 代理店名(3) */
	//private static final String AGNT_NM_3 = "AGNT_NM_3";

	/** 代理店名(4) */
	//private static final String AGNT_NM_4 = "AGNT_NM_4";

	/** 取扱コード用申込チャネル名 */
	//private static final String TRAT_CD_YO_MKM_CHANNEL_NM = "TRAT_CD_YO_MKM_CHANNEL_NM";

	/** 取扱コード分類名 */
	//private static final String TRAT_CD_BRI_NM = "TRAT_CD_BRI_NM";

	/** 取扱コード分類詳細名 */
	//private static final String TRAT_CD_BRI_DTL_NM = "TRAT_CD_BRI_DTL_NM";

	// ファイル関連

	/** ファイルの文字コード */
	private static final String CHARA_SET = "MS932";

	/** ファイルの改行コード(CR＋LF) */
	private static final String NEW_LINE_CRLF = "\r\n";

	// ダウンロードファイル管理

	/** 処理管理番号 */
	// private static final String TRN_KANRI_NO = "000000000087";

	// 初期値

	/** 契約期間日 */
	private static final String INIT_DATA_KYK_KKN_DAY = "0";

	/** 契約期間年月 */
	private static final String INIT_DATA_KYK_KKN_YM = "0000";
	
	/** 圧縮レベルのプロパティファイルキー */
	private static final String PROP_KEY_COMP_LEVEL = "COMP_LEVEL";
	
	// データ件数
	private int count = 0;
	
	// 書き出し行数
	private int writeCount = 0;
	
	private File objCsvFile = null;
	
	private File objCompFile = null;
	
	// バッファサイズ
	FileOutputStream custinfoFileOutputStream = null;
	
	// 文字コード
	OutputStreamWriter custinfoOutputStreamWriter = null;
	
	// 追記モード
	BufferedWriter custinfoBufferdWriter = null;
	
	
	

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		//db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		//db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		
		
		// 顧客情報抽出サービスを実行
	//	executeKK_T_SVC_KEI_KK_SELECT_140(new Object[] {
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate,
	//			opeDate
	//			});

		// 実行結果を取得
	//	JBSbatCommonDBInterface resultMap = null;		
	//	resultMap = db_KK_T_SVC_KEI.selectNext();

		//String csvFilePath = commonItem.getFreeItem();
		String csvDirPath = commonItem.getFreeItem();
		
		// ++++++++++ v4.00.00 変更開始 ++++++++++ //
		//String csvFilePath = csvDirPath.concat("KOKYAKU_").concat(opeDate).concat(".csv");
		String csvFilePath = csvDirPath.concat("KOKYAKU").concat(".csv");
		// ++++++++++ v4.00.00 変更終了 ++++++++++ //
		
		if(count == 0){
			
	
			// CSVファイル
			
	
			try {
	
				objCsvFile = new File(csvFilePath);
	
				if (objCsvFile.exists() && objCsvFile.isFile()) {
					objCsvFile.delete();
				}
	
				objCsvFile.createNewFile();
			} catch(NullPointerException npe) {
				throw npe;
			} catch(SecurityException se) {
				throw se;
			} catch(Exception ex) {
				throw ex;
			}
			
			custinfoFileOutputStream = new FileOutputStream(objCsvFile, true);
			custinfoOutputStreamWriter = new OutputStreamWriter(custinfoFileOutputStream, CHARA_SET);
			custinfoBufferdWriter = new BufferedWriter(custinfoOutputStreamWriter);
		}
			
		

		try {

// 20140604 ANK-2100-00-00 Add Start
			if(count == 0){

				writeCount++;

				// No.1 ヘッダ＿サービス区分
				custinfoBufferdWriter.write(convCsvData4FstCol("サービス区分"));
				// No.2 ヘッダ＿お客様ＩＤ
				custinfoBufferdWriter.write(convCsvData("お客様ＩＤ"));
				// No.3 ヘッダ＿回線内訳番号
				custinfoBufferdWriter.write(convCsvData("回線内訳番号"));
				// No.4 ヘッダ＿申込書番号
				custinfoBufferdWriter.write(convCsvData("申込番号"));
				// No.5 ヘッダ＿申込年月日
				custinfoBufferdWriter.write(convCsvData("申込年月日"));
				// No.6 ヘッダ＿サービス開始日
				custinfoBufferdWriter.write(convCsvData("サービス開始日"));
				// No.7 ヘッダ＿解約年月日
				custinfoBufferdWriter.write(convCsvData("解約年月日"));
				// No.8 ヘッダ＿契約状態
				custinfoBufferdWriter.write(convCsvData("契約状態"));
				// No.9 ヘッダ＿審査結果
				custinfoBufferdWriter.write(convCsvData("審査結果"));
				// No.10 ヘッダ＿契約者タイプ
				custinfoBufferdWriter.write(convCsvData("契約者タイプ"));
				// No.11 ヘッダ＿お客様名
				custinfoBufferdWriter.write(convCsvData("お客様名"));
				// No.12 ヘッダ＿職業・業種
				custinfoBufferdWriter.write(convCsvData("職業・業種"));
				// No.13 ヘッダ＿性別
				custinfoBufferdWriter.write(convCsvData("性別"));
				// No.14 ヘッダ＿年齢
				custinfoBufferdWriter.write(convCsvData("年齢"));
				// No.15 ヘッダ＿年代
				custinfoBufferdWriter.write(convCsvData("年代"));
				// No.16 ヘッダ＿契約期間日
				custinfoBufferdWriter.write(convCsvData("契約期間日"));
				// No.17 ヘッダ＿契約期間年月
				custinfoBufferdWriter.write(convCsvData("契約期間年月"));
				// No.18 ヘッダ＿Ｘ座標
				custinfoBufferdWriter.write(convCsvData("Ｘ座標"));
				// No.19 ヘッダ＿Ｙ座標
				custinfoBufferdWriter.write(convCsvData("Ｙ座標"));
				// No.20 ヘッダ＿郵便番号
				custinfoBufferdWriter.write(convCsvData("郵便番号"));
				// No.21 ヘッダ＿都道府県名
				custinfoBufferdWriter.write(convCsvData("都道府県名"));
				// No.22 ヘッダ＿市区町村名
				custinfoBufferdWriter.write(convCsvData("市区町村名"));
				// No.23 ヘッダ＿大字通称名
				custinfoBufferdWriter.write(convCsvData("大字通称名"));
				// No.24 ヘッダ＿字丁目名
				custinfoBufferdWriter.write(convCsvData("字丁目名"));
				// No.25 ヘッダ＿番地号
				custinfoBufferdWriter.write(convCsvData("番地号"));
				// No.26 ヘッダ＿住所補記・建物名
				custinfoBufferdWriter.write(convCsvData("住所補記・建物名"));
				// No.27 ヘッダ＿住所補記・部屋番号
				custinfoBufferdWriter.write(convCsvData("住所補記・部屋番号"));
				// No.28 ヘッダ＿取扱コード1
				custinfoBufferdWriter.write(convCsvData("取扱コード1"));
				// No.29 ヘッダ＿取扱コード名称1
				custinfoBufferdWriter.write(convCsvData("取扱コード名称1"));
				// No.30 ヘッダ＿取扱コード2
				custinfoBufferdWriter.write(convCsvData("取扱コード2"));
				// No.31 ヘッダ＿取扱コード名称2
				custinfoBufferdWriter.write(convCsvData("取扱コード名称2"));
				// No.32 ヘッダ＿取扱コード3
				custinfoBufferdWriter.write(convCsvData("取扱コード3"));
				// No.33 ヘッダ＿取扱コード名称3
				custinfoBufferdWriter.write(convCsvData("取扱コード名称3"));
				// No.34 ヘッダ＿取扱コード4
				custinfoBufferdWriter.write(convCsvData("取扱コード4"));
				// No.35 ヘッダ＿取扱コード名称4
				custinfoBufferdWriter.write(convCsvData("取扱コード名称4"));
				// No.36 ヘッダ＿申込チャネル
				custinfoBufferdWriter.write(convCsvData("申込チャネル"));
				// No.37 ヘッダ＿申込区分1
				custinfoBufferdWriter.write(convCsvData("申込区分1"));
				// No.38 ヘッダ＿申込区分2
				custinfoBufferdWriter.write(convCsvData("申込区分2"));
				// No.39 ヘッダ＿法人名
				custinfoBufferdWriter.write(convCsvData("法人名"));
				// No.40 ヘッダ＿料金プラン
				custinfoBufferdWriter.write(convCsvData("料金プラン"));
				// No.41 ヘッダ＿マンションＩＤ
				custinfoBufferdWriter.write(convCsvData("マンションＩＤ"));
				// No.42 ヘッダ＿マンション名
				custinfoBufferdWriter.write(convCsvData("マンション名"));
				// No.43 ヘッダ＿とりまとめＩＤ
				custinfoBufferdWriter.write(convCsvData4LstCol("とりまとめＩＤ"));

			}
//20140604 ANK-2100-00-00 Add End

			writeCount++;

			

			// 顧客情報を全件出力
			//while (inMap != null) {

				// No.1 サービス区分
				custinfoBufferdWriter.write(convCsvData4FstCol(inMap.getString(JBSbatKKIFM292.PRC_GRP_NM)));
				// No.2 お客様ＩＤ
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.SVC_KEI_NO)));
				// No.3 回線内訳番号
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.SVC_KEI_KAISEN_UCWK_NO)));
				// No.4 申込書番号
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.MSKMSHO_DTL_NO)));
				// No.5 申込年月日
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.MSKM_YMD)));
				// No.6 サービス開始日
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.SVC_STA_YMD)));
				// No.7 解約年月日
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.SVC_DSL_YMD)));
				// No.8 契約状態
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.SVC_KEI_STAT_NM)));
				// No.9 審査結果
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.SKEKKA_CD_NM)));
				// No.10 契約者タイプ
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.KEISHA_TYPE_CD_NM)));
				// No.11 お客様名
				custinfoBufferdWriter.write(convCsvData(JKKBatCommon.getLCutString(inMap.getString(JBSbatKKIFM292.CUST_NM), 45)));
				// No.12 職業・業種
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.SHOKUGYO_CD_NM)));
				// No.13 性別
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.CUST_SEX_CD_NM)));
				// No.14 年齢
				custinfoBufferdWriter.write(convCsvData(getOld(inMap.getString(JBSbatKKIFM292.CUST_BIRTHD))));
				// No.15 年代
				custinfoBufferdWriter.write(convCsvData(getAge(inMap.getString(JBSbatKKIFM292.CUST_BIRTHD))));
				// No.16 契約期間日
				// No.17 契約期間年月
				{
					String kykKknDay = "";
					String kykKknYm = "";

					String svcStaYmd = null;
					String svcEndYmd = null;

					{
						svcStaYmd = inMap.getString(JBSbatKKIFM292.SVC_STA_YMD);

						if (JKKBatConst.CD_SBT_SVC_KEI_STAT_910.equals(inMap.getString(JBSbatKKIFM292.SVC_KEI_STAT))) {
							svcEndYmd = inMap.getString(JBSbatKKIFM292.SVC_ENDYMD);
						} else {
							svcEndYmd = commonItem.getOpeDate();
						}
					}

					if (JBSbatDateUtil.checkDate(svcStaYmd, 8) && JBSbatDateUtil.checkDate(svcEndYmd, 8)) {

						int intervalDay = JBSbatDateUtil.dayDiff(svcEndYmd, svcStaYmd, "1");

						if (intervalDay < 0) {
							intervalDay = 0;
						} else if (9999 < intervalDay) {
							intervalDay = 9999;
						}

						// 契約期間日
						kykKknDay = Integer.toString(intervalDay);

						int staYear = 0;
						int staMonth = 0;
						int staDay = 0;
						int endYear = 0;
						int endMonth = 0;
						int endDay = 0;

						try {
							staYear = Integer.parseInt(svcStaYmd.substring(0, 4));
							staMonth = Integer.parseInt(svcStaYmd.substring(4, 6));
							staDay = Integer.parseInt(svcStaYmd.substring(6, 8));
							endYear = Integer.parseInt(svcEndYmd.substring(0, 4));
							endMonth = Integer.parseInt(svcEndYmd.substring(4, 6));
							endDay = Integer.parseInt(svcEndYmd.substring(6, 8));
						} catch(NumberFormatException nfe) {
							
						}

						Calendar staCal = new GregorianCalendar(staYear, staMonth - 1, staDay, 0, 0, 0);
						Calendar endCal = new GregorianCalendar(endYear, endMonth - 1, endDay, 0, 0, 0);

						if (0 < intervalDay) {

							int y = 0;

							while (0 < (int) ((endCal.getTime().getTime() - staCal.getTime().getTime()) / (1000 * 60 * 60 * 24))) {
								y += 1;
								staCal = null;
								staCal  = new GregorianCalendar(staYear, staMonth - 1, staDay, 0, 0, 0);
								staCal.add(Calendar.YEAR, y);
							}
							if (0 < y) {
								y -= 1;
								staCal = null;
								staCal  = new GregorianCalendar(staYear, staMonth - 1, staDay, 0, 0, 0);
								staCal.add(Calendar.YEAR, y);
							}

							int m = 0;

							while (0 <= (int) ((endCal.getTime().getTime() - staCal.getTime().getTime()) / (1000 * 60 * 60 * 24))) {
								m += 1;
								staCal = null;
								staCal  = new GregorianCalendar(staYear, staMonth - 1, staDay, 0, 0, 0);
								staCal.add(Calendar.YEAR, y);
								staCal.add(Calendar.MONTH, m);
							}
							if (0 < m) {
								m -= 1;
								staCal = null;
								staCal  = new GregorianCalendar(staYear, staMonth - 1, staDay, 0, 0, 0);
								staCal.add(Calendar.YEAR, y);
								staCal.add(Calendar.MONTH, m);
							}

							if (0 <= (int) ((endCal.getTime().getTime() - staCal.getTime().getTime()) / (1000 * 60 * 60 * 24))) {
								m += 1;
							}

							if (12 <= m) {
								y += 1;
								m = m -12;
							}

							kykKknYm = (paddingZero(Integer.toString(y), 2)).concat(paddingZero(Integer.toString(m), 2));
						}
					}

					if (kykKknDay == null || "".equals(kykKknDay.trim())) {
						kykKknDay = INIT_DATA_KYK_KKN_DAY;
					}
					if (kykKknYm == null || "".equals(kykKknYm.trim())) {
						kykKknYm = INIT_DATA_KYK_KKN_YM;
					}

					super.logPrint.printDebugLog("----- START -----");
					super.logPrint.printDebugLog("サービス契約番号：" + inMap.getString(JBSbatKKIFM292.SVC_KEI_NO));
					if (JBSbatDateUtil.checkDate(svcStaYmd, 8) && JBSbatDateUtil.checkDate(svcEndYmd, 8)) {
						super.logPrint.printDebugLog("　・契約期間：" + svcStaYmd.substring(0, 4) + "/" + svcStaYmd.substring(4, 6) + "/" + svcStaYmd.substring(6, 8) + " 〜 " + svcEndYmd.substring(0, 4) + "/" + svcEndYmd.substring(4, 6) + "/" + svcEndYmd.substring(6, 8));
					} else {
						super.logPrint.printDebugLog("　・契約期間：なし");
					}
					super.logPrint.printDebugLog("　・契約期間日：" + kykKknDay);
					super.logPrint.printDebugLog("　・契約期間年月：" + kykKknYm);
					super.logPrint.printDebugLog("----- END -----");

					// No.16 契約期間日
					custinfoBufferdWriter.write(convCsvData(kykKknDay));
					// No.17 契約期間年月
					custinfoBufferdWriter.write(convCsvData(kykKknYm));
				}
				// No.18 Ｘ座標
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.XZAHYO)));
				// No.19 Ｙ座標
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.YZAHYO)));
				// No.20 郵便番号
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.KAISEN_PLACE_PCD)));
// ▼▼▼ IT1-2012-0002571対応 2012.12.25 MOD START ▼▼▼
//				// No.21 都道府県名
//				custinfoBufferdWriter.write(convCsvData(resultMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_STATE_NM)));
//				// No.22 市区町村名
//				custinfoBufferdWriter.write(convCsvData(resultMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_CITY_NM)));
//				// No.23 大字通称名
//				custinfoBufferdWriter.write(convCsvData(resultMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_OAZTSU_NM)));
//				// No.24 字丁目名
//				custinfoBufferdWriter.write(convCsvData(resultMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_AZCHO_NM)));
//				// No.25 番地号
//				custinfoBufferdWriter.write(convCsvData(resultMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_BNCHIGO)));
//				// No.26 住所補記・建物名
//				custinfoBufferdWriter.write(convCsvData(resultMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_ADRTTM)));
//				// No.27 住所補記・部屋番号
//				custinfoBufferdWriter.write(convCsvData(resultMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_ADRRM)));
				// 共通部品：住所編集部品
				String[] places = null;
				places = JZMAdEdit.getPtn07(
						inMap.getString(JBSbatKKIFM292.KAISEN_PLACE_STATE_NM),
						inMap.getString(JBSbatKKIFM292.KAISEN_PLACE_CITY_NM),
						inMap.getString(JBSbatKKIFM292.KAISEN_PLACE_OAZTSU_NM),
						inMap.getString(JBSbatKKIFM292.KAISEN_PLACE_AZCHO_NM),
						inMap.getString(JBSbatKKIFM292.KAISEN_PLACE_BNCHIGO),
						inMap.getString(JBSbatKKIFM292.KAISEN_PLACE_ADRTTM),
						inMap.getString(JBSbatKKIFM292.KAISEN_PLACE_ADRRM));
				// No.21 都道府県名
				custinfoBufferdWriter.write(convCsvData(places[0]));
				// No.22 市区町村名
				custinfoBufferdWriter.write(convCsvData(places[1]));
				// No.23 大字通称名
				custinfoBufferdWriter.write(convCsvData(places[2]));
				// No.24 字丁目名
				custinfoBufferdWriter.write(convCsvData(places[3]));
				// No.25 番地号
				custinfoBufferdWriter.write(convCsvData(places[4]));
				// No.26 住所補記・建物名
				custinfoBufferdWriter.write(convCsvData(places[5]));
				// No.27 住所補記・部屋番号
				custinfoBufferdWriter.write(convCsvData(places[6]));
// ▲▲▲ IT1-2012-0002571対応 2012.12.25 MOD END ▲▲▲
				// No.28 取扱コード1
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.AGNT_CD_1)));
				// No.29 取扱コード名称1
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.AGNT_NM_1)));
				// No.30 取扱コード2
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.AGNT_CD_2)));
				// No.31 取扱コード名称2
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.AGNT_NM_2)));
				// No.32 取扱コード3
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.AGNT_CD_3)));
				// No.33 取扱コード名称3
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.AGNT_NM_3)));
				// No.34 取扱コード4
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.AGNT_CD_4)));
				// No.35 取扱コード名称4
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.AGNT_NM_4)));
				// No.36 申込チャネル
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.TRAT_CD_YO_MKM_CHANNEL_NM)));
				// No.37 申込区分1
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.TRAT_CD_BRI_NM)));
				// No.38 申込区分2
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.TRAT_CD_BRI_DTL_NM)));
				// No.39 法人名
				if (JBSbatKKConst.HOJIN_ZENGO_SHITEI_CD_ZEN.equals(inMap.getString(JBSbatKKIFM292.HOJIN_ZENGO_SHITEI_CD))) {
					custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.HOJIN_SBT_CD_NM).concat(inMap.getString(JBSbatKKIFM292.COMP_NM))));
				} else if (JBSbatKKConst.HOJIN_ZENGO_SHITEI_CD_GO.equals(inMap.getString(JBSbatKKIFM292.HOJIN_ZENGO_SHITEI_CD))) {
					custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.COMP_NM).concat(inMap.getString(JBSbatKKIFM292.HOJIN_SBT_CD_NM))));
				} else if (JBSbatKKConst.HOJIN_ZENGO_SHITEI_CD_NO.equals(inMap.getString(JBSbatKKIFM292.HOJIN_ZENGO_SHITEI_CD))) {
					custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.COMP_NM)));
				} else {
					custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.COMP_NM)));
				}
				// No.40 料金プラン
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.PPLAN_NM)));
				// No.41 マンションＩＤ
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.MANSION_ID)));
				// No.42 マンション名
				custinfoBufferdWriter.write(convCsvData(inMap.getString(JBSbatKKIFM292.MANSION_NM)));
				// No.43 とりまとめＩＤ
				custinfoBufferdWriter.write(convCsvData4LstCol(inMap.getString(JBSbatKKIFM292.PID)));

				// バッファに蓄積可能な行数に達した場合
				if (WRITER_FLUSH_LIMIT_ROW_NUM == writeCount) {
					// ストリームをフラッシュ
					custinfoBufferdWriter.flush();
					writeCount = 0;
				}

//				inMap = db_KK_T_SVC_KEI.selectNext();

				count = count + 1;
			//}
			
			if(this.commonItem.isEndRecordFlg()){

				// ストリームをフラッシュ(残り分)
				custinfoBufferdWriter.flush();
// OM-2016-0000043 DEL START
//				// 圧縮レベルの取得
//				String compLevel = getCompLevel();
//				
//				// ファイルの圧縮、圧縮ファイルのパスの取得
//				String compFilePath = JCCCompressFileUtil.compressFile(csvFilePath, csvDirPath, "", "0", compLevel);
//				
//				String compFileName = fileRename(compFilePath, csvDirPath);
//				
//				objCompFile = new File(compFileName);
//				
//				String ifId = JKKBatConst.INTERFACE_ID_KKIFE153;			// FTP転送依頼するインターフェイスID
//				int esbSbt = JCCBatCommon.ISI;		// ESB種別
//				ArrayList<String> fileNameList = new ArrayList<String>();
//				fileNameList.add(compFileName);		// 連携するファイル名を設定（フルパス指定）
//				
//				JKKBatFTPUtil.putFile(super.commonItem, ifId, esbSbt, fileNameList);
// OM-2016-0000043 DEL END
	
//				String dlFileDelYmd = JBSbatDateUtil.adjustDate(opeDate, 1);
	
//				String[] eFileInfo = JCCBatCommon.createDenshiFile(commonItem, JKKStrConst.FILE_CD, csvFilePath, dlFileDelYmd);
	
//				{
//					JBSbatCommonDBInterface param = new JBSbatCommonDBInterface();
//					//  1.ファイル番号
//					param.setValue(JCCBatCommon.getFormatedNextSeq(commonItem, JKKStrConst.SEQ_FILE_NO, JKKStrConst.SEQ_PREFIX_SEQ_FILE_NOO, JKKStrConst.SEQ_LEN_SEQ_FILE_NO));
//					//  2.処理管理番号
//					param.setValue(TRN_KANRI_NO);
//					//  3.電子ファイル管理番号
//					param.setValue(eFileInfo[0]);
//					//  4.ファイル名
//					String[] fileName = csvFilePath.split("/", -1);
//					param.setValue(fileName[fileName.length - 1]);
//					//  5.ファイルサイズ
//					param.setValue(JCCFileUtil.getFileSize(csvFilePath));
//					//  6.データ件数
//					param.setValue(count);
//					//  7.ファイル登録年月日時分秒
//					param.setValue(eFileInfo[1]);
//					//  8.ファイル削除年月日
//					param.setValue(dlFileDelYmd);
//					//  9.登録年月日時分秒
//					param.setValue(null);
//					// 10.登録オペレータアカウント
//					param.setValue(null);
//					// 11.更新年月日時分秒
//					param.setValue(null);
//					// 12.更新オペレータアカウント
//					param.setValue(null);
//					// 13.削除年月日時分秒
//					param.setValue(null);
//					// 14.削除オペレータアカウント
//					param.setValue(null);
//					// 15.無効フラグ
//					param.setValue(null);
//	
//					// SQL実行
//					executeZM_T_DL_FILE_KANRI_PKINSERT(param.getList().toArray());
//				}
			}

		}  catch(FileNotFoundException fnfe) {
			throw fnfe;
		}  catch(SecurityException se) {
			throw se;
		} catch(UnsupportedEncodingException uee) {
			throw uee;
		} catch(IOException ioe) {
			throw ioe;
		} catch(JCCbatFrameworkException jccfe) {
			throw jccfe;
		} catch(Exception ex) {
			throw ex;
		} finally {
		
			if(this.commonItem.isEndRecordFlg()){
				if (custinfoBufferdWriter != null) {
					try {
						custinfoBufferdWriter.close();
					} catch (Exception ex) {
// IT1-2013-0000351 2013/02/28 MOD START
//						throw ex;
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0500CE, new String[]{csvFilePath});
// IT1-2013-0000351 2013/02/28 MOD END
					}
				}
	
				if (custinfoOutputStreamWriter != null) {
					try {
						custinfoOutputStreamWriter.close();
					} catch (Exception ex) {
// IT1-2013-0000351 2013/02/28 MOD START
//						throw ex;
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0500CE, new String[]{csvFilePath});
// IT1-2013-0000351 2013/02/28 MOD END
					}
				}
	
				if (custinfoFileOutputStream != null) {
					try {
						custinfoFileOutputStream.close();
					} catch (Exception ex) {
// IT1-2013-0000351 2013/02/28 MOD START
//						throw ex;
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0500CE, new String[]{csvFilePath});
// IT1-2013-0000351 2013/02/28 MOD END
					}
				}
	
				try {
	
// OM-2016-0000043 DEL START
//					if (objCsvFile != null) {
//						if (objCsvFile.exists() && objCsvFile.isFile()) {
//							objCsvFile.delete();
//						}
//					}
// OM-2016-0000043 DEL END
					
					if (objCompFile != null) {
						if (objCompFile.exists() && objCompFile.isFile()) {
							objCompFile.delete();
						}
					}
					
				} catch(NullPointerException npe) {
					throw npe;
				} catch(SecurityException se) {
					throw se;
				} catch(Exception ex) {
					throw ex;
				}
			}
		}

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
//		db_KK_T_SVC_KEI.close();
//		db_ZM_T_DL_FILE_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_140)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 *		 	運用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	//private void executeKK_T_SVC_KEI_KK_SELECT_140(Object[] param) throws Exception
	//{
		// バイント変数のリストを生成します
	//	JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
	//	paramList.setValue(param[0].toString());
	//	paramList.setValue(param[1].toString());
	//	paramList.setValue(param[2].toString());
	//	paramList.setValue(param[3].toString());
	//	paramList.setValue(param[4].toString());
	//	paramList.setValue(param[5].toString());
	//	paramList.setValue(param[6].toString());
	//	paramList.setValue(param[7].toString());
	//	paramList.setValue(param[8].toString());
	//	paramList.setValue(param[9].toString());
	//	paramList.setValue(param[10].toString());
	//	paramList.setValue(param[11].toString());
	//	paramList.setValue(param[12].toString());
	//	paramList.setValue(param[13].toString());
	//	paramList.setValue(param[14].toString());
	//	paramList.setValue(param[15].toString());
	//	paramList.setValue(param[16].toString());
	//	paramList.setValue(param[17].toString());

		// DBアクセスを実行します
	//	db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_140);
	//}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	ファイル番号				FILE_NO
	 *		 	処理管理番号				TRN_KANRI_NO
	 *		 	電子ファイル管理番号				EFILE_KANRI_NO
	 *		 	ファイル名				FILE_NM
	 *		 	ファイルサイズ				FILE_SIZE
	 *		 	データ件数				DATA_CNT
	 *		 	ファイル登録年月日時分秒				FILE_ADD_DTM
	 *		 	ファイル削除年月日				FILE_DEL_YMD
	 *		 	登録年月日時分秒				ADD_DTM
	 *		 	登録オペレータアカウント				ADD_OPEACNT
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント				UPD_OPEACNT
	 *		 	削除年月日時分秒				DEL_DTM
	 *		 	削除オペレータアカウント				DEL_OPEACNT
	 *		 	無効フラグ				MK_FLG
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
//	private void executeZM_T_DL_FILE_KANRI_PKINSERT(Object[] setParam) throws Exception
//	{
//		// 設定値のマップを作成します
//		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.FILE_NO, setParam[0]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.TRN_KANRI_NO, setParam[1]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.EFILE_KANRI_NO, setParam[2]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.FILE_NM, setParam[3]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.FILE_SIZE, setParam[4]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.DATA_CNT, setParam[5]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.FILE_ADD_DTM, setParam[6]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.FILE_DEL_YMD, setParam[7]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.ADD_DTM, setParam[8]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.ADD_OPEACNT, setParam[9]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.UPD_DTM, setParam[10]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.UPD_OPEACNT, setParam[11]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.DEL_DTM, setParam[12]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.DEL_OPEACNT, setParam[13]);
//		setMap.setValue(JBSbatZM_T_DL_FILE_KANRI.MK_FLG, setParam[14]);
//	
//		// DBアクセスを実行します
//		db_ZM_T_DL_FILE_KANRI.insertByPrimaryKeys(setMap);
//	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 年齢を取得する
	 * @param birthd 生年月日
	 * @return String
	 * @throws Exception
	 */
	private String getOld(String birthd) throws Exception {

		if (birthd == null || "".equals(birthd) || birthd.length() != 8) {
			return "";
		}

		//String sysDate = JCCBatCommon.getSysDate();
		String unyoDate = commonItem.getOpeDate();

		int year = Integer.parseInt(unyoDate.substring(0, 4));
		int month = Integer.parseInt(unyoDate.substring(4, 6));
		int day = Integer.parseInt(unyoDate.substring(6, 8));

		int age = 0;
		age = year - Integer.parseInt(birthd.substring(0, 4));

		if (Integer.parseInt(birthd.substring(4, 6)) > month) {
			age -= 1;
		} else if (Integer.parseInt(birthd.substring(4, 6)) == month) {
			if (Integer.parseInt(birthd.substring(6, 8)) > day) {
				age -= 1;
			}
		} else {
			// ignore
		}

		return String.valueOf(age);
	}

	/**
	 * 年代を取得する
	 * @param birthd 生年月日
	 * @return String
	 * @throws Exception
	 */
	private String getAge(String birthd) throws Exception {

		String old = getOld(birthd);

		if (old == null || "".equals(old)) {
			return "";
		}

		String age = "";

		if (old.length() == 3) {
			age = (old.substring(0, 2)).concat("0");
		} else if (old.length() == 2) {
			age = (old.substring(0, 1)).concat("0");
		} else if (old.length() == 1) {
			age = old;
		} else {
			// ignore
		}

		return age;
	}

	/**
	 * 年代を取得する
	 * @param birthd 生年月日
	 * @return String
	 * @throws Exception
	 */
	private String paddingZero(String value, int length) throws Exception {

		if (value == null || "".equals(value)) {
			return "";
		}

		if (length <= value.length()) {
			return value;
		}

		StringBuilder sbZero = new StringBuilder("0");

		while (value.length() < length) {
			value = sbZero.append(value).toString();
		}

		return value;
	}

	/**
	 * 引数で渡された値をCSV出力データにします。
	 * @param value データ
	 * @return CSV出力データ
	 * @exception Exception 予期しない例外
	 */
	public String convCsvData4FstCol(String value) throws Exception{

		if (value == null) {
			value = "";
		}

		return "\"".concat(value.trim()).concat("\"");
	}

	/**
	 * 引数で渡された値をCSV出力データにします。
	 * @param value データ
	 * @return CSV出力データ
	 * @exception Exception 予期しない例外
	 */
	public String convCsvData(String value) throws Exception{
		return ",".concat(convCsvData4FstCol(value));
	}

	/**
	 * 引数で渡された値をCSV出力データにします。
	 * @param value データ
	 * @return CSV出力データ
	 * @exception Exception 予期しない例外
	 */
	public String convCsvData4LstCol(String value) throws Exception{
		return convCsvData(value).concat(NEW_LINE_CRLF);
	}
	
	/**
	 * アプリケーションプロパティファイルから圧縮レベルを取得する。
	 * <br>
	 * @return 圧縮レベル
	 * @throws JCCbatFrameworkException バッチフレームワーク例外
	 */
	private static String getCompLevel() throws JCCbatFrameworkException 
	{
		// 圧縮レベル
		String compLevel = JCCBatCommon.getApplicationConst(PROP_KEY_COMP_LEVEL);
		if (!JCCBatCommon.isNotNull(compLevel))
		{
			throw new JCCbatFrameworkException("APLConst.propertiesに圧縮レベルの定義がありません。");
		}
		
		// 圧縮レベル（範囲チェック用）
		int intCompLevel = 0;
		try
		{
			intCompLevel = Integer.parseInt(compLevel);
		}
		catch (NumberFormatException e)
		{
			throw new JCCbatFrameworkException("圧縮レベルの定義が不正です。");
		}
		
		// 圧縮レベルの範囲確認
		if (intCompLevel < 1 || 9 < intCompLevel)
		{
			throw new JCCbatFrameworkException("圧縮レベルが範囲外の設定です。");
		}
		return compLevel;
	}
	
	/**
	 * ファイル名変更処理
	 */
	public String fileRename(String compFilePath, String outDir){
		String FilePath = compFilePath;
		// ++++++++++ v4.00.00 変更開始 ++++++++++ //
		//String renameFilePath  = outDir.concat("KOKYAKU_").concat(opeDate).concat(".zip");
		String renameFilePath  = outDir.concat("KOKYAKU").concat(".zip");
		// ++++++++++ v4.00.00 変更終了 ++++++++++ //
		File bfFile = new File(FilePath);
		File renameFile = new File(renameFilePath);
		
		// コンペア用ファイルの名前を変更し、フォルダ移動
		bfFile.renameTo(renameFile);
		
		return renameFilePath;
	}

}
