/** * 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'] ); } } } } } } } } 製造モジュール 作業オーダーと廃棄オーダー – Raqqa

製造モジュール 作業オーダーと廃棄オーダー

✅ 製造オーダーと作業オーダーの関係性

概要

製造オーダー(mrp.production作業オーダー(mrp.workorder
製造する最終製品のオーダー単位製造の作業ステップごとの指示単位(工程単位)
製造数量、原材料、ロット、完成品を管理各工程(routing step)の進捗と実績を管理
1つの製造オーダーに対して、複数の作業オーダーが紐づく製造オーダーに紐づく子レコードとして生成される

製造オーダー(mrp.production)
├─ 作業オーダー(mrp.workorder) ← Routingで定義された各工程分
│ ├─ 工程: 組立
│ ├─ 工程: 検査
│ ├─ 工程: 梱包

✅ 製造オーダー画面のボタンと作業オーダーの関係

🎛️ 製造オーダーの主要ボタン(標準UI)

ボタン名製造オーダー上の意味作業オーダーへの影響
すべて生産(Mark as Done)完了処理(完成品の入庫を一括処理)作業オーダーのステータスには影響なし。作業工程を無視して完了可能(例外処理用途)
開始(Start Production)作業工程の開始準備(状態を「In Progress」に変更)作業オーダーが自動で生成され、ステータスが「Ready」に変更される(工程が実行可能になる)
引当解除(Unreserve)原材料の引当解除作業オーダーの直接的な状態には影響なし(ただし、材料がないため進行不能になる可能性あり)
製造オーダー作成(Draft)
↓
材料引当(Reserve Components) ← 自動/手動で引当
↓
「開始」ボタン押下
  → 作業オーダーが作成される(Routingベースで自動生成)
  → 作業オーダーの状態:Ready
↓
作業オーダーで「実行開始」(Start Working)
  → 実際の作業が進行(In Progress)
↓
作業オーダーで「完了」(Mark as Done)
  → 工程単位で完了処理
↓
製造オーダーで「完了」(すべて生産)
  → 全作業オーダーが完了済なら、製造オーダーも自動完了

✅ まとめ:ボタンと作業オーダーの関連性

ボタン名作業オーダーの影響コメント
開始✅ 作業オーダー生成(Routingの各工程単位)製造の流れが動き出すトリガー
すべて生産❌ 作業オーダー無視で製造完了特殊用途(工程を飛ばしたい時用)
引当解除❌ 材料の引当のみ解除作業オーダーの進行は止まらないが、材料不足でエラーになる可能性

✅ Odooの作業オーダー(mrp.workorder)の基本

📌 作業オーダーとは?

  • 製造オーダー(MO)に基づき、特定の作業ステップを実行するための指示書
  • 製造プロセスの作業ステップ単位の進捗管理を行う
  • 製造オーダー(mrp.production)が親で、作業オーダーは子にあたる

✅ 管理対象

管理項目内容
作業内容製造ラインでの特定の作業(例:組立、検査)
使用する作業センターワークステーションや設備
作業者作業を担当する従業員
作業の開始・終了時間作業の実施記録
ステータス実行中、完了、キャンセルなど
実績数量完了した作業の数量(ロット単位)
エラー・廃棄数量不良品やエラー記録

✅ 主要な入力項目(mrp.workorder)

以下、アップロードされたファイルをもとに推測される主要項目:

項目意味・役割
作業オーダー名作業オーダーの識別子(自動生成)
製造オーダー紐づく製造オーダー(親)
作業ステップ実行する作業内容(mrp.routing.workcenter で定義)
作業センター実施場所(設備/ライン)
状態(ステータス)draft / ready / in_progress / done / cancelled
実績開始日時実際の作業開始時刻
実績終了日時実際の作業終了時刻
作業者作業を担当した従業員
実績数量完了した作業数量
廃棄数量不良品の数量(Optional)
予定開始日時予定された開始時刻(計画値)
予定終了日時予定された終了時刻(計画値)
備考・メモ作業中の特記事項(Optional)

✅ 管理する内容の全体像

製造オーダー(mrp.production)
└─ 作業オーダー(mrp.workorder)
├─ 作業ステップ(routing)
├─ 作業センター(設備・ライン)
├─ 作業者
├─ 実績開始・終了時間
├─ 実績数量
└─ 廃棄数量

✅ 実際の用途イメージ

  • 作業の「着手・完了」の記録
  • 作業ごとの「実績工数」管理(OEE分析などにも活用)
  • 不良発生や廃棄の数量記録
  • 作業者別の進捗・実績管理
  • 製造全体のリードタイム分析

✅ 解体オーダー(mrp.unbuild)とは?

📌 概要

  • 解体オーダーは、完成品を分解して、構成部品(原材料)に戻すための指示・処理を行うためのオーダーです。
  • 製造オーダー(mrp.production)の逆プロセスであり、例えば以下のシナリオで利用されます:
    • 不良品や返品された製品を解体し、再利用できる部品を回収する
    • 在庫調整の一環で、誤って組み立てた製品を分解する

📊 解体処理の主な流れ

ステップ処理内容
1️⃣対象となる製品(完成品)を選択
2️⃣分解後に回収する部品の数量を指定
3️⃣解体処理を実行(Validate
4️⃣完成品の在庫が減少し、原材料の在庫が増加

✅ 解体オーダーの主な入力項目(mrp.unbuild

以下はアップロードいただいたExcelからの推測を含む一般的なフィールド:

項目内容・役割
製品解体する完成品(product_id
数量解体する完成品の数量(product_qty
ロット/シリアル番号解体対象のロット/シリアル(lot_id
元の製造オーダーもしあれば、該当する製造オーダーへの参照(production_id
原材料の回収解体で回収される部品の一覧(BOMに基づく)
解体日解体処理を行った日(date
状態(ステータス)draft / done(完了) / cancel(キャンセル)
備考(Optional)特記事項の入力欄

✅ 解体オーダーの利用シーン(イメージ)

シナリオ具体例
不良品解体完成品の不良を発見 → 原材料として再利用可能なものを回収
誤組立の分解誤って組み立てた製品を解体し、部品として戻す
返品処理返品された商品を解体し、部品単位で再入庫
実験/試作品の分解テストで組んだ製品を分解し、部品在庫に戻す

✅ まとめ

  • 解体オーダーは「完成品 → 部品」の逆流プロセスを管理するもの
  • 製造オーダーとは逆方向で、原材料を回収・再利用するための仕組み
  • 部品のトレーサビリティや在庫管理に役立つ(ロット/シリアル含む)
  • 標準Odoo(Community版)にも存在するモデル(mrp.unbuild

✅ 廃棄オーダー(stock.scrap)とは?

📌 概要

  • 廃棄オーダーは、在庫品のうち「破損」「不良」「過剰」「期限切れ」などの理由で、通常の出庫先ではなく「廃棄」として処理するための記録・オーダーです。
  • 在庫から廃棄数量を減算し、物理的には在庫から出庫済、会計的には費用計上を行うために使用します。

✅ 廃棄オーダーの目的・利用シーン

利用シーン
不良品の除却破損、品質不良、テスト失敗品の廃棄
在庫の調整誤入庫、棚卸差異の調整、期限切れ
製造過程での不良廃棄作業中の不良、余剰品の廃棄
会計処理のため在庫資産から費用への振り替え(会計連携)

✅ 廃棄オーダー(stock.scrap)の入力項目

アップロードいただいたExcelをもとに、一般的な項目は以下の通りです:

項目内容・役割
製品(Product)廃棄する商品または原材料
数量(Quantity)廃棄する数量
ロット/シリアル番号(Lot/Serial)対象ロットの特定(必要に応じて)
ソースロケーション(Source Location)廃棄前の保管場所(通常の在庫ロケーション)
廃棄ロケーション(Scrap Location)廃棄先のロケーション(Scrapロケーションに設定)
ステータス(Status)draft / done(完了) / cancelled
関連製造オーダー(Linked Production Order)該当する製造オーダーがある場合
メモ(Notes)廃棄理由や備考(任意)

✅ 廃棄処理の流れ(Odoo標準)

graph TD
A[在庫商品選択(製品・数量・ロケーション)] --> B[廃棄オーダー作成]
B --> C[Validate(検証・確定)]
C --> D[ソースロケーションの在庫数量を減算]
C --> E[廃棄ロケーションの在庫数量を増加]
C --> F[会計処理(費用計上・資産振替)※必要に応じて]

✅ 廃棄オーダーと他のオーダーの違い

項目製造オーダー作業オーダー解体オーダー廃棄オーダー
対象完成品の生産工程作業単位完成品の解体不良品・破損品の除却
出力結果完成品入庫作業進捗部品の再取得在庫からの削除(マイナス)
在庫への影響入庫(増加)部品が戻る(増加)在庫減少(削除)

✅ 廃棄オーダーの会計処理(必要に応じて)

  • 廃棄処理時、会計連携が有効ならば:
    • 原価資産 → 費用勘定への振替仕訳が作成される
    • 例えば:
Dr. 廃棄損失(費用)
Cr. 在庫資産(バランスシート)

✅ まとめ

項目内容
管理対象在庫のうち、廃棄が必要なもの
目的在庫数量の減算・会計処理(必要に応じて)
ロケーションの動き通常のロケーション → 廃棄ロケーション
会計連携必要に応じて(在庫評価が有効な場合のみ)

Comments

コメントを残す

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