/*
 * MosP - Mind Open Source Project    http://www.mosp.jp/
 * Copyright (C) MIND Co., Ltd.       http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
/**
 * 
 */
package jp.mosp.kintai.payroll.action;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;

import jp.mosp.common.CommonConst;
import jp.mosp.common.common.BaseVo;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;
import jp.mosp.common.common.ValidateUtility;
import jp.mosp.common.part.MosPCodePart;
import jp.mosp.common.utils.CsvUtil;
import jp.mosp.common.utils.DateUtil;
import jp.mosp.common.utils.StringUtil;
import jp.mosp.common.utils.VariousUtil;
import jp.mosp.kintai.common.action.KintaiCommonAction;
import jp.mosp.kintai.common.part.PaidHolidayPart;
import jp.mosp.kintai.dto.MYukyuDto;
import jp.mosp.kintai.payroll.dao.KdPaidHolidayDao;
import jp.mosp.kintai.payroll.dto.KdPaidHolidayDto;
import jp.mosp.kintai.payroll.vo.PaidHolidayImportCardVo;

/**
 * @author nakamura
 *
 */
public class PaidHolidayImportCardAction extends KintaiCommonAction {
	
	// コマンド
	private static final String	CMD_SHOW	= "P1120";
	private static final String	CMD_UPLOAD	= "P1121";
	private static final String	CMD_IMPORT	= "P1122";
	private static final String	CMD_REPORT	= "P1123";
	
	private StringBuffer		errMessage;
	// ファイル内重複確認用
	private HashSet<String>		hashSet;
	// エラー件数
	private int					errorCount;
	// 表示用配列
	private List<String[]>		viewList;
	// エラーリポート
	private StringBuffer		errorReport;
	

	/**
	 * コンストラクター
	 */
	public PaidHolidayImportCardAction() {
		super();
	}
	
	public void action() throws Exception {
		// VOの準備
		prepareVo();
		// 初期処理
		init();
		// コマンド毎の処理
		if (CMD_SHOW.equals(cmd)) {
			// 表示
			show();
		} else if (CMD_UPLOAD.equals(cmd)) {
			// アップロード
			upload();
		} else if (CMD_IMPORT.equals(cmd)) {
			// 登録
			insert();
		} else if (CMD_REPORT.equals(cmd)) {
			// エラー出力
			report();
		} else {
			throw new MospException(MospConst.EX_CMD_INVALID);
		}
	}
	
	@Override
	protected BaseVo getSpecificVo() {
		return new PaidHolidayImportCardVo();
	}
	
	@Override
	protected void init() throws Exception {
		getConnection();
	}
	
	@Override
	protected void show() throws Exception {
		PaidHolidayImportCardVo vo = (PaidHolidayImportCardVo)getVo();
		vo.setMode(PaidHolidayImportCardVo.MODE_VIEW);
	}
	
