ポータル全体図

flowchart LR

%% レイヤ構成
subgraph Frontend
  FE[React TSX UI<br>トップ一覧 詳細 仕様入力<br>言語切替 JA EN]
end

subgraph API_BFF
  API[REST OpenAPI<br>GET 一覧 詳細 検索<br>PATCH 保存 差分検知]
end

subgraph Postgres
  PGv[v_models などの i18n マージビュー<br>COALESCE で英語優先]
  PGd[devp_* 原本テーブル群<br>model field view tab menu button relation]
  PGi[devp_i18n 翻訳テーブル<br>entity_table entity_id field_key locale text status updated_at]
  PGc[devp_chroma_cursor カーソル<br>last_synced_at]
end

subgraph Batch_Local
  FET[fetch_needs_update<br>needs_update を取得]
  WKR[worker_translate<br>翻訳して upsert]
  EXP[export_incremental<br>増分抽出 JSONL または upsert]
end

subgraph Vector_Store
  CH[ChromaDB collection<br>id content metadata]
end

subgraph External_Links
  GH[GitHub コード参照]
  ODOO[Odoo 画面リンク]
end

%% 主なフロー
FE <--> API
API -->|SQL with locale| PGv
PGv --> API

API -->|原本読み書き| PGd
API -->|翻訳参照と更新指示| PGi

PGi -->|status needs_update| FET
FET --> WKR
WKR -->|翻訳 upsert auto| PGi

PGd --> EXP
PGi --> EXP
PGc --> EXP
EXP -->|upsert or JSONL| CH
EXP -->|カーソル更新| PGc

%% 参照リンク
FE -.-> GH
FE -.-> ODOO

%% オプション AWS 置換
subgraph AWS_optional
  EVB[EventBridge スケジュール]
  SQS[SQS キュー DLQ]
  Lf[Lambda Fetcher]
  Lw[Lambda Worker]
end

FET -.-> EVB
EVB -.-> Lf
Lf -.-> SQS
SQS -.-> Lw
Lw -.-> PGi

Odoo v18 + Development Portal Design

1. System Components

  • Frontend (TSX shell)
    • Provides UI for browsing and registering customization details.
    • Interfaces with backend APIs to fetch and update metadata.
    • Handles multilingual support (Japanese ↔ English) via translation batch.
  • Backend (FastAPI / Node backend)
    • Exposes REST endpoints for CRUD operations on customization metadata.
    • Manages database updates and communicates with ChromaDB.
    • Executes translation batch jobs (on-demand or scheduled).
  • Database (PostgreSQL)
    • Stores metadata of models, fields, views, menus, smart buttons, tabs.
    • Tracks timestamps for incremental updates (only load changed/added records).
    • Provides reference data for Odoo integration.
  • ChromaDB (Vector DB)
    • Stores embeddings of customization metadata.
    • Used for semantic search and AI-assisted SQL generation.
    • Incrementally updated when new or modified entities are detected.
  • Odoo v18
    • ERP system running locally.
    • Provides the source of truth for models and customizations.
    • Exposes entities via PostgreSQL or Odoo APIs for synchronization.

2. Functional Flow

  1. Odoo Customizations
    Users create/modify fields, views, menus, or smart buttons in Odoo v18.
  2. Data Extraction
    Backend queries Odoo’s DB/API and stores metadata in the Portal DB.
  3. Incremental Sync
    Only new or updated entities (based on timestamps or hash checks) are embedded and pushed to ChromaDB.
  4. Translation Batch
    Batch job detects untranslated records, runs translation (local first, AWS later), and updates DB.
  5. Portal UI
    Frontend displays structured customization metadata with toggleable multilingual views.
  6. AI/ChromaDB Usage
    Developers or consultants query Portal → AI retrieves related definitions → supports SQL generation or documentation.

3. Implementation Checklist (Minimal Viable Path)

A. Environment

  • Install Odoo v18 (local Docker or standard setup).
  • Setup PostgreSQL (metadata DB, separate from Odoo DB).
  • Setup ChromaDB locally.
  • Prepare FastAPI backend skeleton.

B. Database & Models

  • Define models, fields, views, tabs, menus, smart_buttons tables.
  • Add created_at, updated_at columns for incremental sync.
  • Add translation_status flags.

C. Backend

  • Implement CRUD APIs for all tables.
  • Implement incremental sync logic (compare timestamps/hash).
  • Implement translation batch job (local: OpenAI API; future: AWS Translate).
  • Implement ChromaDB embedding update (only for changed/new records).

D. Frontend (TSX)

  • Build table-based UI with filtering & search.
  • Add language toggle (JP/EN).
  • Add forms for manual entry/update.
  • Display sync/translation status indicators.

E. ChromaDB

  • Create embedding pipeline for new/changed metadata.
  • Provide API for semantic search & retrieval.
  • Validate embeddings against sample queries.

F. Testing & Validation

  • Unit test DB → Backend sync.
  • Unit test translation batch.
  • Unit test incremental ChromaDB updates.
  • End-to-end test: Add new Odoo field → Portal → Translation → ChromaDB → Search.

1) 目標(最小で完成)

  • Odoo と同一の Postgres を使い、devp_* テーブルで開発情報を管理
  • Portal は TSXフロント + BFF(API) + 翻訳バッチ で構成
  • 画面は ?locale=ja_JP|en_US で表示言語を切替(英語は i18n 参照、無ければ原本)

2) ローカル構成(docker-compose骨子)

