/** * WPML compatibility functions * * @global array $duplicated_posts Array to store the posts being duplicated. * * @package Yoast\WP\Duplicate_Post * @since 3.2 */ add_action( 'admin_init', 'duplicate_post_wpml_init' ); /** * Add handlers for WPML compatibility. */ function duplicate_post_wpml_init() { if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'shutdown', 'duplicate_wpml_string_packages', 11 ); } } global $duplicated_posts; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: Renaming a global variable is a BC break. $duplicated_posts = []; /** * Copy post translations. * * @global SitePress $sitepress Instance of the Main WPML class. * @global array $duplicated_posts Array of duplicated posts. * * @param int $post_id ID of the copy. * @param WP_Post $post Original post object. * @param string $status Status of the new post. */ function duplicate_post_wpml_copy_translations( $post_id, $post, $status = '' ) { global $sitepress; global $duplicated_posts; remove_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10 ); remove_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10 ); $current_language = $sitepress->get_current_language(); $trid = $sitepress->get_element_trid( $post->ID ); if ( ! empty( $trid ) ) { $translations = $sitepress->get_element_translations( $trid ); $new_trid = $sitepress->get_element_trid( $post_id ); foreach ( $translations as $code => $details ) { if ( $code !== $current_language ) { if ( $details->element_id ) { $translation = get_post( $details->element_id ); if ( ! $translation ) { continue; } $new_post_id = duplicate_post_create_duplicate( $translation, $status ); if ( ! is_wp_error( $new_post_id ) ) { $sitepress->set_element_language_details( $new_post_id, 'post_' . $translation->post_type, $new_trid, $code, $current_language ); } } } } // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: see above. $duplicated_posts[ $post->ID ] = $post_id; } } /** * Duplicate string packages. * * @global array() $duplicated_posts Array of duplicated posts. */ function duplicate_wpml_string_packages() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: renaming the function would be a BC-break. global $duplicated_posts; foreach ( $duplicated_posts as $original_post_id => $duplicate_post_id ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $original_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $original_post_id ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $new_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $duplicate_post_id ); if ( is_array( $original_string_packages ) ) { foreach ( $original_string_packages as $original_string_package ) { $translated_original_strings = $original_string_package->get_translated_strings( [] ); foreach ( $new_string_packages as $new_string_package ) { $cache = new WPML_WP_Cache( 'WPML_Package' ); $cache->flush_group_cache(); $new_strings = $new_string_package->get_package_strings(); foreach ( $new_strings as $new_string ) { if ( isset( $translated_original_strings[ $new_string->name ] ) ) { foreach ( $translated_original_strings[ $new_string->name ] as $language => $translated_string ) { do_action( // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. 'wpml_add_string_translation', $new_string->id, $language, $translated_string['value'], $translated_string['status'] ); } } } } } } } } Odoo MRP Manufacturing in One Step ショップフロアとの連携 – Raqqa

Odoo MRP Manufacturing in One Step ショップフロアとの連携

背景

通常、Odooの製造プロセスは以下のように複数ステップに分かれます:

  • 部品の引当・ピッキング(在庫から作業現場へ)
  • 作業(ワークセンターでの加工や組立)
  • 完成品の登録と在庫反映

しかし、1ステップ製造では、これらを1つの操作で済ませることを目的とします。

📦 例:机の製造(1ステップ)

  1. 製造オーダー作成(天板・脚・ネジを使用)
  2. 「製造」ボタンを押すだけで:
    • 材料が在庫から消費され
    • 完成品「机」が倉庫に入庫される
    • ワークオーダーやピッキングの個別確認は不要

🔧 向いているケース

  • 小規模な組立て業務
  • 作業が単純で明確な工場
  • 工程やトレーサビリティより、迅速さが重要な業種

在庫>設定>倉庫

下記の3つのオプションがある。
製造(1ステップ)
構成品をピッキングして製造 (2ステップ)
構成品をピッキング、製造しプロダクトを格納(3ステップ)

1️⃣ 製造(1ステップ)

  • 概要:最も簡略化されたフロー。製造オーダー(MO)で材料の消費と完成品の入庫が同時に処理される。
  • 物流操作:ピッキングや完成品の格納といった中間の在庫移動がありません。
  • 適用例:工程が少なく、リアルタイム処理が求められない中小製造業など。

2️⃣ 構成品をピッキングして製造(2ステップ)

  • 概要:構成品(材料)を事前に作業場へピッキングしてから、製造を開始する。
  • 物流操作:以下の2つの転送が発生。
    • 材料の移動(倉庫 → 作業現場)
    • 完成品の入庫(作業現場 → 完成品倉庫)



3️⃣ 構成品をピッキングし、製造し、プロダクトを格納(3ステップ)

  • 概要:最も詳細な追跡が可能なモデル。材料ピッキング・製造・完成品格納がすべて別々のステップ。
  • 物流操作
    • 材料の移動(倉庫 → 作業現場)
    • 製造操作(作業現場で製造)
    • 完成品の格納(作業現場 → 完成品倉庫)

製造(1ステップ)の活用方法

  • 設定場所
    • メニュー:在庫 > 設定 > 倉庫
    • 該当倉庫の「製造」セクションで「1ステップ製造」を選択
  • 注意点
    • 製造オーダー(MO)を確定するだけで、材料消費・完成品入庫が一気に処理される
    • ワークオーダー(作業区)は使わない、またはオプション扱いとなることが多い
    • バックオーダーや部品の欠品対応が必要な場合には適しません

「製造(1ステップ)」と「Shop Floor」の関係

  • Shop Floor(製造現場画面) は「製造オーダーの処理画面」であり、1ステップか3ステップかを問わずどの倉庫設定でも利用可能です。
  • しかし、Shop Floorでの操作内容はステップ構成に依存します:
倉庫設定Shop Floorでの操作
製造(1ステップ)すぐに「製造開始」→「完了」
製造(2ステップ)構成品ピッキングが必要
製造(3ステップ)ピッキング・製造・格納の各工程が必要

🔁 なぜ2つのMOを処理できたのか?

Shop Floorでは複数のMOを一度に表示・操作できるため、

  • 製造ラインにおける 複数の作業オーダー(WO)や製造オーダー(MO) をタブレット上でリアルタイムに進行管理できます。
  • 1ステップ設定でも、複数MOを同時に処理可能です。
    たとえば、作業員が同じ部品を使って複数の製品を一括で組立てる場合に有効です。

🔧 まとめ

項目内容
「製造(1ステップ)」在庫移動の簡略化設定。在庫の流れを簡素化し、迅速な処理を可能にする。
Shop Floor実際の製造現場操作画面。1ステップ設定でも、複数のMOを一括処理できる。
関係性Shop Floorはステップ数に関係なく使えるが、表示される操作フローは設定に依存する。

✅ Shop Floorを「使わない」場合のMO処理(標準画面)

操作の流れ(例):

  1. 製造 > 製造オーダー にアクセス
  2. 一覧から MO を複数選択(チェックボックスを使う)
  3. アクションメニューから「確認」「完了」など一括操作
  4. もしくは1件ずつMO画面に入り、手動で処理

🟡 問題点

  • 1件ずつ開いて作業が必要になる場合もある
  • スキャンなどの入力端末と統合しにくい
  • 作業者にとってUIが煩雑になりがち

✅ Shop Floorを「使う」場合のメリット

特徴:

  • 製造現場向けの簡素化されたタブレットUI
  • スキャン対応やステータス更新がワンクリック
  • 作業オーダー(WO)ごとに進行状況を視覚的に表示
  • 複数MOを横断的に処理しやすい(ライン別、製品別)

🔁 結論

比較項目Shop Floor ありShop Floor なし
MOの一括処理○(視覚的に操作しやすい)△(操作できるが面倒)
製造現場の使いやすさ◎(現場向けUI)△(管理者向け画面)
スキャン機器との親和性△(拡張が必要)

Odooの「Manufacturing Steps(製造ステップ)」は、製造工程の在庫管理と物流上の動きを定義する設定項目です。ここでは「製造が何ステップで完了するか」を在庫モジュール内で指定できます。


🔧 製造ステップの選択肢(Warehouse設定)

メニュー:
在庫 > 設定 > 倉庫(Warehouse) > 製造 セクションに以下の3つのオプションがあります。

製造ステップ数内容倉庫からの配送の扱い
1ステップ:製造製造時に必要な構成部品をその場で使用して製品を作る❌ 部品のピッキング工程は不要(即製造)
2ステップ:構成品をピッキングして製造構成部品を先に「ピッキング」し、製造工程へ引き渡す✅ 倉庫から製造用ロケーションへの配送が発生
3ステップ:構成品をピッキング → 製造 → 製品を格納製造の前後に在庫移動が発生する(ピッキング+製品格納)✅ 製造前に部品が移動、製造後に完成品が倉庫へ

📦 倉庫からの配送との関係

ステップ倉庫配送の関与ロケーション移動
1ステップ❌(倉庫からの移動なし)製造は直接行われ、在庫移動は内部的に処理される
2ステップ✅(部品を製造エリアへ移送)例:Stock → Production
3ステップ✅(部品移送+製品格納)例:Stock → Production → Stock(完成品用)

🛠 選択のポイント

  • 1ステップ:単純な製造や在庫管理が不要な環境に適している(例:サービス業、プロトタイプ製造)
  • 2ステップ:倉庫と製造部門が物理的に分かれている場合に適している
  • 3ステップ:厳密な在庫管理(部品・製品の移動履歴や在庫監査)を求める製造業に最適

✅ まとめ

ステップ数特徴倉庫からの配送
1ステップシンプルな製造処理
2ステップピッキング工程あり
3ステップピッキング+完成品格納


Comments

コメントを残す

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