2011-04-15

Force.com : Visualforce のページから承認プロセスを行いたい


@TODO 一旦投稿。



Visualforce のページから承認プロセスを行いたい



○ Visualforce のページから承認プロセスを行いたい

Ex. @TODO 適当に(あとで修正する
  1. [設定]→[アプリケーションの設定]→[作成]→[ワークフローと承認申請]→[承認プロセス]から[取引先]オブジェクトに対して適当な承認プロセスを作成し、有効にしておく
  2. [取引先]レコードはどこかで作成しておく
  3. [取引先]レコードの[申請][承認][却下][取消]処理を行う画面を作成し、処理を行う

■ Visualforce ページ
<apex:page controller="AccountController" tabStyle="Account">
    <apex:sectionHeader title="[取引先]" subtitle="申請・承認・却下・取消" />
    <apex:pageMessages />
    <apex:form >
        <apex:pageBlock title="xx" mode="edit">
            <apex:pageBlockButtons >
                <apex:commandButton action="{!apply}" value="申請" />
                <apex:commandButton action="{!approve}" value="承認"  />
                <apex:commandButton action="{!reject}" value="却下"  />
                <apex:commandButton action="{!cancel}" value="取消"  />
            </apex:pageBlockButtons>
            <apex:pageBlockSection title="取引先情報">
                <apex:outputField value="{!dto.account.name}"/>
                <apex:outputText value="ステータス( {!dto.status} )" id="status" />
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>


■ AccountController クラス
public with sharing class AccountController {

    /** 画面表示クラス */
    public class DTO {
        public Account account { get; set; }
        public String status { get; set; }

        public DTO(){
            account = new Account();
            status = '';
        }
    }
    public DTO dto { get; set; }

    /**  コンストラクタ */
    public AccountController() {
        Id id = ApexPages.currentPage().getParameters().get('id');
        dto = new DTO();
        dto.account = [SELECT Id, Name FROM Account WHERE Id = :id];

        Integer cnt = [SELECT COUNT() FROM ProcessInstance WHERE TargetObjectId = :id AND Status = 'Pending'];
        if(cnt != 0) {
            dto.status = '申請中';
        }
    }

    /** 申請 */
    public PageReference apply() {
        Id id = ApexPages.currentPage().getParameters().get('id');

        Approval.ProcessSubmitRequest request =  new Approval.ProcessSubmitRequest();
        request.setNextApproverIds(new Id[]{UserInfo.getUserId()});
        request.setObjectId(id);
        Approval.ProcessResult result;
        try {
            result = Approval.process(request);
        } catch (System.DmlException e) {
            if(e.getMessage().contains('NO_APPLICABLE_PROCESS')) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, '承認プロセスに該当するレコードではありませんでした.'));
                return null;
            }
        }

        if(result.isSuccess()) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, '申請に成功しました.'));
            dto.status = '申請中';
        } else {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, '申請に失敗しました.'));
        }
        return null;
    }

    /** 承認 */
    public PageReference approve() {
        Id id = ApexPages.currentPage().getParameters().get('id');

        Integer cnt = [SELECT COUNT() FROM ProcessInstance WHERE TargetObjectId = :id AND Status = 'Pending'];
        if(cnt == 0) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, '申請済みのレコードではありません.'));
            return null;
        }
        Id processId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = :id AND Status = 'Pending' LIMIT 1].Id;
        Id workitemId = [SELECT Id FROM ProcessInstanceWorkitem WHERE ProcessInstanceId= :processId LIMIT 1].Id;

        Approval.ProcessWorkitemRequest request = new Approval.ProcessWorkitemRequest();
        request.setAction('Approve');
        request.setNextApproverIds(new Id[]{UserInfo.getUserId()});
        request.setWorkitemId(workitemId);
        Approval.ProcessResult result = Approval.process(request);

        if(result.isSuccess()) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, '承認に成功しました.'));
            dto.status = '';
        } else {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, '承認に失敗しました.'));
        }
        return null;
    }

    /** 却下 */
    public PageReference reject() {
        // @TODO
        return null;
    }

    /** 取消 */
    public PageReference cancel() {
        // @TODO
        return null;
    }
}



◆ ProcessInstance オブジェクト

  • ID
  • TARGETOBJECTID
  • STATUS
  • ISDELETED
  • CREATEDDATE
  • CREATEDBYID
  • LASTMODIFIEDDATE
  • LASTMODIFIEDBYID
  • SYSTEMMODSTAMP
  • @TODO



◆ ProcessInstanceWorkitem オブジェクト

  • ID
  • PROCESSINSTANCEID
  • ORIGINALACTORID
  • ACTORID
  • ISDELETED
  • CREATEDDATE
  • CREATEDBYID
  • SYSTEMMODSTAMP
  • @TODO



◆ Approval オブジェクト

  • ID
  • ISDELETED
  • PARENTID
  • OWNERID
  • CREATEDDATE
  • CREATEDBYID
  • LASTMODIFIEDDATE
  • LASTMODIFIEDBYID
  • STATUS
  • REQUESTCOMMENT
  • APPROVECOMMENT
  • SYSTEMMODSTAMP
  • @TODO



◆ ProcessSubmitRequest クラス

  • @TODO



◆ ProcessWorkitemRequest クラス

  • @TODO



◇ @TODO

  • @TODO な箇所諸々
  • レコードのロック?
  • [申請][承認]処理は確認済み



◇ 環境

  • Salesforce - Developer Edition - API バージョン 21.0



◇ 参考


0 件のコメント:

コメントを投稿