例で見る
例は四つあり、どれも英語の版の横に、名前を全部日本語にした日本語の版(<名前>.ja.book)があります。日本語の版の単位は 個、pt、円 です。どの例も chobo check を警告なしに通り、テストは、chobo scenarios が作るシナリオの全部をすべてのクライアントで流しています(どうやって確かめているか)。リポジトリでは、帳簿の横に chobo doc が描いたページ doc.md と doc.ja.md があり、GitHub で読めます。
| 例 | 見せるもの | 帳簿 | 描いたページ |
|---|---|---|---|
| 注文のために 30 分押さえ、出荷で確定し、キャンセルで取り消す在庫 | 期限の切れる仮押さえ、二つの引数でできたキー | 在庫の引当 · 英語の版 | ページ |
| 返品の期間が過ぎるまで押さえて付与し、支払いが通るまで押さえて使い、期間の終わりに失効するポイント | 下限と上限、期限の切れない仮押さえ | ポイント · 英語の版 | ページ |
| 売上を超えない返金 | 二つの勘定にまたがる条件を、一つの勘定の境界にしたもの。同時に来る二つの返金 | 返金 · 英語の版 | ページ |
| 買い手が払った額を、店の取り分と手数料に分けるマーケットプレイス | 全部通るか一つも通らない二つの移動、呼ぶ側が計算する額 | マーケットプレイス · 英語の版 | ページ |
在庫の引当
SKU ごとの在庫です。入荷で増え、注文のために 30 分押さえ、出荷で仮押さえを確定し、キャンセルで取り消します。返品は棚に戻します。
account 在庫(sku: string) : 個
description "倉庫の棚にある数"
at least 0 refused as 在庫切れ
…
transfer 引当(注文: string, sku: string, 数: 個)
description "出荷で確定し、キャンセルで取り消す"
key 注文, sku
pending expires after 30 minutes
move 数 from 在庫(sku) to 客
キーは注文と SKU の組なので、三つの SKU を頼んだ注文は、SKU ごとに一度ずつ、三回押さえます。ある SKU の最後の一つを二つの注文が同時に押さえようとすると、一方が押さえ、もう一方は 在庫切れ で拒否されます。30 分そのままにされた仮押さえは期限が切れ、押さえていた品は棚に戻ります。
ポイント
会員ごとのポイントで、0 から 100 万までです。購入で付くポイントは、返品の期間が過ぎるまで押さえ、この仮押さえには期限がありません。会計で使うポイントは、支払いが通るまで 15 分押さえます。期間の終わりに使われずに残った分は失効します。
account ポイント(会員: string) : pt
at least 0 refused as ポイント不足
at most 1000000 refused as 上限超え
…
transfer 付与(購入: string, 会員: string, 数: pt)
description "返品の期間が過ぎたら確定し、返品されたら取り消す"
key 購入
pending never expires
move 数 from 発行 to ポイント(会員)
…
transfer 失効(会員: string, 期間: string, 数: pt)
description "その期間に使われなかった分"
key 会員, 期間
move 数 from ポイント(会員) to 失効済み
付与は上限で、利用と失効は下限で拒否されます。押さえて入ってくるポイントは、上限に対しては数えられますが、使えるポイントとしては数えられません。だから、購入で付くポイントは、返品の期間が過ぎて仮押さえが確定するまで使えません。
返金
注文ごとに、返金できる残りを勘定にしています。売上で増え、返金で減り、0 を下回りません。返金は承認を待つあいだ、長くても 7 日押さえます。帳簿の全体はホームに載せています。
transfer 返金(申請: string, 注文: string, 額: 円)
description "承認を待つあいだ押さえる。承認されたら確定し、却下されたら取り消す"
key 申請
pending expires after 7 days
move 額 from 返金できる残り(注文) to 返金済み
横には、手で書いたシナリオ refunds.ja.more.json があります。30000 円の売上に 20000 円の返金が二つ同時に来て、そのあと 10000 円を返金するもので、シナリオを流すで流しています。テストは、このシナリオもすべての出力先で流します。
マーケットプレイス
店ごとに売上金を持ちます。売上は、買い手が払った額を店の売上金と手数料に分け、その額は呼ぶ側が計算して渡します。返金は両方を戻すか、どちらも戻しません。振込は、銀行が受け付けるまで押さえます。
transfer 返金(返金番号: string, 店: string, 店の取り分: 円, 手数料: 円)
description "手数料と店の取り分を、両方とも戻すか、どちらも戻さない"
key 返金番号
move 手数料 from 手数料収入 to 買い手
move 店の取り分 from 売上金(店) to 買い手
…
transfer 振込(振込番号: string, 店: string, 額: 円)
description "銀行振込を始めたときに押さえる。銀行が受け付けたら確定し、失敗したら取り消す"
key 振込番号
pending never expires
move 額 from 売上金(店) to 銀行
店の売上金を 0 より下にする返金は 2 つ目の移動で拒否され、1 つ目の移動で戻した手数料も、一緒に元に戻ります。この帳簿は、帳簿を書くで一行ずつ読んでいます。
テスト用の帳簿
tests/books の帳簿は、例で試していないことを試します。どれにも、英語の名前の版があります。
安全在庫(safety_stock):0 より上の下限与信(credit):マイナスまで使える後払いの枠と、前払いの上限ウォレット(wallet):上限のあるウォレット自分あて(to_itself):同じ種類の二つの勘定のあいだの移動分配(allocation):移動が三つある売上と、円からドルへの両替
在庫 とその英語の版 stock_reservation には、手で書いたシナリオが横にあります。tests/fixtures には、一つから数個の診断を出す帳簿が、日本語の名前のものと英語の名前のもので、対になって並んでいます。