{
    "table_name": "customer_price_rank_schedules",
    "display_name": "得意先単価ランク変更予約",
    "description": "得意先の単価ランク変更を適用日指定で予約登録します。区分カラム（標準／品目別／解除）により、標準ランク変更・品目別ランク設定・品目別ランク解除を1つのCSVで扱えます。適用日を迎えると日次バッチ（00:05）で自動的にマスタへ反映されます。",
    "type": "single_table",
    "processor_class": "App\\Services\\Logic\\User\\CsvImport\\SingleTable\\CustomerPriceRankScheduleProcessor",
    "import_behavior": "all_or_nothing",
    "supported_modes": ["insert"],
    "key_fields": ["id"],
    "required_fields": ["customer_code", "schedule_type_label", "effective_date"],
    "code_padding": {
        "customer_code": 6,
        "category_code": 6
    },
    "field_labels": {
        "customer_code": "得意先コード",
        "schedule_type_label": "区分",
        "category_code": "商品分類コード",
        "price_rank": "単価ランク",
        "effective_date": "適用日",
        "note": "備考"
    },
    "field_types": {
        "customer_code": "varchar",
        "schedule_type_label": "varchar",
        "category_code": "varchar",
        "price_rank": "varchar",
        "effective_date": "date",
        "note": "varchar"
    },
    "enum_values": {
        "schedule_type_label": {
            "標準": "標準ランク変更",
            "品目別": "品目別ランク設定",
            "解除": "品目別ランク解除"
        }
    },
    "validation_rules": {
        "customer_code": {
            "required": true,
            "message": "得意先コードは必須です。有効な得意先のコードを入力してください。"
        },
        "schedule_type_label": {
            "required": true,
            "enum": ["標準", "品目別", "解除"],
            "message": "区分は「標準」「品目別」「解除」のいずれかを入力してください。"
        },
        "category_code": {
            "required": false,
            "message": "商品分類コードは中分類（level=2）かつ有効な分類のコードを入力してください。区分が「品目別」「解除」の場合は必須です。"
        },
        "price_rank": {
            "required": false,
            "message": "単価ランクは単価ランクマスタのランク名またはランクコードを入力してください。区分が「標準」「品目別」の場合は必須です。"
        },
        "effective_date": {
            "required": true,
            "date_format": ["Y-m-d", "Y/m/d"],
            "after": "today",
            "message": "適用日は必須です。翌日以降の日付をYYYY-MM-DDまたはYYYY/MM/DD形式で入力してください。"
        },
        "note": {
            "max_length": 500,
            "message": "備考は500文字以内で入力してください。"
        }
    },
    "error_codes": {
        "E002": {
            "type": "master",
            "message": "得意先コード「{code}」が見つかりません"
        },
        "E003": {
            "type": "master",
            "message": "商品分類コード「{code}」が見つかりません／中分類ではありません"
        },
        "E004": {
            "type": "master",
            "message": "単価ランク「{value}」が見つかりません"
        },
        "E005": {
            "type": "required",
            "message": "区分に応じた必須項目が入力されていません"
        },
        "E006": {
            "type": "period",
            "message": "適用日は翌日以降の日付を指定してください"
        },
        "E008": {
            "type": "duplicate",
            "message": "同一対象の待機中予約が既に存在します"
        },
        "E009": {
            "type": "not_found",
            "message": "解除対象のグループ価格設定が存在しません"
        },
        "E010": {
            "type": "duplicate",
            "message": "同一ファイル内で同じ対象（得意先＋商品分類）が重複しています"
        },
        "E011": {
            "type": "classification",
            "message": "区分は「標準」「品目別」「解除」のいずれかを指定してください"
        }
    },
    "business_rules": {
        "schedule_type_standard": {
            "description": "区分「標準」は標準ランク（得意先マスタの単価ランク）の変更予約。商品分類コードは空欄、単価ランクは必須",
            "validation": "required"
        },
        "schedule_type_category_set": {
            "description": "区分「品目別」はグループ価格設定（得意先×中分類）の設定・変更予約。商品分類コード・単価ランクとも必須",
            "validation": "required"
        },
        "schedule_type_category_clear": {
            "description": "区分「解除」はグループ価格設定の解除予約（標準ランクへ戻す）。商品分類コードは必須、単価ランクは空欄。解除対象の設定が存在しない場合はエラー",
            "validation": "required"
        },
        "effective_date_after_today": {
            "description": "適用日は翌日以降のみ指定可能（当日不可）。当日変更が必要な場合は得意先マスタを直接編集する",
            "validation": "required"
        },
        "pending_schedule_unique": {
            "description": "同一対象（得意先＋商品分類。標準ランクは分類なし）の待機中予約は1件まで。既に待機中予約がある場合は予約一覧から取消してから再取込する",
            "validation": "required"
        },
        "file_duplicate_check": {
            "description": "同一ファイル内で同じ対象が2行以上ある場合はエラー",
            "validation": "required"
        },
        "category_level_2_only": {
            "description": "商品分類は中分類（level=2）かつ有効な分類のみ指定可能",
            "validation": "required"
        }
    },
    "import_notes": {
        "customer_code": "得意先コードは有効な得意先のコードを入力してください（6桁未満は自動的に0埋めされます）",
        "schedule_type_label": "区分は「標準」「品目別」「解除」のいずれかを入力してください",
        "category_code": "商品分類コードは中分類（level=2）のコードを入力してください（6桁未満は自動的に0埋めされます）。区分が「標準」の場合は空欄にしてください",
        "price_rank": "単価ランクはランクコード（例: 00003）またはランク名（例: ランク３）で入力してください。区分が「解除」の場合は空欄にしてください",
        "effective_date": "適用日は翌日以降の日付をYYYY-MM-DDまたはYYYY/MM/DD形式で入力してください",
        "auto_apply": "登録された予約は日次バッチ（毎日00:05）で自動的にマスタへ反映されます",
        "cancel_and_reimport": "適用日前であれば「得意先単価ランク変更予約」一覧から取消し、修正したCSVで再取込できます"
    },
    "sample_data": {
        "headers": [
            "得意先コード",
            "区分",
            "商品分類コード",
            "単価ランク",
            "適用日",
            "備考"
        ],
        "rows": [
            ["031009", "標準", "", "00003", "2026-10-01", "10月価格改定"],
            ["031009", "品目別", "000401", "00001", "2026-10-01", ""],
            ["031009", "解除", "000201", "", "2026-10-01", "標準ランクへ戻す"]
        ]
    },
    "csv_format_example": {
        "description": "得意先単価ランク変更予約インポート用CSVフォーマット（区分カラム方式）",
        "headers": [
            "得意先コード",
            "区分",
            "商品分類コード",
            "単価ランク",
            "適用日",
            "備考"
        ],
        "sample_data": [
            ["# 区分は「標準」「品目別」「解除」のいずれかを入力してください", "", "", "", "", ""],
            ["# 標準 = 標準ランク変更（商品分類コードは空欄・単価ランク必須）", "", "", "", "", ""],
            ["# 品目別 = 品目別ランク設定（商品分類コード・単価ランクとも必須）", "", "", "", "", ""],
            ["# 解除 = 品目別ランク解除（商品分類コード必須・単価ランクは空欄）", "", "", "", "", ""],
            ["# 商品分類コードは中分類（level=2）のコードを入力してください", "", "", "", "", ""],
            ["# 単価ランクはランクコード（00001〜）またはランク名で入力してください", "", "", "", "", ""],
            ["# 適用日は翌日以降の日付を入力してください", "", "", "", "", ""],
            ["# 同一の得意先×商品分類で待機中の予約が既にある行はエラーになります", "", "", "", "", ""],
            ["031009", "標準", "", "00003", "2026-10-01", "10月価格改定"],
            ["031009", "品目別", "000401", "00001", "2026-10-01", ""],
            ["031009", "解除", "000201", "", "2026-10-01", "標準ランクへ戻す"]
        ]
    }
}