version: "3.9"
services:
  pg:
    image: postgres:15
    environment:
      POSTGRES_DB: devp
      POSTGRES_USER: devp
      POSTGRES_PASSWORD: devp
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

  odoo:
    image: odoo:18
    environment:
      HOST: pg
      USER: devp
      PASSWORD: devp
      DATABASE: devp     # Share DB with Odoo + Portal
    ports:
      - "8069:8069"
    depends_on:
      - pg

  api:
    build: ./api        # BFF (FastAPI etc.)
    environment:
      PG_DSN: postgresql://devp:devp@pg:5432/devp
    ports:
      - "8000:8000"
    depends_on:
      - pg

  web:
    build: ./web        # TSX (Vite etc.)
    environment:
      VITE_API_BASE: http://localhost:8000
    ports:
      - "5173:5173"
    depends_on:
      - api

  chroma:               # Start only if needed for learning
    image: chromadb/chroma:latest
    ports:
      - "8001:8000"

volumes:
  pgdata: {}

3) DB(DDLと最低限の準備)

  • devp_model, devp_field, devp_view_hdr, devp_tab_hdr, devp_tab_detail, devp_menu, devp_smart_button, devp_relation
  • 翻訳用:devp_i18n(entity_table, entity_id, field_key, locale, text, status, updated_at, source_hash)
  • 速度系INDEX:
    • devp_i18n(entity_table, entity_id, field_key, locale)
    • devp_i18n(status)
  • 増分学習カーソル(必要時):devp_chroma_cursor

原本テーブルに 表示名/説明/note系のカラムが無ければ追加display_name, description, note, detail_note など)。


4) API(BFF)最小エンドポイント

読み取り(全て ?locale= 対応。サーバ側で i18n を COALESCE マージ)

  • GET /models?query=&domain=&status=&limit=&offset=
  • GET /models/{id}
  • GET /models/{id}/fields|views|tabs|buttons|menus|relations
  • GET /views/{id}/header|common|type

更新(保存→再翻訳トリガ)

  • PATCH /models/{id} ほか編集系
    → 原本更新後、対象フィールドの devp_i18nstatus='needs_update' で upsert(source_hash 更新)

学習(必要時)

  • POST /export/chroma?locale=en_US(増分抽出→Chroma upsert or JSONL返却)

i18nマージは SQL で
COALESCE(t_en.text, m.display_name) AS display_name の形を徹底。


5) フロント(TSX)やること

  • ルーティング:/(TOP)→ /m/:id(モデル詳細)→ /v/:id(View詳細)
  • 言語トグル:UIで ja/en → API へ ?locale= 付与(React Query のキーに含める)
  • 一覧・詳細の列名は 画面項目=DB列名 に合わせ済み(そのまま利用)
  • タブのフロート詳細:初回取得した詳細をメモ化
  • 編集フォーム:保存時に PATCH → 成功トースト「翻訳キュー投入済」

6) 翻訳バッチ(ローカル運用)

  • 差分検知:PATCH 時に対象 devp_i18nneeds_update で upsert
  • 実行:python fetch_needs_update.py | python worker_translate.pycron 5分毎
  • 失敗は status='error' 記録(後から再実行APIで復帰)

7) 学習(Chroma)※後回し可

  • 増分抽出:devp_chroma_cursor を使い 更新/追加のみを JSONL 出力
  • upsert:BFF経由 or ツールで upsert
  • メタデータに model_name, entity_table, locale を入れて検索品質を担保

8) 開発の流れ(最短)

  1. docker compose up -d
  2. DDL 適用 → サンプルデータ投入
  3. API:GET /modelsGET /models/{id} を i18n マージで実装
  4. フロント:TOP→詳細のデータ取得をAPIに接続、言語トグル導入
  5. 編集系 PATCH 実装 → needs_update upsert を確認
  6. ローカル翻訳バッチを cron で回し、英語表示が反映されることを確認
  7. (必要なら)増分エクスポート → Chroma upsert

9) 完了判定(DoD)

  • TOP・詳細が ?locale=en_US で英語表示、未翻訳は日本語フォールバック
  • 編集→保存で対象項目が 翻訳キュー入り→英語表示に反映
  • Odoo の画面リンク・GitHub 参照が動作
  • エラー時の status='error' が可視化でき、再実行で復帰可能

フォルダ/ファイル構成

dev-portal/
├─ docker-compose.yml            # pg + api(ローカル動作用)
├─ .env.example                  # PG_DSN など環境変数のサンプル
├─ db/
│  └─ init/
│     └─ 001_schema.sql          # 原本 + i18n のDDL(前回の完成版)
└─ api/
   ├─ Dockerfile
   ├─ requirements.txt
   ├─ app/
   │  ├─ __init__.py
   │  ├─ main.py                  # FastAPI起動、Swagger有効化、CORS
   │  ├─ config.py                # env読込(PG_DSNなど)
   │  ├─ db.py                    # psycopg コネクション
   │  ├─ schemas.py               # Pydanticスキーマ
   │  ├─ services/
   │  │  ├─ i18n.py               # COALESCE参照SQL, 再翻訳キュー登録
   │  │  └─ chroma_export.py      # (任意)増分エクスポートロジック
   │  └─ routers/
   │     ├─ models.py            # /models, /models/{id}, /models/{id}/fields
   │     └─ fields.py            # /fields/{id}
   └─ tests/
      └─ test_smoke.py           # スモークテスト(任意)

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です