frappe/erpnext

⭐ 26,873 🍴 8,808 Python📄 GNU General Public License v3.0 GitHubで見る →

主な特徴

  • **会計**: 取引の記録から財務報告の分析まで、キャッシュフロー管理に必要なすべてのツール
  • **受注管理**: 在庫レベルの追跡、在庫補充、受注、顧客、サプライヤー、配送、納品管理
  • **製造**: 生産サイクルの簡素化、材料消費の追跡、生産能力計画、下請けの処理など
  • **資産管理**: 購入から廃棄まで、ITインフラから設備まで、組織全体の資産を一元管理
  • **プロジェクト**: 内部・外部プロジェクトを時間、予算、収益性を考慮して納品
  • **CRM**: リード・機会の追跡、顧客関係管理
  • **人事**: 給与計算、採用、従業員管理
  • **サポート**: 問題追跡とチケット管理
  • **多言語サポート**: 28以上の言語に対応
  • **マルチカーレンシー**: 複数通貨のサポート
  • **地域対応**: 各国の税制や規制に対応したローカライゼーション

リポジトリ解析: frappe/erpnext

基本情報

  • リポジトリ名: frappe/erpnext
  • 主要言語: Python
  • スター数: 26,873
  • フォーク数: 8,808
  • 最終更新: 活発に更新中(v15.x.x-develop)
  • ライセンス: GNU General Public License v3.0
  • トピックス: ERP、オープンソース、ビジネス管理、会計、在庫管理、製造、CRM、エンタープライズ

概要

一言で言うと

強力で直感的なオープンソースERPシステムで、企業のあらゆるビジネスプロセスを統合管理できる100%無料のソフトウェアです。

詳細説明

ERPNextは、企業経営の複雑なタスクを簡素化するために開発された包括的なERPシステムです。請求書の管理、在庫追跡、人事管理など、通常は個別のソフトウェアで管理される様々な業務を、ERPNextは一つの統合されたプラットフォームで無料で提供します。

Frappe Framework上に構築されたERPNextは、PythonとJavaScriptで開発されたフルスタックWebアプリケーションです。モジュール式の設計により、企業は必要な機能だけを使用でき、独自の要件に合わせてカスタマイズも可能です。

主な特徴

  • 会計: 取引の記録から財務報告の分析まで、キャッシュフロー管理に必要なすべてのツール
  • 受注管理: 在庫レベルの追跡、在庫補充、受注、顧客、サプライヤー、配送、納品管理
  • 製造: 生産サイクルの簡素化、材料消費の追跡、生産能力計画、下請けの処理など
  • 資産管理: 購入から廃棄まで、ITインフラから設備まで、組織全体の資産を一元管理
  • プロジェクト: 内部・外部プロジェクトを時間、予算、収益性を考慮して納品
  • CRM: リード・機会の追跡、顧客関係管理
  • 人事: 給与計算、採用、従業員管理
  • サポート: 問題追跡とチケット管理
  • 多言語サポート: 28以上の言語に対応
  • マルチカーレンシー: 複数通貨のサポート
  • 地域対応: 各国の税制や規制に対応したローカライゼーション

使用方法

インストール

前提条件

  • Python 3.10以上
  • MariaDB 10.3以上またはPostgreSQL 9.5以上
  • Redis 5.x以上
  • Node.js 18以上
  • yarn 1.12以上
  • wkhtmltopdf (オプション)

インストール手順

# 方法1: Dockerを使用したクイックセットアップ
git clone https://github.com/frappe/frappe_docker
cd frappe_docker
docker compose -f pwd.yml up -d
# http://localhost:8080 でアクセス
# ユーザー名: Administrator
# パスワード: admin

# 方法2: Benchを使用した手動インストール
# benchのセットアップ
pip install frappe-bench
bench init frappe-bench
cd frappe-bench

# 新しいサイトを作成
bench new-site erpnext.localhost

# ERPNextアプリを取得してインストール
bench get-app https://github.com/frappe/erpnext
bench --site erpnext.localhost install-app erpnext

# サーバーを起動
bench start

基本的な使い方

