コンテンツへスキップ

Odoo Sales Order(sales.order)モデルの仕組みと設計解説

開発者と業務コンサルタントのための Odoo 売上受注モデル 完全ガイド
2026年3月10日 by
Odoo Sales Order(sales.order)モデルの仕組みと設計解説
Dasolo
| まだコメントがありません

イントロダクション


Odooでは“モデル”がデータの設計図です。売上伝票や請求書、取引先などビジネスで扱うあらゆる情報はモデルに従ってデータベースに格納されます。


モデルの理解は、開発者だけでなく業務コンサルタントにとっても不可欠です。モデルはフィールドや関連、業務ロジックを決める土台であり、正しい設計がシステムの安定性と拡張性を左右します。


ここではOdooで最も重要なモデルの一つである sales.order に焦点を当てます。カスタムモジュールの作成や外部システム連携、販売プロセスの設定を行う際に必ず関わるモデルです。

sales.order モデルとは何か


sales.order は見積と受注を表すモデルです。請求や出荷の前段階として、販売取引の全情報を一元管理します。


このモデルは主に販売(Sales)アプリケーションで使用されます。


営業担当が見積を作成すると sales.order レコードが生成され、顧客の承認でドラフト(見積)から受注へと状態が変わります。同じモデルで両方の状態を持ち、state フィールドでライフサイクルを管理します。


他のモジュールはモデル継承で機能を追加します。CRMは案件との紐付けを行い、会計は請求関連のフィールドを追加、在庫は出荷日や引当情報を加えるなど、コア構造を複製せず必要な拡張だけを行います。

モデルの主要フィールド


ここからは sales.order の主要フィールドを紹介します。これらを押さえておけば見積・受注の運用や開発がスムーズになります。


1. name

型: Char。注文番号や見積番号を保持します。通常は自動採番(例: S00042)され、一覧や書類の主要な識別子として使われます。


2. state

型: Selection。見積から受注、出荷・請求完了、キャンセルまでの状態を追います。主な値は draft(見積)、sent(顧客へ送付済)、sale(受注確定)、done(出荷・請求完了)、cancel(キャンセル)。状態によって可能な操作が変わります。


3. partner_id

型: Many2one (res.partner)。顧客を示す必須フィールドです。取引先に関する処理やレポートで主要に使われます。


4. partner_invoice_id

型: Many2one (res.partner)。請求先住所。未指定の場合は partner_id が使われます。本社請求など請求先が別の場合に設定します。


5. partner_shipping_id

型: Many2one (res.partner)。納品先住所。未指定時は partner_id にフォールバック。出荷処理や配送料計算で参照されます。


6. user_id

型: Many2one (res.users)。担当営業や責任者を示します。CRMの集計やコミッション計算、アクティビティ割当で利用されます。


7. team_id

型: Many2one (crm.team)。営業チーム。メンバーをグルーピングし、チーム別のKPIやダッシュボードに反映されます。


8. date_order

型: Datetime。注文日。ドラフトでは作成日、確定後は確定日として使われ、集計や並び替えに重要です。


9. validity_date

型: Date。見積の有効期限。期限切れ後は見積が無効となる運用に使います。期間限定オファーで有用です。


10. commitment_date

型: Datetime。顧客向けの約束納期。設定すると在庫の引当や出荷予定がこの日付基準で調整されます。顧客対応で重要な項目です。


11. order_line

型: One2many (sale.order.line)。行アイテム群。製品、数量、単価、税情報がここに入るため、オーダーの実体はこのフィールドで表現されます。


12. amount_untaxed

型: Float。税抜小計。注文行から計算され、画面表示や集計用に使われます。


13. amount_tax

型: Float。税額合計。税設定に基づいて行から算出され、見積書や請求書に表示されます。


14. amount_total

型: Float。税込合計。請求や会計集計で最終的に重要となる金額です。


15. currency_id

型: Many2one (res.currency)。通貨。会社や価格表から継承されることが多く、金額フィールドはこの通貨で扱われます。


16. pricelist_id

型: Many2one (product.pricelist)。適用する価格表。行の単価算出に使われ、取引先や手動設定で切り替えられます。


17. payment_term_id

型: Many2one (account.payment.term)。支払条件(例:翌月末、前金50%)。請求作成時に引き継がれます。


18. fiscal_position_id

型: Many2one (account.fiscal.position)。税率変換や税区分のマッピングを行うためのフィールド。海外取引や特例に対応する際に設定します。


19. client_order_ref

型: Char。顧客側の発注番号や参照番号。顧客提供の注文番号を書類やレポートで表示するときに使います。


20. origin

型: Char。発生元ドキュメントの参照。例えば案件(opportunity)から生成された場合はその名前を入れてトレーサビリティを保ちます。


21. create_date

型: Datetime。レコード作成日時。Odooが自動管理し、監査や履歴確認に役立ちます。


22. write_date

型: Datetime。最終更新日時。こちらも自動管理で、いつデータが変更されたかを追跡できます。


23. note

型: Text。契約条件や社内メモなど自由記述領域。見積書や請求書に表示でき、特記事項の記録に使います。


24. require_signature

型: Boolean。True の場合、顧客の電子署名が完了しないと受注確定できません。ECやポータルでの承認フローに有効です。


25. require_payment

