{
    "table_name": "product_price_change_schedules",
    "display_name": "商品金額変更予約",
    "description": "商品マスタの金額系6項目（粗利算出用単価／標準仕入単価／購入価格／付属原価／上代／参考売価）の変更を適用開始日指定で予約登録します。変更する項目だけ新値を入力し、変更しない項目は空欄のままにしてください。予約は待機中で登録され、適用開始日を迎えると日次バッチ（00:25）で自動的にマスタへ反映されます。",
    "type": "single_table",
    "processor_class": "App\\Services\\Logic\\User\\CsvImport\\SingleTable\\ProductPriceChangeScheduleProcessor",
    "import_behavior": "all_or_nothing",
    "supported_modes": ["insert"],
    "key_fields": ["id"],
    "required_fields": ["product_code", "effective_date"],
    "code_padding": {
        "product_code": 8
    },
    "field_labels": {
        "product_code": "商品コード",
        "new_profit_calc_price": "粗利算出用単価",
        "new_cost_price": "標準仕入単価",
        "new_default_cost_price": "購入価格",
        "new_accessory_cost_price": "付属原価",
        "new_list_price": "上代",
        "new_reference_price": "参考売価",
        "effective_date": "適用開始日",
        "note": "備考"
    },
    "field_types": {
        "product_code": "varchar",
        "new_profit_calc_price": "decimal",
        "new_cost_price": "decimal",
        "new_default_cost_price": "decimal",
        "new_accessory_cost_price": "decimal",
        "new_list_price": "decimal",
        "new_reference_price": "decimal",
        "effective_date": "date",
        "note": "varchar"
    },
    "validation_rules": {
        "product_code": {
            "required": true,
            "message": "商品コードは必須です。有効な商品のコードを入力してください。"
        },
        "new_profit_calc_price": {
            "required": false,
            "message": "粗利算出用単価は0以上の数値（整数部14桁・小数点以下4桁まで）で入力してください。変更しない場合は空欄にしてください。"
        },
        "new_cost_price": {
            "required": false,
            "message": "標準仕入単価は0以上の数値（整数部14桁・小数点以下4桁まで）で入力してください。変更しない場合は空欄にしてください。"
        },
        "new_default_cost_price": {
            "required": false,
            "message": "購入価格は0以上の数値（整数部14桁・小数点以下4桁まで）で入力してください。変更しない場合は空欄にしてください。"
        },
        "new_accessory_cost_price": {
            "required": false,
            "message": "付属原価は0以上の数値（整数部14桁・小数点以下4桁まで）で入力してください。変更しない場合は空欄にしてください。"
        },
        "new_list_price": {
            "required": false,
            "message": "上代は0以上の数値（整数部14桁・小数点以下4桁まで）で入力してください。変更しない場合は空欄にしてください。"
        },
        "new_reference_price": {
            "required": false,
            "message": "参考売価は0以上の数値（整数部14桁・小数点以下4桁まで）で入力してください。変更しない場合は空欄にしてください。"
        },
        "effective_date": {
            "required": true,
            "date_format": ["Y-m-d", "Y/m/d"],
            "after": "today",
            "after_message": "適用開始日は翌日以降の日付を指定してください。",
            "message": "適用開始日は必須です。翌日以降の日付をYYYY-MM-DDまたはYYYY/MM/DD形式で入力してください。"
        },
        "note": {
            "max_length": 500,
            "message": "備考は500文字以内で入力してください。"
        }
    },
    "error_codes": {
        "E002": {
            "type": "master",
            "message": "商品コード「{code}」が見つかりません／無効な商品です"
        },
        "E005": {
            "type": "required",
            "message": "必須項目が入力されていません／変更する項目が1つも入力されていません"
        },
        "E006": {
            "type": "period",
            "message": "適用開始日は翌日以降の日付を指定してください"
        },
        "E007": {
            "type": "quantity",
            "message": "金額の値が数値ではありません／桁数が上限を超えています"
        },
        "E008": {
            "type": "duplicate",
            "message": "同一商品の待機中の予約が既に存在します"
        },
        "E010": {
            "type": "duplicate",
            "message": "同一ファイル内で同じ商品が重複しています"
        }
    },
    "business_rules": {
        "changed_field_required": {
            "description": "粗利算出用単価・標準仕入単価・購入価格・付属原価・上代・参考売価のうち1つ以上に新値を入力する。全項目が空欄の行はエラー。空欄の項目は予約の対象外となり、適用時もマスタの値は変更されない",
            "validation": "required"
        },
        "zero_is_change_target": {
            "description": "0 は変更対象（0円へ変更する予約）として扱う。変更しない項目は必ず空欄にする",
            "validation": "required"
        },
        "effective_date_after_today": {
            "description": "適用開始日は翌日以降のみ指定可能（当日不可）。当日変更が必要な場合は商品マスタを直接編集する",
            "validation": "required"
        },
        "pending_schedule_unique": {
            "description": "同一商品の待機中の予約は1件まで。既に待機中の予約がある商品は「商品金額変更予約」一覧から取消してから再取込する",
            "validation": "required"
        },
        "file_duplicate_check": {
            "description": "同一ファイル内で同じ商品が2行以上ある場合はエラー",
            "validation": "required"
        },
        "purchase_price_primary_supplier": {
            "description": "購入価格は商品仕入先の最優先1件（優先順位の昇順で先頭）へ適用される。仕入先が登録されていない商品では購入価格のみ適用されず、他の項目は適用される",
            "validation": "optional"
        },
        "open_price_list_price_allowed": {
            "description": "オープンプライス商品でも上代の予約は登録できる",
            "validation": "optional"
        },
        "retroactive_profit_calc_price": {
            "description": "適用時に未出荷（未納・分納中）の受注明細へ遡及するのは粗利算出用単価のみ。他の5項目は受注明細を書き換えない",
            "validation": "optional"
        }
    },
    "import_notes": {
        "product_code": "商品コードは有効な商品のコードを入力してください（8桁未満は自動的に0埋めされます）",
        "changed_fields": "6項目のうち変更する項目だけ新値を入力してください。空欄の項目は予約の対象外となります（0を入力すると「0円へ変更する」予約になります）",
        "amount_format": "金額は0以上の数値（整数部14桁・小数点以下4桁まで）で入力してください。桁区切りのカンマは入っていても構いません",
        "new_default_cost_price": "購入価格は商品仕入先の最優先1件へ適用されます。仕入先が未登録の商品では購入価格のみ適用されません",
        "new_list_price": "上代はオープンプライス商品でも予約できます",
        "effective_date": "適用開始日は翌日以降の日付をYYYY-MM-DDまたはYYYY/MM/DD形式で入力してください",
        "note": "備考は500文字以内で入力してください",
        "auto_apply": "登録された予約は待機中となり、日次バッチ（毎日00:25）で自動的にマスタへ反映されます。適用後のステータスは適用済みになります",
        "retroactive": "粗利算出用単価を変更する予約は、適用時に未出荷（未納・分納中）の受注明細の原価も書き換えます",
        "cancel_and_reimport": "適用開始日前であれば「商品金額変更予約」一覧から取消し、修正したCSVで再取込できます"
    },
    "sample_data": {
        "headers": [
            "商品コード",
            "粗利算出用単価",
            "標準仕入単価",
            "購入価格",
            "付属原価",
            "上代",
            "参考売価",
            "適用開始日",
            "備考"
        ],
        "rows": [
            ["00012345", "1850.00", "2100.00", "1750.00", "", "5500", "4980", "2026-10-01", "10月原価改定"],
            ["00012346", "", "", "1980.00", "", "", "", "2026-10-01", "購入価格のみ変更"],
            ["00012347", "2400.00", "", "", "", "", "", "2026-11-01", "粗利算出用単価のみ変更"]
        ]
    },
    "csv_format_example": {
        "description": "商品金額変更予約インポート用CSVフォーマット（変更する項目だけ新値を入力する方式）",
        "headers": [
            "商品コード",
            "粗利算出用単価",
            "標準仕入単価",
            "購入価格",
            "付属原価",
            "上代",
            "参考売価",
            "適用開始日",
            "備考"
        ],
        "sample_data": [
            ["# 変更する項目だけ新値を入力し、変更しない項目は空欄にしてください", "", "", "", "", "", "", "", ""],
            ["# 6項目すべてが空欄の行はエラーになります", "", "", "", "", "", "", "", ""],
            ["# 0 を入力すると「0円へ変更する」予約になります（変更しない項目は必ず空欄に）", "", "", "", "", "", "", "", ""],
            ["# 購入価格は商品仕入先の最優先1件へ適用されます", "", "", "", "", "", "", "", ""],
            ["# 適用開始日は翌日以降の日付を入力してください", "", "", "", "", "", "", "", ""],
            ["# 同一商品で待機中の予約が既にある行はエラーになります", "", "", "", "", "", "", "", ""],
            ["00012345", "1850.00", "2100.00", "1750.00", "", "5500", "4980", "2026-10-01", "10月原価改定"],
            ["00012346", "", "", "1980.00", "", "", "", "2026-10-01", "購入価格のみ変更"],
            ["00012347", "2400.00", "", "", "", "", "", "2026-11-01", "粗利算出用単価のみ変更"]
        ]
    }
}