初期設定と基本操作

  1. 会社情報の設定:

    • セットアップウィザードで会社情報、通貨、会計年度を設定
    • 税率、仕訳科目、コストセンターを設定
  2. 基本マスタデータの登録:

    • 顧客、サプライヤー、アイテムを登録
    • 従業員、部門、役職を設定

実践的な使用例

# Python APIを使用した受注作成の例
import frappe

# 新しい受注を作成
sales_order = frappe.get_doc({
    'doctype': 'Sales Order',
    'customer': 'ABC Corporation',
    'delivery_date': '2024-12-31',
    'items': [{
        'item_code': 'ITEM-001',
        'qty': 10,
        'rate': 1000
    }]
})
sales_order.insert()
sales_order.submit()

高度な使い方

# カスタムレポートの作成例
@frappe.whitelist()
def get_sales_analysis(from_date, to_date):
    """指定期間の売上分析を取得"""
    sales_data = frappe.db.sql("""
        SELECT 
            customer, 
            SUM(grand_total) as total_sales,
            COUNT(*) as order_count
        FROM `tabSales Order`
        WHERE docstatus = 1 
            AND transaction_date BETWEEN %s AND %s
        GROUP BY customer
        ORDER BY total_sales DESC
    """, (from_date, to_date), as_dict=True)
    
    return sales_data

# フックを使用したカスタマイズ
def validate_sales_order(doc, method):
    """受注のバリデーションフック"""
    if doc.grand_total > 1000000:
        doc.needs_approval = 1
        frappe.msgprint('高額受注のため、承認が必要です')

ドキュメント・リソース

公式ドキュメント

  • README.md: プロジェクト概要、インストール方法、コミュニティ情報
  • 公式ドキュメント: https://docs.erpnext.com/ - 各モジュールの詳細なユーザーマニュアル
  • Frappe Frameworkドキュメント: https://frappeframework.com/docs - 開発者向けフレームワークドキュメント
  • 変更履歴: change_log/ディレクトリ内に各バージョンの詳細な変更点

サンプル・デモ

  • ライブデモ: https://erpnext-demo.frappe.cloud - フル機能のオンラインデモ
  • セットアップデモ: setup/demo.py - デモデータの自動セットアップ
  • テストデータ: demo_master_doctypesとdemo_transaction_doctypesで定義

チュートリアル・ガイド

  • Frappe School: https://school.frappe.io - メンテナーやコミュニティによる各種コース
  • セットアップウィザード: 初回起動時のガイド付き設定
  • ディスカッションフォーラム: https://discuss.erpnext.com/ - ユーザーとサービスプロバイダーのコミュニティ
  • Telegramグループ: https://erpnext_public.t.me - リアルタイムサポート

技術的詳細

アーキテクチャ

全体構造

ERPNextは、Frappe Frameworkの上に構築されたマルチテナントWebアプリケーションです。モジュール式アーキテクチャを採用し、各ビジネス機能が独立したモジュールとして実装されています。バックエンドはPython、フロントエンドはJavaScript/Vue.js、データベースにMariaDB/PostgreSQL、キャッシュにRedisを使用しています。

ディレクトリ構成

erpnext/
├── erpnext/           # メインアプリケーションディレクトリ
│   ├── accounts/     # 会計モジュール
│   ├── assets/       # 資産管理モジュール
│   ├── buying/       # 購買モジュール
│   ├── crm/          # CRMモジュール
│   ├── manufacturing/# 製造モジュール
│   ├── projects/     # プロジェクト管理モジュール
│   ├── selling/      # 販売モジュール
│   ├── stock/        # 在庫管理モジュール
│   ├── support/      # サポートモジュール
│   ├── controllers/  # 共通コントローラー
│   ├── patches/      # アップグレードパッチ
│   ├── regional/     # 地域固有の機能
│   ├── public/       # 静的ファイル
│   └── www/          # Webページ
└── deployment/         # デプロイ設定
    ├── docker-compose.yaml
    └── k8s/           # Kubernetes設定

