Files
Aknaproff/HOTFIX_v4.1.11.md
Deploy Bot 64403d6fd6 v4.1.21: Реструктуризация проекта для Synology ARM
- Реструктуризация: src/ разбит на middleware/, utils/, repositories/ (удалены), routes/ (удалены)
- Добавлен src/original-html.ts — полный HTML с reportModal
- Добавлен src/index.tsx.backup — React-компонент с reportModal
- Миграции переименованы (0001_initial_schema.sql)
- Добавлена миграция 0018 (удалена позже)
- Docker: multi-stage build, wrangler.toml
- Frontend: public/static/app.js + style.css
- seed.sql добавлен
- Документация: CHANGELOG, CHANGES_v4.1.0-4.1.9, PROJECT_STRUCTURE
2026-01-14 18:37:00 +02:00

4.8 KiB
Raw Blame History

AKNAPROFF v4.1.11 - HOTFIX

Дата: 2025-12-31
Тип: HOTFIX - Критическое исправление
Статус: Production Ready


🐛 Исправленная проблема

Ошибка: "NOT NULL constraint failed: production_records.price"

Симптомы:

POST /api/records
[HTTP/2 500 Internal Server Error]
Save record error: Failed to create record

Консоль браузера:

Viga salvestamisel: Failed to create record
Save record error: Request failed with status code 500

Логи сервера:

Error creating record: D1_ERROR: NOT NULL constraint failed: production_records.price: SQLITE_CONSTRAINT

Причина:
В реальной БД колонка price имеет ограничение NOT NULL, но код передавал null вместо 0.

Схема БД:

CREATE TABLE production_records (
  ...
  price REAL NOT NULL,  -- ⚠️ NOT NULL!
  ...
);

Старый код (v4.1.10):

const price = data.price ? parseFloat(data.price) : null  // ❌ null вызывает ошибку

Новый код (v4.1.11):

const price = data.price ? parseFloat(data.price) : 0  // ✅ 0 соответствует схеме

Решение

Изменённые файлы:

src/index.tsx:

  • POST /api/records: изменено null0 для price
  • PUT /api/records/🆔 изменено null0 для price

public/original.html:

  • Cache version: v4.1.11

dist/_worker.js:

  • Пересобран с исправлениями

🧪 Тестирование

Тест 1: Добавление записи без цены

curl -X POST http://localhost:3000/api/records \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "month":"1",
    "year":"2025",
    "client_name":"Test Client",
    "offer_number":"TEST-001",
    "work_number":"WRK-001",
    "quantity":"5"
  }'

Результат v4.1.10: 500 Internal Server Error
Результат v4.1.11: {"success":true,"id":49}

Тест 2: Проверка сохранённой записи

SELECT id, client_name, price FROM production_records WHERE id = 49

Результат:

id: 49
client_name: "Test Client"
price: 0  ✅

Тест 3: Добавление записи с ценой

curl -X POST http://localhost:3000/api/records \
  -d '{"month":"1","year":"2025","client_name":"Test","offer_number":"123","work_number":"456","quantity":"1","price":"100.50"}'

Результат: {"success":true,"id":50}, price = 100.5


🔄 Миграция с v4.1.10

Обновление не требует изменений БД

Просто замените файлы:

# 1. Остановить
docker-compose down

# 2. Заменить код
cp /path/to/new/dist/_worker.js dist/
cp /path/to/new/src/index.tsx src/
cp /path/to/new/public/original.html public/

# 3. Запустить
docker-compose up -d --build

⚠️ НЕ трогайте data/ директорию!


📊 Сравнение версий

Параметр v4.1.10 v4.1.11
price default null 0
Добавление без цены 500 ошибка Работает
Добавление с ценой Работает Работает
NOT NULL constraint Нарушается Соблюдается

Все проверки пройдены

  • Добавление записи без цены → price = 0
  • Добавление записи с ценой → price сохраняется
  • Редактирование записи → price обновляется
  • NOT NULL constraint → соблюдается
  • Кнопка "Lisa uus rida" → работает
  • Права доступа → admin может добавлять
  • Cache version → v4.1.11

🎯 Статус

Версия: v4.1.11
Тип: HOTFIX
Критичность: Высокая (блокировала добавление записей)
Совместимость: Полная обратная совместимость
Требуется миграция БД: Нет
Статус: Production Ready


📝 Changelog Summary

v4.1.11 (2025-12-31) - HOTFIX
- Fixed: NOT NULL constraint failed for price column
- Changed: price default value from null to 0
- Files: src/index.tsx, dist/_worker.js, public/original.html
- Status: Production Ready

ПРОБЛЕМА ИСПРАВЛЕНА! Добавление записей теперь работает корректно.