/**
 * 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.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.SIHTMLUtil;
import jp.co.sint.tools.SIURLParameter;
import jp.co.sint.tools.SIUtil;

/**
 * @version $Id: UIInventoryDifference.java,v 1.0 2006/05/29 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/29 11:06:28  Original
 */
public class UIInventoryDifference extends SIBasic {
  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  //親コード
  private String cmdtyCode = "";
  //在庫コード
  private String individualCode = "";
  //支店コード
  private String branchCode = "";
  //対象年月
  private String season = "";
  //差異数量
  private String amount = "";
  //差異理由
  private String comment = "";
  //登録者ID
  private String updateUser= "";
  //登録者名
  private String updateUserName="";
  //商品名
  private String cmdtyName = "";
  //対象時期の年
  private String seasonYearCbo = "";
  //対象時期の月
  private String seasonMonthCbo = "";
  //棚卸在庫数(棚卸在庫の在庫数量N月)
  private String inventoryStockAmount = "";
  //前月締在庫数(締処理在庫の在庫数量N月)
  private String stockRecordAmount="";
  //在庫数量現在値の帳簿在庫
  private String realAmount = "";
  //在庫数量現在値のEC販売可能在庫
  private String ecstockAmount = "";
  //原価自動計算要否
  private String purchasePriceFlg = "";
  //仕入総額
  private String purchaseprice = "";
  //加工総額
  private String processingexpence = "";
  
  private String mailSendFlg = "0";
  
  public UIInventoryDifference(){}
  
  public UIInventoryDifference(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    init(lRequest,lUrlParam);
  }
  