	/**
	 * アップロード
	 * @throws Exception 	例外処理が発生した場合
	 */
	private void upload() throws Exception {
		PaidHolidayImportCardVo vo = (PaidHolidayImportCardVo)getVo();
		// ファイル情報設定
		vo.setFilUploadFile(multipartFieldList);
		// アップロードファイル名
		String uploadFileName = vo.getFilUploadFile().getName();
		// 旧有給休暇情報インポート用のリスト
		List<MYukyuDto> oldImportList = new ArrayList<MYukyuDto>();
		// 新有給休暇情報インポート用のリスト
		List<KdPaidHolidayDto> newImportList = new ArrayList<KdPaidHolidayDto>();
		// ファイル内重複確認用
		hashSet = new HashSet<String>();
		// 表示用配列
		viewList = new ArrayList<String[]>();
		// エラー件数
		errorCount = 0;
		// エラーリポート
		errorReport = new StringBuffer();
		// csvファイル
		if (uploadFileName.matches(".*" + ".csv" + ".*")) {
			String[][] aryAllValues = CsvUtil.getAllValues(getUploadFile(vo.getFilUploadFile()));
			String[] oldTableHeader = part().paidHoliday().getOldPaidHolidayCsvHeader();
			String[] newTableHeader = part().paidHoliday().getNewPaidHolidayCsvHeader();
			int i = 0;
			for (String[] aryValue : aryAllValues) {
				// エラー内容
				errMessage = new StringBuffer();
				// ヘッダー情報
				if (i == 0) {
					if (StringUtil.checkArraysEquals(aryValue, oldTableHeader)) {
						vo.setTable(PaidHolidayImportCardVo.TABLE_OLD);
					} else if (StringUtil.checkArraysEquals(aryValue, newTableHeader)) {
						vo.setTable(PaidHolidayImportCardVo.TABLE_NEW);
					} else {
						// エラーメッセージの表示
						addErrMessage(getMessage(CommonConst.MSG_INVALID_HEAD_TYPE, ""));
						break;
					}
				} else {
					if (vo.getTable() == PaidHolidayImportCardVo.TABLE_OLD) {
						if (aryValue.length >= oldTableHeader.length) {
							// 旧有給休暇テーブル情報
							convDataToOldInfo(aryValue, oldTableHeader, i, oldImportList);
						} else {
							// エラーメッセージの表示
							addCsvErrMessage("WC0013", String.valueOf(i));
							addErrorReport(oldTableHeader, aryValue);
						}
					} else if (vo.getTable() == PaidHolidayImportCardVo.TABLE_NEW) {
						if (aryValue.length >= newTableHeader.length - 4) {
							// 新有給休暇テーブル情報
							convDataToNewInfo(aryValue, newTableHeader, i, newImportList);
						} else {
							// エラーメッセージの表示
							addCsvErrMessage("WC0013", String.valueOf(i));
							addErrorReport(newTableHeader, aryValue);
						}
					}
				}
				i++;
			}
		} else {
			addErrMessage(getMessage(CommonConst.MSG_NO_CSV_DATA, ""));
		}
		// モードの設定
		vo.setMode(PaidHolidayImportCardVo.MODE_VIEW);
		if (vo.getTable() == PaidHolidayImportCardVo.TABLE_OLD) {
			// インポートリストをセット
			vo.setOldImportList(oldImportList);
			// メッセージの表示
			setMessage(getMessage("IC0005", String.valueOf(oldImportList.size())));
			// 表示用カラム名称設定
			setOldColumnName();
		} else if (vo.getTable() == PaidHolidayImportCardVo.TABLE_NEW) {
			// インポートリストをセット
			vo.setNewImportList(newImportList);
			// メッセージの表示
			setMessage(getMessage("IC0005", String.valueOf(newImportList.size())));
			// 表示用カラム名称設定
			setNewColumnName();
		}
		if (oldImportList.size() != 0 || newImportList.size() != 0) {
			// モードの設定
			vo.setMode(PaidHolidayImportCardVo.MODE_UPLOAD);
		}
		if (errorCount > 0) {
			// インポートできないエラーの詳細をセット
			vo.setErrorReport(errorReport);
			// エラーメッセージ
			StringBuffer sb = new StringBuffer();
			sb.append(errorCount);
			sb.append("件のデータ");
			addErrMessage(getMessage(CommonConst.MSG_NO_UPLOAD_KEY, sb.toString()));
			// モードの設定
			vo.setMode(PaidHolidayImportCardVo.MODE_REPORT);
		}
		// VOへセット
		vo.setFields(viewList);
		vo.initListInfo();
	}
	
