/** * 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 原価計算について – Raqqa

Odoo MRP 原価計算について

Odooの製造モジュールにおいて、「Costing Information(コスト情報)」や「Cost per Hour(1時間あたりコスト)」の設定は、**製品の原価計算(Product Costing)**において非常に重要な役割を果たします。


✅ 製造モジュールにおける原価計算ロジックの概要

1. 製造原価の構成要素

Odooでの製造原価は大きく分けて以下の3要素から成り立ちます:

要素内容
材料費BOM(部品表)に登録された構成品の原価合計
工賃(人件費)作業区(Work Center)で定義された時間単価 × 所要時間
その他費用間接費、間接材料など(必要に応じてカスタム可能)

2. Cost per Hourの役割

  • Work Center(作業区) に対して、
    • Time Efficiency(作業効率)
    • Capacity(処理能力)
    • Cost per Hour(時間単価)
    • Setup Time / Cleanup Time(準備/片付け時間)

が定義されており、これらの値に基づいて、製造オーダーごとの「工賃部分の原価」が計算されます。


3. 具体的な計算ロジック

たとえば、以下のようなWork Centerがあるとします:

  • Cost per Hour = ¥3,000
  • 所要時間(Expected Duration) = 2 時間

→ この作業工程にかかる工賃:
 ¥3,000 × 2 = ¥6,000

この金額は、製品の原価(Cost)に加算されます。


4. どこで計算結果が見られる?

  • 製品マスタ → 原価(Cost)
    • 自動的に計算された材料費+工賃が合計され、ここに反映されます(※標準原価法、実際原価法など設定により異なります)
  • 製造オーダー → コスト分析(Cost Analysis)
    • 実際の作業時間と原価構成を比較可能

5. 📌 注意点

  • この原価反映が正しく動作するには、**コスト計算方法(Costing Method)**を製品で正しく設定する必要があります。
    • 例:Standard(標準原価)、Real(実際原価)、Average(移動平均)

✅ 結論

Cost per Hour」で設定された作業区ごとの人件費・マシンコストが、製品の実際原価に工賃として加算されます。これにより、正確な製造原価と利益率の把握が可能になります。

✅ 原価計算方法の設定手順(Odoo)

1. 対象製品(プロダクト)のカテゴリ設定を確認する

  • ナビゲーション:
    [プロダクト] > 一般情報タブ > カテゴリ(内部リンク)をクリック

🔧 プロダクトカテゴリの設定項目解説(Odoo)

📦 ロジスティクス設定

項目説明
払出方針強制?「先入先出(FIFO)」や「後入先出(LIFO)」などの出庫ルールを在庫操作に強制的に適用します(OdooのデフォルトはFIFO)
パッケージング引当?在庫から出庫するとき、製品がパッケージにまとめられている場合にそれ単位で引き当てるかを制御します
全パッケージングのみ引当完全なパッケージ単位でのみ在庫を引き当てる
部分梱包引当パッケージが一部しか揃っていなくても在庫引当を許可する(柔軟な運用)

🧮 在庫評価と原価計算法(Inventory & Costing)

項目説明
在庫評価(Inventory Valuation)
  • 手動: 受払に応じた仕訳は自動では発生しません
  • 自動: 在庫移動と連動して仕訳が生成されます(自動会計連携) |
    | 原価計算法(Costing Method) |
  • 標準原価(Standard Price): 事前に設定した単価で評価
  • FIFO: 実際の入庫順でコスト評価
  • AVCO: 移動平均法(仕入単価を平均化) |

📘 勘定属性(会計連携)

勘定科目説明
収益勘定(Income Account)売上が発生したときに使用する科目。例:410000 売上高
費用勘定(Expense Account)売上原価など、費用を記録する科目。例:510000 商品売上原価
前受金勘定(Deferred Revenue Account)商品・サービスを提供する前に受け取った金額を計上する負債勘定。サブスクリプションや前払い契約に使用

🧩 補足

  • これらの設定は「製品カテゴリ」単位で適用されるため、カテゴリに属するすべてのプロダクトがこれに準じます。
  • 原価計算法や会計連携を適切に設定することで、在庫評価・売上原価の正確な記録が可能となります。

Odooでは、原価計算方法や在庫評価方法は「製品単位」ではなく**「製品カテゴリー単位」**で管理されます。これにより、同じタイプの製品に一貫した原価評価ルールを適用でき、管理が簡素化されます。


Comments

コメントを残す

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