  /**
   * <b>init</b>
   * 入力したデータを基づいて、このbeansを設定します。(棚卸差異新規登録)
   * @param lRequest
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest,lUrlParam);
    this.setCmdtyCode((String)lUrlParam.getParam("insertcmdtyCode"));
    this.setIndividualCode((String)lUrlParam.getParam("insertindividualCode"));
    this.setBranchCode((String)lUrlParam.getParam("insertbranchCode"));
    this.setSeasonMonthCbo((String)lUrlParam.getParam("insertseasonMonthCbo"));
    this.setSeasonYearCbo((String)lUrlParam.getParam("insertseasonYearCbo"));
    this.setAmount((String)lUrlParam.getParam("insertamount"));
  }
  
  /**
   * <b>init</b>
   * 入力したデータを基づいて、このbeansを設定します。(棚卸差異更新登録)
   * @param lRequest
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void updateinit(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest,lUrlParam);
    SILogin manLogin = SIHTMLUtil.getLogin(lRequest);
    this.setComment((String)lUrlParam.getParam("comment"));
    this.setUpdateUser(manLogin.getUserCode());
    this.setCmdtyCode((String)lUrlParam.getParam("cmdtyCode"));
    this.setIndividualCode((String)lUrlParam.getParam("individualCode"));
    this.setBranchCode((String)lUrlParam.getParam("branchCode"));
    this.setSeason((String)lUrlParam.getParam("season"));
    this.setPurchasePriceFlg((String)lUrlParam.getParam("purchasePriceFlg"));
    this.setProcessingexpence((String)lUrlParam.getParam("processingexpence"));
    this.setPurchaseprice((String)lUrlParam.getParam("purchaseprice"));
    this.setAmount((String)lUrlParam.getParam("amount"));
    this.setMailSendFlg((String)lUrlParam.getParam("mailSendFlg"));
  }
  
  /**
   * <b>init</b>
   * 入力したデータを基づいて、このbeansを設定します。(検索時、新規登録初期値表示)
   * @param lRequest
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void searchinit(HttpServletRequest lRequest){
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    SIURLParameter lUrlParam = new SIURLParameter(lRequest);
    super.init(lRequest,lUrlParam);
    this.setBranchCode((String)lUrlParam.getParam("selectbranchCode"));
    this.setSeasonYearCbo((String)lUrlParam.getParam("seasonYearCbo"));
    this.setSeasonMonthCbo((String)lUrlParam.getParam("seasonMonthCbo"));
    //初期化
    this.setIndividualCode("");
    this.setCmdtyCode("");
    this.setAmount("");
  }
  
  /**
   * <b>validate</b>
   * 入力したデータをチェックする(新規登録データをチェックする)
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws SIDBAccessException
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest,Connection lConnection) throws SIDBAccessException{
    SICustomErrors errors=new SICustomErrors();
    StringBuffer lSqlBuf = new StringBuffer();
    
    //支店コード
    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(this.getSeasonCbo().trim().length()!=6){
      errors.addError(new SICustomError("input.data.date","対象年月"));
    }
    
    //親コード
    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,13);
    
    //在庫コード
    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 individualcode FROM cmdtyunittbl");
      lSqlBuf.append(" WHERE individualcode=").append(SIDBUtil.SQL2Str(this.getIndividualCode()));
      lSqlBuf.append(" AND cmdtycode=").append(SIDBUtil.SQL2Str(this.getCmdtyCode()));
      SICheckValid.checkExist(errors,lConnection,"対象商品",lSqlBuf.toString());
    }
    
    //登録対象の締処理データが存在し、数量0である
    if(errors.isEmpty()){
      lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT individualcode FROM ").append(SIConfig.SITABLE_STOCKRECORDTBL_NAME);
      lSqlBuf.append(" WHERE individualcode=").append(SIDBUtil.SQL2Str(this.getIndividualCode()));
      lSqlBuf.append(" AND cmdtycode=").append(SIDBUtil.SQL2Str(this.getCmdtyCode()));
      lSqlBuf.append(" AND branchcode=").append(SIDBUtil.SQL2Str(this.getBranchCode()));
      lSqlBuf.append(" AND ").append(SIUtil.getAmountName(this.getSeasonCbo())).append("=0");
      if(!SIDBUtil.hasData(lConnection,lSqlBuf.toString()))errors.addError(new SICustomError("manager.message.error.stockrecord"));
    }
    
    //登録対象の棚卸ヘッダが存在し、ステータスが0でない
    if(errors.isEmpty()){
      lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT branchcode FROM ").append(SIConfig.SITABLE_INVENTORYTBL_NAME);
      lSqlBuf.append(" WHERE status='0' ");
      lSqlBuf.append(" AND branchcode=").append(SIDBUtil.SQL2Str(this.getBranchCode()));
      lSqlBuf.append(" AND season=").append(SIDBUtil.SQL2Str(this.getSeasonCbo()));
      if(SIDBUtil.hasData(lConnection,lSqlBuf.toString()))errors.addError(new SICustomError("manager.message.error.inventory"));
    }
    
    //同じ登録対象支店、時期、在庫コードの棚卸差異データが存在しない
    if(errors.isEmpty()){
      lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT individualcode FROM ").append(SIConfig.SITABLE_INVENTORYDIFFERENCETBL_NAME);
      lSqlBuf.append(" WHERE individualcode=").append(SIDBUtil.SQL2Str(this.getIndividualCode()));
      lSqlBuf.append(" AND cmdtycode=").append(SIDBUtil.SQL2Str(this.getCmdtyCode()));
      lSqlBuf.append(" AND branchcode=").append(this.getBranchCode());
      lSqlBuf.append(" AND season=").append(SIDBUtil.SQL2Str(this.getSeasonCbo()));
      if(SIDBUtil.hasData(lConnection,lSqlBuf.toString()))errors.addError(new SICustomError("database.insert.duplicate"));
    }
    
    //差異数
    SICheckValid.checkValid(errors, "差異数", this.getAmount(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "差異数", this.getAmount(), SICheckDataConf.SICHECK_DATA_DIGIT_NEGATIVE_TYPE);//員数も可能
    
    if (!errors.isEmpty()) {
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    }else{
      lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    }
    return errors.isEmpty();
  }
  
  /**
   * <b>updatevalidate</b>
   * 入力したデータをチェックする(更新登録データをチェックする)
   * @param lRequest クライアントからのリクエスト
   * @return なし
   * @throws SIDBAccessException
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest){
    SICustomErrors errors=new SICustomErrors();
    
    SICheckValid.checkValid(errors, "差異理由", this.getComment(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE); 
    
    if(this.getPurchasePriceFlg().equals("1")){//原価を手動入力
      SICheckValid.checkValid(errors, "仕入総額", this.getPurchaseprice(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "加工総額", this.getProcessingexpence(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    }
    
    if (!errors.isEmpty()) {
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    }else{
      lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    }
    return errors.isEmpty();
  }
  
  public String getNewStoreNumber(Connection lConnection){
    String storeNo="";
    String storeSql="SELECT MAX(storenumber) FROM storehistorytbl WHERE cmdtycode="+SIDBUtil.SQL2Str(this.cmdtyCode)+" AND individualcode="+SIDBUtil.SQL2Str(this.individualCode);
    try{
      if(SIUtil.isNotNull(SIDBUtil.getFirstData(lConnection,storeSql))) storeNo=SIUtil.add(SIDBUtil.getFirstData(lConnection,storeSql),"1");
      else storeNo="1";
    }catch(Exception e){
      e.printStackTrace();
    }
    return storeNo;
  }
  
  public String getNewShipNumber(Connection lConnection){
    String shipNo="";
    String shipSql="SELECT MAX(shipnumber) FROM shiphistorytbl WHERE cmdtycode="+SIDBUtil.SQL2Str(this.cmdtyCode)+" AND individualcode="+SIDBUtil.SQL2Str(this.individualCode);
    try{
      if(SIUtil.isNotNull(SIDBUtil.getFirstData(lConnection,shipSql))) shipNo=SIUtil.add(SIDBUtil.getFirstData(lConnection,shipSql),"1");
      else shipNo="1";
    }catch(Exception e){
      e.printStackTrace();
    }
    return shipNo;
  }
  
  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 " + 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;
  }
  
  public String getChargeCode(Connection lConnection){
    String chargeCode = "";
    StringBuffer lSqlBuf = new StringBuffer();
    lSqlBuf.append("SELECT aa.chargecode ");
    lSqlBuf.append("FROM chargetbl AS aa ");
    lSqlBuf.append("WHERE aa.chargecode=").append(SIDBUtil.SQL2Str(this.getUpdateUser()," "));
    
    log.debug("lSqlBuf="+lSqlBuf.toString());
    try {
      chargeCode=SIDBUtil.getFirstData(lConnection,lSqlBuf.toString());
    } catch (SIDBAccessException e) {
      e.printStackTrace();
    }
    return chargeCode;
  }
  
  /**
   * @return cmdtyName を戻します。
   */
  public String getCmdtyName() {
    return cmdtyName;
  }
  
