Не отправить чужой формат: проверить проекцию цены до создания CSV

Отчёт показывает фактические наблюдения программы. Если создавалась учебная таблица, её удаление проверено отдельно.

Наблюдаемый результат программы
НаблюдениеРезультат
Заголовок CSV после чтенияsku,price
Цена CABLE в файле120.00
Цена CLAMP в файле25.50
Строк товаров в файле2
Переименованное price отвергнутода
Текстовое price отвергнутода
CAST сохранил значения, но не типда
Создан rejected.csvнет
Строки и дополнительные наблюдения
{
    "valid_metadata": [
        {
            "label": "sku",
            "name": "sku",
            "type": 21,
            "scale": 0
        },
        {
            "label": "price",
            "name": "price",
            "type": 0,
            "scale": 2
        }
    ],
    "selected_rows": [
        {
            "sku": "CABLE",
            "price": "120.00"
        },
        {
            "sku": "CLAMP",
            "price": "25.50"
        }
    ],
    "export_columns": [
        "sku",
        "price"
    ],
    "export_rows": [
        [
            "CABLE",
            "120.00"
        ],
        [
            "CLAMP",
            "25.50"
        ]
    ],
    "export_text": "sku,price\nCABLE,120.00\nCLAMP,25.50\n",
    "rejected_cases": {
        "renamed": {
            "rejected": true,
            "reason": "Ожидались ровно sku,price в этом порядке.",
            "metadata": [
                {
                    "label": "sku",
                    "name": "sku",
                    "type": 21,
                    "scale": 0
                },
                {
                    "label": "renamed_price",
                    "name": "price",
                    "type": 0,
                    "scale": 2
                }
            ],
            "actual_rows": [
                {
                    "sku": "CABLE",
                    "renamed_price": "120.00"
                },
                {
                    "sku": "CLAMP",
                    "renamed_price": "25.50"
                }
            ],
            "file_exists": false
        },
        "text": {
            "rejected": true,
            "reason": "Ожидались строковый sku и DECIMAL price с масштабом 2.",
            "metadata": [
                {
                    "label": "sku",
                    "name": "sku",
                    "type": 21,
                    "scale": 0
                },
                {
                    "label": "price",
                    "name": "",
                    "type": 21,
                    "scale": 0
                }
            ],
            "actual_rows": [
                {
                    "sku": "CABLE",
                    "price": "120.00"
                },
                {
                    "sku": "CLAMP",
                    "price": "25.50"
                }
            ],
            "file_exists": false
        }
    },
    "rejected_file_exists": false,
    "cast_has_same_values": true
}

Полный JSON результата, включая реальные идентификаторы, сохранён рядом в result.json.