	@Override
	protected void insert() throws Exception {
		PaidHolidayImportCardVo vo = (PaidHolidayImportCardVo)getVo();
		// モードの設定
		vo.setMode(PaidHolidayImportCardVo.MODE_VIEW);
		// エラーのある行
		HashSet<Integer> errSet = new HashSet<Integer>();
		if (vo.getTable() == PaidHolidayImportCardVo.TABLE_OLD) {
			if (VariousUtil.isNotNull(vo.getOldImportList())) {
				List<MYukyuDto> oldImportList = vo.getOldImportList();
				int i = 0;
				for (MYukyuDto dto : oldImportList) {
					// 社員の存在確認
					if (VariousUtil.isNull(part().human().getBasisInfo(dto.getKCode()))) {
						// エラーメッセージの表示
						addErrMessage(getMessage("IC0006", String.valueOf(i)));
						errSet.add(i);
					}
					// データの重複確認
					if (VariousUtil.isNotNull(part().paidHoliday().getYukyuInfo(dto.getKCode(), dto.getKyuyoYMD()))) {
						// エラーメッセージの表示
						addErrMessage(getMessage("WC1023", ""));
						errSet.add(i);
					}
					i++;
				}
				if (errSet.size() == 0) {
					// 登録
					int count = part().paidHoliday().getMYukyuDao()
						.insert(oldImportList, CommonConst.NUM_DIVIDE_NUMBER);
					// コミット
					commit();
					// メッセージの表示
					setMessage(getMessage("IC0014", String.valueOf(count)));
				}
			} else {
				// エラーメッセージの表示
				addErrMessage(getMessage("WC0018", ""));
			}
		} else if (vo.getTable() == PaidHolidayImportCardVo.TABLE_NEW) {
			if (VariousUtil.isNotNull(vo.getNewImportList())) {
				List<KdPaidHolidayDto> newImportList = vo.getNewImportList();
				// DAOの準備
				KdPaidHolidayDao dao = part().paidHoliday().getPaidHolidayDao();
				int i = 0;
				for (KdPaidHolidayDto dto : newImportList) {
					// 社員の存在確認
					if (VariousUtil.isNull(part().human().getBasisInfo(dto.getKCode()))) {
						// エラーメッセージの表示
						addErrMessage(getMessage("IC0006", String.valueOf(i)));
						errSet.add(i);
					}
					if (VariousUtil.isNotNull(dao.findForKey(dto.getPaidId(), dto.getKCode()))) {
						// エラーメッセージの表示
						addErrMessage(getMessage("WC1023", ""));
						errSet.add(i);
					}
					i++;
				}
				if (errSet.size() == 0) {
					// 登録
					int count = dao.insert(newImportList, CommonConst.NUM_DIVIDE_NUMBER);
					// コミット
					commit();
					// メッセージの表示
					setMessage(getMessage("IC0014", String.valueOf(count)));
				}
			} else {
				// エラーメッセージの表示
				addErrMessage(getMessage("WC0018", ""));
			}
		}
	}
	
	/**
	 * レポート出力
	 */
	private void report() {
		PaidHolidayImportCardVo vo = (PaidHolidayImportCardVo)getVo();
		if (vo.getTable() == PaidHolidayImportCardVo.TABLE_OLD) {
			// 出力ファイル名
			request.setAttribute(MospConst.ATT_FILE_NAME, "MYukyuImportError.csv");
		} else if (vo.getTable() == PaidHolidayImportCardVo.TABLE_NEW) {
			// 出力ファイル名
			request.setAttribute(MospConst.ATT_FILE_NAME, "PaidHolidayImportError.csv");
		}
		// 出力内容
		request.setAttribute(MospConst.ATT_FILE_OBJECT, vo.getErrorReport());
		// 処理シーケンス発番不要設定
		setNeedProcSeq(false);
	}
	
