【英語勉強録vol.1】Solidus開発者ガイド

　この記事は，センターリスニング４点の英語が出来ない投稿者による英語勉強録です。
　誤った記述の可能性があるため，万が一でも参考とされる際は，翻訳元を**必ず確認のうえ**御参照下さい。

○翻訳規則
　・見出しの「＜＞」は，一つのページを示す。
　・「・」は，翻訳元の段落始まりを示す。
　・「・」以下に続く文頭のスペースは，翻訳元の文章で繋がりをもって記載された文であることを示す。
　・コード中の「$」は，ターミナルの入力を示す。
　・コード中の「>」は，ターミナルの入力結果を示す。
　・コード中の「)」は，ファイルへのコード入力を示す。
　・「DB」は，データベースを示す。
　・「PR」は，プルリクエストを示す。

○覚書
　・翻訳元サイト：https://guides.solidus.io/developers/
　・作業日：2019年5月9日~10日
　・用語集は別途作成する。

#＜前文＞
・このガイドは，Web開発者にSolidusECプラットフォームを学ぶための基礎を記載します。
　Solidusを使用すると，ECサイトを構築することが出来ます。

・Solidusは，オープンソースのECソリューションで，情熱的な開発者コミュニティの調整によりRailsで構築されています。SolidusでECサイトを始める前にRubyとRailsを経験すべきでしょう。
　Railsが初めての場合，RailsガイドやRailsチュートリアルから読み始めよう。

・本ガイドの通り進めてもSolidusがインストール出来ない場合，SolidusのSlackチームに参加して，Support-channnelに連絡してください。
　それでもSolidusが上手く動かない場合，Githubのissueであなたの問題の再現に役立つと思う情報を開いてください。
　OSとそのバージョンか，Rubyバージョンか，Railsか，SQLite3か，あなたがインストール中に受けている特定のエラーメッセージを含んでいるでしょう。

---
---
#＜First-time installation＞
・この記事は，最初のローカル環境におけるSolidusのインストールと実行をサポートします。
　このガイドは，macOSで実行する開発者を対象にしております。
・Linux，Windows又はHomebrewが使用できないMacの場合でも，このガイドと進めることが出来ますが，Ruby,SQLite3,システム依存等で他のドキュメントを参照したくなるでしょう。

##■ Getting help
・もしこのガイドの通り進めてSolidusのインストールに不具合がある場合，SolidusのSlackチームに参加して，#support channelで聞いてみて下さい。
・それでもSolidusが上手く動かない場合，問題を再現出来るような情報をもって，GithubのIssueを開いて下さい。
　その情報には，OSとそのバージョン，Ruby，Rails,SQLite3のバージョン，インストール時に受けたエラーメッセージを含むようにすること。

##■ Before you start
・SolidusはRailsで構築されたECプラットフォームです。
　Solidus以外のことをもっと知りたいなら，Railsと，事前に同じくらいRubyに慣れておくことを推奨します。
・なぜなら，SolidusはRailsエンジンであり，エンジンに関してRailsガイドに記載されていることの多くは，Solidusにも直接当てはまります。
・開発環境の設定には，Sudoを除外してGemをインストールすることも推奨します。

##■ System requirements
・Solidusの実行に要求されるソフトウェアは次の通りです。
　→Ruby2.2.2以上，SQLite3，Rails5.0.0以上，ImageMagick
・我々は，Max上でこれらのソフトウェアをインストールするためにHomebrewの使用を推奨します。
　全ての項目は，brewコマンドでシステム付属物をインストールするために使用します。
・Rubyドキュメントでも，Rubyのアップグレードの必要がある場合にHomebrewの使用が推奨されています。

##■ Quick start
・Homebrewを使用することで，次のコマンドを使用することにより要求される付属物全てをインストールできます。

```
(1) $ brew install ruby sqlite3 imagemagick
(2) $ gem install rails
```

インストールの詳細は以下の情報を参照して下さい。

###○ 情報１：Upgrade Ruby on macOS
・macOS Sierra又はそれ以前のOSで実行する場合，利用者のRubyバージョンは，2.0.Xから2.2.2以上にアップグレードする必要がある。
　利用者は，コマンドでインストールされたRubyバージョンを確認することが出来る。
・Rubyドキュメントは，他の新しいRubyインスタンスをHomebrewを使用してインストールすることを推奨している。
・Homebrewは，(/usr/bin/ruby)よりも(/usr/lobal/bin/ruby)を優先する。

