/**
  * 表示に必要なデータを取得し設定する
  *
  * @access private
  * @param array $input_data 入力データ
  * @return array
  * @author ida
  */
 private function setupData($data)
 {
     $replace_data = array();
     $replace_data['user'] = $this->user;
     $mail_magazine_type = $data['mail_magazine_type'];
     switch ($mail_magazine_type) {
         case \Model_Mail_Magazine::MAIL_MAGAZINE_TYPE_ALL:
             break;
         case \Model_Mail_Magazine::MAIL_MAGAZINE_TYPE_REQUEST:
             $this->set('prefectures', \Config::get('master.prefectures'), false);
             break;
         case \Model_Mail_Magazine::MAIL_MAGAZINE_TYPE_RESEVED_ENTRY:
             $fleamarket_id = $data['reserved_fleamarket_id'];
             $fleamarket = \Model_Fleamarket::find($fleamarket_id);
             $replace_data['fleamarket'] = $fleamarket;
             $this->set('fleamarket', $fleamarket, false);
             break;
         case \Model_Mail_Magazine::MAIL_MAGAZINE_TYPE_WAITING_ENTRY:
             $fleamarket_id = $data['waiting_fleamarket_id'];
             $fleamarket = \Model_Fleamarket::find($fleamarket_id);
             $replace_data['fleamarket'] = $fleamarket;
             $this->set('fleamarket', $fleamarket, false);
             break;
     }
     $users = \Model_Mail_Magazine_User::findListByMailMagazineId($this->mail_magazine_id, null, null);
     $this->set('users', $users, false);
     $body = $data['body'];
     $pattern = \Model_Mail_Magazine::getPatternParameter($mail_magazine_type);
     list($pattern, $replacement) = \Model_Mail_Magazine::createReplaceParameter($body, $pattern, $replace_data);
     $body = \Model_Mail_Magazine::replaceByParam($body, $pattern, $replacement);
     $this->set('body', $body, false);
     $this->set('input_data', $data, false);
 }
 /**
  * メールマガジン送信
  *
  * @access public
  * @param int $mail_magazine_id メルマガID
  * @param int $administrator_id 管理者ID
  * @param int $limit 1回で処理する件数
  * @return void
  * @author ida
  */
 public function run($mail_magazine_id, $administrator_id = 0, $limit = 1000)
 {
     $this->openLog($mail_magazine_id);
     $this->log('メルマガID: ' . $mail_magazine_id . ' の送信を開始します' . "\n");
     if (\Model_Mail_Magazine::isProcess()) {
         $this->log('メルマガ送信中のため送信できません' . "\n");
         exit;
     }
     $mail_magazine = \Model_Mail_Magazine::startProcess($mail_magazine_id);
     $offset = 0;
     if (!is_numeric($limit) || $limit <= 0) {
         $limit = 1000;
     }
     $total_count = 0;
     $success_count = 0;
     $fail_count = 0;
     while ($limit > 0) {
         $mail_magazine_users = \Model_Mail_Magazine_User::findByMailMagazineId($mail_magazine_id, $offset, $limit);
         if (count($mail_magazine_users) == 0) {
             break;
         }
         $is_stop = false;
         $replace_data = $this->makeReplaceData($mail_magazine);
         foreach ($mail_magazine_users as $mail_magazine_user) {
             try {
                 usleep(300000);
                 if (!\Model_Mail_Magazine::isProcess($mail_magazine_id)) {
                     $is_stop = true;
                     $this->log($mail_magazine_user->user_id . ": cancel.\n");
                     break;
                 }
                 $send_result = $this->send($mail_magazine_user, $mail_magazine, $replace_data);
                 \Model_Mail_Magazine_User::updateStatus(array('send_status' => $send_result, 'error' => null, 'updated_user' => $administrator_id), array('mail_magazine_user_id' => $mail_magazine_user->mail_magazine_user_id));
                 $this->log($mail_magazine_user->user_id . " : success\n");
                 $success_count++;
             } catch (\Exception $e) {
                 $message = $e->getMessage();
                 $this->log($mail_magazine_user->user_id . ' : fail ' . $message . "\n");
                 \Model_Mail_Magazine_User::updateStatus(array('send_status' => \Model_Mail_Magazine_User::SEND_STATUS_ERROR_END, 'error' => $message, 'updated_user' => $administrator_id), array('mail_magazine_user_id' => $mail_magazine_user->mail_magazine_user_id));
                 $fail_count++;
             }
             $total_count++;
         }
         $offset += $limit;
     }
     $this->log('[total] ' . $total_count . ' [success] ' . $success_count . ' [fail] ' . $fail_count . "\n");
     $this->log('送信を終了しました');
     $this->closeLog();
     $mail_magazine->send_datetime = \Date::forge()->format('mysql');
     if ($is_stop) {
         $mail_magazine->send_status = \Model_Mail_Magazine::SEND_STATUS_CANCEL;
     } else {
         $mail_magazine->send_status = \Model_Mail_Magazine::SEND_STATUS_NORMAL_END;
     }
     $mail_magazine->save();
 }
 /**
  * view method
  *
  * @access public
  * @return void
  * @author ida
  */
 public function view()
 {
     $this->mail_magazine = \Model_Mail_Magazine::find($this->mail_magazine_id);
     $this->send_status = \Model_Mail_Magazine_User::getSendStatuses();
 }
 /**
  * 登録&送信
  *
  * @access public
  * @param
  * @return void
  * @author ida
  */
 public function action_thanks()
 {
     if (!Security::check_token()) {
         \Response::redirect('errors/doubletransmission');
     }
     Asset::css('jquery-ui.min.css', array(), 'add_css');
     Asset::js('jquery-ui.min.js', array(), 'add_js');
     $input_data = $this->getInputData(true);
     $input_data['created_user'] = $this->administrator->administrator_id;
     $input_data['send_status'] = \Model_Mail_Magazine::SEND_STATUS_WAITING;
     $additional_data = $this->getAdditionalData($input_data);
     $input_data['additional_serialize_data'] = serialize($additional_data);
     try {
         $db = Database_Connection::instance('master');
         \DB::start_transaction();
         $mail_magazine = \Model_Mail_Magazine::forge();
         $mail_magazine->set($input_data)->save();
         // メルマガ対象ユーザ登録
         $query = $input_data['query'];
         $users = \DB::query($query)->execute();
         foreach ($users as $user) {
             $data = array('mail_magazine_id' => $mail_magazine->mail_magazine_id, 'user_id' => $user['user_id'], 'send_status' => \Model_Mail_Magazine_User::SEND_STATUS_WAITING, 'created_user' => $this->administrator->administrator_id);
             $mail_magazine_user = \Model_Mail_Magazine_User::forge();
             $mail_magazine_user->set($data)->save();
         }
         \DB::commit_transaction();
     } catch (\Exception $e) {
         \DB::rollback_transaction();
         throw new \SystemException(\Model_Error::ER00000);
     }
     $view_model = \ViewModel::forge('admin/mailmagazine/thanks');
     list($view_model, $replace_data) = $this->setupData($view_model, $input_data);
     // タスク実行
     $oil_path = realpath(APPPATH . '/../../') . DS;
     $param = $mail_magazine->mail_magazine_id . ' ' . $this->administrator->administrator_id;
     exec('php ' . $oil_path . 'oil refine mail_magazine ' . $param . ' > /dev/null &');
     $view_model->set('mail_magazine', $mail_magazine, true);
     $this->template->content = $view_model;
 }