Salesforce記録：商談の一括コピー

## 背景
友人の会社はSalesforce担当者の離任をきっかけにして、Salesforceの利用を見直したいです。独学経験しかもっていない自分が頼まれて、はじめのSalesforce実務経験をかせぎました。記念品として記録します。

### 課題説明
会社はある年間更新のサービスを販売しています。契約期間切れの前に、お客さんに連絡して、契約更新を促します。これは商談業務の主な内容です。

毎月月初、来月契約期間切れの「既存商談」を検索して、CSVを出力します。そのCSVデータを加工して、新規商談のデータを作成します。新規商談のデータをツール経由してSalesforceにアップロードします。

お客さんと連絡して、継続される場合、商談からオンライン請求の情報を作成して自動メールを発信します。

新規商談作成は明らかに手間が多いです。まずこの点を解決してみましょう。

### 改善案
商談一覧に一括コピーを設けるようにします。来月契約期間切れの商談を検索して、複数選択して、一括コピーボタンで、新しい商談を一括作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/88c420fb-b249-02f4-5a9f-51b125056719.png)

コピー作成時、商談名称の後ろ3桁の数字を足す１にします。契約開始日の年を足す１にします。などCSV加工と同じく、細かい編集ロジックが必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/be9fc450-8ab5-0c18-7653-b2a22b779941.png)

## Sandbox作成
Salesforce Sandbox は、あらゆるメタデータや顧客データを含む本番環境の完全なコピーです。 追加の設定や管理なしで安全に利用でき、 組織や企業の実業務を妨げることなく変更を行えます。参考: https://www.salesforce.com/jp/products/platform/products/sandbox/

いきなり本番に手を入れると問題を起こしやすいから、開発環境でやりましょうということです。
Salesforceにログインした後、右上の歯車アイコンをクリックして、「設定」メニューを押して、フリー検索にSandboxを入力して、表示される環境ー＞Sandboxをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/536c8a37-5ce0-1d5d-0bfd-e3e512ef09ad.png)

いくつかの画面遷移の後、以下のSandbox一覧画面が表示されます。新規ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/48d7a3e9-02a5-3539-424c-c391b4eba076.png)

名称などを入力して、次へボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/62dcb975-01fc-9c86-2108-18d10dc5d1f5.png)

起動時実行するApexクラスの設定みたいです。あまり知らないから無視して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/f68dfa58-1a7c-b048-3e47-49659d22beee.png)

しばらくの後一覧画面に作成できたSandboxが表示されます。ログインリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/d0bd7e92-e5e7-24cf-57bb-f15f9c0f1a42.png)

表示されるURLをメモします。ログインユーザは本番ユーザ名＋Sandbox名になります。パスワードは本番と同じです。Sandbox初回ログイン時、二段階認証が発生します。オーナーの承認が必要です。そのあとはもう大丈夫で、開発者のみの世界になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/1e4218fd-d1bf-764d-dc4b-c2a340924da0.png)

上記の手順を友人の会社の担当者に渡して、SandboxのURL・アカウント・パスワードを入手して作業開始です。

## 開発記録 ～ 基本的な流れ
### フローを定義する
歯車アイコン⇒設定メニュー⇒「フロー」で検索⇒プロセスの自動化・フローを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/8df908d5-980f-0dc1-92f9-870ba8069fba.png)
新規フローボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/9f7cbefc-e73e-f50f-4de0-f6d82ec5c696.png)

画面フローを選択して、作成ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/82c84da3-f3c9-a13e-faa3-4d5c78b68441.png)

「＋」のアイコンをクリックして、プロセスを追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/6ceb4f5e-074a-ef89-a7a1-261750df4c11.png)

最終完成のフローは以下のようになります。左上のボタンで各種リソースを確認・編集できます。※このボタンを見つかるまで２日間かかりました。:relaxed:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/43acacb6-367c-6920-4883-b86b4ddd7956.png)


### ボタンを定義する
歯車アイコン⇒設定⇒「オブジェクト」で検索⇒オブジェクトマネージャーをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/a2c265f1-0926-1421-78c8-d912471e78df.png)

オブジェクトマネージャー一覧画面から、商談を探して開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/898d087e-73c7-b430-bef1-0d8f58ffe308.png)

詳細画面に「ボタン、リンクおよびアクション」で一括コピーボタンを定義します。「リストビューボタンレイアウト」でボタンを商談一覧画面に配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/825dd013-1968-c916-10b7-00ca6a275648.png)

ボタンの定義には、表示種別でリストボタン＆複数レコード選択用とします。また、前に保存したフローの名称を利用して、「/flow/フロー名称」で登録します。これでボタン押すとき、フローを呼び出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/d66811d5-de75-9b5b-5c97-e27d42233ed8.png)

商談のリストビューで、一括コピーボタンを表示するように選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/eeed73d9-2b57-7bc4-db35-9920a1466ac7.png)

## 開発記録 ～ フロー定義の詳細
これからフロー定義の各種リソースの詳細に説明します。

#### ids変数
いくつかの資料からみると、idsの名称はきまりみたいです。一覧から複数選択されたidをコレクションの形でフローに渡します。それを受取るのは、ids変数です。別名したり、大文字小文字違ったり、などはだめです。この変数はフロー処理にとって唯一のINPUTです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/cd4fa59c-5094-54db-f854-a663ce62ab3f.png)

### 割り当て
Countという数字変数を定義して、idsのサイズをCountに代入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/65edf633-fb45-565b-d011-929100840877.png)

### 分岐
選択条件プロセスに、Count変数により処理を分岐します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/718df583-aae3-430b-af39-76a83f596ca3.png)

### ゼロ件エラー
未選択場合、エラー画面を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/150b0e19-e661-658f-09fe-4bc0a949b00d.png)

### 選択レコードをループ
件数有りの場合、idsに対してループします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/97d62287-6926-8b3e-ae0a-0670a9c370ff.png)

### 商談オブジェクト取得
Idがループ中の項目と一致する商談を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/6b7469b2-c23c-897a-e804-08227c59cbf7.png)

### 新規商談オブジェクト作成
取得した商談オブジェクトの項目を新しい商談の項目に代入して、コピー作成を実現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/7ef35604-02d9-b94f-798f-ba3ab240acbd.png)

### 商談名と契約開始日の処理
商談名と契約開始日は、前年度のものを数式で加工します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/6a2765d3-5050-1535-b062-63989443419c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/8f5fc479-575c-9156-6bd1-372de73f952e.png)

## 変更セットでリリース

### 送信変更セットで差分作成

送信変更セットは、ログインしている Salesforce 組織で作成された、他の組織に送信するための変更セットです。一般に送信変更セットは、Sandbox でカスタマイズ内容を作成およびテストした後に本番組織に送信するために使用されます。送信変更セットを別の組織に送信しても、その組織で変更が実装されることを保証するものではありません。変更が適用されるには、送信先組織が変更セットをリリースする必要があります。参考：https://help.salesforce.com/s/articleView?id=sf.changesets_about_outbound.htm&type=5

歯車アイコン・設定⇒変更セットで検索⇒送信変更セットを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/b555cb88-75b4-11bc-257b-d04ff6ea48a3.png)

Sandboxで作成したものを全部選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/a2142a24-4281-d033-1d21-c4ec7672a15e.png)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
以下の内容は本番リリース後、再度更新します。
### 送信変更セットをアップロード
#### 本番環境でリリースOKを設定する
#### Sandbox環境でアップロードボタンを押す
### 受信変更セットで本番リリース
本番環境から、受信した変更セットを選んで本番リリースします。
参考
https://opt-p.co.jp/blog/salesforce-sfdc/post-1537/