主要コンポーネント

  • DocType: Frappeのデータモデルの基本単位

    • 場所: 各モジュールのdoctype/ディレクトリ
    • 役割: データ構造、バリデーション、権限の定義
    • 例: Sales Order、Purchase Order、Item、Customer
  • Controllers: ビジネスロジックの実装

    • 場所: erpnext/controllers/
    • 依存: Frappe Framework
    • 主要クラス:
      • AccountsController: 会計関連の共通処理
      • StockController: 在庫関連の共通処理
      • SellingController: 販売関連の共通処理
  • モジュールシステム: 機能別のビジネスモジュール

    • modules.txtで定義: 21のコアモジュール
    • 各モジュールは独立した機能を提供
    • 相互依存を最小限にした設計

技術スタック

コア技術

  • 言語: Python 3.10+ (型ヒント、async/await、モダンPython機能を使用)
  • フレームワーク:
    • Frappe Framework v16.x - フルスタックWebフレームワーク
    • Frappe UI - Vue.jsベースのUIライブラリ
  • 主要ライブラリ:
    • Unidecode (~1.4.0): Unicode文字の正規化
    • barcodenumber (~0.5.0): バーコード生成・検証
    • rapidfuzz (~3.12.2): 文字列マッチング
    • holidays (~0.75): 祖日管理
    • googlemaps (~4.10.0): Google Maps統合
    • plaid-python (~7.2.1): 銀行統合
    • mt-940 (>=4.26.0): 銀行取引明細書の解析

開発・運用ツール

  • ビルドツール:
    • flit_core: Pythonパッケージビルド
    • bench: Frappeアプリケーション管理ツール
    • yarn: フロントエンド依存関係管理
  • テスト:
    • 単体テスト、統合テスト、UIテスト
    • codecovでカバレッジ追跡
  • CI/CD:
    • GitHub ActionsでMariaDB/PostgreSQLテスト
    • Docker自動ビルド
  • デプロイ:
    • Docker/Docker Compose
    • Kubernetes (k8s/ディレクトリに設定)
    • Frappe Cloud (マネージドホスティング)
  • コード品質:
    • Ruff: Pythonリンター・フォーマッター
    • タブインデント、ダブルクォート
    • 行長110文字制限

設計パターン・手法

  • モジュールパターン: 各ビジネス機能を独立したモジュールとして実装
  • MVCパターン: DocType(Model)、Controller、Viewの分離
  • フックシステム: イベント駆動でカスタマイズを実現
  • オブザーバーパターン: ドキュメントの変更を監視して自動処理
  • テンプレートメソッドパターン: 各Controllerで共通処理を実装

データフロー・処理フロー

  1. ドキュメントのライフサイクル:

    • Draft (下書き) → Submit (確定) → Cancel (キャンセル)
    • 各段階でバリデーションとフックが実行
  2. 在庫処理フロー:

    • Stock Entryが作成される
    • Stock Ledger Entryで在庫移動を記録
    • Binテーブルで現在在庫を更新
    • FIFO/移動平均で評価
  3. 会計処理フロー:

    • ドキュメントのSubmit時にGL Entryを自動生成
    • 複式簿記の原則に従った仕訳
    • リアルタイムで財務諦表を更新
  4. ワークフロー処理:

    • ドキュメントの承認フロー
    • 権限に基づいたアクセス制御
    • メール通知の自動送信

API・インターフェース

公開API

REST API

  • 目的: 外部システムとの統合、モバイルアプリ開発
  • エンドポイント例:
# 認証
POST /api/method/login
{
  "usr": "admin@example.com",
  "pwd": "password"
}

# ドキュメントの取得
GET /api/resource/Sales Order/SO-00001

# ドキュメントの作成
POST /api/resource/Sales Order
{
  "customer": "ABC Corp",
  "items": [...]
}

Python API

# @frappe.whitelist()デコレータでAPIを公開
@frappe.whitelist()
def get_customer_orders(customer):
    return frappe.get_all(
        "Sales Order",
        filters={"customer": customer},
        fields=["name", "grand_total", "status"]
    )

設定・カスタマイズ

設定ファイル