```
$ ruby --version
$ brew install ruby
```

###○ 情報２：Install SQLite3
・RailsとSolidusは，デフォルトのRDBとして，SQLite3を使用する。
　SQLite3は，幅広いサポートがあり，データの送信方法として軽量である。
　(1)のとおりHomebrewのコマンドを使用することで，最新バージョンのSQLite3をインストールできる。
・他の方法として，SQLite公式サイトからプリコンパイルされたSQLite3をダウンロードできる。
・インストール後，(2)でバージョンを確認しよう。
・全てが上手く進んだ場合，(2)コマンドで(3)のようにバージョン番号が返される。

```
(1)
$ brew install sqlite3
(2)
$ sqlite3 --version
(3)
> 3.16.0 2016-11-04 19:09:39
> 0f3eed3324eda2a2b8d3301e5a43dc58a3a5fd5f
```

###○ 情報３：Install Rails
・Railsは，Webアプリの構築や拡張に必要な全てが含まれている。
　利用者がRubyyaSQLite3を自分のシステムで使用したことがある場合，RubyGemsを通し，Rubyの一部としてgemコマンドによりインストールできる。
・これは，それらの付属物と同様にRailsをインストールできる。

```
$ gem install rails
```

###○ 情報４：Install ImageMagick
・ImageMagichは，多くの画像ファイルのフォーマットを作成，編集及び保存するのに役立つ。
　また，Solidusが現行で添付ファイルを扱うために使用するPaperclipに要求される。
　ImageMagickはHomebrewを数字手愚痴のコマンドを使用することでインストールできる。
・他の方法として，ImageMagickの公式サイトからmacOSyouのプリコンパイルされたImageMagickをダウンロードできる。

```
$ brew install imagemagick
```

##■ Setup and installation
・全ての要求システムをインストールできたなら，我々はSolidusの設定を開始できます。

##■ Create and configure new Rails project
・第一として，(1)のとおりRailsプロジェクトを生成する。
・既にプロジェクトを生成している場合，(2)のとおりプロジェクトを開いて，GemfileにSolidus Gemを追加する。
・GemfileでSolidusは，実際に5つのSolidus_gemが要求している。
　→solidus_core, solidus_api, solidus_frontend, solidus_backend, solidus_sample
・５つのGemは，Solidus Githubリポジトリで調整されており，ドキュメントのサイトが分かれている。
・初回のインストールの場合，我々は全ての機能を搭載したECサイトとしてSolidusをインストールすることを推奨している。
　しかし，利用者は，Gemの一部機能だけの使用や，もっとカスタムしたいと考えるでしょう。
・(2)のとおりGemfileに保存したら，Railsプロジェクトのディレクトリに移動して，(3)のとおりBundlerを使用してプロジェクトの従属物をインストールしましょう。

```
(1)
$ rails new your_solidus_project_name
(2)
) gem 'solidus'
) gem 'solidus_auth_devise'
(3)
$ cd/path/to/your-solidus-project-name　#　プロジェクトのディレクトリに移動すること。
$ bundle install
```

##■ Start generating Solidus configuration files
・Gemのインストール完了後，SolidusとRailtiesによるジェネレータを使用して，必要な設定ファイルとデータベース指示を生成する必要がある。
・第一として，spree:installジェネレータを実行する。

```
$ bundle exec rails generate spree:install
```

##■ Set the administrator username and password
・spree:installジェネレータは，利用者にSolidusの管理者名とパスワードの設定を促します。
・デフォルトの値は次の通りです。
　→Username: admin@example.com　Password: test123
・パスワードには6文字以上含む必要があり，そうでなければ，アカウント作成は，ユーザーに再設定を要求することなく失敗してしまいます。

##■ Prepare Solidus database migrations
・次に，solidus:auth:installジェネレータを実行する必要があり，利用者のDBマイグレーションを(1)のコマンドを使用することでインストールします。
・最後に，(2)のとおり利用者はRailstiesが生成したマイグレーションを実行する必要があります。
　これは，SolidusがDBのために使用するECとして親和性を持つモデルを生成します。

```
(1)
$ bundle exec rails generate solidus:auth:install
$ bundle exec rake railties:install:migrations
(2)
$ bundle exec rake db:migarate
```


