<?php
/**
 * 新規ユーザ追加確認画面クラス
 *
 * 新規ユーザ追加確認画面を実現するためのクラス
 *
 * @package   risoluto
 * @author    Risoluto Developers
 * @license   http://opensource.org/licenses/bsd-license.php new BSD license
 * @copyright (C) 2008-2011 Risoluto Developers / All Rights Reserved.
 */

  /**
   * 基底クラス
   */
  require_once( "admin_user_base.inc" );
  /**
   * データベース操作クラス
   */
  require_once( RISOLUTO_FUNC . 'risoluto_db.php' );

  class useradd_confirm extends admin_user_base
  {
    //------------------------------------------------------//
    // クラス変数定義
    //------------------------------------------------------//
    /**
     * データベース操作クラスインスタンスを保持する変数
     * @access private
     * @var    object
     */
    private $obj_db;
    /**
     * ユーティリティクラスインスタンスを保持する変数
     * @access private
     * @var    object
     */
    private $obj_conf;
    /**
     * 取得データを保持する変数
     * @access private
     * @var    object
     */
    private $gotDat;

    //------------------------------------------------------//
    // クラスメソッド定義
    //------------------------------------------------------//
    /**
     * コンストラクタメソッド
     *
     * コンストラクタメソッド
     *
     * @param     void なし
     * @return    void なし
     */
    public function __construct()
    {
    } // end of function:__construct()

    /**
     * クローンメソッド
     *
     * クローンメソッド
     *
     * @param     void なし
     * @return    void なし
     */
    public function __clone()
    {
    } // end of function:__clone()

    /**
     * modelメソッド（モデル）
     *
     * データ取得等のモデルに相当する部分の処理を行う
     *
     * @param     void なし
     * @return    boolean ファンクション実行結果（ true：正常終了 / false: 異常終了 ）
     */
    public function model()
    {
      // 必要なインスタンスを生成
      $this->obj_conf = new RisolutoConf();
      $this->obj_conf->parse( RISOLUTO_CONF . 'risoluto.ini' );

      // スーパバイザセッション又はアドミンセッションが存在しない場合は、
      // ログイン画面に遷移する
      if ( ! $this->obj_util->is_Admin() )
      {
        $this->obj_util->redirectTo( $this->obj_adminconf->get( 'COMMON', 'login_act'  )
                                   , $this->obj_adminconf->get( 'COMMON', 'login_cage' ) );
        return false;
      } // end of if

      // 前画面のCageが「admin.user」でない or 前画面のActが「useradd_entry」でない場合、
      // 入力画面に飛ばす
      $tmp_cage = str_replace( DIRECTORY_SEPARATOR, '.', $this->obj_sess->sessLoad( 'lastcage' ) );
      $tmp_act  = $this->obj_sess->sessLoad( 'lastact'  );
      if ( $tmp_cage != 'admin.user' or ( $tmp_act != 'useradd_entry' ) )
      {
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if



      //------------------------------------------------------------------------
      // 前画面の入力値を取得
      //------------------------------------------------------------------------
      // 初期化
      $tmp_entered[ 'message'         ] = null;
      $tmp_entered[ 'username'        ] = null;
      $tmp_entered[ 'password'        ] = null;
      $tmp_entered[ 'password_retype' ] = null;
      $tmp_entered[ 'group_id'        ] = null;
      $tmp_entered[ 'mail'            ] = null;

      // ユーザ名
      if ( isset( $_POST[ 'username' ] ) )
      {
        $tmp_entered[ 'username' ] = strip_tags( trim( $_POST[ 'username' ] ) );
      } // end of if
      // パスワード
      if ( isset( $_POST[ 'password' ] ) )
      {
        $tmp_entered[ 'password' ] = strip_tags( trim( $_POST[ 'password' ] ) );
      } // end of if
      // パスワード（再入力）
      if ( isset( $_POST[ 'password_retype' ] ) )
      {
        $tmp_entered[ 'password_retype' ] = strip_tags( trim( $_POST[ 'password_retype' ] ) );
      } // end of if
      // グループ
      if ( isset( $_POST[ 'group_id' ] ) )
      {
        $tmp_entered[ 'group_id' ] = strip_tags( trim( $_POST[ 'group_id' ] ) );
      } // end of if
      // メールアドレス
      if ( isset( $_POST[ 'mail' ] ) )
      {
        $tmp_entered[ 'mail' ] = strip_tags( trim( $_POST[ 'mail' ] ) );
      } // end of if



      //------------------------------------------------------------------------
      // 入力情報のチェック
      //------------------------------------------------------------------------
      // ユーザ名（ユーザIDが不正）
      if ( ! preg_match( $this->obj_adminconf->get( 'COMMON', 'valid_username' ), $tmp_entered[ 'username' ] ) )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'invalid_username';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if

      // パスワード（ユーザ名と同じ）
      if ( $tmp_entered[ 'password' ] == $tmp_entered[ 'username' ] or $tmp_entered[ 'password_retype' ] == $tmp_entered[ 'username' ] )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'notmatch';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if

      // パスワード（入力が空）
      if ( empty( $tmp_entered[ 'password' ] ) or empty( $tmp_entered[ 'password_retype' ] ) )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'notmatch';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if

      // パスワード（入力が一致しない）
      if ( $tmp_entered[ 'password' ] != $tmp_entered[ 'password_retype' ] )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'notmatch';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if

      // グループID（数値ではない）
      if ( ! is_numeric( $tmp_entered[ 'group_id' ] ) )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'invalid_groupid';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if

      // メールアドレス（500文字を超過している）
      if ( !empty( $tmp_entered[ 'mail' ] ) and ( strlen( $tmp_entered[ 'mail' ] ) > 500 ) )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'invalid_mail';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if

      // メールアドレス（形式が不正）
      if ( !empty( $tmp_entered[ 'mail' ] ) and !$this->obj_util->is_emailAddr( $tmp_entered[ 'mail' ] ) )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'invalid_mail';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if



      //------------------------------------------------------------------------
      // 権限のチェック
      //------------------------------------------------------------------------
      if ( $tmp_entered[ 'group_id' ] === '0' and ! $this->obj_util->is_Supervisor() )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'notpermit';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if

      if ( $tmp_entered[ 'group_id' ] === '1' and ! $this->obj_util->is_Admin() )
      {
        // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
        $tmp_entered[ 'message' ] = 'notpermit';
        $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
        $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
        return false;
      } // end of if



      // データベースに接続する
      // データベース操作クラスのインスタンスを生成する
      $this->obj_db = new RisolutoDb();



      //------------------------------------------------------------------------
      // 既存ユーザのチェック
      //------------------------------------------------------------------------

      // データベースに接続する
      if ( $this->obj_db->dbConnect( $this->obj_conf->get( 'DBS', 'DEFAULT_DSN' ) ) )
      {
        // SQL文を組み立てる
        $sql =<<<End_Of_SQL

              SELECT count( `user`.`user_name` ) as cnt  -- ユーザ名
                FROM `risoluto_t_user` user
               WHERE `user`.`user_name` = ?

End_Of_SQL;

        // パラメタも用意する
        $param = array(
                        $tmp_entered[ 'username' ]
                      );

        // SQLの実行に失敗した場合は、入力画面に戻る
        $tmp_result = $this->obj_db->dbGetRow( $sql, $param );
        if ( $tmp_result[ 'cnt' ] != 0 )
        {
          // 接続をクローズする
          $this->obj_db->dbDisConnect();

          // エラーメッセージ表示用の情報をセッションに入れてから入力画面に遷移する
          $tmp_entered[ 'message' ] = 'invalid_username';
          $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );
          $this->obj_util->redirectTo( 'useradd_entry', 'admin.user' );
          return false;
        } // end of if

        // 接続に成功している場合は接続をクローズする
        $this->obj_db->dbDisConnect();
      } // end of if
      // データベースに接続できなかった場合は、例外を投げる
      else
      {
        throw new Exception( 'DB Connection Failure' );
        return false;
      } // end of else



      //------------------------------------------------------------------------
      // グループ情報の取得
      //------------------------------------------------------------------------

      // データベースに接続する
      if ( $this->obj_db->dbConnect( $this->obj_conf->get( 'DBS', 'DEFAULT_DSN' ) ) )
      {
        // SQL文を組み立てる
        $sql =<<<End_Of_SQL

              SELECT `groups`.`group_name`  -- グループ名
                FROM `risoluto_m_group` groups
               WHERE `groups`.`group_id` = ?

End_Of_SQL;

        // パラメタも用意する
        $param = array(
                        $tmp_entered[ 'group_id' ]
                      );

        // SQLの実行に失敗した場合は、例外を投げる
        $tmp_result = $this->obj_db->dbGetRow( $sql, $param );
        if ( PEAR::isError( $tmp_result ) )
        {
          // 接続をクローズする
          $this->obj_db->dbDisConnect();
          throw new Exception( 'group_name Select Failure' );
          return false;
        } // end of if

        // 接続に成功している場合は接続をクローズする
        $this->obj_db->dbDisConnect();
      } // end of if
      // データベースに接続できなかった場合は、エラー画面に遷移する
      else
      {
        throw new Exception( 'DB Connection Failure' );
        return false;
      } // end of else

      // 変数に値をDBから取得した値を格納
      $tmp_entered[ 'groupname' ] = $tmp_result[ 'group_name' ];



      //------------------------------------------------------------------------
      // 特に問題がなければ、画面表示用にクラス変数とセッションに値をセットする
      //------------------------------------------------------------------------
      $this->gotDat = $tmp_entered;
      $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentcage' ), $tmp_entered );

      return true;
    } // end of function:model()

    /**
     * viewメソッド（モデル）
     *
     * テンプレート関連処理等のビューに相当する部分の処理を行う
     *
     * @param     void なし
     * @return    boolean ファンクション実行結果（ true：正常終了 / false: 異常終了 ）
     */
    public function view()
    {
      // アサイン
      $this->smarty->assign ( 'header',            $this->obj_util->getHeader() );

      $this->smarty->assign ( 'entered_username',  $this->gotDat[ 'username'  ] );
      $this->smarty->assign ( 'entered_groupname', $this->gotDat[ 'groupname' ] );
      $this->smarty->assign ( 'entered_mail',      $this->gotDat[ 'mail'      ] );

      // 表示
      $this->smarty->display( 'useradd_confirm.tpl' );

      return true;

    } // end of function:view()

  } // end of class:useradd_confirm

?>
