見出し画像

SalesforceからSmartHRへの連携 supported by notion AI

Salesforceで採用や従業員の管理をしているケースを想定して、SalesforceからSmartHRに従業員情報を送信する機能を作ってみました。

notion AIでベースを作成して、SmartHRのAPIリファレンスと、ネットにある先人の事例を参照しながらだいたい2時間くらいで作ることができました。

<参考>
・遠藤 | シクミヤ様 従業員を新規に追加する - SmartHR API
https://zenn.dev/shikumiya_hata/books/33f44d4f561ec4/viewer/c817c5

・SmartHR API Specifications
https://developer.smarthr.jp/api/index.html

・Salesforceの各種ドキュメント

Notion AIに問い合わせてみる

Notion AIに以下を回答してもらい、たたき台を作ってもらいます。

SmartHRにおけるSalesforceデータ連携フローとApexコードの実装方法

使えそうな部分をピックアップして手順を実行していきます。
そもそも案内されていない情報もありますが、最終的な手順としては以下になりました。

  1. SmartHRでアクセストークンを取得する(案内なし)

  2. Apex アクションを作成する

  3. SalesforceからSmartHRへデータを送信するためのフローを作成する

あとはエラーとか出たら、notion AIにどうすれば良い?って聞きながら進めていきます。

たとえば、Salesforceの開発者コンソールで表示されたエラーについて問い合わせると以下のように返答があります。

このままでは基本的には使えませんが、回答をベースにネットでググったりしていきましょう。

SmartHRでアクセストークンを取得する

SalesforceからSmartHRへのAPI POSTに必要なSmartHR側の初期設定について聞いてみました。

  1. SmartHRにログインし、管理者権限を持つアカウントでログインします。

  2. [「設定」] > [「API」] をクリックします。

  3. [「新しいAPIキーの作成」] をクリックします。

  4. APIキーの名前を入力し、必要に応じて権限を設定します。

  5. [「APIキーを作成」] をクリックします。

  6. 作成されたAPIキーをコピーし、SalesforceのApexコードで使用するために保存します。

これで、SalesforceからSmartHRへのAPI POSTに必要なSmartHR側の初期設定が完了しました。

Apex アクションを作成する

次にApexアクションを作成していきます。ここはそのままでは少し難航しました。
たとえば、Apexアクションをフローで実行する場合は、「@INVOCABLEMETHOD」を利用することが推奨されていました。
ここも、notion AIに「@INVOCABLEMETHODでコードを書いて」という感じで伝えればサンプルコードを出力してくれます。

また、サンプルコードだけではSmartHRに渡すパラメータ値が違ったりするので、そのあたりの修正はネットで検索したり、APIリファレンスを見たりしながら対応していきました。
Sandbox連携のサンプルですがこんな感じです。※本番で利用する場合は、サブドメインや、アクセスキーは直打ちから修正した方が良いです。

public class SmartHRApiIntegration {
    @InvocableMethod
    public static void sendData(List<Staff__c> records) {
        for (SObject record : records) {
            String first_name = (String)record.get('FirstName__c');
            String last_name = (String)record.get('LastName__c');
            String first_name_yomi = (String)record.get('FirstNameYomi__c');
            String last_name_yomi = (String)record.get('LastNameYomi__c');
            String email = (String)record.get('Mail__c');

            sendToSmartHR(
                createPayload(first_name, last_name,first_name_yomi,last_name_yomi,email)
            );
        }
    }

    public static String createPayload(String FirstName, String LastName,String FirstNameYomi,String LastNameYomi, String email) {
        Map<String, Object> payload = new Map<String, Object>();
        payload.put('first_name', FirstName);
        payload.put('last_name', LastName);
        payload.put('first_name_yomi', FirstNameYomi);
        payload.put('last_name_yomi', LastNameYomi);
        payload.put('email', email);
        return JSON.serialize(payload);
    }

    public static void sendToSmartHR(String payload) {
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint('https://<サブドメイン>.daruma.space/api/v1/crews');
        request.setMethod('POST');
        request.setHeader('Authorization', 'Bearer <アクセスキー>');
        request.setHeader('Content-Type','application/json');
        request.setBody(payload);
        HttpResponse response = http.send(request);

        if (response.getStatusCode() != 201) {
            throw new SmartHRApiException('Failed to send data to SmartHR: ' + response.getBody());
        }
    }
    public class SmartHRApiException extends Exception {}  

SalesforceからSmartHRへデータを送信するためのフローを作成する

シンプルに、画面フローでボタンを作成し、Apexアクションを呼び出しているフローです。
結果によってSmartHR連携フラグとかを更新しても良いと思います。

まとめ

この記事のままの手順では一部うまくいかないようになっています。APIの仕様が変わったり、Salesforceの仕様が変わることもあるので、うまくエラーと付き合って実装してもらえたら嬉しいです。notion AIはエラーに対しても良い感じの回答をしてくれますので、そこもぜひ実感してみてください。

また、たぶんnotion AIがなかったらこれを0から実装するのは数日かかっていたと思います。これからもAIとうまく付き合いながら業務改善を進めていきたいと思います。

それではまた来週!

この記事が気に入ったらサポートをしてみませんか?