/**
 * 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.SIStndrdContent;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SITableConditionManager;
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 : UIRegStndrdContent.java,v 1.0 Exp $
 * @author      : Jinwang Chen
 * <br>Description :規格内容編集などを行うクラス
 * <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 UIRegStndrdContent extends SIStndrdContent{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //修正と削除用のエレメントコード
  private String regElementCodeTxt="";
  
  //修正と削除用のエレメント名称
  private String regElementNameTxt="";
  
  //修正と削除用のエレメント順序
  private String regDispOrderTxt="";
  
  //更新するレコードの行号
  private String regRowNumTxt="";
  
  /**
   * UIRegStndrdContent
   * コンストラクタ
   * @param なし
   * @return なし
   * @throws なし
   */
  public UIRegStndrdContent(){}
  
  //setter of 修正と削除用のエレメントコード
  public void setRegElementCodeTxt(String lRegElementCodeTxt){
    if (SIUtil.isNull(lRegElementCodeTxt)) lRegElementCodeTxt="";
    this.regElementCodeTxt=SIUtil.changeTo(lRegElementCodeTxt.trim(),this.encode);
  }
  
  //setter of 修正と削除用のエレメント名称
  public void setRegElementNameTxt(String lRegElementNameTxt){
    if (SIUtil.isNull(lRegElementNameTxt)) lRegElementNameTxt="";
    this.regElementNameTxt=SIUtil.changeTo(lRegElementNameTxt.trim(),this.encode);
  }
  
  //setter of 修正と削除用のエレメント順序
  public void setRegDispOrderTxt(String lRegDispOrderTxt){
    if (SIUtil.isNull(lRegDispOrderTxt)) lRegDispOrderTxt="";
    this.regDispOrderTxt=SIUtil.changeTo(lRegDispOrderTxt.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 getRegElementCodeTxt(){
    return this.regElementCodeTxt;
  }
  
  //getter of 修正と削除用のエレメント名称
  public String getRegElementNameTxt(){
    return this.regElementNameTxt;
  }
  
  //getter of 修正と削除用のエレメント順序
  public String getRegDispOrderTxt(){
    return this.regDispOrderTxt;
  }
  
  //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 修正
    }
    
    //7.1.1 ST0236 修正 ここから
    this.setStndrdCode((String)lUrlParam.getParam("stndrdCode"));//規格コード
    this.setElementCode((String)lUrlParam.getParam("elementCode"));//新規エレメントコード
    this.setElementName((String)lUrlParam.getParam("elementName"));//新規エレメント名称
    this.setDispOrder((String)lUrlParam.getParam("dispOrder"));//新規表示順序
    //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.setShopCode(lLogin.getMallShopCode());//ショップコード
    }else{
      this.setShopCode((String)lUrlParam.getParam("shopCode"));//ショップコード  //7.1.1 ST0236 修正
    }
    
    //7.1.1 ST0236 修正 ここから
    this.setStndrdCode((String)lUrlParam.getParam("stndrdCode"));//規格コード
    this.setRegElementCodeTxt((String)lUrlParam.getParam("regElementCodeTxt"));//修正と削除用のエレメントコード
    this.setRegRowNumTxt((String)lUrlParam.getParam("regRowNumTxt"));//更新するレコードの行号
    
    if (SIUtil.isNotNull(this.getRegRowNumTxt())){
      this.setRegElementNameTxt((String)lUrlParam.getParam(SIConfig.SIPREFIX_ELEMENT_NAME_TEXT+this.getRegRowNumTxt()+"Txt"));
      this.setRegDispOrderTxt((String)lUrlParam.getParam(SIConfig.SIPREFIX_DISP_ORDER_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();
    StringBuffer lSqlBuf=new StringBuffer();
    
    if (lCsvCheck){
      //ショップコードのチェック
      SICheckValid.checkValid(errors,"ショップコード",this.getShopCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"ショップコード",this.getShopCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,16);
      
      if (SIUtil.isNotNull(this.getShopCode())){
        lSqlBuf=new StringBuffer("SELECT MallShopCode FROM ShopVW ");
        lSqlBuf.append("WHERE MallShopCode=").append(SIDBUtil.SQL2Str(getShopCode()));
        SICheckValid.checkExist(errors,lConnection,"ショップコード",lSqlBuf.toString());
      }
      
      //規格コードのチェック
      SICheckValid.checkValid(errors,"規格コード",this.getStndrdCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"規格コード",this.getStndrdCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,4);
      
      if (SIUtil.isNotNull(getShopCode())&&SIUtil.isNotNull(getStndrdCode())){
        lSqlBuf=new StringBuffer("SELECT ShopCode FROM StndrdNameMTbl ");
        lSqlBuf.append("WHERE ShopCode=").append(SIDBUtil.SQL2Str(getShopCode()," "));
        lSqlBuf.append("AND StndrdCode=").append(SIDBUtil.SQL2Str(getStndrdCode()));
        SICheckValid.checkExist(errors,lConnection,"規格コード",lSqlBuf.toString());
      }
    }
    
    //エレメントコードのチェック
    SICheckValid.checkValid(errors,"規格コード",this.getElementCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"規格コード",this.getElementCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,4);
    }
    
    //エレメント存在のチェック
    if (SIUtil.isNotNull(getShopCode())&&SIUtil.isNotNull(getStndrdCode())&&SIUtil.isNotNull(getElementCode())){
      lSqlBuf=new StringBuffer("SELECT ShopCode FROM StndrdContentMTbl ");
      lSqlBuf.append("WHERE ShopCode=").append(SIDBUtil.SQL2Str(getShopCode()," "));
      lSqlBuf.append("AND StndrdCode=").append(SIDBUtil.SQL2Str(getStndrdCode()," "));
      lSqlBuf.append("AND ElementCode=").append(SIDBUtil.SQL2Str(getElementCode()));
      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,"規格名称",this.getElementName(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,20);
    
    //表示順序のチェック
    SICheckValid.checkValid(errors,"表示順",this.getDispOrder(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"表示順",getDispOrder(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,3);
    }
    
    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 validateUpdate(HttpServletRequest lRequest){
    return validateUpdate(lRequest,null,false);
  }
  
  public boolean validateUpdate(HttpServletRequest lRequest,Connection lConnection,boolean lCsvCheck){
    SICustomErrors errors=new SICustomErrors();
    StringBuffer lSqlBuf=new StringBuffer();
    
    if (lCsvCheck){
      //ショップコードのチェック
      SICheckValid.checkValid(errors,"ショップコード",this.getShopCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"ショップコード",this.getShopCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,16);
      
      //規格コードのチェック
      SICheckValid.checkValid(errors,"規格コード",this.getStndrdCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"規格コード",this.getStndrdCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,4);
      
      //エレメントコードのチェック
      SICheckValid.checkValid(errors,"規格コード",this.getRegElementCodeTxt(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"規格コード",this.getRegElementCodeTxt(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,4);
      
      if (SIUtil.isNotNull(getShopCode())&&SIUtil.isNotNull(getStndrdCode())&&SIUtil.isNotNull(getRegElementCodeTxt())){
        lSqlBuf=new StringBuffer("SELECT ShopCode FROM StndrdContentMTbl ");
        lSqlBuf.append("WHERE ShopCode=").append(SIDBUtil.SQL2Str(getShopCode()," "));
        lSqlBuf.append("AND StndrdCode=").append(SIDBUtil.SQL2Str(getStndrdCode()," "));
        lSqlBuf.append("AND ElementCode=").append(SIDBUtil.SQL2Str(getRegElementCodeTxt()));
        SICheckValid.checkExist(errors,lConnection,"規格コード",lSqlBuf.toString());
      }
    }
    
    //エレメント名称のチェック
    SICheckValid.checkValid(errors,"規格名称",this.getRegElementNameTxt(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,20);
    
    //表示順序のチェック
    SICheckValid.checkValid(errors,"表示順",this.getRegDispOrderTxt(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    
    if (lCsvCheck){
      SICheckValid.checkValid(errors,"表示順",this.getRegDispOrderTxt(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,3);
    }
    
    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 クライアントからのリクエスト
   * @return なし
   * @throws なし
   */
  public boolean validateDelete(HttpServletRequest lRequest,Connection connection) throws SIDBAccessException{
    SICustomErrors errors=new SICustomErrors();
    
    //商品の存在チェック
    StringBuffer lSql = new StringBuffer();
    lSql.append("SELECT * FROM CmdtyStndrdMtbl ");
    lSql.append("WHERE ShopCode =").append(SIDBUtil.SQL2Str(this.getShopCode()," "));
    lSql.append("AND ((StndrdCode1=").append(SIDBUtil.SQL2Str(this.getStndrdCode()));
    lSql.append(" AND ElementCode1 ="+SIDBUtil.SQL2Str(this.getRegElementCodeTxt()," )"));
    lSql.append("OR (StndrdCode2=").append(SIDBUtil.SQL2Str(this.getStndrdCode()));
    lSql.append(" AND ElementCode2 ="+SIDBUtil.SQL2Str(this.getRegElementCodeTxt()," ))"));
    
    if(SIDBUtil.hasData(connection,lSql.toString())){
      errors.addError(new SICustomError("database.delete.lock2"));
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
    
    return errors.isEmpty();
  }
}