----------------------------------------------------------------------------
CREMANS 
Conference Registration Management System / 国際会議参加登録管理システム
(C) Hirotsugu Kakugawa 2013
----------------------------------------------------------------------------

----------------------------------------------------------------------------
CREMANS は完全無保証, 完全無サポートのソフトウエアです. 

CREMANSでは内部で以下のソフトウエアを使用しており, 本パッケージに
同封して配布していますが, 各々の扱いは各々のライセンスに従います.

FPDF
http://www.fpdf.org/

TFPDF
http://www.fpdf.org/en/script/script92.php

CAPTCHA X
http://www.phpclasses.org/package/3023-PHP-Image-based-CAPTCHA-validation.html

DejaVu
http://dejavu-fonts.org/wiki/Main_Page

----------------------------------------------------------------------------
CREMANS で出来ること
  - 事前登録
  - オンサイト登録
  - 登録者数の集計
  - 請求書, 領収書の発行 
  - ランチチケット, バンケットチケット, イクスカージョンチケットの発行
  - ビザ申請のための招待状の発行
  - 名前タグの生成
  - config ファイルによりカスタマイズ可能 (参加登録締切日, 料金, etc.)

CREMANS で出来ないこと
  - 使用言語の切替え (-> 英語限定です.)

参加者の支払方法
  - PayPal によるクレジットカード (PayPalアカウント開設不要)
  - 銀行振込
  - 現金

登録カテゴリ (Registration Category)
  - 事前著者レギュラー         (Advanced Author Regular)
  - 事前著者学生               (Advanced Author Student)
  - 事前非著者レギュラー       (Advanced Non-author Regular)
  - 事前非著者学生             (Advanced Non-author Student)
  - オンサイト非著者レギュラー (On-Site Non-author Regular)
  - オンサイト非著者学生       (On-Site Non-author Student)
  そのほか, 運営処理用として以下のものを用意
  - 招待客                     (Invited)
  - 追加チケット               (Extra Ticket)
  そのほか, 動作テスト用として以下のものを用意
  - テスト                     (Test)

登録タイプ (Registration Type)
  - 事前著者レギュラー         (Advanced Author Regular)
  - 事前著者学生               (Advanced Author Student)
  - 事前前期非著者レギュラー   (Advanced Early Non-author Regular)
  - 事前前期非著者学生         (Advanced Early Non-author Student)
  - 事前後期非著者レギュラー   (Advanced Early Non-author Regular)
  - 事前後期非著者学生         (Advanced Early Non-author Student)
  - オンサイト非著者レギュラー (On-Site Non-author Regular)
  - オンサイト非著者学生       (On-Site Non-author Student)
  そのほか, 運営処理用として以下のものを用意
  - 招待客                     (Invited)
  - 追加チケット               (Extra Ticket)
  そのほか, 動作テスト用として以下のものを用意
  - テスト                     (Test)

  「事前非著者レギュラー」の「前期/後期」, 
  「事前非著者学生」の「前期/後期」の決定は, 
   config ファイルに指定した〆切日時を境にして, 自動決定します. 

  それぞれの登録タイプに対して, 〆切, 参加費用等を設定できます. 
  全ての登録タイプを使用せずに、一部の登録タイプだけを
  使用するようにも出来ます.

----------------------------------------------------------------------------
作業手順

1. 法人用銀行口座を開設  -> 銀行で

2. PayPal でビジネスアカウントを作成

 - 1 の口座を使用するよう, PayPal アカウントに登録
 - 引出し金額の上限を解除するよう, 自分のクレジットカードを PayPal 口座に登録

3. PayPal Developer サイトで SANDBOX アカウント(テスト用アカウント)を作成

 - このアカウント内で, ビジネスアカウントとユーザーアカウントを作成する. 
   それらは運用テストで使用します.

4. Web サーバーで SSL 通信 (https) ができるようにする

5. Web サーバに SQLite3, PHP をインストール
 - PHP で HTTP_Request, mbstring, GD, PHP-GD, SQLite3, PDO 
   が使えるよう設定する. 
 - PHP の文字集合と文字符合化を Unicode, utf-8 に設定する.
 - PHP の mbstring は以下に設定 (php.ini ファイル)
     mbstring.language = uni
     mbstring.internal_encoding = UTF-8
     mbstring.http_input = UTF-8
     mbstring.http_output = pass
 - SQLite3 の文字集合と文字符合化を Unicode, utf-8 に設定する.

6. Web サーバに CREMANS をインストール

 - HTTP ドキュメントと PHP プログラム
   (配布ファイルの web-data ディレクトリ以下)
    -> http reachable なディレクトリに置く

 - 管理情報(管理者パスワード, PayPalパスワード)とデータベースファイル(SQLite3)
   (配布ファイルの admin-data ディレクトリ以下)
    ->  (機密情報なので) 必ず http unreachable なディレクトリに置く

7. CREMANS の config.php ファイルを書き換えて, 適宜カスタマイズする.

8. SQLite3 を使って登録情報用のデータベースファイルを作成する.
 - 管理情報ディレクトリの scheme/create-reg.sql を SQLite3 で実行.
   (本番用データベースファイル db.sqlite と
    テスト運営用データベースファイル db-test.sqlite を作成.)

   > sqlite3 db.sqlite 
   ] .read create-reg.sql
   ] .exit
   > sqlite3 db-test.sqlite 
   ] .read create-reg.sql
   ] .exit

 - Web サーバがデータベースファイルを読み書きできるように, 
   アクセス許可を設定する.

 - データベースファイル db.sqlite と db-test.sqlite を
   管理情報ディレクトリの db/ に移動.

