/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.beans.mallmgr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SILogin;
import jp.co.sint.basic.SIPayeeInfo;
import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIFlagConf;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SITableCondition;
import jp.co.sint.database.SITableConditionManager;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckUtil;//7.1.1 ST0199 追加
import jp.co.sint.tools.SICheckValid;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id : UIPayeeInfoList.java,v 1.0 2003/11/28 Exp $
 * @author      : Shionoya Yoshiaki
 * <br>Description : 支払先情報設定のbeans
 * <p>History</p>
 * <p>Author                        Date                      Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Shionoya Yoshiaki       2003/11/28          Original
 */

public class UIPayeeInfoList extends SIPayeeInfo {
  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  private String editModeType="";
  
  public UIPayeeInfoList() {}
  
  //setter of 編集タイプ
  public void setEditModeType(String string) {
    if(string==null)string="";
    string = SIUtil.changeTo(string.trim(),this.encode);
    editModeType = string;
  }
  
  //getter
  public String getEditModeType(){
    return editModeType;
  }
  
  /**
   * init
   * 入力したデータから、このbeansを設定します。
   * @param HttpServletRequest
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  //7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    if (lLogin.isShop()){
      this.setMallShopCode(lLogin.getMallShopCode());
    }else{
      this.setMallShopCode((String)lUrlParam.getParam("mallShopCode"));
    }
    this.setPayMethodCode((String)lUrlParam.getParam("payMethodCode"));
    this.setPayMethodName((String)lUrlParam.getParam("payMethodName"));
    this.setPayeeCode((String)lUrlParam.getParam("payeeCode"));
    this.setBankCode((String)lUrlParam.getParam("bankCode"));
    this.setBankName((String)lUrlParam.getParam("bankName"));
    this.setBankNameKana((String)lUrlParam.getParam("bankNameKana"));
    this.setSubBankCode((String)lUrlParam.getParam("subBankCode"));
    this.setSubBankName((String)lUrlParam.getParam("subBankName"));
    this.setSubBankNameKana((String)lUrlParam.getParam("subBankNameKana"));
    this.setAccountName((String)lUrlParam.getParam("accountName"));
    this.setAccountNo((String)lUrlParam.getParam("accountNo"));
    this.setAccountType((String)lUrlParam.getParam("accountType"));
    this.setType((String)lUrlParam.getParam("type"));
    this.setActionNameTxt((String)lUrlParam.getParam("actionNameTxt"));
    this.setEditModeTxt((String)lUrlParam.getParam("editModeTxt"));
  }
  //7.1.1 ST0236 修正 ここまで
  
  /**
   * <b>initSelect</b>
   * hiddenセット用にショップコードをセットします
   * @param lRequest
   * @param lUrlParam
   */
  public void initSelect(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    init(lRequest,lUrlParam);//7.1.1 ST0236 修正
    
    if (lLogin.isShop()){
      this.setMallShopCode(lLogin.getMallShopCode());
    }else{
      this.setMallShopCode((String)lUrlParam.getParam("shadowCode"));//7.1.1 ST0236 修正
    }
  }
  
  /**
   * <b>initList</b>
   * 「選択」押下時の支払方法コードを取得します
   * @param lRequest
   * @param lUrlParam
   */
  //7.1.1 ST0236 修正 ここから
  public void initList(HttpServletRequest lRequest,SIURLParameter lUrlParam) {
    init(lRequest,lUrlParam);
    this.setPayMethodCode((String)lUrlParam.getParam("payMethodCodeHid"));
  }
  //7.1.1 ST0236 修正 ここまで
  
