2018-08-16

SalesforceのワークフロールールをApexトリガに変換するヤーツ作った

Apexをローカル環境で動かすのめっちゃムズイし現実逃避したくなったので SalesforceのワークフロールールをApexトリガに変換するヤーツを作りました。

できること

使い方

$ npm install -g salesforce2apex

からの

$ salesforce2apex -o {object名} -f {ワークフローのメタデータへのパス}

って感じで叩くと標準出力にトリガーのコードが出力されます。トリガー名は{オブジェクト名のCamelCase} + Triggerになります。

例えばこんな感じなワークフローメタデータを食わせると

<?xml version="1.0" encoding="UTF-8"?>
<Workflow xmlns="http://soap.sforce.com/2006/04/metadata">
    <fieldUpdates>
        <fullName>test</fullName>
        <field>TextTest__c</field>
        <formula>iF(true, &quot;BBB&quot;, &quot;CCC&quot;)</formula>
        <name>test</name>
        <notifyAssignee>false</notifyAssignee>
        <operation>Formula</operation>
        <protected>false</protected>
        <reevaluateOnChange>true</reevaluateOnChange>
    </fieldUpdates>
    <fieldUpdates>
        <fullName>test2</fullName>
        <field>TextTest__c</field>
        <formula>&quot;AAA&quot;</formula>
        <name>test2</name>
        <notifyAssignee>false</notifyAssignee>
        <operation>Formula</operation>
        <protected>false</protected>
        <reevaluateOnChange>true</reevaluateOnChange>
    </fieldUpdates>
    <rules>
        <fullName>TestWorkFlow</fullName>
        <actions>
            <name>test</name>
            <type>FieldUpdate</type>
        </actions>
        <active>true</active>
        <criteriaItems>
            <field>TestObject__c.TextTest__c</field>
            <operation>equals</operation>
            <value>AAA</value>
        </criteriaItems>
        <triggerType>onAllChanges</triggerType>
    </rules>
    <rules>
        <fullName>TestWorkFlow2</fullName>
        <actions>
            <name>test2</name>
            <type>FieldUpdate</type>
        </actions>
        <active>true</active>
        <criteriaItems>
            <field>TestObject__c.TextTest__c</field>
            <operation>equals</operation>
            <value>BBB</value>
        </criteriaItems>
        <triggerType>onAllChanges</triggerType>
    </rules>
</Workflow>

こういうApexトリガが出力されます(インデントの調整が甘いです)

trigger TestObjectTrigger on TestObject__c (before update, before insert) {
  if (Trigger.isBefore && (Trigger.isInsert || Trigger.isUpdate)) {
    for (TestObject__c newRecord : Trigger.New) {
      TestObject__c oldRecord = Trigger.oldMap.get(newRecord.id);
      if (newRecord.TextTest__c == 'AAA') {
        String tmp1;
        if (true) {
          tmp1 = 'BBB';
        } else {
          tmp1 = 'CCC';
        }
        newRecord.TextTest__c = tmp1;
      }
      if (newRecord.TextTest__c == 'BBB') {
          newRecord.TextTest__c = 'AAA';
      }
    }
  }
}

仕組み

補足

このエントリーをはてなブックマークに追加