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

import java.sql.Connection;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Category;

import jp.co.sint.basic.SIBasic;
import jp.co.sint.basic.SILogin;
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.SIHTMLUtil;
import jp.co.sint.tools.SIURLParameter;
import jp.co.sint.tools.SIUtil;

/**
 * @version $Id: UIInventory.java,v 1.0 2006/05/30 Exp $
 * @author  Hong.M.J
 * <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>
 * Hong.M.J        2006/05/30 11:06:28  Original
 */
public class UIInventory extends SIBasic {
  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //支店コード
  private String branchCode = "";
  
  //対象年月
  private String season = "";
  
  //ステータス
  private String status = "";
  
  //登録日時
  private String initdatetime = "";
  
  //対象時期の年
  private String seasonYearCbo = "";
  
  //対象時期の年
  private String seasonMonthCbo = "";
  
  //在庫コード
  private String individualCode = "";
  
  //在庫数量
  private String amount = "";
  
  //親コード
  private String cmdtyCode = "";
  
  private String UpdateUser = "";
  
  private String BranchName = "";
  
  private String cmdtyName = "";
  
  private String storeRecordAmount = "0";//ｼｽﾃﾑ在庫総数
  
  private String inventoryStockAmount = "0";//実地棚卸数
  
  private String cmdtyPrice = "0";//在庫単価
  
  private String storeAmount = "0";//入庫在庫数
  
  private String shipAmount = "0";//出庫在庫数
  
  private String sumAmount = "0";//総在庫数
  
  private String sumPrice = "0";
  
  private String ctgryName = "";//カテゴリ名
  
  private String chargeCode = "";//担当者
  
  private String chargeName = "";
  
  private String type = "";//入出庫タイプ
  
  private String storeshipFlg = "";//入出庫判断フラグ
  
  private String inventoryDifference = "";//棚卸差異
  
  private String categoryCode = "";
  
  public UIInventory(){}
  