	/**
	 * @param aryValue データ配列
	 * @param aryHeader ヘッダー配列
	 * @param i インデックス
	 * @param oldImportList 旧有給休暇情報インポート用のリスト
	 * @throws Exception 	例外処理が発生した場合
	 */
	private void convDataToOldInfo(String[] aryValue, String[] aryHeader, int i, List<MYukyuDto> oldImportList)
			throws Exception {
		// 社員コード
		String kCode = aryValue[0];
		// 給与計算年月日
		int kyuyoYMD = 0;
		// 前月残数(当年)
		double zZanT = 0;
		// 前月残数(前年)
		double zZanZ = 0;
		// 当月使用
		double syoka = 0;
		// 当月取得
		int syutoku = 0;
		// 当月廃棄
		double haiki = 0;
		// 当月残数(当年)
		double tZanT = 0;
		// 当月残数(前年)
		double tZanZ = 0;
		try {
			// 項目長確認
			checkLength(aryValue[0], aryHeader[0], CommonConst.LEN_K_CODE);
			checkLength(aryValue[1], aryHeader[1], CommonConst.LEN_KYUYO_YMD);
			checkLength(aryValue[5], aryHeader[5], CommonConst.LEN_SYUTOKU);
			// 存在確認
			checkAvailableUser(kCode, i);
			// 日付の変換
			Date kyuyoDate = checkTargetDate(aryValue[1], aryHeader[1]);
			if (VariousUtil.isNotNull(kyuyoDate)) {
				kyuyoYMD = DateUtil.convDateToInteger(kyuyoDate);
			}
			// 数値確認
			if (checkPaidHolidayValue(aryValue[2], aryHeader[2])) {
				zZanT = Double.parseDouble(aryValue[2]);
			}
			if (checkPaidHolidayValue(aryValue[3], aryHeader[3])) {
				zZanZ = Double.parseDouble(aryValue[3]);
			}
			if (checkPaidHolidayValue(aryValue[4], aryHeader[4])) {
				syoka = Double.parseDouble(aryValue[4]);
			}
			if (checkNumber(aryValue[5], aryHeader[5])) {
				syutoku = Integer.parseInt(aryValue[5]);
			}
			if (checkPaidHolidayValue(aryValue[6], aryHeader[6])) {
				haiki = Double.parseDouble(aryValue[6]);
			}
			if (checkPaidHolidayValue(aryValue[7], aryHeader[7])) {
				tZanT = Double.parseDouble(aryValue[7]);
			}
			if (checkPaidHolidayValue(aryValue[8], aryHeader[8])) {
				tZanZ = Double.parseDouble(aryValue[8]);
			}
		} catch (NumberFormatException e) {
			// エラー一覧へ追加
			addCsvErrMessage(CommonConst.MSG_INVALID_DATA_TYPE, String.valueOf(i));
		} catch (NullPointerException e) {
			// エラー一覧へ追加			
			addCsvErrMessage(CommonConst.MSG_INVALID_DATA_TYPE, String.valueOf(i));
		} catch (MospException e) {
			// エラー一覧へ追加
			addCsvErrMessage("WC1023", "");
		}
		if (kyuyoYMD > 0) {
			// ファイル内重複確認
			String hashCode = StringUtil.combineByComma(kCode, String.valueOf(kyuyoYMD));
			if (!hashSet.contains(hashCode)) {
				hashSet.add(hashCode);
			} else {
				// ファイル内重複エラーメッセージ
				addCsvErrMessage("WC0027", "");
			}
			// データ重複確認
			if (VariousUtil.isNotNull(part().paidHoliday().getYukyuInfo(kCode, kyuyoYMD))) {
				// エラー一覧へ追加
				addCsvErrMessage("WC1023", "");
			}
		}
		if (errMessage.length() == 0) {
			// インポート用リストへ追加
			oldImportList.add(PaidHolidayPart.createMYukyuDto(kCode, kyuyoYMD, zZanT, zZanZ, syoka, syutoku, haiki,
					tZanT, tZanZ));
			// 表示用リストへ追加
			viewList.add(aryValue);
		} else {
			// エラー一覧へ追加
			addErrorReport(aryHeader, aryValue);
		}
	}
	