  /**
   * @param cmdtyName cmdtyName を設定。
   */
  public void setCmdtyName(String cmdtyName) {
    this.cmdtyName = cmdtyName;
  }
  
  /**
   * @return amount を戻します。
   */
  public String getAmount() {
    return amount;
  }
  
  /**
   * @param amount amount を設定。
   */
  public void setAmount(String amount) {
    if (SIUtil.isNull(amount)) amount="";
    this.amount=SIUtil.changeTo(amount.trim(),this.encode);
  }
  
  /**
   * @return branchCode を戻します。
   */
  public String getBranchCode() {
    return branchCode;
  }
  
  /**
   * @param branchCode branchCode を設定。
   */
  public void setBranchCode(String branchCode) {
    if (SIUtil.isNull(branchCode)) branchCode="";
    this.branchCode=SIUtil.changeTo(branchCode.trim(),this.encode);
  }
  
  /**
   * @return comment を戻します。
   */
  public String getComment() {
    return comment;
  }
  
  /**
   * @param comment comment を設定。
   */
  public void setComment(String comment) {
    if (SIUtil.isNull(comment)) comment="";
    this.comment=SIUtil.changeTo(comment.trim(),this.encode);
  }
  
  /**
   * @return individualCode を戻します。
   */
  public String getIndividualCode() {
    return individualCode;
  }
  
  /**
   * @param individualCode individualCode を設定。
   */
  public void setIndividualCode(String individualCode) {
    if (SIUtil.isNull(individualCode)) individualCode="";
    this.individualCode=SIUtil.changeTo(individualCode.trim(),this.encode);
  }
  
  /**
   * @return updateUser を戻します。
   */
  public String getUpdateUser() {
    return updateUser;
  }
  
  /**
   * @param updateUser updateUser を設定。
   */
  public void setUpdateUser(String updateUser) {
    if (SIUtil.isNull(updateUser)) updateUser="";
    this.updateUser=SIUtil.changeTo(updateUser.trim(),this.encode);
  }
  
