<?php
/**
 * 予約モデル
 */
// Qdmailのエラー(E_DEPRECATED)がでるので...
error_reporting(E_ALL & ~E_DEPRECATED);
include(dirname(__FILE__) . "/../libraries/qdmail.php");

class Res_model extends Model {
    
    // 予約エラーコード
    const ERR_ROOM_GUEST_MIN = -1;  // 部屋あたりの人数が下限より小
    const ERR_ROOM_GUEST_MAX = -2;  // 部屋あたりの人数が上限より大
    const ERR_PLAN_GUEST_MIN = -3;  // 
    const ERR_PLAN_GUEST_MAX = -4;  // 
    const ERR_VACANT_PLAN = -5;
    const ERR_VACANT_ROOM = -6;
    const ERR_HOLIDAY = -7;         // 休館日を含む
    const ERR_PLAN_PERIOD = -8;     // プラン提供期間外
    const ERR_ROOMTYPE_PERIOD = -9; // 部屋タイプ提供期間外
    const ERR_PARAM = -99;          // パラメータエラー
    
    // 予約モード
    const RESMODE_CHECK = 1;        // チェックのみ
    const RESMODE_TENTATIVE = 2;    // 仮予約
    const RESMODE_REGULAR = 3;      // 本予約
    
    /**
     * 予約エラーコードから文字列を返す
     */
    function getErrorString($i)
    {
        $ret = '';
        switch ($i)
        {
            case Res_model::ERR_ROOM_GUEST_MIN:
                $ret = "１部屋の人数が部屋タイプの受容人数の下限より少ないです。";
                break;
            case Res_model::ERR_ROOM_GUEST_MAX:
                $ret = "１部屋の人数が部屋タイプの受容人数の上限より多いです。";
                break;
            case Res_model::ERR_PLAN_GUEST_MIN:
                $ret = "人数がプランの最小人数より少ないです。";
                break;
            case Res_model::ERR_PLAN_GUEST_MAX:
                $ret = "人数がプランの最大人数より多いです。";
                break;
            case Res_model::ERR_VACANT_PLAN:
                $ret = "プランの空き人数がありません。";
                break;
            case Res_model::ERR_VACANT_ROOM:
                $ret = "空き部屋がありません。";
                break;
            case Res_model::ERR_HOLIDAY:
                $ret = "休館日が含まれています。";
                break;
            case Res_model::ERR_PLAN_PERIOD:
                $ret = "プラン提供期間外です。";
                break;
            case Res_model::ERR_ROOMTYPE_PERIOD:
                $ret = "部屋タイプ提供期間外です。";
                break;
            case Res_model::ERR_PARAM:
                $ret = "パラメータエラー";
                break;
        }
        return $ret;
    }
    
    function Res_model()
    {
        parent::Model();
    }
    
