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

import java.sql.Connection;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SILogin;
import jp.co.sint.basic.SIStndrdName;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.tools.SICheckDataConf;
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 : UIRegStndrdName.java,v 1.0 Exp $
 * @author      : <a href="mailto: jwchen@sint.co.jp">xxxx xx</a>
 * <br>Description :規格名称管理の編集の画面に対するbeansクラスを作成します。
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Jinwang Chen   2003/09/08  Original
 */

public class UIRegStndrdName extends SIStndrdName{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //修正と削除用のショップコード
  private String regShopCodeTxt="";
  
  //修正と削除用の規格コード
  private String regStndrdCodeTxt="";
  
  //修正と削除用の規格名称
  private String regStndrdNameTxt="";
  
  //更新するレコードの行号
  private String regRowNumTxt="";
  
  /**
   * UIRegStndrdName
   * コンストラクタ
   * @param なし
   * @return なし
   * @throws なし
   */
  public UIRegStndrdName(){}
  
  //setter of 修正と削除用のショップコード
  public void setRegShopCodeTxt(String lRegShopCodeTxt){
    if (SIUtil.isNull(lRegShopCodeTxt)) lRegShopCodeTxt="";
    this.regShopCodeTxt = SIUtil.changeTo(lRegShopCodeTxt.trim(),this.encode);
  }
  
  //setter of 修正と削除用の規格コード
  public void setRegStndrdCodeTxt(String lRegStndrdCodeTxt){
    if (SIUtil.isNull(lRegStndrdCodeTxt)) lRegStndrdCodeTxt="";
    this.regStndrdCodeTxt = SIUtil.changeTo(lRegStndrdCodeTxt.trim(),this.encode);
  }
  
  //setter of 修正と削除用の規格名称
  public void setRegStndrdNameTxt(String lRegStndrdNameTxt){
    if (SIUtil.isNull(lRegStndrdNameTxt)) lRegStndrdNameTxt="";
    this.regStndrdNameTxt = SIUtil.changeTo(lRegStndrdNameTxt.trim(),this.encode);
  }
  
  //setter of 更新する行号
  public void setRegRowNumTxt(String lRegRowNumTxt){
    if (SIUtil.isNull(lRegRowNumTxt)) lRegRowNumTxt="";
    this.regRowNumTxt = SIUtil.changeTo(lRegRowNumTxt.trim(),this.encode);
  }
  
  //getter of ページごとに表示するレコード数
  public String getRegShopCodeTxt(){
    return this.regShopCodeTxt;
  }
  
  //getter of ページごとに表示するレコード数
  public String getRegStndrdCodeTxt(){
    return this.regStndrdCodeTxt;
  }
  
  //getter of 更新する規格名称
  public String getRegStndrdNameTxt(){
    return this.regStndrdNameTxt;
  }
  
  //getter of 更新する行号
  public String getRegRowNumTxt(){
    return this.regRowNumTxt;
  }
  
  /**
   * <b>initInsert</b>
   * 入力した新規レコードのデータを取得します。
   * @param request クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void initInsert(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    if (lLogin.isShop()){
      this.setShopCode(lLogin.getMallShopCode());//新規ショップコード
    }else{
      this.setShopCode((String)lUrlParam.getParam("shopCode"));//新規ショップコード  //7.1.1 ST0236 修正
    }
    this.setStndrdCode((String)lUrlParam.getParam("stndrdCode"));//新規規格コード  //7.1.1 ST0236 修正
    this.setStndrdName((String)lUrlParam.getParam("stndrdName"));//新規規格名称  //7.1.1 ST0236 修正
  }
  
  /**
   * <b>initModify</b>
   * 入力した既存レコードのデータを取得します。
   * @param request クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void initModify(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    if (lLogin.isShop()){
      this.setRegShopCodeTxt(lLogin.getMallShopCode());//編集ショップコード
    }else{
      this.setRegShopCodeTxt((String)lUrlParam.getParam("regShopCodeTxt"));//編集ショップコード  //7.1.1 ST0236 修正
    }
    this.setRegStndrdCodeTxt((String)lUrlParam.getParam("regStndrdCodeTxt"));//編集規格コード  //7.1.1 ST0236 修正
    this.setRegRowNumTxt((String)lUrlParam.getParam("regRowNumTxt"));//行号  //7.1.1 ST0236 修正  
    
    if (SIUtil.isNotNull(this.getRegRowNumTxt())){
      //規格名称
      this.setRegStndrdNameTxt((String)lUrlParam.getParam(SIConfig.SIPREFIX_STNDRD_NAME_TEXT+this.getRegRowNumTxt()+"Txt"));//7.1.1 ST0236 修正
    }
  }
  
  /**
   * <b>validateInsert</b
   * 入力した新規レコードのデータをチェックします。
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws なし
   */
  public boolean validateInsert(HttpServletRequest lRequest,Connection lConnection){
    return validateInsert(lRequest,lConnection,false);
  }
  