##■ Start the Rails server and user the sample store
・DBマイグレーションが完了したら，Railsサーバを開始でき，サンプルストを表示出来ます。
　次のコマンドでサーバが開始します。
・サーバが開始したら，利用者は次のURLからストアにアクセスできます。
　→http://localhost:3000/  opens the solidus_frontend　※店頭
　→http://localhost:3000/admin/  opens the solidus_backend　※管理者専用
・利用者は，サンプルストアのページやモック製品など閲覧できます。

```
$ bundle exec rails server
```
---
---

#＜Install options＞
##■ Stable Solidus
・Solidusの最新バージョンを手に入れるためには，Gemfileにsolidusとだけ記述して下さい。

```
) gem 'solidus'
```

##■ Bleeding edge Solidus
・最前線にあるSolidusのバージョンを使用したい場合，Githubのリポジトリでmasterブランチを要求して下さい。
・masterブランチは，頻繁にアップデートされており，たぶんバグります。
　本番環境でmasterブランチを使用しないこと。

```
) gem 'solidus', github: 'solidusio/solidus'
```

##■ Manually run migrations
・(1)のとおり，引数なしでspree:installジェネレータを実行した時，マイグレーションの実行やサンプルデータ及びデータベースのSeedが追加されます。
・(2)のコマンド引数を使用することで，ジェネレータのこれらのステップをスキップできます。
・後々，これらの機能を実行したくなった場合，(3)のコマンドで使用できるようになります。
・ユーザー認証機能であるsolidus_auth_deviseを使用する場合，(4)のとおりインストールして，マイグレーションを実行してから，別々にデータベースをシードする。

```
(1)
$ rails generate spree:install
(2)
$ rails generate spree:install --migrate=false --sample=false --seed=false
(3)
$ bundle exec rake railties:install:migrations
$ bundle exec rake db:migrate
$ bundle exec rake db:seed
$ bundle exec rake spree_sample:load
(4)
$ bundle exec rake solidus_auth:install:migrations
$ bundle exec rake db:migrate
$ bundle exec rake db:seed
```

##■ Development environment performance gains
・Solidusストアが開発環境で遅いことが気になるかもしれません。
　速度改善のために次の設定オプションを変更できます。

###○ 設定１：Turn off asset debugging
・デフォルトでは，開発環境で全てのCSSとJavaScriptを個別Includeされています。
　config/environments/develpment.rbで，設定をTrueからFalseへ変更して下さい。

```
Rails.application.configure do
 config.assets.debug = false
end
```

###○ 設定２：Enable turbolinks
・Turbolinksを有効化することで，Solidus管理者サイトの中でより早くなります。
　始めに(1)のとおり，プロジェクトのGemfileにTurbolinksGemを追加して下さい。
・次にvendor/assets/spree/backend/all/jsで，JavaScriptのマニフェストファイルに(2)のコードを追加することで，Backend内でTurbolinksが有効化されます。
・注意事項として，Turbolinksは，利用者のカスタム追加設定や，Solidus管理者に対する他のカスタマイズをバグらせることがあります。

```
(1)
$ gem 'turbolinks', '~> 5.0.0'
(2)
) //= require turbolinks
) //= require backend/app/assets/javascripts/spree/backend/turbolinks-integration.js
```
---
---
#＜Develop Solidus＞
・Solidusの改善やPRを送りたい場合，初めに「contributing guidelines」をお読み下さい。
・Solidusの開発環境を設定するのは簡単です。
　第一として，(1)のとおりGithubのリポジトリからSolidusをクローンして下さい。
・(2)のとおりダウンロードしたディレクトリに移動し，Solidusの付属物をインストールして下さい。

```
(1)
$ git clone git://github.com/solidusio/solidus.git
(2)
$ cd solidus
$ bundle install
```
##■ Create a sandbox application
・Solidusは，Railsアプリです。
　(1)のとおり，クローンしたソースディレクトリの中で，サンドボックスアプリを生成して下さい。
　これでテスト目的に使用可能なSolidusストアができました。
・デフォルトとして，サンドボックスは，solidus_auth_deviseを含み，ジェネレータがDBを設定してサンプルデータを読み込みます。
・利用者は，デフォルトのSQLite3の代わりに，コマンドの前に「DB=mysql」又は「DB=postgresql」を添付することができます。例として(2)のとおりです。
・サンドボックス生成後，ディレクトリに移動して，サーバを開始できます。

