/**
 * 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.SIBasic;
import jp.co.sint.basic.SILogin;
import jp.co.sint.basic.SIStndrdName;
import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIDBMultiConf;
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.SICheckValid;
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 : UIStndrdNameListCond.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 UIStndrdNameListCond extends SIBasic{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //ショップコード
  private String shopCodeTxt="";
  
  //規格分類名称
  private String stndrdNameTxt="";
  
  //SQL検索のばあいに、条件文
  private String conditionSQL="";
  //並び順の文
  private String orderBySQL=" ORDER BY a.ShopCode,a.StndrdCode,a.StndrdName ";
  
  private boolean searchFlg = true;
  
  /**
   * UIStndrdNameListCond
   * コンストラクタ
   * @param なし
   * @return なし
   * @throws なし
   */
  public UIStndrdNameListCond(){}
  
  /**
   * UIStndrdNameListCond
   * コンストラクタ
   * @param lRequest リクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public UIStndrdNameListCond(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    this.init(lRequest,lUrlParam);//7.1.1 ST0236 修正
  }
  
  //setter of ショップコード
  public void setShopCodeTxt(String lShopCodeTxt){
    if (SIUtil.isNull(lShopCodeTxt)) lShopCodeTxt="";
    this.shopCodeTxt=SIUtil.changeTo(lShopCodeTxt.trim(),this.encode);
  }
  
  //setter of 規格分類名称
  public void setStndrdNameTxt(String lStndrdNameTxt){
    if (SIUtil.isNull(lStndrdNameTxt)) lStndrdNameTxt="";
    this.stndrdNameTxt=SIUtil.changeTo(lStndrdNameTxt.trim(),this.encode);
  }
  
  //setter of ページ番号
  public void setPageNumberTxt(String lPageNumberTxt){
    if (SIUtil.isNull(lPageNumberTxt)) lPageNumberTxt="";
    this.pageNumberTxt=SIUtil.changeTo(lPageNumberTxt.trim(),this.encode);
  }
  
  //setter of ページごとに表示するレコード数
  public void setPageNumberSel(String lPageNumberSel){
    if (SIUtil.isNull(lPageNumberSel)) lPageNumberSel="";
    this.pageNumberSel=SIUtil.changeTo(lPageNumberSel.trim(),this.encode);
  }
  
  //setter of 条件文
  public void setConditionSQL(String lConditionSQL){
    if (lConditionSQL==null)lConditionSQL="";
    this.conditionSQL=lConditionSQL;
  }
  
  //setter of 並び順文
  public void setOrderBySQL(String lOrderBySQL){
    if (lOrderBySQL==null)lOrderBySQL="";
    this.orderBySQL=lOrderBySQL;
  }
  
  //getter of ショップコード
  public String getShopCodeTxt(){
    return this.shopCodeTxt;
  }
  
  //getter of 規格分類名称
  public String getStndrdNameTxt(){
    return this.stndrdNameTxt;
  }
  
  //getter of ページ番号
  public String getPageNumberTxt(){
    return this.pageNumberTxt;
  }
  
  //getter of ページごとに表示するレコード数
  public String getPageNumberSel(){
    return this.pageNumberSel;
  }
  
  //getter of 条件文
  public String getCondtionSQL(){
    return this.conditionSQL;
  }
  
  //getter of 並び順文
  public String getOrderBySQL(){
    return this.orderBySQL;
  }
  
  /**
   * <b>init</b>
   * 入力したデータを基づいて、このbeansを設定します。
   * @param request クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    //7.1.1 ST0236 修正 ここから
    super.init(lRequest,lUrlParam);
    if (lLogin.isShop()){
      this.setShopCodeTxt(lLogin.getMallShopCode());//ショップコード
    }else{
      this.setShopCodeTxt((String)lUrlParam.getParam("shopCodeTxt"));//ショップコード
    }
    this.setStndrdNameTxt((String)lUrlParam.getParam("stndrdNameTxt"));//規格分類名称
    this.setPageNumberSel((String)lUrlParam.getParam("pageNumberSel"));
    //7.1.1 ST0236 修正 ここまで
  }
  
  public Collection getCollection(Connection lConnection) throws SIDBAccessException{
    return getCollection(lConnection,new SILogin());
  }
  
  /**
   * <b>getCollection</b>
   * 条件に合ったレコードを検索して、結果のコネクションを作成して、戻します。
   * @param lConnection データベースへの接続コネクション
   * @return レコードのセット
   * @throws SIDBAccessException
   */
  public Collection getCollection(Connection lConnection,SILogin lLogin) throws SIDBAccessException{
    Statement lStatement=null;
    ResultSet lResultSet=null;
    SIStndrdName lStndrdName=new SIStndrdName();
    Collection lStndrdNameColl=new ArrayList();
    StringBuffer lSqlBuf=new StringBuffer();
    if(!this.searchFlg){
      return lStndrdNameColl;
    }
    
    //基本のSQL
    lSqlBuf.append("SELECT a.*, ");
    lSqlBuf.append(" CASE WHEN ");
    lSqlBuf.append(" ( SELECT DISTINCT(1) AS jj FROM cmdtystndrdmtbl WHERE shopcode = a.shopcode AND stndrdcode1=a.stndrdcode) > 0 ");
    
    lSqlBuf.append(" THEN 1 ELSE 0 ");
    lSqlBuf.append(" END AS CmdtyCount1 ,");
    lSqlBuf.append(" CASE WHEN ");
    lSqlBuf.append(" ( SELECT DISTINCT(1) as jj from cmdtystndrdmtbl where shopcode = a.shopcode and stndrdcode2=a.stndrdcode ) > 0 ");
    lSqlBuf.append(" THEN 2 ELSE 0");
    lSqlBuf.append(" END AS CmdtyCount2 ");
    lSqlBuf.append("FROM StndrdNameMTbl a ");
    
    if (lLogin.isShop()){
      lSqlBuf.append("WHERE a.ShopCode=").append(SIDBUtil.SQL2Str(lLogin.getMallShopCode()," "));
    }else{
      lSqlBuf.append("WHERE 1=1 ");
    }
    //検索の条件
    lSqlBuf.append(this.conditionSQL);
    //出力順
    lSqlBuf.append(this.getOrderBySQL());
    log.debug("getCollection:lSqlBuf="+lSqlBuf.toString());
    //実行
    try{
      lStatement=lConnection.createStatement();
      lResultSet=lStatement.executeQuery(lSqlBuf.toString());
      
      //商品レコードのセットの作成
      while (lResultSet.next()){
        lStndrdName=new SIStndrdName();
        lStndrdName.setEncode(SIConfig.SIENCODE_NONE);
        lStndrdName.setShopCode(lResultSet.getString("ShopCode"));
        lStndrdName.setStndrdCode(lResultSet.getString("StndrdCode"));
        lStndrdName.setStndrdName(lResultSet.getString("StndrdName"));
        lStndrdName.setCmdtyCount1(lResultSet.getString("CmdtyCount1"));
        lStndrdName.setCmdtyCount2(lResultSet.getString("CmdtyCount2"));
        lStndrdNameColl.add(lStndrdName);
      }
    }catch(Exception ex){
      throw new SIDBAccessException(ex);
    }finally{
      SIDBUtil.close(lResultSet,lStatement);
    }
    return lStndrdNameColl;
  }
  
  /**
   * <b>validate</b>
   * 入力したデータをチェックして、同時にSQLの条件文を作成します。
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws なし
   */
  public void validate(HttpServletRequest lRequest){
    SILogin lLogin=SIHTMLUtil.getLogin( lRequest);
    SICustomErrors errors=new SICustomErrors();
    SITableConditionManager lConditionMan=new SITableConditionManager();
    
    //ショップコード
    if (lLogin.isMall()&&SIUtil.isNotNull(this.getShopCodeTxt())
        && SICheckValid.checkValid(errors,"ショップコード",this.getShopCodeTxt(),SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE)){
      lConditionMan.add(new SITableCondition("a","ShopCode",this.getShopCodeTxt(),SIConfig.SICONDITION_TYPE_EQUAL,SIConfig.SICONDITION_TYPE_AND));
    }
    
    //規格分類名称
    if (SIUtil.isNotNull(getStndrdNameTxt())){
      lConditionMan.add(new SITableCondition("a","StndrdName",this.getStndrdNameTxt(),SIConfig.SICONDITION_TYPE_LIKE,SIConfig.SICONDITION_TYPE_AND));
    }
    
    //エラーをセッションに設定します。
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    if (!errors.isEmpty()){
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
      this.searchFlg=false;
    } else {
      lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    }
    //条件文の設定
    this.setConditionSQL(lConditionMan.getCondtionSQL());
  }
}