  public boolean validateInsert(HttpServletRequest lRequest,Connection lConnection,boolean lCsvCheck){
    SICustomErrors errors=new SICustomErrors();
    
    //ショップコード
    SICheckValid.checkValid(errors,"ショップコード",getShopCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
    SICheckValid.checkValid(errors,"ショップコード",getShopCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,16);
    
    if (SIConfig.SIEDIT_MODE_INSERT.equalsIgnoreCase(this.getEditModeTxt().trim())){
      //ショップコードが存在するかどうか
      StringBuffer lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT MallShopCode FROM ShopVW ");
      lSqlBuf.append("WHERE MallShopCode=").append(SIDBUtil.SQL2Str(this.getShopCode()));
      SICheckValid.checkExist(errors,lConnection,"ショップコード",lSqlBuf.toString());
    }
    
    if (lCsvCheck&&SIUtil.isNotNull(this.getShopCode())){
      StringBuffer lSqlBuf=new StringBuffer();
      lSqlBuf.append("SELECT MallShopCode FROM ShopVW ");
      lSqlBuf.append("WHERE MallShopCode=").append(SIDBUtil.SQL2Str(this.getShopCode()));
      SICheckValid.checkExist(errors,lConnection,"ショップコード",lSqlBuf.toString());
    }
    
    //規格コード
    SICheckValid.checkValid(errors,"規格分類コード",getStndrdCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
    
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"規格分類コード",getStndrdCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,4);
    }
    
    //規格コード存在のチェック
    if (SIUtil.isNotNull(this.getShopCode())&&SIUtil.isNotNull(this.getStndrdCode())){
      StringBuffer lSqlBuf=new StringBuffer();
      lSqlBuf.append("SELECT StndrdCode FROM StndrdNameMTbl ");
      lSqlBuf.append("WHERE ShopCode=").append(SIDBUtil.SQL2Str(this.getShopCode()," "));
      lSqlBuf.append("AND StndrdCode=").append(SIDBUtil.SQL2Str(this.getStndrdCode()));
      if (lCsvCheck){
        try {
          if (SIDBUtil.hasData(lConnection,lSqlBuf.toString())){
            errors.addError(new SICustomError("input.data.csv.duplication","規格分類コード"));
          }
        } catch (SIDBAccessException e1) {
          e1.printStackTrace();
        }
      }else{
        SICheckValid.checkNotExist(errors,lConnection,"規格分類コード",lSqlBuf.toString());
      }
    }
    
    //規格名称
    SICheckValid.checkValid(errors,"規格分類名称",getStndrdName(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,20);
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
    return errors.isEmpty();
  }
  
  /**
   * <b>validateUpdate</b
   * 入力した新規レコードのデータをチェックします。
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws なし
   */
  public boolean validateModify(HttpServletRequest lRequest){
    return validateModify(lRequest,null,false);
  }
  
  public boolean validateModify(HttpServletRequest lRequest,Connection lConnection,boolean lCsvCheck){
    SICustomErrors errors=new SICustomErrors();
    
    if (lCsvCheck){
      //ショップコード
      SICheckValid.checkValid(errors,"ショップコード",getRegShopCodeTxt(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"ショップコード",getRegShopCodeTxt(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,16);
      
      //規格コード
      SICheckValid.checkValid(errors,"規格分類コード",getRegStndrdCodeTxt(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"規格分類コード",getRegStndrdCodeTxt(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,4);
      
      if (SIUtil.isNotNull(this.getRegShopCodeTxt())&&SIUtil.isNotNull(this.getRegStndrdCodeTxt())){
        StringBuffer lSqlBuf=new StringBuffer();
        lSqlBuf.append("SELECT ShopCode FROM StndrdNameMTbl ");
        lSqlBuf.append("WHERE ShopCode=").append(SIDBUtil.SQL2Str(this.getRegShopCodeTxt()," "));
        lSqlBuf.append("AND StndrdCode=").append(SIDBUtil.SQL2Str(this.getRegStndrdCodeTxt()));
        
        SICheckValid.checkExist(errors,lConnection,"規格分類コード",lSqlBuf.toString());
      }
    }
    //規格名称
    SICheckValid.checkValid(errors,"規格分類名称",getRegStndrdNameTxt(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,20);
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
    
    return errors.isEmpty();
  }
  
  /**
   * <b>validateDelete</b
   * 外部のキーのデータレコードをチェックします。
   * @param lRequest クライアントからのリクエスト
   * @param lConnection データベースへのコネクション
   * @return エラーがあるかどうかを指す状態
   * @throws なし
   */
  public boolean validateDelete(HttpServletRequest lRequest,Connection lConnection){
    SICustomErrors errors=new SICustomErrors();
    
    //外部のキーのデータレコードのチェック用のSQL文の作成
    StringBuffer lSqlBuf=new StringBuffer();
    lSqlBuf.append("SELECT ShopCode FROM CmdtyStndrdMTbl ");
    lSqlBuf.append("WHERE ShopCode=").append(SIDBUtil.SQL2Str(getRegShopCodeTxt()," "));
    lSqlBuf.append("AND (StndrdCode1=").append(SIDBUtil.SQL2Str(getRegStndrdCodeTxt()));
    lSqlBuf.append(" OR StndrdCode2=").append(SIDBUtil.SQL2Str(getRegStndrdCodeTxt(),")"));
    
    try {
      boolean isLocked=SIDBUtil.hasData(lConnection,lSqlBuf.toString());
      if (isLocked){
        errors.addError(new SICustomError("database.query.exist","規格に紐づいている商品"));
      }
    } catch (SIDBAccessException e) {
      e.printStackTrace();
      errors.addError(new SICustomError("database.execute.error"));
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
    
    return errors.isEmpty();
  }
}