package jp.mosp.payroll.payment.action;

import java.sql.SQLException;
import java.util.List;

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.payroll.base.PayrollAction;
import jp.mosp.payroll.base.PayrollConst;
import jp.mosp.payroll.dao.CmBankDao;
import jp.mosp.payroll.dao.CmBranchDao;
import jp.mosp.payroll.dao.CmCoBankDao;
import jp.mosp.payroll.dto.CmBankDto;
import jp.mosp.payroll.dto.CmBranchDto;
import jp.mosp.payroll.dto.CmCoBankDto;
import jp.mosp.payroll.payment.vo.CompanyCoBankVo;

/**
 * 会社銀行マスタのメンテナンスに必要な機能を提供する。<br>
 * 会社銀行マスタの一覧表示、及び登録・更新が可能。<br>
 */
public class CompanyCoBankAction extends PayrollAction {
	
	// コマンド
	private static final String	CMD_CM_CO_BANK_SHOW			= "U5251";
	private static final String	CMD_CM_CO_BANK_INSERT		= "U5252";
	private static final String	CMD_CM_CO_BANK_SELECT		= "U5253";
	private static final String	CMD_CM_CO_BANK_UPDATE		= "U5254";
	private static final String	CMD_CM_CO_BANK_RE_SEARCH	= "U5255";
	

	/**
	 * Actionの初期化を行う。<br><br>
	 * 以下の処理を行う。
	 * <ul><li>
	 * {@link PayrollAction#PayrollAction()}
	 * </li></ul>
	 */
	public CompanyCoBankAction() {
		super();
	}
	
	/* (non-Javadoc)
	 * @see jp.mosp.common.common.BaseAction#getSpecificVo()
	 */
	@Override
	protected BaseVo getSpecificVo() {
		return new CompanyCoBankVo();
	}
	
	/**
	 * アクション
	 */
	public void action() throws Exception {
		// DBコネクション取得
		getConnection();
		// PAYROLL権限確認
		confirmPayrollAuth();
		// VO取得及び設定
		prepareVo();
		CompanyCoBankVo vo = (CompanyCoBankVo)getVo();
		// DAO
		CmCoBankDao dao;
		// DTO
		CmCoBankDto dto;
		Object obj2 = session.getAttribute(MospConst.ATT_DTO);
		dto = obj2 instanceof CmCoBankDto ? (CmCoBankDto)obj2 : null;
		// 銀行マスタ、支店マスタデータ作成(ファイルがあっても出力する)
		convFinanceData(cfg.getProperty(MospConst.PPT_APP_DOCBASE) + PayrollConst.JS_FINANCE, true);
		/*		// 銀行コード取得
				vo.aryPltPaidBankName   = getBankArray  ();
				// 支店コード取得
				vo.aryPltPaidBranchName = getBranchArray();
		*/// コマンド毎の処理
		if (cmd.equals(CMD_CM_CO_BANK_SHOW)) {
			// 表示
			vo.setPltDelete(MospConst.DELETE_FLAG_OFF);
			vo.aryPltAccountType = getCodeArray(PayrollConst.TID_ACCOUNT_TYPE);
			// 初期化処理
			vo.setInitFields();
			vo.setMode(0);
			// 検索
			searchCompanyCoBank(vo);
			vo.setFormerKey(vo.KEY_CO_BANK_CODE);
			vo.setIsAscending(true);
			vo.initListInfo();
		} else if (cmd.equals(CMD_CM_CO_BANK_INSERT)) {
			// 登録
			vo.setParams(request);
			dto = insert(vo);
			session.setAttribute(MospConst.ATT_DTO, dto);
			// 初期化処理
			vo.setInitFields();
			// 検索
			searchCompanyCoBank(vo);
			vo.setFormerKey(vo.KEY_CO_BANK_CODE);
			vo.setIsAscending(true);
			vo.initListInfo();
		} else if (cmd.equals(CMD_CM_CO_BANK_SELECT)) {
			// 表示(情報を検索)
			// DBコネクションの取得及びDTOの準備
			getConnection();
			dao = new CmCoBankDao();
			dao.initDao(cfg, cmd, aspUser, user, conn);
			// データの取得
			dto = dao.findForKey(key1);
			chkExist(dto);
			// VOに情報をセット
			vo.setFields(dto);
			// 銀行名支店名設定
			setFinanceName(dto, vo);
			vo.setMode(1);
			// セッションにDTOをセット
			session.setAttribute(MospConst.ATT_DTO, dto);
		} else if (cmd.equals(CMD_CM_CO_BANK_UPDATE)) {
			// 更新
			vo.setParams(request);
			dto = update(vo, dto);
			session.setAttribute(MospConst.ATT_DTO, dto);
			// 初期化処理
			vo.setInitFields();
			// 検索
			searchCompanyCoBank(vo);
			vo.setFormerKey(vo.KEY_CO_BANK_CODE);
			vo.setIsAscending(true);
			vo.initListInfo();
		} else if (cmd.equals(CMD_CM_CO_BANK_RE_SEARCH)) {
			// 再検索
			vo.setParams(request);
			session.removeAttribute(MospConst.ATT_DTO);
			// 初期化処理
			vo.setInitFields();
			// 初期化処理
			vo.setInitFields();
			vo.setMode(0);
			//検索
			searchCompanyCoBank(vo);
			vo.setFormerKey(vo.KEY_CO_BANK_CODE);
			vo.setIsAscending(true);
			vo.initListInfo();
		} else {
			throw new MospException(MospConst.EX_CMD_INVALID);
		}
	}
	