```
(1)
$ bundle exec rake sandbox
(2)
$ env DB=postgresql bundle exec rake sandbox
(3)
$ cd sandbox
$ rails server
```
##○ Testing
・SolidusはRSpecをテストに使用しています。テスト情報についてはRSpecのドキュメントを参照して下さい。
・PRとしてSolidusに貢献したい場合，マージ前にSolidusのテストスイートを全てパスする必要があります。
　また，新機能の追加やバグ修正時も同じです。
・我々は，全てのPRを受け取る上でテストを実行するためにCircleCIを使用しています。
・Solidus_frontendとSolidus_backendのテストスイートを実行するためには，初めにあなたのシステムにChromeDriverをインストールする必要があります。
・我々のCircleCIは次のページで見ることができます。
　https://circleci.com/gh/solidusio/solidus

##■ Run all Solidus test suites
・全てのテストspecを実行するためには，Solidusプロジェクトのルートディレクトリで(1)のとおり実行します。
・bin/buildは，デフォルトでPostgreSQLを使用して実行するが，DB環境を「DB=sqlite」か「DB=mysql」に上書きできます。
　例としては，(2)のとおりです。
・注意事項として，あなたのシステムでChromeDriverがインストールされていない場合，テストが失敗します。

```
(1)
$ bin/build
(2)
$ env DB=mysql bin/build
```
##■ Run a single test suite
・各GemではGem自身のテストスイートを含んでおり，例としてcoreディレクトリ内で
solidus_coreだけのテストされます。
・デフォルトでは，SQLite3に対してテストされる。他にも(2)のとおり，「DB=mysql」や「DB=postgreSQL」をコマンド前に追加することでテストできます。

```
(1)
$ cd core
$ bundle exec rspec 
(2)
$ env DB=postgresql bundle exec rspec 
```
##■ Generate a code coverage report
・rspecコマンドの前に「COVERAGE=true」を追加することで，コードカバレッジ報告書であるSimpleCovが生成されます。

```
$ env COVERAGE=true bundle exec rspec
```
##■ Develop a Solidus extension
・Solidusの拡張機能を使用して自身のストアに機能を追加できる。
　サポートされた拡張機能のリストは，次のURLのとおりです。
　→https://extensions.solidus.io/
・Solidusの新機能を作成し始めたい場合，例としてsolidus_cmdを使用できます。
　詳細については，拡張機能作成に係るドキュメントを確認して下さい。

---
---
#＜Forking Solidus＞
・もしSolidusのコア機能に深くカスタマイズしたい場合，より自由に自分の機能を実行出来るような自分のストアのためにSolidusをフォークしたくなるでしょう。
・注意事項として，Solidusをアップグレードするのが大変になったり，もしくは，あなたが使用したい他のSolidusの拡張機能がバグることもあります。
・Solidusをフォークして使用するメリットとしては，自分の新機能をSolidusのテストスイートと一緒にテストできること，そして，自分の開発環境が既存の機能とバグらないように保証することになります。
・次のとおり，GemfileにSolidusのフォークを参照することができます。
・もし自分の機能のことを思いやり，又は広くSolidusコミュニティに興味があれば，PRを送って下さい。

```
) gem 'solidus', git: 'https://github.com/my_account/solidus.git', branch: "my-new-feature"
```
##■ Create a &quot;orivate fork&quot;
・もし，何らかの理由で自分の組織がプライベートリポジトリで作業したい場合は，フォークしたSolidusでは，少し複雑になります。
　Githubはパブリックリポジトリをプライベートフォークすることは許可していません。
　代わりに，リポジトリを複製することができます。
　Githubの以下のURLに詳細情報があるので，見ておいて下さい。
　　→https://help.github.com/en/articles/duplicating-a-repository

---
---
#＜Customer flow＞
・この記事では，Solidusにおける典型的な顧客の流れを技術レベルで解説します。
　Spree::Orderモデルは，流れの大部分で関連付けられていますが，全ての注文は，多くのモデルを動かしていきます。
・この記事は，高いレベルで段階毎に顧客の流れを解説します。

- Shopping
    - 顧客の会計前の行動を示します。例として，顧客のストア閲覧，カートに商品を加える等です。
- Account
    - 顧客のアカウントログイン，ゲストとして購入を示します。
- Address
    - 顧客の支払方法，配送先住所を確認します。
- Shipment
    - 配送方法，税金を計算します。顧客は利用可能な配送方法を選択できます。
- Promotion
    - 顧客は，コードベースのプロモーションを自分の注文に適用できます。もしくは，Solidusが他の要因に基づくプロモーションを適用することもできます。
