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

製造 全体概観

✅ それぞれの役割と関係性

機能主な役割関連
プロダクト(product.template)製品の基本情報(共通部分)プロダクトバリアントの親、BOMの対象、ロット管理の対象
プロダクトバリアント(product.product)個別の製品バリエーション(色、サイズ等)プロダクトの派生形。各ロット/シリアルに紐づく
部品表(BOM、mrp.bom)製品を作るための部品構成プロダクト/プロダクトバリアントに関連付け可能
ロット・製品番号(stock.lot)製品/原材料の追跡管理(トレーサビリティ)プロダクトバリアント単位で発行。BOMの部品にも紐づく
graph TD
A[プロダクト (product.template)]
  --> B[プロダクトバリアント (product.product)]
B --> C[ロット/シリアル (stock.lot)]

A --> D[部品表 (mrp.bom)]
D --> E[部品 (product.template または product.product)]

✅ 各要素の詳細とつながり

1️⃣ プロダクト(product.template)

  • 製品の基本情報(共通属性)
    • 商品名、カテゴリ、販売/購買可能、会計設定
  • 例:Tシャツ(色・サイズは共通)

2️⃣ プロダクトバリアント(product.product)

  • プロダクトの具体的な「バリエーション」
    • 色、サイズ、仕様の違いで分かれる
  • プロダクトに定義した属性(Attribute)によって自動生成される
  • 例:
    • Tシャツ(赤・Mサイズ)
    • Tシャツ(青・Lサイズ)
  • ロット/シリアルはこのレベルで紐づく

3️⃣ 部品表(BOM、mrp.bom)

  • ある製品を作るために必要な部品のリスト
    • 対象は:
      • プロダクト単位(全バリアント共通)
      • またはプロダクトバリアント単位(個別BOM)
  • 例:
    • プロダクト「自転車」→ 部品表にはフレーム、タイヤ、ハンドルなど
  • 製造時にはBOMに従って作業オーダーや材料引当が行われる

4️⃣ ロット・製品番号(stock.lot)

  • 個別の在庫単位を識別するための番号
    • ロット(Lot):複数の数量が同じ番号で管理
    • シリアル(Serial Number):1つの製品ごとに一意の番号
  • 紐づき先は プロダクトバリアント単位(product.product)
  • 例:
    • 製品「Tシャツ(赤・M)」のロット番号「LOT-20240526-001」

✅ 製品作成から出荷までの流れイメージ

ステップデータの関係
製品を作成プロダクト(product.template)作成
バリエーション追加属性を設定 → プロダクトバリアント生成
製造のため部品表作成プロダクト/バリアントにBOMを作成
製造オーダー発行BOM参照 → 材料引当/作業オーダー作成
完成品入庫プロダクトバリアント + ロット/シリアル で在庫管理
出荷ロット番号やシリアル番号で追跡可能

✅ まとめ

項目管理対象関連性
プロダクト製品の共通情報
プロダクトバリアント色・サイズ別の個体子。ロット/シリアルはここで管理
部品表(BOM)組立に必要な部品リストプロダクト/バリアントに紐づく
ロット/シリアル追跡単位の識別子バリアントに紐づき、入出庫を管理
erDiagram
    PRODUCT_TEMPLATE ||--o{ PRODUCT_PRODUCT : has
    PRODUCT_PRODUCT ||--o{ LOT : has
    PRODUCT_TEMPLATE ||--o{ BOM : has
    BOM ||--o{ BOM_LINE : has
    BOM_LINE }o--|| PRODUCT_TEMPLATE : uses
    PRODUCT_PRODUCT ||--o{ STOCK_MOVE : generates
    PRODUCT_PRODUCT ||--o{ PURCHASE_ORDER_LINE : purchased
    PRODUCT_PRODUCT ||--o{ SALE_ORDER_LINE : sold
    PRODUCT_TEMPLATE ||--o{ MRP_PRODUCTION : produces
    MRP_PRODUCTION ||--o{ MRP_WORKORDER : consists_of

    PRODUCT_TEMPLATE {
        string name
        string type
    }

    PRODUCT_PRODUCT {
        string name
        string attribute_values
    }

    LOT {
        string name
        string serial_number
    }

    BOM {
        string name
        string type
    }

    BOM_LINE {
        int quantity
    }

    STOCK_MOVE {
        int quantity
        date move_date
    }

    PURCHASE_ORDER_LINE {
        float price_unit
        int quantity
    }

    SALE_ORDER_LINE {
        float price_unit
        int quantity
    }

    MRP_PRODUCTION {
        string production_name
        int quantity
    }

    MRP_WORKORDER {
        string workorder_name
        string state
    }

Comments

コメントを残す

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