型: Boolean。True の場合、確定前に支払確認が必要になります。前払いやデポジット運用で使います。


26. invoice_status

型: Selection。請求状況を示します:no(未請求)、to invoice(請求準備あり)、invoiced(請求済)、upsell(追加請求あり)。


27. locked

型: Boolean。True のとき編集不可となります。受注確定や会計伝票作成時に自動でロックされることが多いです。


28. company_id

型: Many2one (res.company)。マルチカンパニー環境でどの会社に属するかを示します。表示やアクセス制御に影響します。


29. tag_ids

型: Many2many (crm.tag)。分類用タグ。フィルターやセグメント、レポートの柔軟な切り口として使えます。


30. signed_by

型: Char。署名が求められた場合の署名者名を保存します。監査証跡として有用です。


31. signed_on

型: Datetime。署名日時。署名が必要なワークフローで記録されます。


32. prepayment_percent

型: Float。前払割合。require_payment と組み合わせて前受金の比率を管理します。

業務フローでの使われ方


1. 見積から受注へ

営業が見積(ドラフト)を作り、行を追加して価格を設定し顧客へ送付。顧客が承認すると state が sale に変わり、請求や出荷処理へとつながります。


2. ECサイトと顧客ポータル

ウェブ注文はそのまま sales.order レコードとして生成されます。オンライン決済や署名を強制したい場合は require_payment / require_signature の設定で運用できます。


3. CRM からの受注作成

案件が成約すると見積が自動作成され、origin に案件名が残ります。user_id や team_id は商談管理や報酬算出に反映されます。


4. 請求処理

確定済み注文から請求書を作成します。請求書の明細は受注行から引き継がれ、支払条件や会計上の設定も注文から継承されます。invoice_status で請求の進捗を追います。


5. 出荷と約束納期

commitment_date を使って出荷スケジュールを組み、partner_shipping_id を元に配送先を決定します。納期遵守のために重要なフィールドです。

開発者による拡張方法


開発者はモデル継承やメソッド上書きなどで sales.order を拡張できます。設計パターンを正しく使うことが重要です。


モデル継承の使い方

_inherit = 'sale.order' を使って既存モデルを拡張します。フィールド追加やメソッドのオーバーライド、制約追加が可能で、変更は別モジュールにまとめることで将来のアップグレードを容易にします。


フィールドの追加

継承モデルで新しいフィールドを定義します。Char、Many2one、Boolean、Integer、Text、Selection といった適切な型を選び、マルチカンパニー環境では company-dependent な設計も検討してください。


Pythonでの拡張

action_confirmcreatewrite 等をオーバーライドして処理を追加できます。既存の処理は super() で呼び出しつつ、依存関係のある算出フィールド等には注意が必要です。


Odoo Studio の活用

Odoo Studio を使えばコードを書かずにフィールド追加ができます。短期的なカスタマイズには便利ですが、複雑なロジックや将来の保守性を考えるとカスタムモジュールで実装する方が堅牢です。

ベストプラクティス


  • 各ステージに適切な state を使い、確認ロジックを迂回しないこと。状態管理を飛ばすと後続処理が壊れる原因になります。
  • 顧客に約束した納期がある場合は commitment_date を必ず設定しましょう。出荷計画や在庫引当の精度が上がります。
  • 与信や集計で会社単位の最上位取引先が必要な場合は commercial_partner_id を使うと便利です。
  • API連携を作る際は XML-RPC か JSON-RPC を利用します。sales.order は外部から利用可能なので外部IDのマッピングや参照整合に注意してください。
  • カスタムフィールドは x_ プレフィックスかモジュール固有のプレフィックスを付けて、将来のOdooバージョンとの衝突を避けましょう。

よくあるミス


  • ロック済みの受注を無理に編集しないこと。編集が必要な場合はリビジョンを作るか正しいワークフローで対応してください。
  • partner_id、partner_invoice_id、partner_shipping_id を混同しないこと。それぞれ目的が異なるため、住所が異なる場合は全て正しく設定しましょう。
  • action_confirm を上書きして super() を呼ばないのは危険です。他モジュールとの連携や将来のアップグレード時に不具合を招きます。
  • 既存データがある環境で必須のカスタムフィールドを追加する際はデフォルト値を設定しないと、バリデーションで既存レコードがエラーになることがあります。
  • 通貨や価格がデフォルトと異なる場合は pricelist_id を適切に設定してください。価格ミスは請求トラブルにつながります。

まとめ


sales.order はOdooの販売プロセスの中核です。見積や受注のデータを保持し、他モジュールから拡張されることで販売業務全体を支えます。


業務要件を設計するコンサルタントでも、カスタムを作る開発者でも、sales.order の構造と特性を理解しておくことは、手戻りを減らし安定運用につながります。

Odoo導入のサポートが必要ですか?


Dasolo はOdooの導入・カスタマイズ・最適化を支援します。API連携や開発を得意とし、sales.order を含むOdooのデータ設計に深い知見を持つチームが対応します。


Odooの導入支援やカスタム開発、連携でお困りならご相談ください。 デモを予約する プロジェクトについて話し合いましょう。

Odoo Sales Order(sales.order)モデルの仕組みと設計解説
Dasolo 2026年3月10日
このポストを共有
サインイン コメントを残す