    /**
     * 予約を実行する
     *
     * セッションの予約データを参照する。
     * @return 0:正常,整数:予約id,負数:エラー
     */
    public function doRes($resmode, $hotel_model)
    {
        $this->load->library('phpsession');
        
        $reservation = $this->phpsession->get('reservation');
        $hotelid = $reservation['hotelid'];
        $planid = $reservation['planid'];
        $cin = $reservation['cin'];
        $cout = $reservation['cout'];
        $room_num = $reservation['room_num'];
        
        $resrooms = $this->phpsession->get('resrooms');
        
        $resid = 0;
        
        $this->db->where('planid', $planid);
        $query = $this->db->get('plans', 1);
        if ($query->num_rows() <= 0)
        {
            return  Res_model::ERR_PARAM;
        }
        $plan = $query->row_array();
        
        $this->db->where('roomtypeid', $plan['roomtypeid']);
        $query = $this->db->get('roomtypes', 1);
        if ($query->num_rows() <= 0)
        {
            return  Res_model::ERR_PARAM;
        }
        $roomtype = $query->row_array();
        
        // プラン提供期間内であるかをチェックする
        $int_start_date = intval(substr($plan['start_date'], 0, 4) . substr($plan['start_date'], 5, 2) . substr($plan['start_date'], 8, 2));
        $int_end_date = intval(substr($plan['end_date'], 0, 4) . substr($plan['end_date'], 5, 2) . substr($plan['end_date'], 8, 2));
        $int_cin = intval(substr($cin, 0, 4) . substr($cin, 5, 2) . substr($cin, 8, 2));
        $int_cout = intval(substr($cout, 0, 4) . substr($cout, 5, 2) . substr($cout, 8, 2));
        if ($int_cin < $int_start_date || $int_cout > $int_end_date)
        {
            return Res_model::ERR_PLAN_PERIOD;
        }
        
        // 部屋タイプ提供期間内であるかをチェックする
        $int_start_date = intval(substr($roomtype['start_date'], 0, 4) . substr($roomtype['start_date'], 5, 2) . substr($roomtype['start_date'], 8, 2));
        $int_end_date = intval(substr($roomtype['end_date'], 0, 4) . substr($roomtype['end_date'], 5, 2) . substr($roomtype['end_date'], 8, 2));
        if ($int_cin < $int_start_date || $int_cout > $int_end_date)
        {
            return Res_model::ERR_ROOMTYPE_PERIOD;
        }
        
        $vplan = 0;     // 予約プラン人数
        for ($i = 0; $i < $room_num; $i++)
        {
            $room_i = $resrooms[$i];
            
            // 一部屋あたりの人数
            $n = $plan['basic_count']  * $room_i['basic_num']
               + $plan['child1_count'] * $room_i['child1_num']
               + $plan['child2_count'] * $room_i['child2_num']
               + $plan['child3_count'] * $room_i['child3_num']
               + $plan['child4_count'] * $room_i['child4_num'];
            $vplan += $n;
            // 一部屋あたりの人数が部屋の許容人数以内であることをチェックする
            if ($n < $roomtype['guest_min'])
            {
                return Res_model::ERR_ROOM_GUEST_MIN;
            }
            else if ($n > $roomtype['guest_max'])
            {
                return Res_model::ERR_ROOM_GUEST_MAX;
            }
        }
        
        $vroom = $room_num;     // 予約部屋数
        
        // プラン人数がプランの許容最小値から最大値の範囲内である
        // ことをチェックする。
        if ($vplan < $plan['guest_min'])
        {
            return Res_model::ERR_PLAN_GUEST_MIN;
        }
        else if ($vplan > $plan['guest_max'])
        {
            return Res_model::ERR_PLAN_GUEST_MAX;
        }
        
        // TABLEをlockする。
        $this->db->query("LOCK TABLES hotel_seq WRITE, vacantplans WRITE, vacantrooms WRITE;");
        
        // トランザクション開始
        $this->db->trans_start();
        
        try
        {
            $tmp_y = substr($cin, 0, 4);
            $tmp_m = substr($cin, 5, 2);
            $tmp_d = substr($cin, 8, 2);
            for ($i = 0;;$i++)
            {
                $tmp_date = date('Y-m-d', mktime(0, 0, 0, $tmp_m, $tmp_d + $i, $tmp_y));
                if ($tmp_date >= $cout)
                {
                    break;
                }
                
                // プラン人数空きをチェックし、空きがあれば空き数を更新する。
                $this->db->where('planid', $planid);
                $this->db->where('day', $tmp_date);
                $query = $this->db->get('vacant_plans', 1);
                
                $record_flag = false;   // DB:vacantplansにデータがあるか？
                $vp_num = 0;
                if ($query->num_rows() > 0)
                {
                    $record_flag = true;
                    $row = $query->row_array();
                    $vp_num = $row['vp_num'];
                    $vp_vacant = $row['vp_num'] - $row['vp_inuse'];
                }
                else
                {
                    $vp_num = $plan['default_num'];
                    $vp_vacant = $plan['default_num'];
                }
                
                if ($vp_vacant >= $vplan)
                {
                    if ($resmode == Res_model::RESMODE_TENTATIVE || $resmode == Res_model::RESMODE_REGULAR)
                    {
                        if ($record_flag == true)
                        {
                            $this->db->where('planid', $planid);
                            $this->db->where('day', $tmp_date);
                            $data = array('vp_inuse' => $row['vp_inuse'] + $vplan);
                            $this->db->update('vacant_plans', $data);
                        }
                        else
                        {
                            $data = array(
                                'planid' => $planid,
                                'day' => $tmp_date,
                                'vp_inuse' => $vplan,
                                'vp_num' => $vp_num);
                            $this->db->insert('vacant_plans', $data);
                        }
                    }
                }
                else
                {
                    throw new Exception('', Res_model::ERR_VACANT_PLAN);
                }
                
                // 部屋数の空きをチェックをし、空きがあれば空き数を更新する。
                $this->db->where('roomtypeid', $roomtype['roomtypeid']);
                $this->db->where('day', $tmp_date);
                $query = $this->db->get('vacant_rooms', 1);
                $record_flag = false;   // DB:vacantplansにデータがあるか？
                $vr_num = 0;
                
                if ($query->num_rows() > 0)
                {
                    $record_flag = true;
                    $row = $query->row_array();
                    $vr_num = $row['vr_num'];
                    $vr_vacant = $row['vr_num'] - $row['vr_inuse'];
                }
                else
                {
                    $vr_num = $roomtype['default_num'];
                    $vr_vacant = $roomtype['default_num'];
                }
                
                if ($vr_vacant >= $vroom)
                {
                    if ($resmode == Res_model::RESMODE_TENTATIVE || $resmode == Res_model::RESMODE_REGULAR)
                    {
                        if ($record_flag == true)
                        {
                            $this->db->where('roomtypeid', $roomtype['roomtypeid']);
                            $this->db->where('day', $tmp_date);
                            $data = array('vr_inuse' => $row['vr_inuse'] + $vroom);
                            $this->db->update('vacant_rooms', $data);
                        }
                        else
                        {
                            $data = array(
                                'roomtypeid' => $roomtype['roomtypeid'],
                                'day' => $tmp_date,
                                'vr_inuse' => $vroom,
                                'vr_num' => $vr_num);
                            $this->db->insert('vacant_rooms', $data);
                        }
                    }
                }
                else
                {
                    log_message('info', 'Res::ERR_VACANT_ROOM');
                    throw new Exception('', Res::ERR_VACANT_ROOM);
                }
            }
            
            if ($resmode == Res_model::RESMODE_TENTATIVE || $resmode == Res_model::RESMODE_REGULAR)
            {
                $status = 1;
                if ($resmode == Res_model::RESMODE_REGULAR)
                {
                    $status = 2;
                }
                
                $memberid = 0;
                $member = $this->phpsession->get('member');
                if ($member != null)
                {
                    $memberid = $member['memberid'];
                }
                
                $resmember = $this->phpsession->get('resmember');
                
                // $residの取得。
                $this->db->query("UPDATE hotel_seq SET seq_resid = seq_resid + 1 WHERE hotelid = " . $hotelid);
                $this->db->where('hotelid', $hotelid);
                $query = $this->db->get('hotel_seq', 1);
                $resid = $query->row()->seq_resid;
                
                $data = array(
                               'resid' => $resid,
                               'hotelid' => $hotelid,
                               'cin' => $reservation['cin'],
                               'cout' => $reservation['cout'],
                               'stay_days' => $reservation['stay_days'],
                               'memberid' => $memberid,
                               'planid' => $reservation['planid'],
                               'roomtypeid' => $reservation['roomtypeid'],
                               'plan_num' => $vplan,
                               'room_num' => $vroom,
                               'status' => $status,
                               'total_price' => $reservation['total_price'],
                               'created' => date("Y-m-d H:i:s"),
                               'memo' => $resmember['memo']
                            );
                if ($resmember['cinhour'] != '')
                {
                    $data['cinhour'] = $resmember['cinhour'];
                }
                $this->db->insert('reservations', $data);
                log_message('info', 'reservation insert ok');
                
                $data2 = array(
                                'resid' => $resid,
                                'memberid' => $memberid,
                                'email' => $resmember['email'],
                                'name' => $resmember['name'],
                                'name_kana' => $resmember['name_kana'],
                                'postcode' => $resmember['postcode'],
                                'prefecture' => $resmember['prefecture'],
                                'city' => $resmember['city'],
                                'street' => $resmember['street'],
                                'phone' => $resmember['phone']
                            );
                $this->db->insert('resmember', $data2);
                log_message('info', 'resmember insert ok');
                
                foreach ($resrooms as $room)
                {
                    $data3 = array(
                        'resid' => $resid,
                        'day' => $room['day'],
                        'roomtypeid' => $reservation['roomtypeid'],
                        'room_no'  => $room['room_no'],
                        'basic_num' => $room['basic_num'],
                        'child1_num' => $room['child1_num'],
                        'child2_num' => $room['child2_num'],
                        'child3_num' => $room['child3_num'],
                        'child4_num' => $room['child4_num'],
                        'basic_price' => $room['basic_price'],
                        'child1_price' => $room['child1_price'],
                        'child2_price' => $room['child2_price'],
                        'child3_price' => $room['child3_price'],
                        'child4_price' => $room['child4_price'],
                        'subtotal' => $room['subtotal']);
                    $this->db->insert('resrooms', $data3);
                }
                
                $resoptions = $this->phpsession->get('resoptions');
                foreach ($resoptions as $key => $value)
                {
                    foreach ($value as $key2 => $value2)
                    {
                        $data4 = array(
                            'resid' => $resid,
                            'hotelid' => $hotelid,
                            'optionid' => $key2,
                            'day' => $key,
                            'option_name' => $value2['option_name'],
                            'price' => $value2['price'],
                            'unitname' => $value2['unitname'],
                            'num' => $value2['num']);
                        $this->db->insert('resoptions', $data4);
                    }
                }
                
                /**
                 * 完了画面に表示する情報はセッションに保存する。
                 * resid, rescode
                 */
                $this->phpsession->save('resid', $resid);
            }
            
            // トランザクション終了
            $this->db->trans_complete();
            log_message('info', 'trans_complete');
            
            // Tableをアンロックする。
            $this->db->query("UNLOCK TABLES;");
            
            if ($resmode == Res_model::RESMODE_TENTATIVE)
            {
                // ユーザ宛仮予約Eメール送信
                if ($memberid == 0)
                {
                    $cancel_url = site_url('cancel');
                }
                else
                {
                    $cancel_url = site_url('my/index');
                }
                
                $mail_subject = $hotel_model->hotel_name . ": 仮予約メール";
                $mail_body = 
                    $data2['name'] . " 様\n" . 
                    "この度は、" . $hotel_model->hotel_name . "をご予約いただき、ありがとうございます。\n" . 
                    "以下のご予約を承りました。\n" .
                    "後ほど、本予約メールをお送りいたします。\n" .
                    "(場合によってキャンセルしていただくことがあります。\n" .
                    "その際にはキャンセルのメールをお送りします。ご了承ください。)\n";
                log_message('info', 'resid = ' . $resid);
                $mail_body .= $this->makeMailRes($resid);
                $mail_body .= "ご予約の確認、キャンセルはこちらから\n";
                $mail_body .= $cancel_url . "\n";
                log_message('info', $mail_body);
                
                qd_send_mail(
                    'text', 
                    $resmember['email'],
                    $mail_subject,
                    $mail_body,
                    $hotel_model->email);
                
                // 管理者宛仮予約Eメール送信
                // 件名,本文はユーザ宛と同じ。宛先だけ違う。
                qd_send_mail(
                    'text', 
                    $hotel_model->email,
                    $mail_subject,
                    $mail_body,
                    $hotel_model->email);
            }
            else if ($resmode == Res_model::RESMODE_REGULAR)
            {
                // ユーザ宛本予約Eメール送信
                if ($memberid == 0)
                {
                    $cancel_url = site_url('cancel');
                }
                else
                {
                    $cancel_url = site_url('my/index');
                }
                
                $mail_subject = $hotel_model->hotel_name . ": 予約確認メール";
                $mail_body = 
                    $data2['name'] . " 様\n" . 
                    "この度は、" . $hotel_model->hotel_name . "をご予約いただき、ありがとうございます。\n" . 
                    "以下のご予約を承りました。\n";
                $mail_body .= $this->makeMailRes($resid);
                $mail_body .= "ご予約の確認、キャンセルはこちらから\n" .
                $mail_body .= $cancel_url . "\n";
                log_message('info', $mail_body);
                
                qd_send_mail(
                    'text', 
                    $resmember['email'],
                    $mail_subject,
                    $mail_body,
                    $hotel_model->email);
                
                // 管理者宛本予約Eメール送信
                // 件名,本文はユーザ宛と同じ。宛先だけ違う。
                qd_send_mail(
                    'text', 
                    $hotel_model->email,
                    $mail_subject,
                    $mail_body,
                    $hotel_model->email);
            }
            
            return $resid;
        }
        catch (Exception $e)
        {
            $this->db->trans_rollback();
            
            // Tableをアンロックする。
            $this->db->query("UNLOCK TABLES;");
            
            log_message('info', 'doRes ' . $e->getCode());
            return $e->getCode();
        }
    }
    
    /**
     * 仮予約->本予約
     */
    public function confirmRes($hotelid, $resid, $hotel_model)
    {
        $this->db->where('hotelid', $hotelid);
        $this->db->where('resid', $resid);
        $this->db->where('status >', 0);
        $query = $this->db->get('reservation', 1);
        if ($query->num_rows() <= 0)
        {
            return;
        }
        $this->db->where('hotelid', $hotelid);
        $this->db->where('resid', $resid);
        $this->db->update('reservation', array('status' => 2));
        
        $this->db->where('hotelid', $hotelid);
        $this->db->where('resid', $resid);
        $query = $this->db->get('resmember', 1);
        if ($query->num_rows() <= 0)
        {
            return;
        }
        $resmember = $query->row_array();
        
        $mail_subject = $hotel_model->hotel_name . ": 本予約メール";
        $mail_body = 
            $resmember['name'] . " 様\n" . 
            "この度は、" . $hotel_model->hotel_name . "をご予約いただき、ありがとうございます。\n" . 
            "以下のご予約を承りました。\n" .
            "お越しをお待ちいたしております。\n";
        $mail_body .= $this->makeMailRes($resid);
        $mail_body .= "ご予約の確認、キャンセルはこちらから\n";
        $mail_body .= $cancel_url . "\n";
        
        log_message('info', 'mail_subjet:' . $mail_subject);
        log_message('info', $mail_body);
        /**
         * 本予約メールはユーザにのみ送信する。
         * 管理者は自身で本処理に変更していてわかっているので、
         * 送信しなくて良い。
         */
        qd_send_mail(
            'text', 
            $resmember['email'],
            $mail_subject,
            $mail_body,
            $hotel_model->email);
    }
    