- Payment
    - 顧客は，支払情報を送信します。
- Confirmation
    - 顧客は，注文を確認して発注します。
- Capture and fulfillment
    - 支払は，ストア（又は管理者が手動で）が保存し，選択された配送方法で顧客に配送します。

・注意事項として，この記事は，全てのRailsサーバのログ情報を説明しません。
　全ての関連モデルにおおける全ての要素についても説明しませんし，例として，顧客が注文やキャンセルするプロセスに係るspecial_instructionsも説明しません。
・Promotionは，会計前や会計中でも適用できます。
##■ Standard flow
###○ Shopping
♢顧客がストアのURLにアクセスしてきます。

- 顧客が新規or既存顧客かどうかを識別します。
    - 既存顧客の場合，顧客がゲストアカウントか識別します。
    - ログイン記録がある場合，顧客が再ログインの必要性を識別します。
    - 新規顧客の場合，guest_token Cookieを顧客に対して生成します。
- 顧客を正しいViewにルーティングします（正しいPermissionを含んでいること）。
- ストアは，顧客をTOPページに導きます。

♢顧客が商品ページへアクセスします。
♢顧客が商品のバリエーションを選択します。
♢顧客が商品の個数を選択します。
♢顧客がカートに商品を追加します。

- Spree:Orderが生成され，idを発行します。
    - その注文はカートの状態になります。 
- Spree:LineItemがカート内の各商品に対して生成されます。
    - LineItemは，顧客がどのSpree:Variantをカートに追加したかを記録します。
    - LineItemは，カートに追加したSpree::Variantの個数を記録します。
    - 商品の価格がLineItemに追加されます。
    - LineItemは，order_idを使用して，顧客の注文と関連付けます。
    - 税金と価格の調整は，0.0から始まり，顧客のAddressを把握するまで計算できない。
    - 各商品のtax_category_idは，カート内の各商品の税区分に従い設定されます。

###○ Account
♢顧客がログインしていない場合，顧客にログインを要求するか，ゲストとして購入手続きします。

- 顧客は，ログインするか，ゲストとして購入手続きします。
    - Spree::Orderがアップデートされます。
    - 顧客がログインした場合，Spree:UserのIDがSpree::Orderと関連付けられます。user_idの値がnilでなくなります。
        - 現在のSpree::Orderは，最新の注文として統合されます（注文がカートにある場合）。
    - 顧客が新規登録した場合，Spree::Userが生成されます。新規作成したIDは，user_idの値に使用して，Spree:Orderと関連付けられます。
    - 顧客のEmailは，nilでなくなります。
        - 顧客がログインした場合，Spree:UserのEmailは，他のObjectの一部で使用されています。
        - 顧客がゲストで続けたい場合，「ゲストとして購入を続ける」フォームにEmailを入力する必要があり，Spree::OrderのEmail値で使用されます。
   - 注文の状態が，カートからAddressへ遷移します。 

###○ Address
♢顧客が注文に係る配送方法や請求先住所の情報を提出します。

- 顧客のtax_addressを設定します。デフォルトでは，注文先の住所を参照した，Spree::AddressのIDを使用します。
- Spree::Adjusmentは，Spree:LineItem毎に生成され，商品の税額を計算して保存します。
- Spree::LineItmeは，カート内の商品毎にアップデートします。
    - 初めに，顧客のtax_addressが設定され，注文の税金が計算される。
    - additional_tax_total，included_tax_total，adjustment_totalの値は，nilから（Spree:Adjustmentの関連付けに従う）数値にアップデートされます。
    - 税別でも税込でも0.0で設定され，顧客の配送地域が税別か税込かに左右されます。
- Spree:Orderはアップデートされます。
    - bill_address_idがnilから，新規のSpree::AddressのIDに関連付けられます。
    - ship_address_idがnilから，新規のSpree::AddressのIDに関連付けられます。
    - 顧客が請求先住所として同じ配送先を使用した場合，ship_address_idとbill_address_idは，同じIDになります。
    - 注文状態は，addressからdeliveryに変化します。
    - 注意事項として，顧客が以前ストアで注文してaddressを保存したとしても，注文に係るbill_address_idとship_address_idの値は，この時点ではnilのままでした。
