{
  "display_name": "倉庫移動インポート",
  "description": "倉庫間の在庫移動をCSVで一括処理",
  "processor_class": "App\\Services\\Logic\\User\\CsvImport\\SingleTable\\InventoryTransferImportProcessor",
  "call_process_row": false,
  "import_behavior": "all_or_nothing",
  "supported_modes": ["insert"],
  "fields": {
    "product_code": {
      "label": "商品コード",
      "type": "string",
      "required": true,
      "max_length": 40,
      "validation_rules": [
        "required",
        "string",
        "max:40"
      ],
      "description": "移動対象の商品コード"
    },
    "from_warehouse_code": {
      "label": "移動元倉庫コード",
      "type": "string",
      "required": true,
      "max_length": 20,
      "validation_rules": [
        "required",
        "string",
        "max:20"
      ],
      "description": "在庫を出す倉庫のコード"
    },
    "to_warehouse_code": {
      "label": "移動先倉庫コード",
      "type": "string",
      "required": true,
      "max_length": 20,
      "validation_rules": [
        "required",
        "string",
        "max:20"
      ],
      "description": "在庫を入れる倉庫のコード"
    },
    "lot_number": {
      "label": "ロット番号",
      "type": "string",
      "required": false,
      "max_length": 50,
      "validation_rules": [
        "string",
        "max:50"
      ],
      "description": "ロット番号（BE品の場合は必須）"
    },
    "expiration_date": {
      "label": "賞味期限",
      "type": "date",
      "required": false,
      "format": "Y-m-d",
      "validation_rules": [
        "date"
      ],
      "description": "賞味期限（BE品の場合は必須、YYYY-MM-DD形式）"
    },
    "transfer_quantity": {
      "label": "移動数量",
      "type": "decimal",
      "required": true,
      "min_value": 0.001,
      "validation_rules": [
        "required",
        "numeric",
        "min:0.001"
      ],
      "description": "移動する数量（0より大きい数値）"
    }
  },
  "foreign_key_mappings": {
    "product_code": {
      "reference_table": "products",
      "reference_key_column": "product_code",
      "reference_value_column": "id",
      "required": true,
      "error_message": "商品コード「{value}」が商品マスタに存在しません"
    },
    "from_warehouse_code": {
      "reference_table": "warehouses",
      "reference_key_column": "warehouse_code",
      "reference_value_column": "id",
      "required": true,
      "error_message": "移動元倉庫コード「{value}」が倉庫マスタに存在しません"
    },
    "to_warehouse_code": {
      "reference_table": "warehouses",
      "reference_key_column": "warehouse_code",
      "reference_value_column": "id",
      "required": true,
      "error_message": "移動先倉庫コード「{value}」が倉庫マスタに存在しません"
    }
  },
  "code_padding": {
    "product_code": 8,
    "from_warehouse_code": 3,
    "to_warehouse_code": 3
  },
  "business_rules": {
    "be_product_expiration_required": {
      "rule": "if product_type=2 AND stock_control_type=1 then expiration_date required",
      "error_message": "BE品の場合、賞味期限は必須です"
    },
    "different_warehouse": {
      "rule": "from_warehouse_code != to_warehouse_code",
      "error_message": "移動元と移動先は異なる倉庫を指定してください"
    },
    "source_inventory_exists": {
      "rule": "source_inventory_lot exists",
      "error_message": "移動元の在庫が存在しません"
    },
    "sufficient_quantity": {
      "rule": "source_quantity >= transfer_quantity",
      "error_message": "移動元在庫（{source_quantity}）が移動数量より少ないです"
    },
    "allocation_check": {
      "rule": "(source_quantity - transfer_quantity) >= allocated_quantity",
      "error_message": "移動後の残数（{remaining_quantity}）が引当済み数量（{allocated_quantity}）を下回ります"
    }
  },
  "error_codes": {
    "E001": {
      "type": "format",
      "message": "必須カラム「{column}」がCSVに含まれていません"
    },
    "E002": {
      "type": "master",
      "message": "商品コード「{code}」が見つかりません"
    },
    "E003": {
      "type": "master",
      "message": "倉庫コード「{code}」が見つかりません"
    },
    "E004": {
      "type": "lot",
      "message": "BE品のため賞味期限は必須です"
    },
    "E005": {
      "type": "quantity",
      "message": "移動数量は0より大きい数値で入力してください"
    },
    "E006": {
      "type": "allocation",
      "message": "移動後の残数（{remaining_quantity}）が引当済み数量（{allocated_quantity}）を下回ります"
    },
    "E007": {
      "type": "inventory",
      "message": "移動元の在庫が存在しません"
    },
    "E008": {
      "type": "quantity",
      "message": "移動元在庫（{source_quantity}）が移動数量より少ないです"
    },
    "E009": {
      "type": "warehouse",
      "message": "移動元と移動先は異なる倉庫を指定してください"
    }
  },
  "csv_format_example": {
    "description": "倉庫移動用CSVフォーマット。BE品はロット番号・賞味期限が必須。",
    "headers": [
      "商品コード",
      "移動元倉庫コード",
      "移動先倉庫コード",
      "ロット番号",
      "賞味期限",
      "移動数量"
    ],
    "sample_data": [
      ["GT-101", "WH01", "WH02", "", "", "50"],
      ["GT-201", "WH01", "WH03", "LOT2025001", "2025-06-30", "30"],
      ["GT-301", "WH02", "WH01", "", "", "100"]
    ]
  }
}