    /**
     * 予約キャンセル
     * @param int $resid 予約Id
     * @param int $mode  1:ユーザによるキャンセル
                         2:管理者によるキャンセル(本予約不可)
                         3:本予約取消
     */
    public function cancel($hotelid, $resid, $mode, $hotel_model)
    {
        /**
         * DBのデータは削除されるため、メールの予約内容を先に作成しておく。
         * (要検討)
         * 後の処理で予約内容作成と同様の処理をするので、
         * 高速化を考えるときは後処理と同時にしたほうが良い？
         */
        $mailRes = $this->makeMailRes($hotelid, $resid);
        
        $hotelid = $hotel_model->hotelid;
        $this->db->where('hotelid', $hotelid);
        $this->db->where('resid', $resid);
        $this->db->where('status >', 0);
        $query = $this->db->get('reservations', 1);
        if ($query->num_rows() <= 0)
        {
            return -1;
        }
        $data = $query->row_array();

        $row = $query->row_array();
        $planid = $row['planid'];
        $roomtypeid = $row['roomtypeid'];
        $cin = $row['cin'];
        $cout = $row['cout'];
        $room_num = $row['room_num'];
        $plan_num = $row['plan_num'];
        
        $this->db->where('planid', $planid);
        $query = $this->db->get('plans', 1);
        if ($query->num_rows() <= 0)
        {
            return - 2;
        }
        $plan = $query->row_array();
        
        $this->db->where('roomtypeid', $roomtypeid);
        $query = $this->db->get('roomtypes', 1);
        if ($query->num_rows() <= 0)
        {
            return -3;
        }
        $roomtype = $query->row_array();
        
        // TABLEをlockする。
        $this->db->query("LOCK TABLES vacantplans WRITE, vacantrooms WRITE;");

        $this->db->trans_start();
        try
        {
            // 空きを元に戻す
            $tmp_y = substr($cin, 0, 4);
            $tmp_m = substr($cin, 5, 2);
            $tmp_d = substr($cin, 8, 2);
            for ($i = 0;;$i++)
            {
                $tmp_date = date('Y-m-d', mktime(0, 0, 0, $tmp_m, $tmp_d + $i, $tmp_y));
                if ($tmp_date >= $cout) {
                    break;
                }
                
                $this->db->where('planid', $planid);
                $this->db->where('day', $tmp_date);
                $query = $this->db->get('vacant_plans', 1);
                if ($query->num_rows() > 0)
                {
                    $row = $query->row_array();
                    $vp_inuse = $row['vp_inuse'];
                    $this->db->where('planid', $planid);
                    $this->db->where('day', $tmp_date);
                    $a = array('vp_inuse' => $vp_inuse - $plan_num);
                    $this->db->update('vacant_plans', $a);
                }
                else
                {
                }
                
                $this->db->where('roomtypeid', $roomtypeid);
                $this->db->where('day', $tmp_date);
                $query = $this->db->get('vacant_rooms', 1);
                if ($query->num_rows() > 0)
                {
                    $row = $query->row_array();
                    $vr_inuse = $row['vr_inuse'];
                    $this->db->where('roomtypeid', $roomtypeid);
                    $this->db->where('day', $tmp_date);
                    $a = array('vr_inuse' => $vr_inuse - $room_num);
                    $this->db->update('vacant_rooms', $a);
                }
                else
                {
                }
            }
            
            /**
             * reservationのstatusを0にする。
             * resmember,resrooms,resoptionsは変更せずに残しておく。
             */
            $this->db->where('hotelid', $hotelid);
            $this->db->where('resid', $resid);
            $a = array('status' => 0);
            $this->db->update('reservations', $a);
            
        }
        catch (Exception $ex)
        {
            $this->db->trans_rollback();
            
            // Tableをアンロックする。
            $this->db->query("UNLOCK TABLES;");
            
            return -10;
        }
        
        $this->db->trans_complete();
        
        // Tableをアンロックする。
        $this->db->query("UNLOCK TABLES;");
        
        $this->db->where('resid', $resid);
        $query = $this->db->get('reservation', 1);
        if ($query->num_rows() <= 0)
        {
            return -11;
        }
        $data = $query->row_array();
        
        $this->db->where('resid', $resid);
        $query = $this->db->get('resmember', 1);
        if ($query->num_rows() <= 0)
        {
            return -12;
        }
        $resmember = $query->row_array();
        
        // Eメール送信
        
        $mail_subject = $hotel_model->hotel_name . ": 予約キャンセルメール";
        $mail_body = 
            $resmember['name'] . " 様\n" . 
            "この度は、" . $hotel_model->hotel_name . "をご利用いただき、ありがとうございます。\n" . 
            "以下のご予約のキャンセルを承りました。\n" .
            "またのご利用をお待ちしております。\n";
        $mail_body .= $mailRes;
        
        log_message('info', 'mail_subject:' . $mail_subject);
        log_message('info', $mail_body);
        
        /**
         * キャンセルメールの送信
         */
        qd_send_mail(
            'text', 
            $resmember['email'],
            $mail_subject,
            $mail_body,
            $hotel_model->email);
        qd_send_mail(
            'text',
            $hotel_model->email,
            $mail_subject,
            $mail_body,
            $hotel_model->email);
        
        
    }
    