- Spree::Shipmentが生成されます。
    - １つの出荷に対して11文字の数字が与えられます。
    - Spree::Shipmentモジュールが生成します。これは商品の在庫や他の要因や設定の数値に依存しています。詳細情報は，Shipmentのドキュメントを参照して下さい。https://guides.solidus.io/developers/shipments/overview.html

###○ Shipments
♢顧客が配送方法を選択します（利用可能な選択肢が一つ以上の場合）。

- 注文に複数の配送方法を含む場合，顧客は，注文に対して複数の配送方法を選択する必要があります。
- Spree::Shipmentは，アップデートされます。
    - Spree::Orderに適合するorder_idを割り当てます。
    - 商品在庫を確認します。
    - 在庫場所から出荷可能な商品を確保できる場合，配送状態が保留中になります。
    - 在庫場所から商品を確保できないが，取り寄せ可能な場合，配送状態が取寄注文になります。
    - 在庫場所が決定されます。
    - 配送料の調整が追加されます。
- Spree::ShippingRateが少なくとも１つ生成されます。
    - 注文の商品を出荷のため選択の可能性がある配送方法毎に１つ生成されます。
    - 一度も使用されない配送方法でさえ計算や生成されることを意味します。
    - 各オブジェクトは，現在の注文に対する配送料の合計金額を計算します。
    - 各配送料は，shipment_id値を使用した出荷と関連付けられている。
- Spree::Adjustmentは，Spree::Shipment毎に出荷の計算済の税額を保存するために生成されている。
- Spree::Orderはアップデートされます。
    - 注文の合計がアップデートされます。
    - 正確な配送料が追加されます。
    - shipment_totalは，nilからSpree::Shipmentに関連付けられた全ての配送料にアップデートされます。

###○ Promotions
♢顧客は自信の注文にpromoコードを追加します。

- Promotionが機能するか識別します。
- カート内の注文がPromotionルールに適合するか確認します。
    - Promotionが過去の日付でないか確認します。
    - Promotionの使用量が超過していないか確認します。
    - ここまで確認したら，Spree::OrderPromotionが生成されます。
- 新しいSpree::OrderPromotionは，Spree::PromotionのIDと，Spree::OrderIDと関連付けられます。
    - Promotionが，特定の商品（又は複数商品）にだけ適合する場合，商品のSpree::LineItemは，新しいpromo_total値にアップデートされます。
    - Promotionが，特定の配送方法（又は複数の方法）にだけ適合する場合，Spree::Shimpmentは，新しいpromo_total値にアップデートされます。
    - Promotionが，注文全体に適合し，特定のLineItem又はShipmentに適合する場合，Spree::Orderのpromo_total値のみアップデートされます。
- Spree::Orderがアップデートされます。
    - promo_totalがnilから，注文に関連付けられた全てのpromo_total値にアップデートされます。

###○ Payments
♢顧客に支払情報を入力させます。

- 顧客は支払方法リスト（Spree::PaymentMethod）から選択します。
    - 顧客が以前に注文して支払情報を保存している場合，保存した支払情報を使用可能であり，また，別の支払方法を選択できます。
    - 新規顧客は，Spree:MaymentMethodリストから一つ選択できます。
- 顧客が選択した支払方法に応じて，関連付けられた決済業者の支払方法を使用する。
- 支払方法に基づき，payment_sourceが決定される。
- 新しいSpree::Paymentは，Spree::Orderに関連付けられたorder_idを使用する。
    - 支払は，Spree::PaymentMethodのIDに関連付けられる。
    - 支払は，Spree::PaymentMethodと使用されるpayment_sourceに関連付けられたsource_typeとsource_idを持つ。
    - 支払状況は，checkoutになる。

♢顧客は，推奨された支払の詳細を入力し，送信します。

###○ Confirmation
♢顧客は，確認画面を見直し，発注します。

- Spree::Paymentの状態は，checkoutからpendingに変わります。
- Spree::StockItemのcount_on_hand値が注文された個数分減少します。
    - 出荷した商品に関連する在庫場所は，管理者画面でアップデートされます。

###○ Capture and fulfillment
♢管理者は，手動で出荷を承認することを選択できます。　※自動化もできます。

- Spree::Orderのapprover_idとapproved_at値は，nilでなくなります。

♢管理者は，支払を保存します。

- 注文に関連付けられたSpree::Shipmentは，Ready状態にアップデートされます。
- Spree::Paymentはアップデートされます。
    - 支払が完了した場合，PendingからProcessingToCompletedに変わります。
    - 支払が失敗した場合，PendingからProcessingToFailuerに変わります。

