AM Daemon ライブラリリファレンス
EMoneyOperation.h
[詳解]
1 /// @file
2 /// @brief 電子マネーの各種操作を行うクラス EMoneyOperation のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_EMONEYOPERATION_H
7 #define AMDAEMON_EMONEYOPERATION_H
8 
9 #include "amdaemon/env.h"
10 #include "amdaemon/EMoneyResult.h"
11 #include "amdaemon/EMoneyBrandId.h"
12 
13 #include <utility>
14 #include <functional>
15 #include <cstdint>
16 #include <cstddef>
17 
18 namespace amdaemon
19 {
20 /// @addtogroup g_emoney
21 /// @{
22 
23  // 内部クラスの前方宣言
24  class InnerIndexHolder;
25 
26  /// @brief 電子マネーの各種操作を行うクラス。
27  /// @see EMoney
28  ///
29  /// このクラスのインスタンスをアプリ側で直接生成することはできない。
30  /// EMoney クラスのメンバ関数 EMoney#getOperation から取得すること。
31  ///
32  /// @par プラットフォーム情報
33  /// - ALLSシリーズの電子マネー対応版SDKでのみ利用可能である。
34  /// - 上記以外の場合、常に操作不可として扱われる。
35  ///
36  /// @par 支払操作未了時の挙動
37  /// 通信不良等により支払操作が未了となった場合、
38  /// ブランドによっては支払操作の再要求や残高照会要求が自動的に開始され、
39  /// かざし待ち状態に移行する場合がある。
40  /// @par
41  /// その際、メンバ関数 #isBusy は true を返し続けるため、
42  /// アプリ側からは支払操作が継続しているように見える。
43  /// プレイヤー向けの情報は付属ディスプレイに随時表示されるため、
44  /// 通常はアプリ側でこの状態をケアする必要はなく、
45  /// 支払操作継続中であることを示す画面表示にしてしまって問題ない。
46  /// @par
47  /// 支払操作開始によるかざし待ちと操作未了時の自動処理によるかざし待ちを区別したい場合、
48  /// メンバ関数 #isCancellable と #isHeldOver を組み合わせることで判別できる。
49  /// メンバ関数 #isCancellable が true を返すならば何らかのかざし待ち状態であり、
50  /// その際にメンバ関数 #isHeldOver が false を返すならば支払操作開始によるかざし待ち、
51  /// true を返すならば操作未了時の自動処理によるかざし待ちとなる。
52  /// (ただしPASELIは現状この方法で判別することはできず、他の判別方法も無い。)
53  /// @par
54  /// 支払操作が未了となり、その後の自動処理もすべて失敗もしくはキャンセルされた場合、
55  /// 未了取引確認待ち状態に移行する。未了取引確認待ち状態については後述する。
56  ///
57  /// @par 未了取引確認待ち状態について
58  /// 下記をすべて満たすと、未了取引確認待ち状態へ遷移する。
59  /// @par
60  /// - 通信不良等により、支払操作が未了となった。
61  /// - 支払操作が未了となった際、
62  /// ブランドによっては支払操作の再要求や残高照会要求が自動的に開始される場合があるが、
63  /// それが正常に完了しなかった。またはキャンセルした。
64  /// @par
65  /// 未了取引確認待ち状態へ遷移すると、
66  /// 付属ディスプレイには係員を呼び出して欲しい旨を伝えるメッセージが表示される。
67  /// @par
68  /// この状態はゲームテストモードを開始するまで解除されない。
69  /// また、メンバ関数 #isDealAvailable が false を返すようになり、
70  /// メンバ関数 #checkDisplay による付属ディスプレイ表示チェック以外の操作は開始できない。
71  ///
72  /// @par 操作実施中にゲームテストモードを開始した場合の挙動
73  /// 各種操作を実施中に Sequence クラスのメンバ関数 Sequence#beginTest
74  /// によってゲームテストモードを開始した場合、次のように動作する。
75  /// @par
76  /// - 操作がキャンセル可能な状態であれば、Daemonプロセスによって自動的にキャンセルされる。
77  /// - 自動キャンセルの挙動はメンバ関数 #cancel を呼び出した場合と同様である。
78  /// - 操作がキャンセル不可な状態であれば、単にそのまま操作継続する。
79  /// @par
80  /// 操作継続となった場合、たとえゲームテストモード中であっても、
81  /// EMoney クラスのメンバ関数 EMoney#setSoundHook で設定したフック関数は呼び出される。
82  /// ゲームアプリはゲームテストモード中であってもサウンド再生/停止処理を実施すること。
84  {
85  public:
86  /// @brief コンストラクタ。
87  /// @note アプリ側からは利用できない。
88  explicit EMoneyOperation(InnerIndexHolder);
89 
90  // 下記は暗黙の定義を用いる。
91  //‾EMoneyOperation() = default;
92 
93  /// @brief 取引操作を利用可能な状態であるか否かを取得する。
94  /// @retval true 利用可能な状態である場合。
95  /// @retval false 操作が無効な状態である場合。
96  /// @see #canOperateDeal, #requestBalance, #payToCoin
97  ///
98  /// 下記をすべて満たす状態であれば true を返す。
99  ///
100  /// - 第3世代以降のAimeリーダーユニット、および付属ディスプレイが接続されている。
101  /// - 端末売上管理システム上で端末IDと基板が紐付けられており、 "利用可" の状態である。
102  /// - EMoney クラスのメンバ関数 EMoney#isServiceAlive が true を返す。
103  /// - EMoney クラスのメンバ関数 EMoney#isAuthCompleted が true を返す。
104  /// - EMoney クラスのメンバ関数 EMoney#getAvailableBrandCount が 1 以上を返す。
105  /// - Error クラスのメンバ関数 Error#isOccurred が false を返す。
106  /// - 未了取引確認待ち状態ではない。
107  /// 未了取引確認待ち状態については EMoneyOperation クラスの説明を参照すること。
108  ///
109  /// この関数が false を返す場合、メンバ関数 #requestBalance および #payToCoin
110  /// による取引操作を行うことはできない。
111  /// 付属ディスプレイには取引が行えない旨が表示される。
112  ///
113  /// この関数が true を返す場合であっても、
114  /// 他の操作を実施中の場合や締め処理中である場合は取引操作を開始できない。
115  /// 取引操作を開始可能か否か調べるにはメンバ関数 #canOperateDeal を用いること。
116  ///
117  /// メンバ関数 #checkDisplay, #authTerminal, #removeTerminal については、
118  /// この関数の返す値に関わらず利用可能である。
119  bool isDealAvailable() const;
120 
121  /// @brief 取引操作を開始可能な状態であるか否かを取得する。
122  /// @retval true 開始可能な状態である場合。
123  /// @retval false 開始可能な状態ではない場合。
124  /// @see #requestBalance, #payToCoin
125  ///
126  /// 下記をすべて満たす状態であれば true を返す。
127  ///
128  /// - メンバ関数 #isDealAvailable が true を返す。
129  /// - メンバ関数 #isBusy が false を返す。
130  /// - EMoney クラスのメンバ関数 EMoney#isReporting が false を返す。
131  ///
132  /// この関数で開始可否を判断できるのは、
133  /// メンバ関数 #requestBalance および #payToCoin のみである。
134  /// メンバ関数 #checkDisplay, #authTerminal, #removeTerminal については、
135  /// 各関数の説明を参照すること。
136  bool canOperateDeal() const;
137 
138  /// @brief いずれかの操作、あるいはそのキャンセルを実施中であるか否かを取得する。
139  /// @retval true いずれかの操作、あるいはそのキャンセルを実施中である場合。
140  /// @retval false いずれの操作も実施していない場合。
141  ///
142  /// この関数が true を返す場合、他の操作を開始することはできない。
143  bool isBusy() const;
144 
145  /// @brief 実施中の操作をキャンセル可能な状態であるか否かを取得する。
146  /// @retval true キャンセル可能な状態である場合。
147  /// @retval false キャンセルできない状態であるか、操作実施中ではない場合。
148  /// @see #cancel
149  ///
150  /// 操作を実施中であっても常にキャンセル可能なわけではない。
151  /// 具体的なキャンセル可能タイミングについては各操作関数の説明を参照すること。
152  bool isCancellable() const;
153 
154  /// @brief 実施中の操作のキャンセルを開始する。
155  /// @retval true キャンセル開始に成功した場合。
156  /// @retval false キャンセル開始に失敗したか、キャンセルできない状態である場合。
157  /// @see #isCancellable
158  ///
159  /// メンバ関数 #isCancellable が false を返す状態の場合、
160  /// この関数は何も行わずに false を返す。
161  ///
162  /// この関数を呼び出しても即座にキャンセル完了となるわけではない。
163  /// この関数の成功後にメンバ関数 #isBusy が
164  /// false を返すようになって初めてキャンセル完了となる。
165  ///
166  /// キャンセル完了時、メンバ関数 #getResult はキャンセル結果を返す。
167  /// 通常は成功となる。
168  ///
169  /// 操作を実施中であっても常にキャンセル可能なわけではない。
170  /// 具体的なキャンセル可能タイミングについては各操作関数の説明を参照すること。
171  bool cancel();
172 
173  /// @brief 実施中の操作でカードリーダーへのかざし操作が1回以上行われたか否かを取得する。
174  /// @retval true かざし操作が1回以上行われた場合。
175  /// @retval false かざし操作が行われていないか、操作中ではない場合。
176  ///
177  /// 端末認証、残高照会、支払の操作において、
178  /// カードリーダーが認証用カードまたは電子マネーデバイスを一度でも認識すると、
179  /// それ以降 true を返すようになる。
180  /// 一旦 true を返すようになると、操作が完了してメンバ関数 #isBusy が
181  /// false を返すようになるまで、この関数の戻り値は true のままとなる。
182  ///
183  /// 通常ではかざし操作は一度しか行わないが、通信不良等により支払操作が未了となると、
184  /// ブランドによっては支払操作の再要求や残高照会要求が自動的に開始され、
185  /// 再度かざし待ち状態となる場合がある。
186  /// その場合であっても、この関数の返す値が false に戻ることはない。
187  ///
188  /// 対象外の操作(端末撤去等)が行われている場合、この関数の返す値は不定値となる。
189  bool isHeldOver() const;
190 
191  /// @brief 直近の操作を実施中にエラーが発生したか否かを取得する。
192  /// @retval true エラーが発生した場合。
193  /// @retval false エラーが発生していない場合。
194  ///
195  /// いずれかの操作を開始すると、過去のエラー情報を破棄して false を返すようになる。
196  /// 操作内容は問わない。(操作結果を返さないものを含む)
197  ///
198  /// 操作の実施中にエラーが発生すると true を返すようになる。
199  bool isErrorOccurred() const;
200 
201  /// @brief 直近の操作、あるいはそのキャンセルの結果が存在するか否かを取得する。
202  /// @retval true 直近の操作、あるいはそのキャンセルの結果が存在する場合。
203  /// @retval false 結果が存在しない場合。
204  ///
205  /// getResult().valid() を返す。
206  bool hasResult() const
207  {
208  return this->getResult().valid();
209  }
210 
211  /// @brief 直近の操作、あるいはそのキャンセルの結果を取得する。
212  /// @return
213  /// 直近の操作、あるいはそのキャンセルの結果。
214  /// まだ一度も操作開始していない場合は無効値。
215  ///
216  /// いずれかの操作を開始すると、過去の操作結果を破棄して無効値を返すようになる。
217  /// 操作内容は問わない。(操作結果を返さないものを含む)
218  ///
219  /// 操作が完了するか、もしくはキャンセルされると、その結果を返すようになる。
220  /// ただし、操作内容が残高照会でも支払でもない場合は操作結果を返さない。
221  ///
222  /// 操作が成功した場合とエラーが発生した場合とでは設定内容が異なる。
223  /// EMoneyResult クラスの説明を参照すること。
224  const EMoneyResult& getResult() const
225  {
226  return _result;
227  }
228 
229  /// @brief 付属ディスプレイの表示チェックを開始する。
230  /// @retval true 操作開始に成功した場合。
231  /// @retval false 操作開始に失敗した場合。
232  ///
233  /// メンバ関数 #isBusy が true を返す状態である場合、
234  /// この関数は何も行わずに false を返す。
235  ///
236  /// この操作がエラー情報を返すことはない。
237  /// 実際に問題があるか否かは付属ディスプレイの表示状態による。
238  ///
239  /// @par キャンセル可能タイミング
240  /// 常にキャンセル可能である。
241  bool checkDisplay();
242 
243  /// @brief 端末認証操作を開始する。
244  /// @retval true 操作開始に成功した場合。
245  /// @retval false 操作開始に失敗した場合。
246  ///
247  /// 下記のいずれかの状態である場合、この関数は何も行わずに false を返す。
248  ///
249  /// - メンバ関数 #isBusy が true を返す。
250  /// - EMoney クラスのメンバ関数 EMoney#isReporting が true を返す。
251  ///
252  /// 操作開始に成功した場合であっても、
253  /// サービスサーバが生存していない等の理由で操作に失敗する可能性があるため、
254  /// 操作完了後は必ずメンバ関数 #isErrorOccurred によってエラーの有無を確認すること。
255  ///
256  /// アプリでは、ゲームテストモードに端末認証用の画面を用意し、
257  /// オペレータの画面操作によってこの操作を開始すること。
258  /// なお、操作を完了させるためには認証用カードをカードリーダーにかざす必要がある。
259  ///
260  /// 認証済みの端末であっても、
261  /// 利用可能な電子マネーを追加する際には再度この操作を実施する必要があるため、
262  /// 認証済みか否かに関わらず上記画面に遷移できるようにすること。
263  ///
264  /// @par キャンセル可能タイミング
265  /// - 操作開始から認証用カードをかざすまでの間はキャンセル可能である。
266  /// - カードリーダーが認証用カードを認識すると、それ以降はキャンセル不可となる。
267  /// @par
268  /// 現在キャンセル可能であるか否かはメンバ関数 #isCancellable によって判別すること。
269  bool authTerminal();
270 
271  /// @brief 端末撤去操作を開始する。
272  /// @retval true 操作開始に成功した場合。
273  /// @retval false 操作開始に失敗した場合。
274  ///
275  /// 下記のいずれかの状態である場合、この関数は何も行わずに false を返す。
276  ///
277  /// - メンバ関数 #isBusy が true を返す。
278  /// - EMoney クラスのメンバ関数 EMoney#isReporting が true を返す。
279  ///
280  /// 操作開始に成功した場合であっても、
281  /// サービスサーバが生存していない等の理由で操作に失敗する可能性があるため、
282  /// 操作完了後は必ずメンバ関数 #isErrorOccurred によってエラーの有無を確認すること。
283  ///
284  /// アプリでは、ゲームテストモードに端末撤去用の画面を用意し、
285  /// オペレータの画面操作によってこの操作を開始すること。
286  ///
287  /// @par キャンセル可能タイミング
288  /// 常にキャンセル不可である。
289  bool removeTerminal();
290 
291  /// @brief 残高照会操作を開始する。
292  /// @param[in] brandId ブランドID。
293  /// @retval true 操作開始に成功した場合。
294  /// @retval false 操作開始に失敗した場合。
295  ///
296  /// @exception Exception
297  /// 引数 brandId に不正な値を指定した場合。
298  ///
299  /// メンバ関数 #canOperateDeal が false を返す場合や、
300  /// 引数 brandId に指定したブランドが有効ではない場合、
301  /// この関数は何も行わずに false を返す。
302  ///
303  /// @par キャンセル可能タイミング
304  /// - 操作開始から電子マネーデバイスをかざすまでの間はキャンセル可能である。
305  /// - カードリーダーが電子マネーデバイスを認識すると、それ以降はキャンセル不可となる。
306  /// @par
307  /// 現在キャンセル可能であるか否かはメンバ関数 #isCancellable によって判別すること。
308  bool requestBalance(EMoneyBrandId brandId);
309 
310  /// @brief コイン購入支払操作を開始する。
311  /// @param[in] playerIndex プレイヤーインデックス。
312  /// @param[in] brandId ブランドID。
313  /// @param[in] coin 購入するコイン数。
314  /// @retval true 操作開始に成功した場合。
315  /// @retval false 操作開始に失敗した場合。
316  ///
317  /// @exception Exception
318  /// - 引数 playerIndex に有効プレイヤー数以上の値を指定した場合。
319  /// 有効プレイヤー数は Core クラスのメンバ関数 Core#getPlayerCount で取得できる。
320  /// - 引数 brandId に不正な値を指定した場合。
321  /// - 引数 coin に 0 もしくは 99 より大きい値を指定した場合。
322  ///
323  /// 電子マネーを支払い、コインを購入する。
324  /// 購入したコイン数などの情報はブックキーピングに記録される。
325  ///
326  /// 1コインあたりの金額はクレジット設定により決定される。
327  /// Credit クラスのメンバ関数 Credit#getConfig から取得したクレジット設定の
328  /// CreditConfig#coinAmount メンバを参照する事。
329  ///
330  /// 下記の場合、この関数は何も行わずに false を返す。
331  ///
332  /// - メンバ関数 #canOperateDeal が false を返す場合。
333  /// - 引数 brandId に指定したブランドが有効ではない場合。
334  /// - 現在ゲームテストモード中である場合。
335  /// ゲームテストモード状態の管理は Sequence クラスで行える。
336  ///
337  /// また、下記の場合はプロセス側で操作開始に失敗して false を返す。
338  ///
339  /// - クレジット機能が無効である場合。
340  /// - コインを購入することで MAX CREDIT 値を超える場合。
341  ///
342  /// MAX CREDIT 値を超えずに購入可能なコイン数は、
343  /// CreditUnit クラスのメンバ関数 CreditUnit#getAddableCoin によって取得できる。
344  ///
345  /// @code
346  /// // 購入可能なコイン数を事前チェックしてから payToCoin を呼び出すサンプル。
347  /// bool buyCoin(std::size_t playerIndex, EMoneyBrandId brandId, std::uint32_t coin)
348  /// {
349  /// amdaemon::Credit credit;
350  /// amdaemon::EMoney eMoney;
351  ///
352  /// // (追加可能なコイン数 < 購入予定コイン数) なら購入不可
353  /// if (credit.getPlayer(playerIndex).getAddableCoin() < coin)
354  /// {
355  /// return false;
356  /// }
357  ///
358  /// return eMoney.getOperation().payToCoin(playerIndex, brandId, coin);
359  /// }
360  /// @endcode
361  ///
362  /// @par キャンセル可能タイミング
363  /// - 操作開始から電子マネーデバイスをかざすまでの間はキャンセル可能である。
364  /// - カードリーダーが電子マネーデバイスを認識すると、それ以降はキャンセル不可となる。
365  /// - 支払操作が未了となった場合は再びキャンセル可能となる場合がある。
366  /// 詳細は EMoneyOperation クラスの説明を参照すること。
367  /// @par
368  /// 現在キャンセル可能であるか否かはメンバ関数 #isCancellable によって判別すること。
369  bool payToCoin(std::size_t playerIndex, EMoneyBrandId brandId, std::uint32_t coin);
370 
371  private:
372  EMoneyResult _result; ///< 操作結果。
373 
374  private:
375  // コピー禁止
376  EMoneyOperation(const EMoneyOperation&); // 宣言のみ
377  EMoneyOperation& operator=(const EMoneyOperation&); // 宣言のみ
378  };
379 
380 /// @}
381 } // namespace amdaemon
382 
383 #endif // AMDAEMON_EMONEYOPERATION_H
const EMoneyResult & getResult() const
直近の操作、あるいはそのキャンセルの結果を取得する。
Definition: EMoneyOperation.h:224
電子マネーブランドID列挙 EMoneyBrandId のヘッダ。
bool cancel()
実施中の操作のキャンセルを開始する。
bool isDealAvailable() const
取引操作を利用可能な状態であるか否かを取得する。
bool canOperateDeal() const
取引操作を開始可能な状態であるか否かを取得する。
EMoneyBrandId
電子マネーブランドID列挙。
Definition: EMoneyBrandId.h:19
bool isErrorOccurred() const
直近の操作を実施中にエラーが発生したか否かを取得する。
Daemonライブラリの環境定義を行うヘッダ。
bool payToCoin(std::size_t playerIndex, EMoneyBrandId brandId, std::uint32_t coin)
コイン購入支払操作を開始する。
bool isBusy() const
いずれかの操作、あるいはそのキャンセルを実施中であるか否かを取得する。
電子マネー操作結果を提供するクラス EMoneyResult のヘッダ。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
bool requestBalance(EMoneyBrandId brandId)
残高照会操作を開始する。
bool isHeldOver() const
実施中の操作でカードリーダーへのかざし操作が1回以上行われたか否かを取得する。
電子マネーの各種操作を行うクラス。
Definition: EMoneyOperation.h:83
bool authTerminal()
端末認証操作を開始する。
bool removeTerminal()
端末撤去操作を開始する。
bool checkDisplay()
付属ディスプレイの表示チェックを開始する。
EMoneyOperation(InnerIndexHolder)
コンストラクタ。
bool valid() const
有効な情報が保持されているか否かを取得する。
bool hasResult() const
直近の操作、あるいはそのキャンセルの結果が存在するか否かを取得する。
Definition: EMoneyOperation.h:206
電子マネー操作結果を提供するクラス。
Definition: EMoneyResult.h:52
bool isCancellable() const
実施中の操作をキャンセル可能な状態であるか否かを取得する。