	/**
	 * @param aryValue データ配列
	 * @param aryHeader ヘッダー配列
	 * @param i インデックス
	 * @param newImportList 新有給休暇情報インポート用のリスト
	 * @throws Exception 	例外処理が発生した場合
	 */
	private void convDataToNewInfo(String[] aryValue, String[] aryHeader, int i, List<KdPaidHolidayDto> newImportList)
			throws Exception {
		// 有休ID
		long paidHolidayId = 0;
		// 社員コード
		String kCode = aryValue[1];
		// 処理コード
		String processType = aryValue[2];
		// 処理日
		Date processDate = null;
		// 前年度残日数
		double lastRemainDays = 0;
		// 前年度残時間
		int lastRemainHour = 0;
		// 今年度残日数
		double remainDays = 0;
		// 今年度残時間
		int remainHour = 0;
		// 時間単位取得可能日数
		int possible = 0;
		// 削除フラグ
		int deleteFlag = 0;
		try {
			// 項目長確認
			checkLength(aryValue[0], aryHeader[0], CommonConst.LEN_PAID_HOLIDAY_ID);
			checkLength(aryValue[1], aryHeader[1], CommonConst.LEN_K_CODE);
			checkLength(aryValue[2], aryHeader[2], CommonConst.LEN_PROCESS_TYPE);
			checkLength(aryValue[3], aryHeader[3], CommonConst.LEN_PROCESS_DATE);
			checkLength(aryValue[5], aryHeader[5], CommonConst.LEN_LAST_REMAIN_HOUR);
			checkLength(aryValue[7], aryHeader[7], CommonConst.LEN_REMAIN_HOUR);
			checkLength(aryValue[8], aryHeader[8], CommonConst.LEN_POSSIBLE);
			checkLength(aryValue[9], aryHeader[9], CommonConst.LEN_FLAG);
			// 存在確認
			checkAvailableUser(kCode, i);
			// 処理コード確認
			checkProcessCode(processType, aryHeader[2]);
			// 日付の変換
			processDate = checkTargetDate(aryValue[3], aryHeader[3]);
			// 数値確認
			if (checkNumber(aryValue[0], aryHeader[0])) {
				paidHolidayId = Long.parseLong(aryValue[0]);
			}
			if (checkPaidHolidayValue(aryValue[4], aryHeader[4])) {
				lastRemainDays = Double.parseDouble(aryValue[4]);
			}
			if (checkNumber(aryValue[5], aryHeader[5])) {
				lastRemainHour = Integer.parseInt(aryValue[5]);
			}
			if (checkPaidHolidayValue(aryValue[6], aryHeader[6])) {
				remainDays = Double.parseDouble(aryValue[6]);
			}
			if (checkNumber(aryValue[7], aryHeader[7])) {
				remainHour = Integer.parseInt(aryValue[7]);
			}
			if (checkNumber(aryValue[8], aryHeader[8])) {
				possible = Integer.parseInt(aryValue[8]);
			}
			if (checkNumber(aryValue[9], aryHeader[9])) {
				deleteFlag = Integer.parseInt(aryValue[9]);
			}
		} catch (NumberFormatException e) {
			// エラー一覧へ追加
			addCsvErrMessage(CommonConst.MSG_INVALID_DATA_TYPE, String.valueOf(i));
		} catch (NullPointerException e) {
			// エラー一覧へ追加
			addCsvErrMessage(CommonConst.MSG_INVALID_DATA_TYPE, String.valueOf(i));
		} catch (MospException e) {
			// エラー一覧へ追加
			addCsvErrMessage("WC1023", "");
		}
		// ファイル内重複確認
		String hashCode = StringUtil.combineByComma(String.valueOf(paidHolidayId), kCode);
		if (!hashSet.contains(hashCode)) {
			hashSet.add(hashCode);
		} else {
			// ファイル内重複エラーメッセージ
			addCsvErrMessage("WC0027", "");
		}
		// データ重複確認
		if (VariousUtil.isNotNull(part().paidHoliday().getPaidHolidayDao().findForKey(paidHolidayId, kCode))) {
			// エラー一覧へ追加
			addCsvErrMessage("WC1023", "");
		}
		if (errMessage.length() == 0) {
			// インポート用リストへ追加
			newImportList.add(PaidHolidayPart.createKdPaidHolidayDto(paidHolidayId, kCode, processType, processDate,
					lastRemainDays, lastRemainHour, remainDays, remainHour, possible, deleteFlag));
			// 表示用リストへ追加
			viewList.add(aryValue);
		} else {
			// エラー一覧へ追加
			addErrorReport(aryHeader, aryValue);
		}
	}
	