	/**
	 * 会社銀行マスタ一覧を取得する。<br>
	 * 以下の流れで処理を行う。<br>
	 * <ol>
	 * <li>会社銀行マスタの全件取得。<br>
	 * <li>取得した会社銀行レコードのリストをVoにセットする。<br>
	 * <li>会社銀行マスタのレコード毎に、銀行マスタから銀行名を取得する。<br>
	 * <li>会社銀行マスタのレコード毎に、支店マスタから支店名を取得する。<br>
	 * <li>取得した銀行名、支店名をVoにセットする。<br>
	 * </ol>
	 * @param vo CompanyCoBankVoインスタンス
	 * @throws Exception
	 */
	private void searchCompanyCoBank(CompanyCoBankVo vo) throws Exception {
		// DBコネクションの取得
		getConnection();
		// Daoの準備
		CmCoBankDao dao = new CmCoBankDao();
		CmBankDao cmBankDao = new CmBankDao();
		CmBranchDao cmBranchDao = new CmBranchDao();
		// Dao初期化
		dao.initDao(cfg, cmd, aspUser, user, conn);
		cmBankDao.initDao(cfg, cmd, aspUser, user, conn);
		cmBranchDao.initDao(cfg, cmd, aspUser, user, conn);
		// 会社銀行マスタの全件取得。
		List<CmCoBankDto> list = dao.findAll();
		// 取得したレコードのリストをVoにセットする。
		vo.setFields(list);
		// レコード毎に銀行名及び支店名を設定する。
		// 銀行名を設定する。
		for (int i = 0; i < list.size(); i++) {
			CmCoBankDto dto = list.get(i);
			CmBankDto cmBankDto = cmBankDao.findForKey(dto.getBankCode());
			if (cmBankDto == null) {
				vo.setBankName(i, "");
			} else {
				vo.setBankName(i, cmBankDto.getBankName());
			}
			// 支店名を設定する。
			CmBranchDto cmBranchDto = cmBranchDao.findForKey(dto.getBankCode(), dto.getBranchCode());
			if (cmBranchDto == null) {
				vo.setBranchName(i, "");
			} else {
				vo.setBranchName(i, cmBranchDto.getBranchName());
			}
		}
	}
	
	/**
	 * データ挿入
	 * @param vo 対象VO
	 * @throws Exception
	 * @return データ挿入対象DTO
	 * @throws Exception
	 */
	public CmCoBankDto insert(CompanyCoBankVo vo) throws Exception {
		// VOのモード設定		
		vo.setMode(0);
		// パラメータの妥当性確認
		vo.validate();
		// コネクションの取得及びDAOの準備
		getConnection();
		CmCoBankDao dao = new CmCoBankDao();
		dao.initDao(cfg, cmd, aspUser, user, conn);
		// 存在チェック
		chkDuplicate(dao.findForKey(vo.getTxtCoBankCode()), vo);
		// DTO準備
		CmCoBankDto dto = new CmCoBankDto();
		vo.setDtoFields(dto);
		// データ挿入
		dao.insert(dto);
		// DTO再取得
		dto = dao.findForKey(dto.getCoBankCode());
		// コミット
		commit();
		// メッセージ設定
		vo.setMessage(MospUtility.getMessage(msg, MospConst.MSG_INSERT, ""));
		// 銀行マスタ、支店マスタデータ作成(ファイルがあっても出力する)
		convFinanceData(cfg.getProperty(MospConst.PPT_APP_DOCBASE) + PayrollConst.JS_FINANCE, true);
		return dto;
	}
	
	/**
	 * データ更新
	 * @param vo 対象VO
	 * @param dto 対象DTO
	 * @return データ挿入対象DTO
	 * @throws Exception
	 */
	public CmCoBankDto update(CompanyCoBankVo vo, CmCoBankDto dto) throws Exception {
		// VOのモード設定
		vo.setMode(1);
		// パラメータの妥当性確認
		vo.validate();
		// コネクションの取得及びDAOの準備
		getConnection();
		CmCoBankDao dao = new CmCoBankDao();
		dao.initDao(cfg, cmd, aspUser, user, conn);
		// 排他確認
		chkExclusive(dto, dao.findForUpdate(vo.getTxtCoBankCode()), vo);
		// DTOの準備
		vo.setDtoFields(dto);
		// データの更新
		dao.update(dto, true);
		// DTOの再取得
		CmCoBankDto retDto = dao.findForKey(dto.getCoBankCode());
		// コミット
		commit();
		// メッセージ設定
		vo.setMessage(MospUtility.getMessage(msg, MospConst.MSG_UPDATE, ""));
		vo.setMode(0);
		// 銀行マスタ、支店マスタデータ作成(ファイルがあっても出力する)
		convFinanceData(cfg.getProperty(MospConst.PPT_APP_DOCBASE) + PayrollConst.JS_FINANCE, true);
		return retDto;
	}
	
	private void setFinanceName(CmCoBankDto dto, CompanyCoBankVo vo) throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		if (dto == null) {
			return;
		}
		// DAOの準備
		CmBankDao cmBankDao = new CmBankDao();
		cmBankDao.initDao(cfg, cmd, aspUser, user, conn);
		// DAOの準備
		CmBranchDao cmBranchDao = new CmBranchDao();
		cmBranchDao.initDao(cfg, cmd, aspUser, user, conn);
		CmBankDto cmBankDto = cmBankDao.findForKey(dto.getBankCode());
		if (cmBankDto != null) {
			vo.setLblBankName(cmBankDto.getBankName());
		} else {
			vo.setLblBankName(dto.getBankCode());
		}
		CmBranchDto cmBranchDto = cmBranchDao.findForKey(dto.getBankCode(), dto.getBranchCode());
		if (cmBranchDto != null) {
			vo.setLblBranchName(cmBranchDto.getBranchName());
		} else {
			vo.setLblBranchName(dto.getBranchCode());
		}
		
	}
}
