ERP

ERPNext導入ガイド:システム構成、ドキュメントモデル、主要業務フローの実践解説

ERPNextはFrappe Frameworkというメタデータ駆動型のローコードプラットフォーム上に構築されています。この一点を理解するだけで、ERPNext導入の実態がほぼすべて説明できます。つまり、ERPをゼロから書き上げるのではなく、データモデル、フォーム、権限、ワークフローのすべてがドキュメントそのものとして定義されているシステムを「設定」していく作業だということです。このドキュメントモデルを理解することが、「ERPNextを導入した」から「ERPNextで事業を運用している」へと最も早く到達する道です。

本稿では次の3点を扱います。実践的な導入ロードマップ、すべてのモジュール(販売、購買、在庫、会計、人事)の基盤となるドキュメントモデル、そしてどの導入プロジェクトも最終的に正しく設計する必要がある2つの業務フロー——受注から入金まで(Order-to-Cash)と購買から支払いまで(Procure-to-Pay)——のサンプルシーケンス図です。

1. ERPNext導入の実際の進め方

成功するERPNext導入の多くは5つのフェーズを経て進みます。以下の期間は単一法人・中小規模企業を前提としています。複数会社(マルチカンパニー)や製造業中心の導入はこれより長くなります。

フェーズ1 — 業務要件の把握(2〜4週間):各部門のステークホルダーとのワークショップ、現行業務プロセスのマッピング、既存システムの棚卸し、要件定義を行います。このフェーズは、モジュールごとの詳細要件をまとめたビジネス要件定義書(BRD)と、カスタマイズが必要な箇所を特定するギャップ分析で締めくくられます。

フェーズ2 — モジュール設定(4〜8週間):会社レベルの設定、ユーザー管理、勘定科目表の作成から着手します。チームは販売、購買、在庫、会計、人事など必要なモジュールを順に設定し、あわせて顧客・仕入先・品目・価格表・倉庫などのマスタデータを作成します。

フェーズ3 — カスタマイズと連携(3〜6週間):要件把握フェーズで見つかったギャップは、カスタムフィールド、クライアント/サーバースクリプト、カスタム帳票・レポート、承認フロー用のWorkflowドキュメントによって埋められます。ECサイト、決済ゲートウェイ、銀行、配送業者とのシステム連携もこのフェーズで構築・設定します。

フェーズ4 — テストとトレーニング(3〜4週間):設定済みフローの単体テストと結合テストを、実際の取引データを用いたユーザー受入テスト(UAT)と並行して実施します。トレーニングは役割別に行い、財務、営業、倉庫、人事の各チームは扱うDocTypeが異なるため、それぞれ異なる内容の研修が必要です。

フェーズ5 — 本番稼働とサポート:最終的なデータ移行、期首残高の登録、並行運用またはハードカットオーバーを経て本番稼働します。稼働直後(通常1〜2週間)は専任チームによるハイパーケア期間を設け、その後通常サポート体制へ移行します。

合計で、典型的な中堅企業の導入では3〜6か月かかります。変動要因として最も大きいのは常にフェーズ3です——業務プロセスがERPNextの標準機能から乖離するほど、カスタムDocType、スクリプト、ワークフロー状態が必要になり、それぞれに個別のテスト工程が必要になります。

2. ドキュメントモデル:すべてはDocTypeである

Frappe FrameworkにおいてDocTypeは、データベーステーブルの定義、フォーム、権限の境界、そして(多くの場合)業務ロジックを同時に表します。DocTypeを作成すると、Frappeは自動的に対応するテーブル(接頭辞tabが付き、Sales OrderというDocTypeはtabSales Orderテーブルに対応します)、一覧ビュー、フォームビューを、追加のフロントエンド開発なしに生成します。