9. PayPal ユーザー名とパスワードを, 設定ファイルに記入

 - 管理情報ディレクトリ中の paypal/defs-live.php (実運用用, Live アカウント) 
   と paypal/defs-live.php (テスト運用用, Sandbox アカウント) ファイルに, 
   ユーザー名, パスワード, シグネチャ を記入する. これらの情報は,
   PayPal にログインすれば得られます. 

10. admin-page (管理者用画面)アクセスのための管理者パスワードを設定

 - 管理情報ディレクトリ admin/passwd.php に, 管理者 (admin) のパスワードを
   設定. 
 - ログイン用 URL : .../admin/login.php 
 - admin-page (管理者用画面)で, 登録一覧など, 管理業務を行ないます

11. 再登録のためのパスワードを設定

 - 管理情報ディレクトリ admin/passwd.php に, paymenyXXXXXのパスワードを
   設定. 
 - ログイン用 URL : ../payment.php
 - このページは, アクセス日時に関係なく, 全ての登録タイプに対する
   登録が出来ます. 一旦登録をしたけれども, 後日登録内容を変更する必要が
   出てきた時にこのページを使用します. 運営側は一旦古い登録をキャンセルします.
   そして登録者に, ユーザー名とパスワードと URL を教えて, 
   再度登録してもらいます. これで再登録が完了です. 

12. config.php ファイルの先頭の $mode の設定をテストモード(SANDBOX)にして,
   動作を確認する. (SANDBOXアカウント内のアカウントを使用して支払テスト)
  
 - 動作確認手順のメモは admin-page (管理者用画面) から読めますので, 
   十分にテストを行なって下さい.

13. config.php ファイルの先頭の $mode の設定を実運用モード(LIVE)にして,
   動作を確認する. (自分のクレジットカードを使って, 実際に支払をする.
   支払テスト用の Registration Category "Test" を登録フォームで
   選択するようにするとよい.)

14. PayPal 口座から銀行口座へのお金の引出しのテスト

 - PayPal のサイトにログインして, 「銀行口座への引出し」を行なう.
 - ちゃんと引出しが出来る事を確認する
 - 設定や登録内容が違っていると引出しが出来ないので, この確認作業は重要
   (PayPal の中の人のいう通りの設定をしても, 実はそれは引出し出来ない設定な
    場合があるので要注意.)

15.  招待客の処理
  運営側が作業する. 
  データベースの新規項目作成機能で, データを作成.
  このとき, 登録タイプに Invited を選ぶ.

16. 追加チケットの販売 
  購入者が作業をする.
  登録タイプ Extra Ticket を選んでもらって, 必要事項を記入してもらう.

X. 本システムの弱い点

 - 1支払トランザクションがそのまま, 管理者画面での登録1件になっている.
   (データベース中には, 表が1枚あるだけの非常に簡素な作りです.)

 - 登録した後に, 追加チケットを購入しても, 1つの記録としてまとめられない.
   -> 発券処理が別々になってしまう, ということです.
      参加者にチケットを渡す時はひとまとめにしないといけないが, 
      まとめ作業が手作業になってしまう. 
      (この作業が, 人の記憶に頼った処理になるのでミスの元になる.
       このため会議規模が200人程度を超えると, 現状のシステム設計では
       事務作業はたぶん破綻.)
   -> 1参加者に対して, 1登録, 複数追加チケット, という対応づけ構造に
      しないといけない.

----------------------------------------------------------------------------
PayPal 関係

PayPal 決済は、PayPal の ExpressChechout 機能を使ってます.
PayPal Developer (https://developer.paypal.com/) にドキュメントがあるので
必ず読んで理解して下さい.

ExpressCheckout は https 通信路で, name-value ペアでパラメータを相互に
やりとりしながら決済をすすめます.
本システムでの PayPal決済は以下の流れで処理します.

1. (WEBブラウザ -> データベース)
   フォームに記入した項目を submit.

2. (データベース -> PayPalサーバ)
   フォーム内容をデータベースに記録.
   フォーム内容から請求金額を計算.
   SetExpressCheckout メソッドで, 請求金額を PayPal サーバに通知.
   データベースは PayPal サーバからのレスポンス
   (TOKEN - トランザクションの識別用データ) を受信し, 記録.

3. (データベース -> ブラウザ)
   ブラウザにレスポンスとして, PayPal サーバの支払 URL へのリダイレクトを
   行なう.

3. (ブラウザ -> PayPal サーバ)
   ブラウザはリダイレクトされた URL に接続し, PayPal サーバで支払を行なう.
   レスポンスとして, データベースの支払最終確認 URL へのリダイレクトを行なう.

4. (ブラウザ -> データベース -> PayPal サーバ)
   ブラウザはリダイレクトされたデータベースの URL に接続する. 
   接続を受けたデータベースは, PayPay サーバに対して 
   GetExpressCheckoutDetails メソッドで支払の成功/失敗や支払に
   関する各種情報を得る.
   データベースは PayPal サーバからのレスポンスを受信し, 記録.

5. (データベース -> ブラウザ)
   データベースはブラウザに対して, 支払を確定するか, 取消をするかの
   最終決定を求めるページを送信する. 

6. (ブラウザ -> データベース)
   支払を取消ボタンをクリックすると, キャンセルを行ない, 
   キャンセルページにジャンプ.
   支払を承認ボタンをクリックすると, データベースは PayPay サーバに対して 
   DoExpressCheckoutPayment メソッドで支払を確定する. 
   そしてデータベースは, PayPal サーバからのレスポンスに加えて, 
   支払が完了した事を記録する. 

7. (データベース -> ブラウザ)
   データベースは, 確定した登録内容と金額をブラウザに表示し, 
   メイルでも通知をする.

----------------------------------------------------------------------------
以上