/** * 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

製造モジュール 製造オーダー

✅ 製造オーダー(MO)の主な入力項目(標準画面)

項目説明入力例
製造オーダー番号自動生成される番号(MO0001など)
プロダクト製造する完成品組み立てる商品(例:テーブルA)
数量製造する数量1.00(初期値)
部品表(BOM)使用する部品表(BOMを選択)テーブルA用BOM(部品A+部品B)
生産予定日(計画日)製造開始の予定日時2025年05月28日 18時17分
担当者MOの担当者(ユーザー)Dobuchi など
生産予定製品が完成予定の日自動計算 or 入力
ステータスMOの状態ドラフト / 確認済 / 実行中 / 完了 / キャンセル
作業オーダー工程ごとの作業指示(自動生成)工程1(溶接)、工程2(塗装)
構成要素(消費部材)使用する部材リスト部品A、部品B(BOMから引継ぎ)
備考メモ欄(自由入力)特殊指示、作業注意など


✅ その他フィールド(拡張や設定で表示される場合あり)

項目説明備考
費用(原価)製造にかかったコスト工賃+材料費の自動計算
製造ロット/シリアル完成品のロット番号トレーサビリティ管理に必要
リンク先販売オーダーこのMOが紐づく販売オーダーMTO(受注生産)の場合
リンク先プロジェクト製造をプロジェクトとして管理する場合optional

✅ 製造オーダー作成の流れ(ざっくり)

1️⃣ 製造オーダー(MO)を新規作成
2️⃣ 完成品を選択(プロダクト)
3️⃣ BOMを選択(必要なら手動選択も可)
4️⃣ 数量・計画日・担当者を入力
5️⃣ 保存&確認 → 作業オーダー自動生成
6️⃣ 作業オーダーごとに実績入力(開始/完了/作業時間)
7️⃣ 完了処理で在庫へ入庫(完成品)、部材は自動で消費

✅ 作業オーダー(Work Order)の画面項目

項目説明補足例
工程実行する作業工程の名称例: 溶接工程、組立工程
作業区(Work Center)作業を行う場所や設備例: 溶接ライン1号機
プロダクト製造する最終製品例: 木製テーブル
残数量この作業で残っている未処理数量作業進行中に減少
開始実際の作業開始日時ボタン押下で記録
終了実際の作業終了日時ボタン押下で記録
予想所要時間この作業の標準時間BOMまたは作業区設定から計算
実所要時間実際にかかった作業時間開始〜終了の実績
状態(Status)作業の進捗状況予定 / 実行中 / 完了

✅ 構成要素(消費部材)の画面項目

項目説明補足例
プロダクト使用する原材料や部品例: 木材、ネジ、塗料など
From在庫移動元のロケーション原材料が出庫される場所(在庫倉庫)
消費対象この部材がどの作業工程で消費されるか例: 組立工程で使う
予測計画上必要な数量(BOMに基づく)例: 4個必要
数量実際に消費した数量実績ベース(必要に応じて編集可能)
消費済みその部材がすでに消費されたか✅ マークで表示
ロット/シリアル番号使用した部材のロット番号やシリアル番号トレーサビリティ用(シリアル管理有効時のみ)

✅ 位置づけ・役割のイメージ

  • 作業オーダー(Work Order) は:
    • 製造オーダー(MO)を「工程ごとの作業単位」に分解したもの
    • 作業員が見る「現場の指示書」
  • 構成要素(消費部材) は:
    • この作業でどの原材料を使うのか」を示すリスト
    • 消費実績を記録し、在庫から原材料を引き落とすための情報源

✅ まとめイメージ

作業オーダー画面(簡易図)

工程作業区開始終了予想時間実時間状態
組立ラインA14:0015:0060分50分完了

構成要素画面(簡易図)

部品From消費対象予測数量消費済みロット/シリアル
ネジ倉庫A組立4412345ABC

🔍 「処理可能」ボタンを押すとは?

  • 「予測」項目は、BOMに基づいて「この作業で何個必要」という理論上の必要数を示しています。
  • その隣にある「処理可能」ボタンは:
    • 実際にこの部品を消費した(使った)とOdooに伝えるアクションです。
    • 在庫上の原材料を減らす処理をトリガーするボタンでもあります。

つまり:

✅「処理可能」を押した = 「この部品を必要数量分、在庫から使いました!」と確定する操作。


🔍 「消費済」にチェックが出る意味

  • 「消費済」は、この部品が実際に作業で消費され、在庫から減ったことを示すフラグです。
  • 在庫の出庫処理(在庫減少)が行われた証であり、
  • 製造オーダーの原材料消費が正しく処理されたことを表します。

✅ 処理の流れイメージ

ステップ状態操作Odoo上の動き
1作業オーダー開始前消費済なし「処理可能」未押下
2実作業で部材使用「処理可能」を押す在庫から部材が減少、消費済チェックが入る
3作業オーダー完了「消費済」✅作業が完了、部材消費が確定

✅ まとめ

項目意味状態
「処理可能」ボタン部材消費の確定処理を行う在庫を減らすトリガー
「消費済」チェック部材が実際に消費されたか✅ = 在庫から消費済
消費処理後の在庫部材の数量が減る例:木材10→8本(2本消費)

✅ もう一歩深堀り(補足)

  • 「処理可能」を押すと
    • stock.move が「完了済み」ステータスになる(在庫移動の確定処理)
    • stock.quant(在庫数量)が減少する
  • シリアル/ロット管理が有効なら
    • 使用したロット番号を選ぶ画面が出る場合もある


Comments

コメントを残す

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