    /**
     * 予約メールの予約内容作成
     * @param
     * @return string メール本文, エラー時は''を返す。
     */
    private function makeMailRes($hotelid, $resid)
    {
        $this->load->model('Common_model');
        
        $this->db->where('hotelid', $hotelid);
        $this->db->where('resid', $resid);
        $this->db->where('status >', 0);
        $query = $this->db->get('reservations', 1);
        if ($query->num_rows() <= 0)
        {
            return '';
        }
        $reservation = $query->row_array();
        
        $this->db->where('resid', $resid);
        $query = $this->db->get('resmember', 1);
        if ($query->num_rows() <= 0)
        {
            return '';
        }
        $resmember = $query->row_array();
        
        $planid = $reservation['planid'];
        $roomtypeid = $reservation['roomtypeid'];
        $this->db->where('planid', $planid);
        $query = $this->db->get('plans', 1);
        if ($query->num_rows() <= 0)
        {
            return '';
        }
        $plan = $query->row_array();
        
        $this->db->where('roomtypeid', $roomtypeid);
        $query = $this->db->get('roomtypes', 1);
        if ($query->num_rows() <= 0)
        {
            return '';
        }
        $roomtype = $query->row_array();
        
        $this->db->where('resid', $resid);
        $this->db->order_by('day DESC');
        $query = $this->db->get('resrooms');
        if ($query->num_rows() <= 0)
        {
            return '';
        }
        $resrooms = $query->result_array();
        
        $this->db->where('resid', $resid);
        $this->db->order_by('day DESC');
        $query = $this->db->get('resoptions');
        if ($query->num_rows() <= 0)
        {
            $resoptions = array();
        }
        $resoptions = $query->result_array();
        
        $res_body = 
            "ご予約内容\n" .
            "---------------------\n" .
            "予約コード : " . $reservation['rescode'] . "\n" .
            "予約受付日 : " . $reservation['created'] . "\n" .
            "チェックイン日 : " . $reservation['cin'] . ' (' . $this->Common_model->week($reservation['cin']) . ')' . "\n" .
            "チェックアウト日 : " . $reservation['cout'] . ' (' . $this->Common_model->week($reservation['cout']) . ')' . "\n" .
            "宿泊日数 : " . $reservation['stay_days'] . ' 日' . "\n" .
            "プラン名 : " . $plan['plan_name'] . "\n" .
            "部屋タイプ : " . $roomtype['roomtype_name'] . "\n" .
            "部屋数 : " . $reservation['room_num'] . " 部屋" . "\n" .
            "人数 : " . "\n";
            
        $tmp = '';
        for ($i = 0; $i < $reservation['room_num']; $i++)
        {
            $resroom = $resrooms[$i];
            $tmp .= $resroom['room_no'] . '部屋目' . "\n";
            if ($resroom['basic_num'] > 0)
            {
                $tmp .= "・大人 : "  . $resroom['basic_num']  . " 人 ";
            }
            if ($resroom['child1_num'] > 0)
            {
                $tmp .= "・子供A : " . $resroom['child1_num'] . " 人 ";
            }
            if ($resroom['child2_num'] > 0)
            {
                $tmp .= "・子供B : " . $resroom['child2_num'] . " 人 ";
            }
            if ($resroom['child3_num'] > 0)
            {
                $tmp .= "・子供C : " . $resroom['child3_num'] . " 人 ";
            }
            if ($resroom['child4_num'] > 0)
            {
                $tmp .= "・子供D : " . $resroom['child4_num'] . " 人 ";
            }
            $tmp .= "\n";
        }
        $res_body .= $tmp;
        
        $res_body .= "料金 : " . "\n";
        
        $tmp = '';
        $strDay = '';
        foreach ($resrooms as $resroom)
        {
            if ($strDay != $resroom['day'])
            {
                $tmp .= $resroom['day'] . "\n";
                $strDay = $resroom['day'];
            }
            $tmp .= $resroom['room_no'] . '部屋目' . "\n";
            if ($resroom['basic_num'] > 0)
            {
                $tmp .= "・大人 : ";
                $temp = $resroom['basic_num'] * $resroom['basic_price'];
                $tmp .= $resroom['basic_num'] . ' 人 x ' . number_format($resroom['basic_price']) . ' 円 = ' . number_format($temp) . ' 円' . "\n";
            }
            if ($resroom['child1_num'] > 0)
            {
                $tmp .= "・子供A : ";
                $temp = $resroom['child1_num'] * $resrooom['child1_price'];
                $tmp .= $resroom['child1_num'] . ' 人 x ' . number_format($resroom['child1_price']) . ' 円 = ' . number_format($temp) . ' 円' . "\n";
            }
            if ($resroom['child2_num'] > 0)
            {
                $tmp .= "・子供B : ";
                $temp = $resroom['child2_num'] * $resroom['child2_price'];
                $tmp .= $resroom['child2_num'] . ' 人 x ' . number_format($resroom['child2_price']) . ' 円 = ' . number_format($temp) . ' 円' . "\n";
            }
            if ($resroom['child3_num'] > 0)
            {
                $tmp .= "・子供C : ";
                $temp = $resroom['child3_num'] * $resroom['child3_price'];
                $tmp .= $resroom['child3_num'] . ' 人 x ' . number_format($room_i['child3_price']) . ' 円 = ' . number_format($temp) . ' 円' . "\n";
            }
            if ($resroom['child4_num'] > 0)
            {
                $tmp .= "・子供D : ";
                $temp = $resroom['child4_num'] * $resroom['child4_price'];
                $tmp .= $resroom['child4_num'] . ' 人 x ' . number_format($room_i['child4_price']) . ' 円 = ' . number_format($temp) . ' 円' . "\n";
            }
        }
        $res_body .= $tmp;
        
        if (count($resoptions) > 0)
        {
            $res_body .= "オプション : " . "\n";
            
            $tmp = '';
            $strDay = '';
            
            $tmp = '';
            $strDay = '';
            foreach ($resoptions as $resoption)
            {
                if ($strDay != $resoption['day'])
                {
                    $tmp .= $resoption['day'] . "\n";
                    $strDay = $resoption['day'];
                }
                $tmp .= '・' . $resoption['option_name'] . ':';
                $tmp .= number_format($resoption['price']) . '円' . " x ";
                $tmp .= $resoption['num'] . " " . $resoption['unitname'] . " = ";
                $option_subtotal = $resoption['price'] * $resoption['num'];
                $tmp .= number_format($option_subtotal) . '円' . "\n";
            }
            $res_body .= $tmp;
        }
        
        $res_body .= "合計 : " . number_format($reservation['total_price']) . "円" . "\n";
        $res_body .= "\n";
        $res_body .= "申込者氏名: " . $resmember['name'] . "\n";
        $res_body .= "---------------------\n";
        $res_body .= "\n";
        
        log_message('info', "res_body = \n" . $res_body);
        
        return $res_body;
    }
}