利用するだけでなく実際に導入・構築する立場になると、特に重要になる概念がいくつかあります。

  • DocField — DocType内の単一フィールド定義(型、ラベル、バリデーション、権限レベル)。DocTypeの構造とは、DocFieldのリストそのものです。
  • Meta — DocType自体もDocTypeとして保存されます(DocTypeというDocTypeがDocTypeを記述しています)。この自己反映性(reflexivity)こそが、Customize FormがSales Orderのような標準DocTypeにソースコードを一切変更せずフィールドを追加できる理由です——変更しているのはコードではなくメタデータだからです。
  • Child Table / Table DocTypeistableとして定義されたDocTypeで、親ドキュメントの中にネストされた形でのみ存在し、独自の一覧ビューを持ちません。Sales Order ItemSales Orderの子テーブルであり、各行が1つの明細行に対応します。
  • Link Field — 名前で他のDocTypeを参照するフィールドで、外部キーのような役割を果たします。Sales OrderはCustomerに、Sales Order ItemはItemにリンクするといった参照関係を、手書きのJOINなしに構築できます。
  • Submit可能なドキュメントとdocstatus — Sales Order、Delivery Note、Purchase Invoiceのようなトランザクション系DocTypeにはdocstatusフィールドがあります:0=下書き(Draft)、1=提出済み(Submitted)、2=取消(Cancelled)です。提出(submit)こそが在庫移動や仕訳(GL)計上といった後続処理のトリガーであり、提出済みドキュメントはほぼ不変になります。これがERPNextの会計を、編集可能なスプレッドシートではなく監査証跡(audit trail)のあるものにしている理由です。
  • 採番シリーズ(Naming series) — ドキュメントIDの生成方法を制御します(Sales OrderであればSO-.YYYY.-.#####など)。会社や会計年度ごとに設定できます。
  • Workflow — これ自体もDocTypeであり、コードを書かずに対象DocTypeの上に承認ステータス(下書き→承認待ち→承認済み)を追加するために使います。

ドキュメントモデル図:メタデータ層

classDiagram
    class DocType {
        +name: string
        +module: string
        +istable: bool
        +is_submittable: bool
        +autoname: string
    }
    class DocField {
        +fieldname: string
        +fieldtype: string
        +label: string
        +reqd: bool
        +options: string
    }
    class Document {
        +doctype: string
        +name: string
        +docstatus: int
        +owner: string
        +validate()
        +on_submit()
        +on_cancel()
    }
    class Workflow {
        +document_type: string
        +states: WorkflowState[]
        +transitions: WorkflowTransition[]
    }

    DocType "1" --> "*" DocField : defines
    DocType "1" --> "*" Document : instantiates
    Workflow "1" --> "1" DocType : governs
    Document "1" --> "*" Document : child table rows

ドキュメントモデル図:販売サイクルのデータ

erDiagram
    CUSTOMER ||--o{ SALES_ORDER : places
    SALES_ORDER ||--|{ SALES_ORDER_ITEM : contains
    ITEM ||--o{ SALES_ORDER_ITEM : referenced_by
    SALES_ORDER ||--o{ DELIVERY_NOTE : fulfilled_by
    DELIVERY_NOTE ||--|{ DELIVERY_NOTE_ITEM : contains
    SALES_ORDER ||--o{ SALES_INVOICE : billed_by
    SALES_INVOICE ||--|{ SALES_INVOICE_ITEM : contains
    SALES_INVOICE ||--o{ PAYMENT_ENTRY : settled_by
    SALES_INVOICE ||--o{ GL_ENTRY : posts
    DELIVERY_NOTE ||--o{ STOCK_LEDGER_ENTRY : posts

この図の矢印はすべて、メタデータで定義されたLink Fieldまたは子テーブル関係であり、手書きのJOINではありません。だからこそ、Customize Form、Report Builder、Query Reportツールは、開発者がSQLを書くことなくこれらの関係をたどることができるのです。

3. サンプルシーケンス図:受注から入金まで(Order-to-Cash)

これは要件把握ワークショップで最も時間をかけて議論されるフローです。「いつ収益を認識するか」「いつ在庫が倉庫から出るか」は、多くの場合、顧客の実際の業務プロセスがERPNextの標準フローと最も乖離する部分だからです。

sequenceDiagram
    actor Customer as 顧客
    actor SalesUser as 営業担当者
    participant ERPNext as ERPNext (Frappe)
    participant Warehouse as 倉庫担当者
    actor Accounts as 経理担当者

    Customer->>SalesUser: 見積を依頼
    SalesUser->>ERPNext: Quotationを作成
    ERPNext-->>SalesUser: Quotation (docstatus=0 下書き)
    SalesUser->>Customer: Quotationを送付
    Customer->>SalesUser: 承認

    SalesUser->>ERPNext: QuotationからSales Orderを作成
    ERPNext-->>SalesUser: Sales Order (下書き)
    SalesUser->>ERPNext: Sales Orderを提出
    ERPNext->>ERPNext: docstatus 0 → 1 (提出済み)
    ERPNext-->>Warehouse: 出荷可能な受注として表示

    Warehouse->>ERPNext: Sales OrderからDelivery Noteを作成
    ERPNext-->>Warehouse: Delivery Note (下書き)
    Warehouse->>ERPNext: Delivery Noteを提出
    ERPNext->>ERPNext: Stock Ledger Entryを記録(数量 -N)
    ERPNext->>ERPNext: Sales Orderの配送済み割合を更新

    Accounts->>ERPNext: Delivery NoteからSales Invoiceを作成
    ERPNext-->>Accounts: Sales Invoice (下書き)
    Accounts->>ERPNext: Sales Invoiceを提出
    ERPNext->>ERPNext: GL Entryを記録(借方:売掛金 / 貸方:収益)

    Customer->>Accounts: 支払いを実行
    Accounts->>ERPNext: Sales Invoiceに対しPayment Entryを作成
    ERPNext->>ERPNext: GL Entryを消込し、未回収額をクローズ
    ERPNext-->>Accounts: 請求書ステータス = 支払済み

フェーズ2の設定時に顧客と明示的に確認しておくべき点:

  • Delivery Noteは任意です。 サービス業であればSales OrderからSales Invoiceへ直接進むことができます。ドキュメントモデルとして在庫ステップを強制する仕組みはありません。
  • トリガーとなるのは「提出(submit)」であり「保存(save)」ではありません。 下書き状態(docstatus=0)のドキュメントは自由に編集でき、台帳には一切影響しません。これは最もよくあるトレーニング上のギャップです——Delivery Noteを「保存」しただけのユーザーが、なぜ在庫が動かないのか戸惑うケースがよくあります。
  • 配送済み割合・請求済み割合はSales Order上の自動計算フィールドで、関連ドキュメントが提出されるたびに自動更新されます。これが過剰出荷(over-delivery)や過剰請求(over-billing)を防ぐガードレールの仕組みです。

4. サンプルシーケンス図:購買から支払いまで(Procure-to-Pay)

sequenceDiagram
    actor Dept as 依頼部門
    actor Buyer as 購買担当者
    participant ERPNext as ERPNext (Frappe)
    actor Supplier as 仕入先
    participant Warehouse as 倉庫担当者
    actor Accounts as 経理担当者

    Dept->>ERPNext: Material Requestを作成
    ERPNext-->>Buyer: Material Requestが承認待ちに

    opt 複数仕入先を比較する場合
        Buyer->>ERPNext: Request for Quotation (RFQ) を作成
        ERPNext-->>Supplier: RFQを送付
        Supplier->>ERPNext: Supplier Quotationを提出
        Buyer->>ERPNext: Supplier Quotationを比較
    end

    Buyer->>ERPNext: Purchase Orderを作成(RFQまたはMaterial Requestから)
    ERPNext-->>Buyer: Purchase Order (下書き)
    Buyer->>ERPNext: Purchase Orderを提出
    ERPNext->>Supplier: POを発行

    Supplier->>Warehouse: 商品を出荷
    Warehouse->>ERPNext: Purchase OrderからPurchase Receiptを作成
    Warehouse->>ERPNext: Purchase Receiptを提出
    ERPNext->>ERPNext: Stock Ledger Entryを記録(数量 +N)
    ERPNext->>ERPNext: POの受領済み割合を更新

    Accounts->>ERPNext: Purchase ReceiptからPurchase Invoiceを作成
    Accounts->>ERPNext: Purchase Invoiceを提出
    ERPNext->>ERPNext: GL Entryを記録(借方:費用/在庫 / 貸方:買掛金)

    Accounts->>ERPNext: Purchase Invoiceに対しPayment Entryを作成
    ERPNext->>ERPNext: GL Entryを消込し、未払額をクローズ
    ERPNext-->>Supplier: 支払い完了

このフローを左右する、要件把握段階で明確にしておくべき2つの設定判断:

  • RFQ / Supplier Quotationの比較は任意です。 事前交渉済みの仕入先や単一調達先しかない組織では、この手順を丸ごと省略し、Material RequestからPurchase Orderへ直接進めます。
  • Purchase ReceiptとPurchase Invoiceの順序は固定ではありません。 商品到着前に請求する(invoice-first)組織もあれば、先に受領する(receive-first)組織もあります。ERPNextは両方に対応しており、Buying Settingsでデフォルトを設定できますが、個別取引ごとに例外を許容できます。

5. 導入チェックリストへの示唆

ドキュメントモデルはモジュールを横断して一貫しているため、導入作業の大部分は新規設計というより、パターンの繰り返し適用です。

  1. 各業務プロセスをドキュメントチェーンにマッピングする——上記2つの図と同じ要領で。どのステップが必須で、どのステップが任意で、どのステップに承認用のWorkflow DocTypeを重ねる必要があるかを特定します。
  2. 提出のゲート条件を決める。 提出可能なDocTypeごとに、誰が提出権限を持ち、提出前に何が真であるべきか(在庫が確保されているか、与信枠を確認したか、予算が承認されているか)を合意します。
  3. フォークせず拡張する。 並行する独自のカスタムDocTypeを作るよりも、Customize Form(標準DocTypeへのDocField追加)を優先しましょう。これにより標準レポートとの互換性や将来のERPNextアップグレードへの追随性が保たれます。
  4. 本番稼働前に採番シリーズと番号体系を確定させる。 実際の取引が発生した後にシリーズを変更するのは大きな混乱を招きます。フォーマット(SO-.YYYY.-.#####など)はフェーズ5ではなくフェーズ2で合意しておきましょう。
  5. 単体のDocTypeごとではなく、連結されたドキュメントチェーン全体をエンドツーエンドでテストする。 ERPNext導入のUAT不具合の多くは、単一フォーム内ではなく、ドキュメント間の受け渡し部分で発生します(例:Sales Orderの在庫引当ロジックが倉庫設定と食い違い、Delivery Noteが提出できないなど)。

ドキュメントモデルを正しく設計できれば、上記のシーケンス図は単なる「ERPNextの動き方」ではなく、「あなたのビジネスがすでに動いている姿」をFrappeのメタデータで表現したものになります。


出典: