3つの改善事例
freeeでは、「クラウド会計ソフトfreee」をはじめとする自社プロダクトの情報をSalesforceにリアルタイムでAPI連携しています。また、プロダクトの情報を分析している分析データベースにて集計した情報も、毎日SalesforceにAPI連携しています。
触ったことのない方はイメージが湧きづらいかとは思いますが、Salesforceは簡単に言うと、データベースをノンエンジニアにもわかりやすく可視化したものです。リレーショナル・データベースで言うところのテーブルがオブジェクトと呼ばれ、カラムが項目となっています。ユニークキーによる一意制約や必須制限の設定、オブジェクト間のリレーションシップを作ることもできます。
ここからはfreeeにおけるSalesforceの改善事例をご紹介します。
ワークフローによる項目自動更新
よく、「Salesforce上に存在する項目の、値が変わった日付を取得したい」という相談を受けます。素直に考えた場合、連携元から更新日付を連携しますが、そのためにはエンジニアによるコードの修正やリリースが必要になります。しかし実は、ノンコーディングで日付を取得する手段があるのです。それがワークフローの機能になります。
ワークフローは一つのオブジェクトに対して条件を満たしたときに、設定したアクションを行える機能です。対象のオブジェクトを選ぶ(図1)と、条件の設定画面(図2)が表示されます。
ここでは項目の入力内容を一つひとつ設定することもできますし、数式によって条件を表現することも可能です。AND条件やOR条件も使えるので、比較的自由に条件を設定することができます。条件を設定したら、次にアクションを指定します(図3)。
ここではTODOの設定や、メールアラートを送る設定ができます。日付を取得したいといった要件を満たすには、項目自動更新を選びます。どの項目にどんな値を設定するか、指定することができます(図4)。
コーディングすることなく、簡単に日付を取得することができました。この機能は便利なので重宝しています。
カスタムオブジェクトとトリガーを駆使した顧客管理
Salesforceの良いところはSQLを書けないノンエンジニアでも、オブジェクトを結合したレポーティングやグラフ化ができることです。セールスのメンバーでも容易にレポートを作成して、自分たちの成績をウォッチすることができます。エンジニアの手を借りることなく、取得したい数字をSalesforce上で見られるのはとても便利です。
しかしこのレポーティング、以前のfreeeでは課題がありました。それは税理士事務所と顧問先の関連をSalesforce上で正しく確認できないということでした。
ここでいう税理士事務所と顧問先の関係は、税理士さんが経理業務を代行したり、帳簿の管理をしたりすることです。
freeeには認定アドバイザー制度があり、freeeを利用している税理士事務所も多数あります。通常は税理士さんが顧問先に赴くなどしてさまざまな業務を行いますが、freeeを利用することで取引内容などをクラウド上でいつでもどこでも確認可能になる制度です。
その顧問先もfreeeを利用している場合、パートナーセールスチームがサポートをするのですが、その所属情報がSalesforce上では全て事業所の情報を登録するオブジェクト「取引先」になってしまっていました。そこから関連を見いだすことができなかったのです。そのため、パートナーセールスチームは顧問先の情報をスプレッドシートで管理して、フォローアップを行っていました(図6)。
しかしそれではかなり大変でした。Salesforceの強みであるレポーティングもできない状態で、その上マンパワーによる管理では間違いが起こる可能性もあります。
そこで、Salesforceの「カスタムオブジェクト」と「トリガー」機能を利用してこの問題を解決しました。カスタムオブジェクトとは、Salesforceが標準で用意しているオブジェクトのほかに、自由に作成できるオブジェクトのことです。トリガーとは、オブジェクトの更新のタイミングで発火するプログラムのことです。こちらはSalesforce独自の言語であるApexで記述します。
freeeのプロダクト上で税理士事務所と顧問先の関連ができると、Salesforceの顧問先の取引先にある税理士事務所番号というカスタム項目に税理士事務所の取引先のIDが入るようになっています。そこで、取引先の税理士事務所番号が更新されることをトリガーにして処理をします。新規に税理士顧問先というカスタムオブジェクト作成し、その税理士顧問先の顧問先という項目に顧問先の取引先のIDをセットします。そして税理士顧問先の税理士事務所という項目に税理士事務所番号に登録された、税理士事務所の取引先のIDをセットします。
この流れを表したのが以下のコードです。
// サンプルコード AdvisorClient__c advisorClient = new AdvisorClient__c(); advisorClient.Account__c = accountid; advisorClient.Advisor__c = advisorid; insert advisorClient;
たったこれだけで、税理士事務所と顧問先をつなぐことができました。カスタムオブジェクトで関連付けることによって、Salesforce上でレポーティングすることができるようになったのです(図7)。
Visualforceページを利用したキュー適用
Salesforceには、独自の画面を開発する機能があります。MVCパラダイムを利用しており、Visualforceページ(以降、Visualforce)と呼ばれています。前述のワークフローやトリガーでほとんどのカスタマイズは賄えるため、めったにVisualforceを利用することはありませんが、今回freeeで作成した機能を紹介します。
Salesforceにはキューという機能があり、所有者を特定のSalesforceユーザーに設定するのではなく、キューを指定して利用します。キューをビューで表示するとキューに入っているレコード一覧が表示され、レコードを選んで担当者になるボタンを押すことでレコードを所有できます。そんなキューの機能ですが、リードやケースと呼ばれるSalesforceの標準オブジェクトとカスタムオブジェクトでのみ利用できます。
freeeの営業活動は取引先と取引先責任者をベースに行っていたため、キューの機能を利用できずスプレッドシートで管理しており、誰がどの事業所に営業活動を行っているかなどがSalesforce上でわからないといった課題がありました(図8)。
そこでVisualforceを使用し、とある機能を作成しました。それは、Salesforce上にすでに存在するレポートを選択すると、その実行結果のレコードに関連する取引先責任者にコールリストというカスタムオブジェクトをひも付け、そのカスタムオブジェクトをキューに入れるというものです(図9)。
カスタマイズした画面を作成して検索条件などを指定しても良かったのですが、Salesforceユーザーがより自由に検索をできるように、Salesforce標準のレポートを使って条件抽出できる実装にしました。
// レポートを実行するサンプルコード
reportResults = Reports.ReportManager.runReport(reportSelected, true);
// カラム名を取得するサンプルコード
List<String> colNames = reportResults.getReportMetadata().getDetailColumns();
Map<String, Reports.DetailColumn> reportExtendedMetadata = reportResults.getReportExtendedMetadata().getDetailColumnInfo();
// レポートの実行結果の詳細を取得するサンプルコード
Reports.ReportFactWithDetails factDetails = ( Reports.ReportFactWithDetails )reportResults.getFactMap().get('T!T');
