/**
 * Created on 2003/10/02
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
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.SIInstock;
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.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @author arai
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class UIRegInstockList extends SIInstock {
  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  public UIRegInstockList() {}
  
  /**
   * init
   * 入力したデータから、このbeansを設定します。
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  //7.1.1 ST0236 修正 ここから
  public void init(SIURLParameter lUrlParam){
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.setStockStatusCode((String)lUrlParam.getParam("stockStatusCode"));
    this.setStockStatusName((String)lUrlParam.getParam("stockStatusName"));
    this.setCommentOfNoStock((String)lUrlParam.getParam("commentOfNoStock"));
    this.setAmountOfLessStock((String)lUrlParam.getParam("amountOfLessStock"));
    this.setCommentOfLessStock((String)lUrlParam.getParam("commentOfLessStock"));
    this.setCommentOfMoreStock((String)lUrlParam.getParam("commentOfMoreStock"));
    this.setActionNameTxt((String)lUrlParam.getParam("actionNameTxt"));
    this.setEditModeTxt((String)lUrlParam.getParam("editModeTxt"));
  }
  //7.1.1 ST0236 修正 ここまで
  
  /**
   * validate
   * 入力したデータをチェックします。
   * 不正なデータがある場合、エラーをオブジェクトに格納します。
   * そのオブジェクトは、エラーメッセージとして画面に表示されます。
   * @param HttpServletRequest ，Connection , SIURLParameter
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest, Connection lConnection,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    
    SICheckValid.checkValid(errors, "在庫状況番号", this.getStockStatusCode(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE); //自動採番
    SICheckValid.checkValid(errors, "在庫状況番号", this.getStockStatusCode(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 6);
    
    if (!SIConfig.SIEDIT_MODE_DELETE.equals((String)lUrlParam.getParam("editModeTxt"))) {//7.1.1 ST0236 修正
      SICheckValid.checkValid(errors, "在庫状況分類名", this.getStockStatusName(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors, "在庫状況分類名", this.getStockStatusName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 20);
      
      SICheckValid.checkValid(errors, "在庫無コメント", this.getCommentOfNoStock(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 20);
      
      SICheckValid.checkValid(errors, "在庫少数量", this.getAmountOfLessStock(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "在庫少数量", this.getAmountOfLessStock(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8);
      
      if(this.getAmountOfLessStock().equals("0")){
        errors.addError(new SICustomError("input.data.instock.less","在庫少 数量","1"));
      }
      
      SICheckValid.checkValid(errors, "在庫少コメント", this.getCommentOfLessStock(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 20);
      
      SICheckValid.checkValid(errors, "在庫多コメント", this.getCommentOfMoreStock(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 20);
    }
    
    if (!errors.isEmpty())
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  /**
   * validateData
   * 対象コードでデータ削除可能かどうか調べます。
   *  @param HttpServletRequest ，Connection
   * @return true:データがある false:データがない
   * @throws なし
   */
  public boolean validateData(Connection lConnection) throws SIDBAccessException{
    StringBuffer lSqlBuf=new StringBuffer();
    lSqlBuf.append("SELECT a.stockstatuscode  FROM stockstatusMtbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("a, ");
    lSqlBuf.append("cmdtyMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("b ");
    lSqlBuf.append(" WHERE a.stockstatuscode=b.stockstatuscode ");
    lSqlBuf.append(" AND a.stockstatuscode=").append(this.getStockStatusCode());
    
    return SIDBUtil.hasData(lConnection, lSqlBuf.toString());
  }
  
  /**
   * getFirstColl
   * 編集対象のレコードを取得する。
   * @param
   * @return SIInstock
   * @throws
   */
  public SIInstock getFirstColl() {
    SIInstock linstock = new SIInstock();
    linstock.setEncode(SIConfig.SIENCODE_NONE);
    linstock.setStockStatusCode(this.getStockStatusCode());
    linstock.setStockStatusName(this.getStockStatusName());
    linstock.setCommentOfNoStock(this.getCommentOfNoStock());
    linstock.setAmountOfLessStock(this.getAmountOfLessStock());
    linstock.setCommentOfLessStock(this.getCommentOfLessStock());
    linstock.setCommentOfMoreStock(this.getCommentOfMoreStock());
    linstock.setActionNameTxt(this.getActionNameTxt());
    linstock.setEditModeTxt(this.getEditModeTxt());
    return linstock;
  }
  
  /**
   * getFirstColl
   * 編集対象のレコードを取得する。
   * @param Connection
   * @return SIInstock
   * @throws SIDBAccessException
   */
  public SIInstock getFirstColl(Connection lConnection) throws SIDBAccessException {
    if (!this.actionNameTxt.equals(SIConfig.SIACTION_REMODIFY) || getCollection(lConnection, this.getStockStatusCode()).isEmpty()) {
      return new SIInstock();
    } else {
      return (SIInstock) getCollection(lConnection, this.getStockStatusCode()).iterator().next();
    }
  }
  
  /**
   * getCollection
   * 条件に合ったレコードを検索して、結果のコネクションを作成して、戻します。
   * @param Connection , String
   * @return Collection
   * @throws SIDBAccessException
   */
  public Collection getCollection(Connection lConnection, String pStockStatusCode) throws SIDBAccessException {
    Statement lStatement = null;
    ResultSet lResultSet = null;
    StringBuffer lSqlBuf = new StringBuffer();
    SIInstock instock = new SIInstock();
    Collection instockCol = new ArrayList();
    
    //基本のSQL
    lSqlBuf.append(" SELECT a.* , b.cmdtyCount ");
    lSqlBuf.append(" FROM stockstatusMtbl a ");
    lSqlBuf.append(" LEFT OUTER JOIN ");
    lSqlBuf.append(" (SELECT stockstatuscode,COUNT(cmdtycode) as cmdtyCount FROM cmdtyMtbl GROUP BY stockstatuscode ) b ");
    lSqlBuf.append("ON (a.stockstatuscode = b.stockstatuscode) ");
    lSqlBuf.append(" WHERE 1=1 ");
    SITableConditionManager lConditionMan = new SITableConditionManager();
    SITableCondition DD = new SITableCondition("", "a.stockstatuscode", pStockStatusCode, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    DD.setBlankEnable(false);
    lConditionMan.add(DD);
    lSqlBuf.append(lConditionMan.getCondtionSQL());
    lSqlBuf.append(" Order By a.stockstatuscode asc");
    
    log.debug("lSqlBuf=" + lSqlBuf.toString());
    
    //実行
    try {
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlBuf.toString());
      
      while (lResultSet.next()) {
        instock = new SIInstock();
        instock.setEncode(SIConfig.SIENCODE_NONE);
        instock.setStockStatusCode(lResultSet.getString("stockstatuscode"));
        instock.setStockStatusName(lResultSet.getString("stockstatusname"));
        instock.setCommentOfNoStock(lResultSet.getString("commentofnostock"));
        instock.setAmountOfLessStock(lResultSet.getString("amountoflessstock"));
        instock.setCommentOfLessStock(lResultSet.getString("commentoflessstock"));
        instock.setCommentOfMoreStock(lResultSet.getString("commentofmorestock"));
        instock.setCmdtyCount(lResultSet.getString("cmdtyCount"));
        instockCol.add(instock);
      }
      
      return instockCol;
      
    } catch (Exception ex) {
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
  }
}