mcpField
F
frappe-core-workflow

frappe-core-workflow

github.com/impertio-studio開発198112 回インストール30 週間前に更新
リポジトリ

frappe-core-workflow について

Frappe 開発者向けのワークフローエンジン解説です。状態、遷移、ロール権限によるドキュメントライフサイクルの管理を説明し、条件判定、承認、ドキュメントステータスの規則も扱います。

主な機能

  1. 01状態とロールによる遷移制御
  2. 02条件によるアクションの絞り込み
  3. 03状態更新とメール通知の設定
  4. 04承認と自己承認ルールの管理
  5. 05ドキュメントステータス遷移の制約説明
  6. 06一般的なワークフローエラーの特定

活用シーン

  1. 01DocType の承認プロセス設定
  2. 02ロールによるドキュメント操作の制限
  3. 03ドキュメント項目に基づく条件付き遷移
  4. 04状態または権限エラーの調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/impertio-studio/frappe_claude_skill_package --skill frappe-core-workflow

インストール後、Claude Code で/frappe-core-workflowを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
.gitkeep
anti-patterns.md
api-reference.md
examples.md

詳細

ワークフローエンジン

Frappe ワークフローエンジンは、設定可能な状態、遷移、ロールベースの権限を通じてドキュメントのライフサイクルを制御するステートマシンです。ドキュメントのステータスがいつ、どのように変更されるか、誰がアクションを実行できるか、各遷移でどのような副作用が発生するかを管理します。

クイックリファレンス

Workflow DocType            → Defines the state machine for a specific DocType
├── states (child table)    → Workflow Document State rows
│   ├── state               → Link to Workflow State
│   ├── doc_status          → 0 (Draft), 1 (Submitted), 2 (Cancelled)
│   ├── allow_edit          → Role that can edit in this state
│   ├── update_field        → Field to update when entering state
│   ├── update_value        → Value to set (literal or expression)
│   └── next_action_email_template → Email Template link
└── transitions (child table) → Workflow Transition rows
    ├── state               → Source state (Link to Workflow State)
    ├── action              → Link to Workflow Action Master
    ├── next_state          → Target state (Link to Workflow State)
    ├── allowed             → Role that can perform this action
    ├── allow_self_approval → Check (default: 1)
    ├── condition           → Python expression (optional)
    └── transition_tasks    → Link to Workflow Transition Tasks
Workflow DocType の主なフィールド
フィールド型用途
workflow_nameData一意の識別子
document_typeLink → DocType対象の DocType
is_activeCheckDocType ごとに有効にできるワークフローは 1 つのみです
workflow_state_fieldDataデフォルト:workflow_state
override_statusCheckワークフローによるリストビューのステータスの上書きを防止します
send_email_alertCheck次に実行可能なアクションを含むメール通知

エンジンの仕組み

1. 有効化とフィールドの作成

is_active = 1 で Workflow を保存すると、次の処理が行われます。

  • 同じ DocType の他のすべてのワークフローが自動的に無効化されます
  • 対象の DocType に非表示の Custom Field(workflow_state_field、デフォルトは workflow_state)が存在しない場合、作成されます
  • フィールドの型は Workflow State への Link で、hidden=1、allow_on_submit=1、no_copy=1 が設定されます
  • ワークフロー状態が空の既存ドキュメントは、現在の docstatus に基づいて状態が設定されます
2. 状態の解決

ワークフロー対象のすべてのドキュメントには、workflow_state フィールドがあります。エンジンは次の手順で利用可能な遷移を解決します。

  1. ドキュメントから現在の workflow_state を読み取ります
  2. transition.state == current_state に該当する workflow.transitions を絞り込みます
  3. ユーザーのロールで絞り込みます:transition.allowed in frappe.get_roles()
  4. 設定されている場合は transition.condition を frappe.safe_eval() で評価します
  5. 条件に一致した遷移を利用可能なアクションとして返します
3. 遷移の適用

apply_workflow(doc, action) が呼び出されると、次の処理が行われます。

  1. DB からドキュメントを読み込みます(最新の状態を取得)
  2. 現在のユーザーが利用できる遷移を取得します
  3. 要求された action に一致する遷移を見つけます
  4. 自己承認を確認します:allow_self_approval=0 かつユーザーがドキュメントの所有者の場合はブロックされます
  5. workflow_state_field に transition.next_state を設定します
  6. 対象の状態に update_field が設定されている場合、そのフィールドを更新します
  7. 遷移タスクを実行します(同期処理を先に実行し、その後 frappe.enqueue で非同期処理を実行)
  8. 遷移元と遷移先の状態の doc_status 値に基づいて、docstatus の変更を処理します
  9. それに応じてドキュメントを保存、送信、またはキャンセルします
  10. ワークフローコメントを追加します

ワークフローと DocStatus の連携

重要:docstatus の遷移はワークフローエンジンが制御します。ワークフローで制御されているドキュメントに対して、doc.submit() や doc.cancel() を直接呼び出してはいけません。これらの処理はワークフローが行います。

DocStatus 遷移ルール
遷移元の doc_status遷移先の doc_statusエンジンのアクション有効?
0(下書き)0(下書き)doc.save()はい
0(下書き)1(送信済み)doc.submit()はい
1(送信済み)1(送信済み)doc.save()はい
1(送信済み)2(キャンセル済み)doc.cancel()はい
2(キャンセル済み)任意ブロックいいえ
1(送信済み)0(下書き)ブロックいいえ
0(下書き)2(キャンセル済み)ブロックいいえ