# hooks.py - アプリケーションフック設定
app_name = "erpnext"
app_title = "ERPNext"

# ドキュメントイベントフック
doc_events = {
    "Sales Order": {
        "validate": "erpnext.custom.validate_sales_order",
        "on_submit": "erpnext.custom.on_submit_sales_order"
    }
}

# スケジューラージョブ
scheduler_events = {
    "daily": [
        "erpnext.custom.daily_cleanup"
    ]
}

拡張・カスタマイズ開発

  1. カスタムアプリの作成:

    bench new-app my_custom_app
    bench --site site1.local install-app my_custom_app
  2. DocTypeのカスタマイズ:

    • Custom Fieldでフィールド追加
    • Server Scriptでロジック追加
    • Print Formatで帳票カスタマイズ
  3. クライアントサイドスクリプト:

    frappe.ui.form.on('Sales Order', {
        refresh: function(frm) {
            // カスタムボタン追加
            frm.add_custom_button('Custom Action', () => {
                // カスタム処理
            });
        }
    });

パフォーマンス・スケーラビリティ

パフォーマンス特性

  • キャッシュ: Redisで高速化
  • バックグラウンドジョブ: RQ (Redis Queue)で非同期処理
  • 最適化手法:
    • データベースインデックスの最適化
    • レポートのキャッシュ
    • ページネーションによる大量データ処理
    • バッチ処理の非同期実行

スケーラビリティ

  • マルチテナント対応: 1つのインスタンスで複数企業をサポート
  • 水平スケーリング:
    • ロードバランサーで複数インスタンスへ分散
    • 読み取りレプリカで読み込み負荷分散
  • 垂直スケーリング:
    • データベースサーバーのスケールアップ
    • Redisクラスタリング

制限事項

  • 技術的制限:

    • リアルタイム処理にはWebソケットが必要
    • 大量データのインポートはバックグラウンド処理が必須
    • カスタマイズの複雑化によるアップグレードの難度
  • 運用上の制限:

    • 適切なバックアップ戦略が必須
    • バージョンアップは慣重な計画が必要
    • パフォーマンスチューニングには専門知識が必要

評価・所感

技術的評価

強み

  • 包括的な機能セットで企業のあらゆるニーズに対応
  • 強力なフレームワークによる高いカスタマイズ性
  • 活発なコミュニティと継続的な開発(26k+スター、定期リリース)
  • 完全なオープンソースでベンダーロックインなし
  • モバイル対応と現代的なUI(Frappe UI)
  • 多言語・多通貨・地域対応でグローバル展開可能

改善の余地

  • 初期設定の複雑さ(多機能ゆえの学習曲線)
  • モダンなフロントエンドフレームワークへの移行(React/Vueの部分的採用)
  • マイクロサービスアーキテクチャへの対応
  • ドキュメントの一元化と整理

向いている用途

  • 中小企業から大企業までの幅広い規模
  • 製造業、卸売業、小売業、サービス業
  • カスタマイズが必要な特殊な業務プロセスを持つ企業
  • オープンソースERPを求める組織
  • 地域固有の税制や規制への対応が必要な企業

向いていない用途

  • 非常にシンプルなERPを求める小規模企業
  • 特定業界に特化した機能のみが必要な場合
  • 技術リソースが限られた組織(セットアップと管理に専門知識が必要)
  • リアルタイム性が極めて重要なシステム

総評

ERPNextは、オープンソースERPの中で最も完成度が高く、実用的なシステムの一つです。無料でありながら、商用ERPに匹敵する機能を提供し、特に中小企業にとって魅力的な選択肢です。

Frappe Frameworkの強力な基盤により、高いカスタマイズ性と拡張性を備え、企業の成長に合わせて柔軟に対応できます。多言語対応や地域固有の機能も充実しており、グローバル展開する企業にも適しています。

ただし、初期設定やカスタマイズには一定の技術力が必要で、導入には専門家の支援が推奨されます。しかし、活発なコミュニティと豊富なドキュメントにより、学習リソースは充実しています。総合的に見て、TCO(総所有コスト)を大幅に削減できる優れたERPソリューションと評価できます。