private function sendRequestNotifycation($user, $request)
 {
     $payment_guide = MovieViewerReviewPackPurchasePaymentGuide::create($this->_settings->payment, $request);
     $price_with_notes = plugin_movieviewer_render_price_with_notes($request->getPrice(), "回", true);
     $item_names = $this->getItemNames($request);
     $mail_builder = new MovieViewerReviewPackRequestNotificationMailBuilder($this->_settings->mail);
     $mail = $mail_builder->build($user, $item_names, $price_with_notes, $payment_guide->bank_transfer, $payment_guide->deadline);
     $result = $mail->send();
     if (!$result) {
         MovieViewerLogger::getLogger()->addError("再視聴申し込み通知エラー", array("error_statement" => $mail->ErrorInfo));
         // スタッフ向けはログのみで終わらせる
     }
 }
/**
 * [ブロック] 申し込みの詳細を生成する
 *
 * @param MovieViewerSettings                  $settings プラグインの設定
 * @param MovieViewerReviewPackPurchaseRequest $request  申し込み
 * 
 * @return string 申し込みの詳細(html)
 */
function plugin_movieviewer_review_purchase_start_convert_get_request_details($settings, $request)
{
    $courses = plugin_movieviewer_get_courses_repository()->find();
    $itemsByCourse = $request->getItemsByCourse();
    $item_description = "";
    foreach ($itemsByCourse as $course_id => $items) {
        $course = $courses->getCourse($course_id);
        $session_list = "";
        foreach ($items as $item) {
            $session = $course->getSession($item->session_id);
            $session_list .= "<li>{$session->describe()}</li>";
        }
        $item_description .= <<<TEXT
        {$course->describe()}
        <ul style='margin-left:0;'>
            {$session_list}
        </ul>
TEXT;
    }
    $payment_guide = MovieViewerReviewPackPurchasePaymentGuide::create($settings->payment, $request);
    $hsc = "plugin_movieviewer_hsc";
    if ($request->purchase_method === 'bank') {
        $bank_accounts_with_notes = nl2br($payment_guide->bank_transfer->bank_accounts_with_notes);
        $content_header_payment = <<<TEXT
        <tr><th>振込先</th><td>{$bank_accounts_with_notes}</td></tr>
TEXT;
    } else {
        $acceptable_brands = "";
        foreach ($payment_guide->credit_card->acceptable_brands as $brand) {
            $file_name = "logo_" . strtolower($brand) . ".gif";
            $acceptable_brand = <<<TEXT
            <img src="img/{$file_name}" ALT="{$brand}">
TEXT;
            $acceptable_brands .= $acceptable_brand;
        }
        $content_header_payment = <<<TEXT
        <tr><th>振込先<br>(利用可能なクレジットカード)</th>
        <td style='vertical-align:top;'>{$acceptable_brands}</td>
        </tr>
TEXT;
    }
    $price_with_notes = plugin_movieviewer_render_price_with_notes($request->getPrice(), "回", false);
    $content = <<<TEXT
    <p>
    <table class="movieviewer-purchase-request-details">
        <tr><th>項目</th><td>{$item_description}</td></tr>
        <tr><th>金額</th><td>{$price_with_notes}</td></tr>
        {$content_header_payment}
        <tr><th>振込期限</th><td>{$hsc($payment_guide->deadline->format("Y年m月d日"))}まで</td></tr>
    </table>
    </p>
TEXT;
    return $content;
}