	/**
	 * 日付変換
	 * @param value 対象文字列
	 * @param header 対象ヘッダー
	 * @return 変換後日付
	 * @throws MospException 	MosP例外処理が発生した場合
	 */
	private Date checkTargetDate(String value, String header) throws MospException {
		PaidHolidayImportCardVo vo = (PaidHolidayImportCardVo)getVo();
		Date date = null;
		// yyyy/mm/ddである場合
		date = DateUtil.convStringDateToDate(value);
		if (VariousUtil.isNull(date)) {
			// yyyy-mm-ddである場合
			date = DateUtil.convHyphenDateToDate(value);
			if (VariousUtil.isNull(date)) {
				// yyyymmddである場合
				if (value.length() < 9) {
					date = DateUtil.convStringBaseDateToDate(value);
					// 日付確認(繰越されている場合エラー)
					if (!String.valueOf(DateUtil.convDateToInteger(date)).equals(value)) {
						// エラー一覧へ追加
						addCsvErrMessage("WC0006", header);
					}
				}
			}
		}
		if (VariousUtil.isNotNull(date)) {
			if (!ValidateUtility.chkDate(MospUtility.getYear(date), MospUtility.getMonth(date) - 1, MospUtility
				.getDay(date))) {
				// エラー一覧へ追加
				addCsvErrMessage("WC0006", header);
			}
			if (vo.getTable() == PaidHolidayImportCardVo.TABLE_OLD) {
				// 改正労働基準法施行日より後日の場合
				if (MosPCodePart.afterLegalReformDate(date)) {
					// エラー一覧へ追加
					addCsvErrMessage("WC0028", StringUtil.combineByComma(header, DateUtil
						.convDateToFormatDateJPShort(DateUtil.getLegalReformDate())));
				}
			} else if (vo.getTable() == PaidHolidayImportCardVo.TABLE_NEW) {
				// 改正労働基準法施行日より前の場合
				if (!MosPCodePart.afterLegalReformDate(date)) {
					// エラー一覧へ追加
					addCsvErrMessage("WC0023", StringUtil.combineByComma(header, DateUtil
						.convDateToFormatDateJPShort(DateUtil.getLegalReformDate())));
				}
			}
		} else {
			// エラー一覧へ追加
			addCsvErrMessage("WC0006", header);
		}
		return date;
	}
	
	/**
	 * @param kCode 対象社員コード
	 * @param i インデックス
	 * @throws Exception 例外処理が発生した場合
	 */
	private void checkAvailableUser(String kCode, int i) throws Exception {
		// 存在確認
		if (VariousUtil.isNull(part().human().getBasisInfo(kCode))) {
			// エラー一覧へ追加
			addCsvErrMessage("IC0006", String.valueOf(i));
		}
	}
	
	/**
	 * 有給休暇残数値確認
	 * @param value 対象文字列
	 * @param header 対象ヘッダー
	 * @throws MospException 	MosP例外処理が発生した場合
	 * @return 
	 * <p>
	 * 対象が0.5で割り切れる場合true、そうでない場合false
	 * </p>
	 */
	private boolean checkPaidHolidayValue(String value, String header) throws MospException {
		if (ValidateUtility.chkNumeric(value)) {
			double days = Double.parseDouble(value);
			if (String.valueOf(days).endsWith(".0") || String.valueOf(days).endsWith(".5")) {
				return true;
			}
		}
		addCsvErrMessage("WC0005", header);
		return false;
	}
	
	/**
	 * 整数型確認(小数点確認)
	 * @param value 対象文字列
	 * @param header 対象ヘッダー
	 * @throws MospException 	MosP例外処理が発生した場合
	 * @return 
	 * <p>
	 * 対象が整数の場合true、そうでない場合false
	 * </p>
	 */
	private boolean checkNumber(String value, String header) throws MospException {
		if (!ValidateUtility.chkRegex("\\d*", value)) {
			addCsvErrMessage("WC0005", header);
			return false;
		}
		return true;
	}
	
	/**
	 * 文字列長確認(最大文字数)
	 * <p>
	 * 文字列が最大文字数より長い場合エラーメッセージを項目に追加する。
	 * </p>
	 * @param value 対象文字列
	 * @param header 対象ヘッダー
	 * @param maxLength 最大文字数
	 * @throws MospException  	MosP例外処理が発生した場合
	 */
	private void checkLength(String value, String header, int maxLength) throws MospException {
		StringBuffer sb = new StringBuffer();
		sb.append(".{0,");
		sb.append(maxLength);
		sb.append("}");
		if (!ValidateUtility.chkRegex(sb.toString(), value)) {
			addCsvErrMessage("WC0004", StringUtil.combineByComma(header, String.valueOf(maxLength)));
		}
	}
	