  /**
   * validate
   * 入力したデータをチェックします。
   * 不正なデータがある場合、エラーをオブジェクトに格納します。
   * そのオブジェクトは、エラーメッセージとして画面に表示されます。
   * @param HttpServletRequest ，Connection , SIURLParameter
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public boolean validateSelect(HttpServletRequest lRequest, Connection lConnection,SIURLParameter lUrlParam) throws SIDBAccessException {//7.1.1 ST0236 修正
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    String lShopCode="";
    if (lLogin.isShop()){
      lShopCode=lLogin.getMallShopCode();
    }else{
      lShopCode=(String)lUrlParam.getParam("shadowCode");//7.1.1 ST0236 修正
    }
    StringBuffer lSqlBuf = new StringBuffer();
    
    SICheckValid.checkValid(errors, "ショップコード", lShopCode, SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "ショップコード", lShopCode, SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    
    if (SIConfig.SIRUNNING_MODE_CURRENT==SIConfig.SIRUNNING_MODE_INDIVIDUAL&&SIUtil.isNotNull(lShopCode)&&lShopCode.equals(SIConfig.SIMALL.getMallShopCode())){
      errors.addError(new SICustomError("manager.app.mallmode.disable"));
    }
    
    //ショップが存在するか
    if(errors.isEmpty()){
      lSqlBuf.append("select mallshopcode from MallShopMTbl where mallshopCode =").append(SIDBUtil.SQL2Str(lShopCode));
      if(SIDBUtil.hasData(lConnection,lSqlBuf.toString())==false){
        errors.addError(new SICustomError("database.query.notexist","ショップ"));
      }
    }
    //ショップに後払い先払い支払区分があるか
    if(errors.isEmpty()){
      lSqlBuf = new StringBuffer();
      lSqlBuf.append("select mallshopcode FROM paymethodmtbl WHERE mallshopCode=").append(SIDBUtil.SQL2Str(lShopCode));
      lSqlBuf.append(" AND PaymentFlg IN ("+SIDBUtil.SQL2Str(SIFlagConf.SIFLAG_PAYMENTFLG_BEFORE)+","+SIDBUtil.SQL2Str(SIFlagConf.SIFLAG_PAYMENTFLG_AFTER)+") ");
      if(SIDBUtil.hasData(lConnection,lSqlBuf.toString())==false){
        errors.addError(new SICustomError("database.paymethod.exist.error"));
      }
    }
    if (!errors.isEmpty())
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  /**
   * validate
   * 入力したデータをチェックします。
   * 不正なデータがある場合、エラーをオブジェクトに格納します。
   * そのオブジェクトは、エラーメッセージとして画面に表示されます。
   * @param HttpServletRequest ，Connection , SIURLParameter
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest, Connection lConnection,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    
    if (SIUtil.match(SIConfig.SIADMIN_MS,lLogin.getAdminType())){
      errors.addError(new SICustomError("manager.app.priv.disable"));
    }
    
    if (!((String)lUrlParam.getParam("editModeTxt")).equalsIgnoreCase(SIConfig.SIEDIT_MODE_DELETE)) {//7.1.1 ST0236 修正
      SICheckValid.checkValid(errors, "ショップコード", this.getMallShopCode(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "ショップコード", this.getMallShopCode(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
      
      if (SIConfig.SIRUNNING_MODE_CURRENT==SIConfig.SIRUNNING_MODE_INDIVIDUAL&&SIUtil.isNotNull(getMallShopCode())&&getMallShopCode().equals(SIConfig.SIMALL.getMallShopCode())){
        errors.addError(new SICustomError("manager.app.mallmode.disable"));
      }
      
      SICheckValid.checkValid(errors, "支払方法名称", this.getPayMethodCode(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);//7.1.1 ST0162 修正
      
      SICheckValid.checkValid(errors, "金融機関コード", this.getBankCode(), SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "金融機関コード", this.getBankCode(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 4);
      
      SICheckValid.checkValid(errors, "金融機関名", this.getBankName(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors, "金融機関名", this.getBankName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 40);
      
      SICheckValid.checkValid(errors, "金融機関名カナ", this.getBankNameKana(), SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE);
      SICheckValid.checkValid(errors, "金融機関名カナ", this.getBankNameKana(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 50);
      
      SICheckValid.checkValid(errors, "支店コード", this.getSubBankCode(), SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "支店コード", this.getSubBankCode(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 3);
      
      SICheckValid.checkValid(errors, "支店名", this.getSubBankName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 40);
      
      SICheckValid.checkValid(errors, "支店名カナ", this.getSubBankNameKana(), SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE);
      SICheckValid.checkValid(errors, "支店名カナ", this.getSubBankNameKana(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 50);
      
      //7.1.1 ST0199 修正 ここから
      if (!SICheckUtil.isTel(this.getAccountNo())){
        errors.addError(new SICustomError("input.data.wrong","口座番号","口座番号"));
      }
      //7.1.1 ST0199 修正 ここまで
      SICheckValid.checkValid(errors, "口座番号", this.getAccountNo(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 14);
      
      SICheckValid.checkValid(errors, "口座名義人カナ", this.getAccountName(), SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE);
      SICheckValid.checkValid(errors, "口座名義人カナ", this.getAccountName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    }
    
    if (!errors.isEmpty())
       lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
      return errors.isEmpty();
  }
  
  public String getPayMethodSQL(String displayFlg,SILogin manLogin){
    StringBuffer lSqlBuf = new StringBuffer();
    
    if (SIConfig.SIRUNNING_MODE_CURRENT==SIConfig.SIRUNNING_MODE_INDIVIDUAL&&SIUtil.isNotNull(getMallShopCode())&&getMallShopCode().equals(SIConfig.SIMALL.getMallShopCode())){
      return "";
    }
    
    if(displayFlg.equals("C")){
      if(SIUtil.isNotNull(getActionNameTxt())&&getActionNameTxt().equals(SIConfig.SIACTION_REFRESH)){
        lSqlBuf.append("SELECT PayMethodName,PaymethodCode, MallShopCode FROM PayMethodMTbl ");
        lSqlBuf.append("WHERE MallShopCode=").append(SIDBUtil.SQL2Str(this.getMallShopCode()));
        lSqlBuf.append(" AND PaymentFlg IN (").append(SIDBUtil.SQL2Str(SIFlagConf.SIFLAG_PAYMENTFLG_BEFORE)+","+SIDBUtil.SQL2Str(SIFlagConf.SIFLAG_PAYMENTFLG_AFTER)+") ");
        lSqlBuf.append(" ORDER BY PayMethodCode");
      }else{
        lSqlBuf.append("SELECT PayMethodName,PaymethodCode, MallShopCode FROM PayMethodMTbl WHERE 1=2");
      }
    }else{
      if(SIUtil.isNull(getActionNameTxt())||getActionNameTxt().equals(SIConfig.SIACTION_REFRESH)){
        lSqlBuf.append("SELECT PayMethodName,PaymethodCode, MallShopCode FROM PayMethodMTbl ");
        lSqlBuf.append("WHERE MallShopCode = ").append(SIDBUtil.SQL2Str(manLogin.getMallShopCode()));
        lSqlBuf.append(" AND PaymentFlg IN (").append(SIDBUtil.SQL2Str(SIFlagConf.SIFLAG_PAYMENTFLG_BEFORE)+","+SIDBUtil.SQL2Str(SIFlagConf.SIFLAG_PAYMENTFLG_AFTER)+") ");
        lSqlBuf.append(" ORDER BY PayMethodCode");
      }else{
        lSqlBuf.append("SELECT PayMethodName,PaymethodCode, MallShopCode FROM PayMethodMTbl WHERE 1=2");
      }
    }
    return lSqlBuf.toString();
  }
  
  /**
   * <b>reset</b>
   * 編集対象のレコードを取得します
   * @param lConnection
   * @param pMallShopCode   ショップコード
   * @param pPayMethodCode  支払方法コード
   * @param pPayeeCode      支払手数料コード
   * @param lLogin          SILogin ログイン者情報
   * @return  boolean       結果があればTrue
   * @throws SIDBAccessException
   */
  public boolean reset(Connection lConnection) throws SIDBAccessException {
    Statement lStatement = null;
    ResultSet lResultSet = null;
    StringBuffer lSqlStatement = new StringBuffer();
    boolean lRes=false;
    
    if(SIUtil.isNull(this.getMallShopCode())||SIUtil.isNull(this.getPayMethodCode())||SIUtil.isNull(this.getPayeeCode())) return lRes;
    
    //基本のSQL
    lSqlStatement.append(" SELECT a.* ,");
    lSqlStatement.append(" b.paymethodname ");
    lSqlStatement.append(" FROM payeeinfomtbl a, paymethodmtbl b");
    lSqlStatement.append(" WHERE a.paymethodcode = b.paymethodcode");
    lSqlStatement.append(" AND a.mallshopcode = b.mallshopcode ");
    lSqlStatement.append(" AND a.mallshopcode=").append(SIDBUtil.SQL2Str(this.getMallShopCode()));
    lSqlStatement.append(" AND a.payMethodCode=").append(SIDBUtil.SQL2Str(this.getPayMethodCode()));
    lSqlStatement.append(" AND a.payeeCode=").append(SIDBUtil.SQL2Str(this.getPayeeCode()));
    
    lSqlStatement.append(" ORDER BY a.mallshopcode ASC ,a.paymethodcode ASC, a.payeecode ASC ");
    
    log.debug("sqlStatement=" + lSqlStatement.toString());
    
    //実行
    try {
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlStatement.toString());
      
      //支払先情報レコードのセットの作成
      while (lResultSet.next()) {
        this.setEncode(SIConfig.SIENCODE_NONE);
        this.setMallShopCode(lResultSet.getString("mallshopcode"));
        this.setPayMethodCode(lResultSet.getString("paymethodcode"));
        this.setPayMethodName(lResultSet.getString("paymethodname"));
        this.setPayeeCode(lResultSet.getString("payeecode"));
        this.setBankCode(lResultSet.getString("bankcode"));
        this.setBankName(lResultSet.getString("bankname"));
        this.setBankNameKana(lResultSet.getString("banknamekana"));
        this.setSubBankCode(lResultSet.getString("subbankcode"));
        this.setSubBankName(lResultSet.getString("subbankname"));
        this.setSubBankNameKana(lResultSet.getString("subbanknamekana"));
        this.setAccountType(lResultSet.getString("accounttype"));
        this.setAccountNo(lResultSet.getString("accountNo"));
        this.setAccountName(lResultSet.getString("accountname"));
        lRes=true;
      }
    } catch (Exception ex) {
       throw new SIDBAccessException(ex);
    } finally {
        SIDBUtil.close(lResultSet, lStatement);
    }
    return lRes;
  }
  
  /**
   * getCollection
   * 条件に合ったレコードを検索して、結果のコネクションを作成して、戻します。
   * @param Connection , String , String  , String
   * @return Collection
   * @throws SIDBAccessException
   */
  public Collection getCollection(Connection lConnection, String pMallShopCode, String pPayMethodCode, String pPayeeCode, SILogin lLogin) throws SIDBAccessException {
    Statement lStatement = null;
    ResultSet lResultSet = null;
    SIPayeeInfo lpayeeInfo = new SIPayeeInfo();
    StringBuffer lSqlStatement = new StringBuffer();
    Collection payeeInfo = new ArrayList();
    String displayFlg = SIPayeeInfo.getDisplayMode(lLogin);
    
    //基本のSQL
    SITableConditionManager lConditionMan = new SITableConditionManager();
    lSqlStatement.append(" SELECT a.*,");
    lSqlStatement.append(" b.paymethodname ");
    lSqlStatement.append(" FROM payeeinfomtbl a, paymethodmtbl b");
    lSqlStatement.append(" WHERE a.paymethodcode = b.paymethodcode");
    lSqlStatement.append(" AND a.mallshopcode = b.mallshopcode ");
    
    if (displayFlg.equals("A")) {
      lSqlStatement.append(" AND a.mallshopcode = ");
      lSqlStatement.append(SIDBUtil.SQL2Str(lLogin.getMallShopCode()));
    }else if (displayFlg.equals("B")){
      lSqlStatement.append(" AND 1 = 2 ");
    }else if (displayFlg.equals("C")){
      lSqlStatement.append(" AND a.mallshopcode<>").append(SIDBUtil.SQL2Str(SIConfig.SIMALL.getMallShopCode()));
    }else if (displayFlg.equals("D")){
      lSqlStatement.append(" AND a.mallshopcode = ");
      lSqlStatement.append(SIDBUtil.SQL2Str(lLogin.getMallShopCode()));
    }else{
      lSqlStatement.append(" AND 1 = 2");
    }
    SITableCondition DD = new SITableCondition();
    if (lLogin.isShop()) {
      DD = new SITableCondition("a", "mallshopcode", lLogin.getMallShopCode(), SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    } else {
      DD = new SITableCondition("a", "mallshopcode", pMallShopCode, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    }
    DD.setBlankEnable(false);
    lConditionMan.add(DD);
    DD = new SITableCondition("a", "paymethodcode", pPayMethodCode, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    DD = new SITableCondition("a", "payeecode", pPayeeCode, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    lSqlStatement.append(lConditionMan.getCondtionSQL());
    lSqlStatement.append(" ORDER BY a.mallshopcode ASC ,a.paymethodcode ASC, a.payeecode ASC ");
    
    log.debug("sqlStatement=" + lSqlStatement.toString());
    
    //実行
    try {
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlStatement.toString());
      
      //支払先情報レコードのセットの作成
      while (lResultSet.next()) {
        lpayeeInfo = new SIPayeeInfo();
        lpayeeInfo.setEncode(SIConfig.SIENCODE_NONE);
        lpayeeInfo.setMallShopCode(lResultSet.getString("mallshopcode"));
        lpayeeInfo.setPayMethodCode(lResultSet.getString("paymethodcode"));
        lpayeeInfo.setPayMethodName(lResultSet.getString("paymethodname"));
        lpayeeInfo.setPayeeCode(lResultSet.getString("payeecode"));
        lpayeeInfo.setBankCode(lResultSet.getString("bankcode"));
        lpayeeInfo.setBankName(lResultSet.getString("bankname"));
        lpayeeInfo.setBankNameKana(lResultSet.getString("banknamekana"));
        lpayeeInfo.setSubBankCode(lResultSet.getString("subbankcode"));
        lpayeeInfo.setSubBankName(lResultSet.getString("subbankname"));
        lpayeeInfo.setSubBankNameKana(lResultSet.getString("subbanknamekana"));
        lpayeeInfo.setAccountType(lResultSet.getString("accounttype"));
        lpayeeInfo.setAccountNo(lResultSet.getString("accountNo"));
        lpayeeInfo.setAccountName(lResultSet.getString("accountname"));
        payeeInfo.add(lpayeeInfo);
      }
    } catch (Exception ex) {
       throw new SIDBAccessException(ex);
    } finally {
        SIDBUtil.close(lResultSet, lStatement);
    }
    return payeeInfo;
  }
}