♢管理者は，注文を出荷し，出荷済の記録を付けます。

- Spree::Cartonは，注文に関連付けられた各出荷に対して生成されます。
    - Cartonは，11文字の数字が与えられます（C~~~~~~）。
- Spree::Shipmentの状態は，ReadyからShippedに変わります。

♢管理者は追跡番号を追加します。

- Spree::Shipmentのtracking値は，nilでなくなります。

♢顧客は，商品が配送されるのを気長に待ちます。
♢顧客は商品を受け取ります。


#＜API＞
##■ Overview
・SolidusのREST API(solidus_api gem)は，あなたのストアに含まれているデータにアクセスできるよう設計されています。
・このAPIは，JSONを返す基本的なRead/writeインターフェースを使用しています。
　これは，ストアのデータを使用することができるサードパーティ製アプリを簡単に生成できます。
　このAPIは，コントローラとJbuilderを使用して実行されます。
・また，洗練されたミドルウェアアプリを構築することもできて，ストアと倉庫又は在庫システムの間を繋ぎます。

###○ Make an API call
・管理者である認証済みユーザで有る場合，デフォルトでAPIcallを作成できる。

####□ Requests
・APIリクエストを作成するためには，(1)のとおり，Spree-API-keyと一緒にBearer-Authentication-Headerを設定します。
・注意事項として，Solidus ver.2.7以下の場合，X-Spree-Token:<key>headerが使用されます。
・他の方法として，headerが通らない場合，(2)のとおりURLパラメータとしてtokenを設定できます。
・このTokenパラメータは，tokenが属する現在のユーザと同レベルの許可を持つためのリクエストを許可します。

```
(1)curl --header "Authorization: Bearer <key>" http://yourstore.com/api/products/1
(2)curl http://example.com/api/products/1?token=<key>
```

####□ Authentication
・Spree::Roleの管理者権限を持つユーザは，アカウント登録時に生成されたAPI-keyを持ちます。
　Userテーブルのspree_api_keyカラムからkey値を取得できます。
・例として，solidus_auth_devise-Gemにより生成されるSpree::Userモデルを使用する場合，次のコマンドにより，Rails consoleの中で，ユーザのAPI-keyにアクセスできる。
・ストアの管理者は，ユーザページから管理者権限を持つユーザを編集することによって，API-keyを表示したり再生成できる。

```
$ Spree::User.find(1).spree_api_key
```

###○ Endpoint rules
・SolidusAPIの端末は，次に掲げるルールに準じます。

- Getリクエスト成功時は，200を返す。
- CREATE又はUPDATEリクエスト成功時は，201又は200を返す。
- DELETE成功時は，204を返すか何も返さない。
- リソースが見つからない場合，404を返す。
- 認証されていないリクエストの場合，401を返すか何も返さない。
- リソースが見つからない場合，404を返す。
- CREATE又はUPDATEリクエストが失敗した場合，422と，エラーkeyを含むハッシュと，エラーkeyを返す。エラー値は，レコードの保存時に全てのActiveRecordで発生したバリデーションエラーを含む。
- リストコレクションのリクエストは分割され，デフォルトで25レコード毎に表示される。

###○ Custom responses
・APIを二つの方法でカスタムすることができる。

1. solidus_api-GemのViewを上書きする。
2. 自分のアプリの中にカスタムしたテンプレートとして新しいViewを追加する。

・例として，デフォルトの「products/show.json.jbuilder」を上書きしたい場合，同じパスとファイル名で上書きする。
　この場合，カスタムテンプレートを「app/views/spree/api/products/show.json.jbuilder」パスを生成する必要がある。

##■ Endpoints
・SolidusのAPIドキュメントは，現在作業中です。
・APIエンドポイントを早く確認したい場合，ローカルで確認できます。
・第一として，(1)のとおり自分のプロジェクトのディレクトリに移動します。
・第二として，(2)のとおりgrepコマンドでrails routesでフィルターをかける。
・このコマンドは，自分のアプリに繋がる全ての/apiルートリストを返す。
　各routesに応じたGETやPOST等のリクエストタイプを含んでいる。
・(3)のとおり，より特定したgrepコマンドでroutesをフィルターできる。

```
(1) $ cd my_dolidus_application
(2) $ bundle exec rails routes | grep '/api'
(3) $ bundle exec rails routes | grep '/api/products'
```