Salesforce B2C CommerceCloud についてちょっとだけ語るよ！

~~皆様メリー・クリスマス！~~
小林です。。投稿がだいぶ遅れてしまいすみません、、

最初は今年から運営をしている[Salesforce Developer Group Tokyo](https://www.trailblazers.jp/group/salesforce_dg_tokyo_dg)の活動についてエモく語ろうかなと思っていましたが、それは[JapanDreamin'](https://www.japandreamin.com/)の場で語ろうかなと思い、

本記事では、皆様興味津々であろうB2C CommerceCloudについて、広く浅く語っていきたいと思います。
（文字多め & ある程度Salesforce開発したことある前提です、ごめんなさい）


# B2C CommerceCloudとは
一言でいうとECサイトの構築と提供が出来るプラットフォームです。
テンプレートサイトとして、通常の購入フローをカバーしたものは準備されており、そこに設定によるカスタマイズや拡張開発を行っていきます。
[テンプレートサイトイメージ](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/cc-digital-for-developers/cc-business-manager/images/ja-JP/1e8e764f62bc62fe7c5027c29c7736ef_mfra-mobile-homepage.png)


詳しくはTrailheadのモジュールに概要が書いてありますので、下記を参照ください。
~~決して書くのが面倒と言うことではありません。~~
[Commerce Cloud の使用開始](https://trailhead.salesforce.com/ja/content/learn/modules/cc_ccbasics/cc_ccbasics_getstarted)

# 環境
買収した製品ですので、通常のSaleseforce組織へのログインではなく、独自の環境へログインし、管理・構築を行います。

ログインして利用する環境にはAccountManagerとBuisinessManagerがあります。
サポートケース用のアカウントもありますが、一旦置いておいて、AccountMangerは組織ごと、BuisinessManagerはインスタンスごとに存在しています。

## Account Manager
その名の通り、アカウントの管理を行う環境（機能）です。
Rolesという権限を付与し、そのユーザが何を出来るかを制御します。
例）
- BuisinessManagerの管理権限
- Xchange（TrailblazerCommunityのCommerce版的なもの）へのログイン権限
- 各環境へのアクセス制御（Sandbox01はログイン可能だが、02は不可、Productionも不可、など）

![AccountManager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309797/9c1d34cc-9901-892e-3e12-94f3382fd3ab.png)

## インスタンスの種類
- PIG(プライマリ インスタンス グループ)
    - Staging／Development／Production 環境が含まれるインスタンスグループ
- SIG(セカンダリ インスタンス グループ）
    - 開発用Sandboxが含まれるインスタンスグループ
    - CommerceCloudではSandboxが５つデフォルトで付与されます
    - 昨今はODSが主流となっているため、SIGのSandboxは利用されていないかも

| インスタンスタイプ|使用方法|
|:--|---|
| Staging |SIGからリリースをうけ、Developmentインスタンスへの検証準備環境。Development、Productionへのメタデータ、レコード、コードのレプリケーションに利用する|
| Development|UATや外部連携テストに利用|
| Production|本番環境|

### Business Manager
ECサイトを管理する機能です。今回、全機能は紹介出来ないので、ピックアップしていくつか紹介します。
※この機能気になる、ということがあれば個別にお問い合わせください（答えられるかは別ですが、、）

まず、BuisinessManagerには、マーチャントツールと管理機能があります。

BuisinessManagerには、管理者、開発者、マーチャンダイザーなど多くのロールユーザがアクセスするので、前述のAccountManagerで権限付与を正しくしておく必要があります。このあたりは、通常のSalesforceと同様ですね。
※統合認証を利用していない場合、BuisinessManagerでもユーザ作成・権限付与出来ます

#### マーチャントツールのメニューたち
<img width="1092" alt="スクリーンショット 2019-12-27 9.30.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309797/873ea498-3e4d-7281-e781-aebd07917a15.png">

#### 管理ツールのメニューたち
<img width="1018" alt="スクリーンショット 2019-12-27 9.28.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309797/0dc32f95-e710-9d70-cf39-719678a72dd1.png">
パッと見ていただくと、開発者向け、管理者向け機能が混在しているのがわかるかと思います。

##### 商品とカタログ（マーチャントツール）
名の通り、いわゆるカタログ（カテゴリや商品）を管理出来ます。

##### オブジェクト（管理ツール）
Salesforceに携わっている方にはお馴染みのオブジェクトです。
CommerceCloudにも標準（システム）オブジェクトとカスタムオブジェクトがあります。

ECサイトに必要なオブジェクトはシステムオブジェクトとして一通り用意されていますので、必要に応じて項目の追加、もしくはカスタムオブジェクトの追加を行います。
カスタムオブジェクトにはレコード保有上限（４０万件）があるので、設計時には注意が必要です。
各種制限は「クォータ」と呼ばれ、管理ツール内のメニューから確認可能です。コア側の組織の制限的なものですね。

ちなみに、参照関係項目的なものはないのですが、システムオブジェクトのデータはXMLで構造化されて出力されます。
これがまたわかりづらく、オブジェクトとしては独立している（ように見える）のですが、データ上紐付いている、ということが結構あります。ER的なものや各システムオブジェクトレコードが作成されるタイミングをまとめたヘルプなどもないので、このへんは結構苦しかったりもします。

ちなみに各種レコードや設定のインポートはXML形式です~~（苦行！！）~~
カタログはSpring'20? でCSVでのインポートが可能になるとか（神！！）
→（追記）商品のCSVインポートは可能になりましたが、カテゴリの割り当てなどはできないため、どこで苦労するのか、という機能なので、一長一短ですね。。

サンプル（この１オーダーの下に５つくらいのオブジェクトレコード情報が入ってます）
![おーだXML.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309797/907e2ac5-7e84-7049-b829-b1329cc563da.png)


##### キャンペーン・プロモーション・クーポン（マーチャントツール）
ECサイトでよく見る、XXキャンペーンだったり、クーポンだったりを管理出来ます。
プロモーションはいわゆる、XX円以上お買い上げで（割引・XXをプレゼント・配送料無料）などを管理し、
クーポンはクーポン番号を管理します。それらを取りまとめているのがキャンペーンになります（いつからいつまで、誰をターゲットにするのかなどなど）

##### 各種インポート・エクスポート（両方）
レコードやメタデータ（設定）のエクスポートが出来ます。
サイトのエクスポートなどはグローバルエクスポートが可能で、同一インスタンス間でエクスポートしたファイルの共有も可能です（変更セットの送信が不要なイメージ）

# サイトのアーキテクチャ
アーキテクチャにはSiteGenesis2（SG2）とStoreFrontReferenceArchitecture（SFRA）の2種類があります。
ちょっと語ると長くなるので、今回は割愛。ちなみにSFRAが新しく、新規導入はこちらが（一応）推奨です。新しい、ということはそういうことですよ（察してください）

# 開発の流れ
## SIG環境からPIG環境へ
<img width="762" alt="スクリーンショット 2019-12-27 18.46.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309797/abbc55e4-149a-c485-a8a8-45117598f491.png">

各Sandboxで開発をし、Stagingへデプロイし、Stagingからは、Development、Productionへのレプリケーション機能でリリースを実施します。レプリケーションはクリックだけで実施可能です。

## 開発者１名につき１Sandboxを準備してもらいましょう
これがないと、つらい思いをします（私も現在進行系で、、ｗ）
Salesforce社もこちらを推奨しています。これもまたなぜ、を書くと長いので割愛、、

従来、Sandboxを１つずつ追加購入という形式でしたが、On-Demand-Sandboxの登場により、このあたりは多少やりやすくなりそうです。On-Demand-Sandboxは、従量課金制のScratchOrgのようなものと解釈しています。HerokuのAddonクレジット的なものを購入しておき、利用した分だけ課金される仕組みです。まだ私も利用したことはないのですが、B2C CommerceCloudはそれなりに開発規模が大きくなるとおもうので、こちらはかなり有用かなと思います。

[On-Demand-Sandboxの詳細](https://help.salesforce.com/articleView?id=b2c_commerce_19_9_samdboxes.htm&type=5)

## ソースコード
カートリッジと呼ばれる、ソースコード郡が存在しており、CommerceCloud標準で用意されているカートリッジがあり、拡張する場合は、カスタムカートリッジやサードパーティのカートリッジ（リンクカートリッジ）を適用し、カスタマイズ開発を実施します。
実際のソースコードは、ISMLというマークアップと、クライアント・サーバーサイドのJS、CommerceCloudが用意しているライブラリを利用して開発してきます

CommerceCloudの標準提供のソースコードや拡張カートリッジはGithubで限定公開されておりますが、xchangeからの申請が必要なため、開発に携わらないと参照不可です。。Stagingデプロイに利用するBuildSuiteなんかもここに入っています。

[SFRAの場合のカートリッジ構成](https://documentation.b2c.commercecloud.salesforce.com/DOC1/index.jsp?topic=%2Fcom.demandware.dochelp%2FSFRA%2FSFRAOverview.html)

### サードパーティが提供するカートリッジ
AppExchange的なものです。現在CommerceCloudのサードパーティの機能もAppExchangeに掲載されるようにはなるようです。
ちなみに、リンクカートリッジにはGMOPaymentやPaypal、AmazonPayなど、決済系のカートリッジを始め、レビュー機能、CMS機能を提供するカートリッジなどがあります。

## 開発環境
SG2までは、UXStudioというEclipseのプラグインを利用しての開発でしたが、
SFRAでは、Visual Studio Codeが利用できるようになりました！！！！

# 環境取得の障壁
B2C CommerceCloudには、Developer環境やPlayGroundなどは存在しておりません。

CommerceCloudのテスト（パートナー）環境を得るためには、Salesforce社とパートナー契約（通常のコンサルティングパートナーとは別）を結ぶ必要があります。

ただし、パートナーの条件としては、認定B2C CommerceCloudデベロッパー保持者が **4**名在籍している必要があります。ただし環境がなく、出題される問題はかなり細かいレベルなので、公開されている[リファレンス](https://documentation.b2c.commercecloud.salesforce.com/DOC1/index.jsp)をひたすら読み込むだけでは流石に厳しく、おなじみの研修を受講する必要があるかとは思います。

ちなみにこんな問題が出ます。 
 [※受験ガイドから引用](http://tandc.salesforce.com/l/77422/2017-07-19/6cbqhs/77422/106183/CertifiedCommerceCloudDigitalDeveloper_SP17.pdf)

```
1. ビジネスユーザーが、カテゴリページへのリンクを、コンテンツアセットの本文内
に追加したいと考えています。カテゴリの ID は `mens-jeans` です。
正しいリンクを生成するリンク関数はどれですか？
答えを 1 つ選んでください。
A) `$url('Search-Show', 'cgid', 'mens-jeans')$`
B) `$httpUrl('Search-Show', 'cid', 'mens-jeans')$`
C) `$include('Products-Show', 'cgid', 'mens-jeans')$`
D) `$url('Products-Show', 'cid', 'mens-jeans')$`

2. デベロッパーが、おすすめ商品を用いてコンテンツスロットを設定するよう依頼さ
れました。
この要件を満たすために設定できるスロットコンテンツタイプを 2 つ選択してくだ
さい。
答えを 2 つ選んでください。
A) コンテンツアセット
B) HTML
C) 商品
D) 推奨
```

ソースコードレベルの問題から、BusinessManagerでの設定内容まで出てくるので、設定や開発物をBusinessManager、カートリッジ、ストアフロントを通して見ないと、なかなか厳しそうだ、ということがなんとなく伝わったとは思います。

# まとめ
かなり雑多な文章になってしまいましたが、ざっとB2C CommerceCloudについて書いてみました。

今後、SalesforceCMSとの連携など、コア製品との連携が増えていく、というところはありますが、ライセンス体系がどうなるのか、など個人的には気になっているところではあります。現状B2C CommerceCloudだけでもライセンス購入が可能なので、CMSとの連携となると、そっちもライセンス購入するのか？など。
Customer360の発表もあるため、各Platformをシームレスに繋ぐ仕組み、というところが提供されていくのだとは思いますが、Platformが増えたことによる、開発／管理の複雑さ、とこれからどうしていくのかも気になるポイントですね。

折角B2C CommerceCloudに関われているので、今後それぞれの機能を深堀りした記事を書こうかな、と思いますので、過度に期待せずお待ちくださいませ。

それでは、皆様良いお年を！！！