  /**
   * <b>validate</b>
   * 入力したデータをチェックする。
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest,Connection lConnection){
    SICustomErrors errors=new SICustomErrors();
    StringBuffer lSqlBuf=null;
    
    //支店コード
    SICheckValid.checkValid(errors, "支店コード", this.getBranchCode(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE); 
    
    //対象年月
    SICheckValid.checkValid(errors, "対象年", this.getSeasonYearCbo(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE); 
    SICheckValid.checkValid(errors, "対象月", this.getSeasonMonthCbo(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE); 
    if (SIUtil.isNotNull(this.getSeasonYearCbo())&&SIUtil.isNotNull(this.getSeasonMonthCbo())){
      if(this.getSeasonCbo().trim().length()!=6){
        errors.addError(new SICustomError("input.data.date","対象時期"));
      }
    }
    //ステータスチェック
    if(errors.isEmpty()){
      lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT branchcode FROM ").append(SIConfig.SITABLE_INVENTORYTBL_NAME);
      lSqlBuf.append(" WHERE branchcode=").append(SIDBUtil.SQL2Str(this.getBranchCode()));
      lSqlBuf.append(" AND season=").append(SIDBUtil.SQL2Str(this.getSeasonCbo()));
      lSqlBuf.append(" AND status='0'");
      SICheckValid.checkExist(errors,lConnection,"取込ができる棚卸データ",lSqlBuf.toString());
    }
    
    if (!errors.isEmpty()) {
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    }else{
      lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    }
    return errors.isEmpty();
    
  }
  
  public boolean filevalidate(HttpServletRequest lRequest,Connection lConnection,String season,String branchName){
    SICustomErrors errors=new SICustomErrors();
    String seasontemp = season.trim().substring(0,4) + season.trim().substring(5,7);
    if(!this.getSeasonCbo().equals(seasontemp)){
      errors.addError(new SICustomError("manager.message.error.inventoryfile"));
    }
    
    if(errors.isEmpty()){
      StringBuffer lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT BranchCode FROM BranchTbl ");
      lSqlBuf.append("WHERE BranchName=").append(SIDBUtil.SQL2Str(branchName));
      try {
        if(!this.branchCode.equals(SIDBUtil.getFirstData(lConnection,lSqlBuf.toString()))){
          errors.addError(new SICustomError("manager.message.error.inventoryfile"));
        }
      } 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>validate</b>
   * 入力したデータをチェックする。
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws なし
   */
  public boolean updatevalidate(HttpServletRequest lRequest,Connection lConnection){
    SICustomErrors errors=new SICustomErrors();
    StringBuffer lSqlBuf=null;
    
    //在庫コード
    SICheckValid.checkValid(errors, "在庫コード", this.getIndividualCode(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
    SICheckValid.checkValid(errors,"在庫コード",this.getIndividualCode(),SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,8);
    
    //登録対象在庫コードの商品が存在する
    if(errors.isEmpty()){
      lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT cmdtycode FROM cmdtyunittbl ");
      lSqlBuf.append("WHERE individualcode=").append(SIDBUtil.SQL2Str(this.getIndividualCode()," "));
      lSqlBuf.append("AND cmdtyname=").append(SIDBUtil.SQL2Str(this.getCmdtyName()));
      try {
        this.setCmdtyCode(SIDBUtil.getFirstData(lConnection,lSqlBuf.toString()));
        SICheckValid.checkValid(errors,"対象商品",this.getCmdtyCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      } catch (SIDBAccessException e) {
        e.printStackTrace();
      }
    }
    
    if(errors.isEmpty()){
      lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT BranchCode FROM BranchTbl ");
      lSqlBuf.append("WHERE BranchName=").append(SIDBUtil.SQL2Str(this.getBranchName()));
      try {
        this.setBranchCode(SIDBUtil.getFirstData(lConnection,lSqlBuf.toString()));
        SICheckValid.checkValid(errors,"対象支店",this.getBranchCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      } catch (SIDBAccessException e) {
        e.printStackTrace();
      }
    }
    
    //在庫数量
    SICheckValid.checkValid(errors, "在庫数量", this.getAmount(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "在庫数量", this.getAmount(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "在庫数量", this.getAmount(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 6);
    
    if (!errors.isEmpty()) {
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    }else{
      lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    }
    return errors.isEmpty();
  }
  
  public String getStockAmount(Connection lConnection){
    StringBuffer lSqlBuf = new StringBuffer();
    String amount = "0";
    lSqlBuf.append("SELECT aa.").append(SIUtil.getAmountName(this.getSeasonCbo())).append(" AS stockRecordAmount ");
    lSqlBuf.append("FROM ").append(SIConfig.SITABLE_STOCKRECORDTBL_NAME).append(" aa ");//締処理在庫
    lSqlBuf.append("WHERE cmdtyCode = ").append(SIDBUtil.SQL2Str(this.getCmdtyCode()," "));
    lSqlBuf.append("AND individualcode = ").append(SIDBUtil.SQL2Str(this.getIndividualCode()," "));
    lSqlBuf.append("AND stockyear = ").append(SIDBUtil.SQL2Str(this.getSeasonYearCbo()," "));
    lSqlBuf.append("AND branchcode = ").append(this.getBranchCode());
    
    log.debug("lSqlBuf="+lSqlBuf.toString());
    try {
      amount=SIDBUtil.getFirstData(lConnection,lSqlBuf.toString());
    } catch (SIDBAccessException e) {
      e.printStackTrace();
    }
    return amount;
  }
  
  /**
   * @return branchCode を戻します。
   */
  public String getBranchCode() {
    return branchCode;
  }
  
  /**
   * @param branchCode branchCode を設定。
   */
  public void setBranchCode(String branchCode) {
    this.branchCode = branchCode;
  }
  
  /**
   * @return initdatetime を戻します。
   */
  public String getInitdatetime() {
    return initdatetime;
  }
  
  /**
   * @param initdatetime initdatetime を設定。
   */
  public void setInitdatetime(String initdatetime) {
    this.initdatetime = initdatetime;
  }
  
  /**
   * @return season を戻します。
   */
  public String getSeason() {
    return season;
  }
  
  /**
   * @param season season を設定。
   */
  public void setSeason(String season) {
    this.season = season;
  }
  
  /**
   * @return status を戻します。
   */
  public String getStatus() {
    return status;
  }
  
  /**
   * @param status status を設定。
   */
  public void setStatus(String status) {
    this.status = status;
  }
  
  /**
   * @return seasonMonthCbo を戻します。
   */
  public String getSeasonMonthCbo() {
    return seasonMonthCbo;
  }
  
  /**
   * @param seasonMonthCbo seasonMonthCbo を設定。
   */
  public void setSeasonMonthCbo(String seasonMonthCbo) {
    this.seasonMonthCbo = seasonMonthCbo;
  }
  
  /**
   * @return seasonYearCbo を戻します。
   */
  public String getSeasonYearCbo() {
    return seasonYearCbo;
  }
  
  /**
   * @param seasonYearCbo seasonYearCbo を設定。
   */
  public void setSeasonYearCbo(String seasonYearCbo) {
    this.seasonYearCbo = seasonYearCbo;
  }
  
  public String getSeasonCbo(){
    return this.seasonYearCbo + this.seasonMonthCbo;
  }
  
  /**
   * @return amount を戻します。
   */
  public String getAmount() {
    return amount;
  }
  
  /**
   * @param amount amount を設定。
   */
  public void setAmount(String amount) {
    this.amount = amount;
  }
  
  /**
   * @return individualCode を戻します。
   */
  public String getIndividualCode() {
    return individualCode;
  }
  
  /**
   * @param individualCode individualCode を設定。
   */
  public void setIndividualCode(String individualCode) {
    this.individualCode = individualCode;
  }
  
  /**
   * @return cmdtyCode を戻します。
   */
  public String getCmdtyCode() {
    return cmdtyCode;
  }
  
  /**
   * @param cmdtyCode cmdtyCode を設定。
   */
  public void setCmdtyCode(String cmdtyCode) {
    this.cmdtyCode = cmdtyCode;
  }
  
  /**
   * @return updateUser を戻します。
   */
  public String getUpdateUser() {
    return UpdateUser;
  }
  
  /**
   * @param updateUser updateUser を設定。
   */
  public void setUpdateUser(String updateUser) {
    UpdateUser = updateUser;
  }
  
  /**
   * @return branchName を戻します。
   */
  public String getBranchName() {
    return BranchName;
  }
  
  /**
   * @param branchName branchName を設定。
   */
  public void setBranchName(String branchName) {
    BranchName = branchName;
  }
  
  /**
   * @return cmdtyName を戻します。
   */
  public String getCmdtyName() {
    return cmdtyName;
  }
  
  /**
   * @param cmdtyName cmdtyName を設定。
   */
  public void setCmdtyName(String cmdtyName) {
    this.cmdtyName = cmdtyName;
  }
  
  /**
   * @return inventoryStockAmount を戻します。
   */
  public String getInventoryStockAmount() {
    return inventoryStockAmount;
  }
  
  /**
   * @param inventoryStockAmount inventoryStockAmount を設定。
   */
  public void setInventoryStockAmount(String inventoryStockAmount) {
    if (SIUtil.isNull(inventoryStockAmount)) this.inventoryStockAmount = "0";
    this.inventoryStockAmount = inventoryStockAmount;
  }
  
  /**
   * @return storeRecordAmount を戻します。
   */
  public String getStoreRecordAmount() {
    return storeRecordAmount;
  }
  
  /**
   * @param storeRecordAmount storeRecordAmount を設定。
   */
  public void setStoreRecordAmount(String storeRecordAmount) {
    if (SIUtil.isNull(storeRecordAmount)) this.storeRecordAmount = "0";
    else this.storeRecordAmount = storeRecordAmount;
  }
  
  /**
   * @return cmdtyPrice を戻します。
   */
  public String getCmdtyPrice() {
    return cmdtyPrice;
  }
  
  /**
   * @param cmdtyPrice cmdtyPrice を設定。
   */
  public void setCmdtyPrice(String cmdtyPrice) {
    if (SIUtil.isNull(cmdtyPrice)) this.cmdtyPrice = "0";
    else this.cmdtyPrice = cmdtyPrice;
  }
  
  /**
   * @return shipAmount を戻します。
   */
  public String getShipAmount() {
    return shipAmount;
  }
  
  /**
   * @param shipAmount shipAmount を設定。
   */
  public void setShipAmount(String shipAmount) {
    if (SIUtil.isNull(shipAmount)) this.shipAmount = "0";
    else this.shipAmount = shipAmount;
  }
  
  /**
   * @return storeAmount を戻します。
   */
  public String getStoreAmount() {
    return storeAmount;
  }
  
  /**
   * @param storeAmount storeAmount を設定。
   */
  public void setStoreAmount(String storeAmount) {
    if (SIUtil.isNull(storeAmount)) this.storeAmount = "0";
    else this.storeAmount = storeAmount;
  }
  
  /**
   * @return sumAmount を戻します。
   */
  public String getSumAmount() {
    return sumAmount;
  }
  
  /**
   * @param sumAmount sumAmount を設定。
   */
  public void setSumAmount(String sumAmount) {
    if (SIUtil.isNull(sumAmount)) this.sumAmount = "0";
    else this.sumAmount = sumAmount;
  }
  
  /**
   * @return sumPrice を戻します。
   */
  public String getSumPrice() {
    return sumPrice;
  }
  
  /**
   * @param sumPrice sumPrice を設定。
   */
  public void setSumPrice(String sumPrice) {
    if (SIUtil.isNull(sumPrice)) this.sumPrice = "0";
    else this.sumPrice = sumPrice;
  }
  
  /**
   * @return ctgryName を戻します。
   */
  public String getCtgryName() {
    return ctgryName;
  }
  
  /**
   * @param ctgryName ctgryName を設定。
   */
  public void setCtgryName(String ctgryName) {
    this.ctgryName = ctgryName;
  }
  
  /**
   * @return chargeCode を戻します。
   */
  public String getChargeCode() {
    return chargeCode;
  }
  
  /**
   * @param chargeCode chargeCode を設定。
   */
  public void setChargeCode(String chargeCode) {
    this.chargeCode = chargeCode;
  }
  
  /**
   * @return storeshipFlg を戻します。
   */
  public String getStoreshipFlg() {
    return storeshipFlg;
  }
  
  /**
   * @param storeshipFlg storeshipFlg を設定。
   */
  public void setStoreshipFlg(String storeshipFlg) {
    this.storeshipFlg = storeshipFlg;
  }
  
  /**
   * @return type を戻します。
   */
  public String getType() {
    return type;
  }
  
  /**
   * @param type type を設定。
   */
  public void setType(String type) {
    this.type = type;
  }
  
  /**
   * @return chargeName を戻します。
   */
  public String getChargeName() {
    return chargeName;
  }
  
  /**
   * @param chargeName chargeName を設定。
   */
  public void setChargeName(String chargeName) {
    this.chargeName = chargeName;
  }
  
  /**
   * @return inventoryDifference を戻します。
   */
  public String getInventoryDifference() {
    return inventoryDifference;
  }
  
  /**
   * @param inventoryDifference inventoryDifference を設定。
   */
  public void setInventoryDifference(String inventoryDifference) {
    if (SIUtil.isNull(inventoryDifference)) this.inventoryDifference = "0";
    else this.inventoryDifference = inventoryDifference;
  }
  
  /**
   * @return categoryCode を戻します。
   */
  public String getCategoryCode() {
    return categoryCode;
  }
  
  /**
   * @param categoryCode categoryCode を設定。
   */
  public void setCategoryCode(String categoryCode) {
    this.categoryCode = categoryCode;
  }
}