docstatus が常に前方向にのみ進むよう、状態を定義してください:0→0、0→1、1→1、1→2。 キャンセル済みの状態からの遷移や、送信済みから下書きに戻る遷移は作成しないでください。

送信不可の DocType

対象の DocType が送信不可の場合、すべての状態で doc_status = 0 にする必要があります。エンジンはこれを検証し、送信不可の DocType に doc_status = 1 または 2 の状態があるとエラーを発生させます。

ワークフロー状態

Workflow State は、マスターリストとして使用される独立した DocType です。各状態には次の項目があります。

フィールド用途
state状態の表示名
styleバッジ表示用の CSS クラス(Primary、Success、Warning、Danger、Info、Inverse)
iconFont Awesome のアイコンクラス
状態行のフィールド(ワークフロードキュメントの状態)
フィールド目的
stateワークフロー状態へのリンク
doc_status選択:0、1、または2
allow_editロールへのリンク — この状態でドキュメントを編集できるのはこのロールのみです
update_fieldドキュメントがこの状態に入るときに更新するフィールド
update_value設定する値(文字列、または evaluate_as_expression=1 の場合は Python 式)
is_optional_stateチェック — オプションの状態は get_next_possible_transitions でスキップされます
send_emailチェック(デフォルトは1)— この状態に入ったときにメール通知を送信します
next_action_email_templateメールテンプレートへのリンク
messageメール通知のテキストメッセージ

ワークフロー遷移

各遷移行は、可能なアクションを1つ定義します。

フィールド目的
state遷移元の状態(状態テーブルに存在する必要があります)
actionワークフローアクションマスターへのリンク(例:「承認」、「却下」、「レビュー」)
next_state遷移先の状態(状態テーブルに存在する必要があります)
allowedロールへのリンク — このアクションが表示されるのは、このロールを持つユーザーのみです
allow_self_approvalチェック(デフォルトは1)— 0の場合、ドキュメントの所有者はこのアクションを実行できません
conditionfrappe.safe_eval() で評価される Python 式
transition_tasksワークフロー遷移タスクへのリンク(v15以降)
条件式

条件は、サンドボックス環境で評価される Python 式です。利用可能なグローバル変数:

# Available in condition expressions:
frappe.db.get_value(doctype, name, fieldname)
frappe.db.get_list(doctype, filters, fields)
frappe.session.user
frappe.session.roles  # NOT available — use frappe.get_roles() outside conditions
frappe.utils.now_datetime()
frappe.utils.add_to_date(date, **kwargs)
frappe.utils.get_datetime(datetime_str)
frappe.utils.now()
doc.fieldname  # Access any field on the document (as dict)

条件の例:

doc.grand_total > 50000
doc.department == "HR"
doc.grand_total > 50000 and doc.department != "Finance"

ワークフローアクション

ワークフローアクションマスター

workflow_action_name フィールドのみを持つシンプルな DocType です。一般的なアクションは、承認、却下、レビュー、差し戻し、キャンセルです。遷移を定義する前に、これらを作成してください。

ワークフローアクション DocType

ユーザーの保留中のアクションを追跡します。ドキュメントが、遷移先が設定された状態に入ると自動的に作成されます。

フィールド目的
statusオープンまたは完了
reference_doctypeドキュメントの DocType
reference_nameドキュメント名
workflow_state現在のワークフロー状態
user割り当てられたユーザー
permitted_roles操作可能なロールのテーブル複数選択
completed_byアクションを完了したユーザー
completed_by_role完了に使用したロール

ワークフローアクションはユーザーの「ワークフローアクション」リストに表示され、メール内のリンクから実行できます。

自己承認の制御

def has_approval_access(user, doc, transition):
    return (user == "Administrator"
            or transition.get("allow_self_approval")
            or user != doc.get("owner"))
  • Administrator は設定にかかわらず、常に承認権限を持ちます
  • allow_self_approval = 1(デフォルト)の場合:ドキュメントの所有者は承認できます
  • allow_self_approval = 0 の場合:ドキュメントの所有者は自分のドキュメントを承認できません

判断ツリー

Need workflow on a DocType?
├── Is DocType submittable?
│   ├── YES → States can use doc_status 0, 1, 2
│   └── NO  → ALL states MUST have doc_status = 0
├── Define states → Create Workflow State records first
├── Define transitions → Need Workflow Action Master records first
├── Who can edit in each state? → Set allow_edit per state
├── Need conditional transitions?
│   └── Use Python expressions with doc.field access
├── Need to block self-approval?
│   └── Set allow_self_approval = 0 on specific transitions
└── Need email notifications?
    └── Set send_email_alert on Workflow + email templates on states

よくあるエラー

エラー原因対処方法
WorkflowStateErrorドキュメントに workflow_state が設定されていません作成時にワークフローで初期状態が設定されることを確認してください
WorkflowTransitionError現在の状態またはロールでは無効なアクションです遷移テーブルに必要な経路がすべて含まれていることを確認してください
WorkflowPermissionErrorユーザーに遷移に必要なロールがない、または自己承認が禁止されていますallowed ロールと allow_self_approval を確認してください
"Illegal Document Status"無効な docstatus の遷移です(例:0→2)状態の doc_status 値を修正してください
"Cannot cancel before submitting"下書き(0)からキャンセル(2)への遷移です中間の送信済み(1)状態を追加してください

関連項目

コメント