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

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

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.SIUtil;


/**
 * @version $Id: SICmdtyCtgry.java,v 1.0 2003/09/12 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>
 * jwchen        2003/09/12 11:29:57  Original
 */
public class SICmdtyCtgry extends SIBasic{
  //ショップコード
  private String shopCode="";
  
  //商品コード
  private String cmdtyCode="";
  
  //カテゴリコード
  private String ctgryCode="";
  
  //商品名
  private String cmdtyName="";
  
  //カテゴリ名
  private String ctgryName="";
  
  //カテゴリ略名
  private String abbvCtgryName="";
  
  public SICmdtyCtgry(){}
  
  //setter of ショップコード
  public void setShopCode(String lShopCode){
    if (SIUtil.isNull(lShopCode)) lShopCode="";
    this.shopCode=SIUtil.changeTo(lShopCode.trim(),this.encode);
  }
  
  //setter of 商品コード
  public void setCmdtyCode(String lCmdtyCode){
    if (SIUtil.isNull(lCmdtyCode)) lCmdtyCode="";
    this.cmdtyCode=SIUtil.changeTo(lCmdtyCode.trim(),this.encode);
  }
  
  //setter of カテゴリコード
  public void setCtgryCode(String lCtgryCode){
    if (SIUtil.isNull(lCtgryCode)) lCtgryCode="";
    this.ctgryCode=SIUtil.changeTo(lCtgryCode.trim(),this.encode);
  }
  
  //setter of 商品名
  public void setCmdtyName(String lCmdtyName){
    if (SIUtil.isNull(lCmdtyName)) lCmdtyName="";
    this.cmdtyName=SIUtil.changeTo(lCmdtyName.trim(),this.encode);
  }
  
  //setter of カテゴリ名
  public void setCtgryName(String lCtgryName){
    if (SIUtil.isNull(lCtgryName)) lCtgryName="";
    this.ctgryName=SIUtil.changeTo(lCtgryName.trim(),this.encode);
  }
  
  //setter of カテゴリ略名
  public void setAbbvCtgryName(String lAbbvCtgryName){
    if (SIUtil.isNull(lAbbvCtgryName)) lAbbvCtgryName="";
    this.abbvCtgryName=SIUtil.changeTo(lAbbvCtgryName.trim(),this.encode);
  }
  
  //getter of ショップコード
  public String getShopCode(){
    return this.shopCode;
  }
  
  //getter of 商品コード
  public String getCmdtyCode(){
    return this.cmdtyCode;
  }
  
  //getter of カテゴリコード
  public String getCtgryCode(){
    return this.ctgryCode;
  }
  
  //getter of 商品名
  public String getCmdtyName(){
    return this.cmdtyName;
  }
  
  //getter of カテゴリ名
  public String getCtgryName(){
    return this.ctgryName;
  }
  
  //getter of カテゴリ略名
  public String getAbbrCtrgyName(){
    return this.abbvCtgryName;
  }
  
  public boolean validate(HttpServletRequest lRequest,Connection lConnection,boolean lCsvCheck){
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors=new SICustomErrors();
    StringBuffer lSqlBuf=new StringBuffer("");
    
    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.getCmdtyCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
    SICheckValid.checkValid(errors,"親コード",this.getCmdtyCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,16);
    
    //商品存在のチェック
    if (SIUtil.isNotNull(getShopCode())&&SIUtil.isNotNull(getCmdtyCode())){
      lSqlBuf=new StringBuffer("SELECT ShopCode FROM CmdtyMTbl ");
      lSqlBuf.append("WHERE ShopCode=").append(SIDBUtil.SQL2Str(this.getShopCode()," "));
      lSqlBuf.append("AND CmdtyCode=").append(SIDBUtil.SQL2Str(this.getCmdtyCode()));
      SICheckValid.checkExist(errors,lConnection,"親コード",lSqlBuf.toString());
    }
    
    SICheckValid.checkValid(errors,"カテゴリコード",this.getCtgryCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    if (lCsvCheck&&getCtgryCode().equals(SIConfig.SICATEGORY_ROOT_CODE)){
    }else{
      SICheckValid.checkValid(errors,"カテゴリコード",this.getCtgryCode(),SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,16);
    }
    
    //商品存在のチェック
    if (SIUtil.isNotNull(getShopCode())&&SIUtil.isNotNull(getCmdtyCode())){
      lSqlBuf=new StringBuffer("SELECT CtgryCode FROM CtgryMTbl ");
      lSqlBuf.append("WHERE CtgryCode=").append(SIDBUtil.SQL2Str(this.getCtgryCode()));
      SICheckValid.checkExist(errors,lConnection,"カテゴリコード",lSqlBuf.toString());
    }
    
    if (lCsvCheck&&getEditModeTxt().equals(SIConfig.SIEDIT_MODE_INSERT)&&SIUtil.isNotNull(getShopCode())
    &&SIUtil.isNotNull(getCmdtyCode())&&SIUtil.isNotNull(getCtgryCode())){//存在のチェック
      lSqlBuf=new StringBuffer("SELECT CmdtyCode FROM CmdtyCtgryMTbl WHERE ShopCode=");
      lSqlBuf.append(SIDBUtil.SQL2Str(this.getShopCode()," "));
      lSqlBuf.append("AND CmdtyCode=").append(SIDBUtil.SQL2Str(this.getCmdtyCode()," "));
      lSqlBuf.append("AND CtgryCode=").append(SIDBUtil.SQL2Str(this.getCtgryCode()," "));
      try {
        if (SIDBUtil.hasData(lConnection,lSqlBuf.toString())){
          errors.addError(new SICustomError("input.data.csv.duplication","商品カテゴリコード"));
        }
      } catch (SIDBAccessException e) {
        e.printStackTrace();
      }
    }
    
    //エラーメッセージをセッションに設定します。
    if (!errors.isEmpty())lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    
    return errors.isEmpty();
  }
  
  /**
   * <b>hasCtgry</b>
   * 対象の商品コードに対するカテゴリーがあるかどうかをチェックします。
   * @param lConnection DBへのコネクション
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @return true 規格ある false 規格なし
   * @throws なし
   */
  public static boolean hasCtgry(Connection lConnection,String lShopCode,String lCmdtyCode){
    if (SIUtil.isNull(lShopCode)||SIUtil.isNull(lCmdtyCode)) return false;
    StringBuffer lSqlBuf=new StringBuffer("SELECT CmdtyCode FROM CmdtyCtgryMTbl WHERE ShopCode=? AND CmdtyCode=?");
    PreparedStatement lPreparedStatement =null;
    ResultSet lResultSet=null;
    
    try {
      lPreparedStatement = lConnection.prepareStatement(lSqlBuf.toString());
      
      lPreparedStatement.setString(1,lShopCode);
      lPreparedStatement.setString(2,lCmdtyCode);
      lResultSet=lPreparedStatement.executeQuery();
      return lResultSet.next();
    } catch (SQLException e) {
      e.printStackTrace();
      return false;
    }finally{
      SIDBUtil.close(lResultSet,lPreparedStatement);
    }
  }
}