  /**
   * @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;
  }
  
  /**
   * @param season season を設定。
   */
  public void setSeason(String season) {
    if (SIUtil.isNull(season)) season="";
    this.season = SIUtil.changeTo(season.trim(),this.encode);
  }
  
  /**
   * @return season を戻します。
   */
  public String getSeason() {
    return season;
  }
  
  public String getSeasonCbo(){
    return this.seasonYearCbo + this.seasonMonthCbo;
  }
  
  /**
   * @return updateUserName を戻します。
   */
  public String getUpdateUserName() {
    return updateUserName;
  }
  
  /**
   * @param updateUserName updateUserName を設定。
   */
  public void setUpdateUserName(String updateUserName) {
    this.updateUserName = updateUserName;
  }
  
  /**
   * @return inventoryStockAmount を戻します。
   */
  public String getInventoryStockAmount() {
    return inventoryStockAmount;
  }
  
  /**
   * @param inventoryStockAmount inventoryStockAmount を設定。
   */
  public void setInventoryStockAmount(String inventoryStockAmount) {
    this.inventoryStockAmount = inventoryStockAmount;
  }
  
  /**
   * @return stockRecordAmount を戻します。
   */
  public String getStockRecordAmount() {
    return stockRecordAmount;
  }
  
  /**
   * @param stockRecordAmount stockRecordAmount を設定。
   */
  public void setStockRecordAmount(String stockRecordAmount) {
    this.stockRecordAmount = stockRecordAmount;
  }
  
  /**
   * @return realAmount を戻します。
   */
  public String getRealAmount() {
    return realAmount;
  }
  
  /**
   * @param realAmount realAmount を設定。
   */
  public void setRealAmount(String realAmount) {
    this.realAmount = realAmount;
  }
  
  /**
   * @return ecstockAmount を戻します。
   */
  public String getEcstockAmount() {
    return ecstockAmount;
  }
  
  /**
   * @param ecstockAmount ecstockAmount を設定。
   */
  public void setEcstockAmount(String ecstockAmount) {
    this.ecstockAmount = ecstockAmount;
  }
  
  /**
   * @return cmdtyCode を戻します。
   */
  public String getCmdtyCode() {
    return cmdtyCode;
  }
  
  /**
   * @param cmdtyCode cmdtyCode を設定。
   */
  public void setCmdtyCode(String cmdtyCode) {
    if (SIUtil.isNull(cmdtyCode)) cmdtyCode="";
    this.cmdtyCode = SIUtil.changeTo(cmdtyCode.trim(),this.encode);
  }
  
  /**
   * @return purchasePriceFlg を戻します。
   */
  public String getPurchasePriceFlg() {
    return purchasePriceFlg;
  }
  
  /**
   * @param purchasePriceFlg purchasePriceFlg を設定。
   */
  public void setPurchasePriceFlg(String purchasePriceFlg) {
    if (SIUtil.isNull(purchasePriceFlg)) purchasePriceFlg="";
    this.purchasePriceFlg=SIUtil.changeTo(purchasePriceFlg.trim(),this.encode);
  }
  
  /**
   * @return processingexpence を戻します。
   */
  public String getProcessingexpence() {
    return processingexpence;
  }
  
  /**
   * @param processingexpence processingexpence を設定。
   */
  public void setProcessingexpence(String processingexpence) {
    if (SIUtil.isNull(processingexpence)) processingexpence="";
    this.processingexpence=SIUtil.changeTo(processingexpence.trim(),this.encode);
  }
  
  /**
   * @return purchaseprice を戻します。
   */
  public String getPurchaseprice() {
    return purchaseprice;
  }
  
  /**
   * @param purchaseprice purchaseprice を設定。
   */
  public void setPurchaseprice(String purchaseprice) {
    if (SIUtil.isNull(purchaseprice)) purchaseprice="";
    this.purchaseprice=SIUtil.changeTo(purchaseprice.trim(),this.encode);
  }
  
  /**
   * @return mailSendFlg を戻します。
   */
  public String getMailSendFlg() {
    return mailSendFlg;
  }
  
  /**
   * @param mailSendFlg mailSendFlg を設定。
   */
  public void setMailSendFlg(String mailSendFlg) {
    this.mailSendFlg = mailSendFlg;
  }
}