	/**
	 * 処理コード確認
	 * <p>
	 * 予想されない処理コードの場合エラーメッセージを項目に追加する。
	 * </p>
	 * @param value 対象処理コード
	 * @param header 対処ヘッダー
	 * @throws MospException MosP例外処理が発生した場合
	 */
	private void checkProcessCode(String value, String header) throws MospException {
		if (!CommonConst.CODE_PROCESS_INITIAL.equals(value) && !CommonConst.CODE_PROCESS_MONTHLY.equals(value)
				&& !CommonConst.CODE_PROCESS_SUPPLY.equals(value) && !CommonConst.CODE_PROCESS_WASTE.equals(value)) {
			addCsvErrMessage("WA1001", header);
		}
	}
	
	/**
	 * @param msgCode メッセージコード
	 * @param rep 置換文字列(複数ある場合はカンマ区切り)
	 * @throws MospException 	MosP例外処理が発生した場合
	 */
	private void addCsvErrMessage(String msgCode, String rep) throws MospException {
		errMessage.append(getCsvData(getMessage(msgCode, rep)));
		errMessage.append(CommonConst.STR_CSV_SEPARATOR);
	}
	
	private void addErrorReport(String[] aryHeader, String[] aryValue) {
		for (int i = 0; aryHeader.length > i; i++) {
			if (i != aryHeader.length) {
				errorReport.append(getCsvData(aryHeader[i]) + CommonConst.STR_CSV_SEPARATOR);
			} else {
				errorReport.append(getCsvData(aryHeader[i]));
			}
		}
		errorReport.append(CommonConst.STR_CSV_NEW_LINE);
		for (int i = 0; aryValue.length > i; i++) {
			if (i != aryValue.length) {
				errorReport.append(getCsvData(aryValue[i]) + CommonConst.STR_CSV_SEPARATOR);
			} else {
				errorReport.append(getCsvData(aryValue[i]));
			}
		}
		errorReport.append(errMessage);
		errorReport.deleteCharAt(errorReport.lastIndexOf(CommonConst.STR_CSV_SEPARATOR));
		errorReport.append(CommonConst.STR_CSV_NEW_LINE);
		errorCount++;
	}
	
	private void setOldColumnName() {
		PaidHolidayImportCardVo vo = (PaidHolidayImportCardVo)getVo();
		List<String> list = new LinkedList<String>();
		list.add(CommonConst.NAM_K_CODE);
		list.add(CommonConst.NAM_KYUYO_YMD);
		list.add(CommonConst.NAM_ZZANT);
		list.add(CommonConst.NAM_ZZANZ);
		list.add(CommonConst.NAM_SYOKA);
		list.add(CommonConst.NAM_SYUTOKU);
		list.add(CommonConst.NAM_HAIKI);
		list.add(CommonConst.NAM_TZANT);
		list.add(CommonConst.NAM_TZANZ);
		vo.setAryColumnName(StringUtil.listToArray(list));
	}
	
	private void setNewColumnName() {
		PaidHolidayImportCardVo vo = (PaidHolidayImportCardVo)getVo();
		List<String> list = new LinkedList<String>();
		list.add(CommonConst.NAM_PAID_HOLIDAY_ID);
		list.add(CommonConst.NAM_K_CODE);
		list.add(CommonConst.NAM_PROCESS_TYPE);
		list.add(CommonConst.NAM_PROCESS_DATE);
		list.add(CommonConst.NAM_LAST_REMAIN_DAYS);
		list.add(CommonConst.NAM_LAST_REMAIN_HOUR);
		list.add(CommonConst.NAM_REMAIN_DAYS);
		list.add(CommonConst.NAM_REMAIN_HOUR);
		list.add(CommonConst.NAM_POSSIBLE);
		vo.setAryColumnName(StringUtil.listToArray(list));
	}
	
}
