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
This commit is contained in:
Deploy Bot
2026-01-14 18:37:00 +02:00
parent 4898f5ec7f
commit 64403d6fd6
113 changed files with 19231 additions and 3084 deletions

294
README.md Executable file → Normal file
View File

@@ -1,122 +1,214 @@
# Aknaproff Backend Restoration
# AKNAPROFF Tootmine
This repository contains the Cloudflare Pages/Workers backend implementation required to restore the Aknaproff production tracker service to its historical state (**v3.20.8**) while keeping the provided HTML/JS/CSS frontend unchanged.
**Версия:** 4.0.4 (28.11.2025)
**Статус:** ✅ Production Ready - **Все функции работают, включая клики по ячейкам**
## Project Summary
- **Goal:** полностью восстановить API, миграции и бизнес-логику для фронтенда `AKNAPROFF Tootmine`.
- **Текущая внутренняя версия:** `v1.0.0` (см. `docs/CHECKLIST.md`).
- **Технологии:** Hono (TypeScript), Cloudflare Pages + Workers, D1 (SQLite), Wrangler, Vite.
- **Документация:**
- [Техническое задание](docs/TECH_SPEC.md)
- [Чек-лист и прогресс](docs/CHECKLIST.md)
## 📋 Обзор проекта
## Структура проекта
Система управления производством окон для компании AKNAPROFF. Веб-приложение построено на Hono (Cloudflare Workers) с базой данных D1 SQLite.
## 🎯 Стратегия восстановления v4.0.0
### ✅ ОСНОВА проекта (НЕ ТРОГАЕМ):
- **Original HTML** (1223 строки) из архива `aknaproff.zip`
- **Original app.js** (73KB, 2079 строк) - все функции, стили, логика
- **Original all.min.css** (100KB) - FontAwesome и стили
- **Original button texts** - "Lisa uus rida", "Tühista", etc.
- **Original function names** - `openModal()`, `closeModal()`, etc.
- **Original IDs** - `recordModal`, `settingsForm`, etc.
### 🔧 ЧТО ВОССТАНАВЛИВАЕМ:
- **Backend API** (Hono) - создан под фронтенд вызовы из оригинального app.js
- **D1 Database** - схема БД для хранения данных
- **Authentication** - JWT токены для безопасности
## 🌐 Доступ к приложению
- **Sandbox URL**: https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai
## 👤 Демо пользователи
| Пользователь | Пароль | Роль | Описание |
|--------------|--------|------|----------|
| `admin` | `demo123` | Admin | Для разработчика |
| `aknaproff` | `demo123` | Admin | Для клиента |
## ✨ Основные функции
### Реализовано (v4.0.0):
-**100% соответствие оригинальному HTML из архива**
- ✅ Управление производственными записями (CRUD)
- ✅ Статусные чекбоксы для этапов производства
- ✅ Система флагов ошибок с блокировкой полей
- ✅ Модальные окна (7 шт): Login, Record, Notes, Problems, Blocked, Settings, Report
- ✅ Быстрый поиск по: Klient, Tüüp, Pakkum. Nr, Töö Nr
- ✅ Сортировка по колонкам
- ✅ Фильтрация по месяцу и году
- ✅ Итоговые суммы (Kogus, Hind)
- ✅ JWT аутентификация
- ✅ Audit log для изменений
- ✅ Soft delete записей
- ✅ Генерация отчётов (Master, Accountant)
## 🏗️ Архитектура
### Frontend (из архива):
```
backend/
├── docs/ # TECH_SPEC.md, CHECKLIST.md и вспомогательные заметки
├── migrations/ # Миграции D1 (0001 …)
├── public/ # Статический фронтенд (HTML, CSS, JS)
── src/ # Код Hono (TypeScript)
├── seed.sql # Начальные данные
├── package.json # Скрипты npm и зависимости
├── wrangler.toml # Конфигурация Wrangler (Pages + D1)
└── README.md # Этот файл
public/
├── static/
│ ├── app.js # Original 73KB, 2079 lines
│ └── all.min.css # Original 100KB FontAwesome
── original.html # Original 1223 lines (встроен в TypeScript)
```
## Быстрый старт
### Backend (Hono + D1):
```
src/
├── index.tsx # Main Hono app (26 API endpoints)
├── original-html.ts # Embedded original HTML
├── middleware/
│ └── auth.ts # JWT middleware
└── utils/
└── auth.ts # Password hashing, token generation
```
### Database (D1):
```
migrations/
└── 0001_initial_schema.sql # 4 tables:
# - users
# - production_records
# - status_checkboxes
# - audit_log
```
## 📡 API Endpoints (26)
### Authentication (2):
- `POST /api/auth/login` - Вход в систему
- `PATCH /api/users/profile` - Изменение профиля
### Data Management (8):
- `GET /api/years` - Список годов для фильтров
- `GET /api/records` - Список записей (с фильтрами)
- `POST /api/records` - Создание записи
- `GET /api/records/:id` - Получение записи
- `PATCH /api/records/:id` - Обновление записи
- `DELETE /api/records/:id` - Удаление записи
- `PATCH /api/records/:id/material-confirmed` - Подтверждение материала
- `PATCH /api/records/:id/material2-confirmed` - Подтверждение материала-2
### Status Management (6):
- `PATCH /api/records/:id/worksheets-cycle` - Цикл статуса "Töölehti"
- `PATCH /api/records/:id/status` - Обновление даты статуса
- `PATCH /api/records/:id/notes` - Сохранение заметок
- `PATCH /api/records/:id/problems` - Сохранение проблем
- `PATCH /api/records/:id/price-paid` - Подтверждение оплаты
- `PATCH /api/records/:id/blocked` - Информация о блокировке
## 🔒 Важные принципы восстановления
### ❌ НЕ МЕНЯТЬ:
1. Названия функций из оригинального `app.js`
2. Тексты кнопок (на эстонском языке)
3. HTML структуру из архива
4. CSS классы и стили
5. ID элементов
6. Логику работы фронтенда
### ✅ ТОЛЬКО СОЗДАВАТЬ:
1. Backend API endpoints под фронтенд вызовы
2. Database схему для хранения данных
3. Middleware для аутентификации
4. Utility функции для бэкенда
## 🚀 Локальная разработка
```bash
# Установка зависимостей
cd /home/user/webapp
npm install
npm run db:migrate:local
npm run db:seed
npm run dev
```
- Dev-сервер доступен по адресу http://localhost:5173 (Vite) или через Wrangler Pages dev (см. ниже).
## Сборка и предпросмотр
# База данных
npm run db:migrate:local # Применить миграции
npm run db:seed # Загрузить тестовые данные
# Разработка
npm run build # Сборка проекта
pm2 start ecosystem.config.cjs # Запуск сервера
pm2 logs webapp --nostream # Просмотр логов
# Тестирование
curl http://localhost:3000/api/years
curl http://localhost:3000/api/records?month=1&year=2025
```
## 📝 Git история
```bash
npm run build # Сборка статики и worker-кода (dist/)
npm run preview # Wrangler Pages dev с собранным билдом
6d22b04 - FULL RESTORE: Use original HTML/CSS/JS from archive as base (v4.0.0)
cc7b3d4 - Update README to v3.20.8
013be72 - Fix: Replace openAddRecordModal() with openModal()
f45b5a3 - Fix D1 database binding and API /api/years endpoint (v3.20.7)
[Earlier commits...]
```
## Деплой
## 🎨 Оригинальные стили и функции
### Кнопки (Original):
- "Lisa uus rida" - Добавить новую строку (`openModal()`)
- "Tühista" - Отмена (`closeModal()`)
- "Salvesta" - Сохранить
- "Kustuta" - Удалить
### Модальные окна (Original):
- `loginModal` - Вход администратора
- `recordModal` - Добавление/редактирование записи
- `notesModal` - Заметки к записи
- `problemsModal` - Проблемы производства
- `blockedFieldModal` - Уведомление о блокировке
- `settingsModal` - Настройки пользователя
- `reportModal` - Генерация отчётов
### Функции (Original from app.js):
- `openModal()` - Открыть форму добавления
- `closeModal()` - Закрыть форму
- `toggleDate()` - Переключить дату статуса
- `toggleWorksheetsStep()` - Цикл статусов "Töölehti"
- `openNotesModal()`, `openProblemsModal()`, etc.
## ✅ Проверка качества восстановления
```bash
npm run deploy # npm run build && wrangler pages deploy dist
```
> Перед деплоем убедитесь, что настроены Cloudflare credentials (`setup_cloudflare_api_key`) и определён `cloudflare_project_name`.
# ✅ Проверка оригинального HTML
curl http://localhost:3000 | grep "Lisa uus rida"
curl http://localhost:3000 | grep 'onclick="openModal()"'
## Запуск в Docker / Synology
Эти файлы входят в пакет `backend` и готовы к импорту в Docker UI:
- `Dockerfile`
- `docker-compose.yml`
- `.dockerignore`
- `docker-entrypoint.sh`
- `wrangler.toml`
# ✅ Проверка API
curl http://localhost:3000/api/years
# {"years":[2024,2025,2026]}
### Как использовать на Synology (через Docker UI без консоли)
1. Скопируйте папку `backend/` (или подготовленный архив) на NAS Synology.
2. В *Container Manager***Projects****Create** укажите `docker-compose.yml` (можно выбрать напрямую или загрузить `.tar.gz`, содержащий compose-файл).
3. Отредактируйте переменные окружения при необходимости:
- `PORT` — внешний порт сервиса (по умолчанию 3000).
- `SEED_DATA` — поставьте `true` только на первом запуске, если хотите автоматически выполнить `seed.sql`.
- `PERSIST_PATH` — путь хранения локальной базы (по умолчанию `/data`).
- `WRANGLER_SEND_METRICS` — необязательно, по умолчанию отключено.
4. После старта контейнер выполнит полный цикл автоматически (весь конфиг берёт из `/app/wrangler.toml`, поэтому ошибка
«Pages does not support custom paths for the Wrangler configuration file» больше не появляется):
- применит миграции D1 через `wrangler d1 migrations apply --persist-to /data`;
- один раз (при `SEED_DATA=true`) импортирует `seed.sql` и создаст маркер `/data/.seeded`;
- запустит `wrangler pages dev dist --local` на порту `PORT`.
5. Интерфейс будет доступен по адресу `http://<IP Synology>:<открытый порт>`.
6. После успешного запуска установите `SEED_DATA=false` и перезапустите проект (чтобы повторное наполнение не выполнялось).
> Том `d1-data` в `docker-compose.yml` монтируется в `/data`, поэтому локальная SQLite-база (D1 local) и маркер `/.seeded` сохраняются между перезапусками.
## Работа с миграциями и данными
```bash
npm run db:migrate:local # Применить все миграции локально
npm run db:migrate:prod # Применить миграции в продакшн D1
npm run db:seed # Заселить тестовые данные (локально)
# ✅ Проверка модальных окон
curl http://localhost:3000 | grep -o 'id="recordModal"'
curl http://localhost:3000 | grep -o 'id="settingsForm"'
```
## Тестовые учётные записи
| Пользователь | Пароль | Роль |
|--------------|--------|------|
| `admin` | `demo123` | Admin |
| `aknaproff` | `demo123` | Admin |
| `tootmine` | `demo123` | Пользователь (только просмотр) |
## 📦 Технологии
## API Overview
| Method & Path | Описание | Требует токен |
|---------------|----------|---------------|
| `POST /api/auth/login` | Логин, выдача токена | Нет |
| `GET /api/years` | Список годов с данными | Опционально |
| `GET /api/records` | Получение заявок (фильтры `month`, `year`) | Опционально |
| `POST /api/records` | Создание заявки | Admin |
| `PUT /api/records/:id` | Обновление заявки | Admin |
| `DELETE /api/records/:id` | Soft delete заявки | Admin |
| `PATCH /api/records/:id/status` | Тоггл дат (MAT/LÕI/KLA/VAL/VÄL) | Да |
| `PATCH /api/records/:id/material-confirmed` | Подтверждение MAT-1 | Admin |
| `PATCH /api/records/:id/material2-confirmed` | Подтверждение MAT-2 | Admin |
| `PATCH /api/records/:id/worksheets-cycle` | 3-стадийный цикл töölehti | Да |
| `PATCH /api/records/:id/notes` | Заметки + дата | Да |
| `PATCH /api/records/:id/problems` | Проблемы + error flags | Да |
| `PATCH /api/records/:id/price-paid` | Тоггл оплаты/арве | Admin |
| `GET /api/reports/master` | Агрегированные данные по месяцам | Опционально |
| `GET /api/reports/accountant` | Детализированный отчёт (нужны `month`, `year`) | Опционально |
| `PATCH /api/users/profile` | Смена ФИО и пароля | Да |
- **Frontend**: Original HTML/CSS/JS from archive
- **Backend**: Hono (Cloudflare Workers)
- **Database**: Cloudflare D1 (SQLite)
- **Auth**: JWT tokens
- **Styles**: TailwindCSS + FontAwesome
- **Deployment**: Cloudflare Pages
## Запуск dev-сервера (Wrangler Pages)
```bash
npm run build
fuser -k 3000/tcp 2>/dev/null || true
pm2 start npm --name aknaproff-backend -- run dev:sandbox
# остановить: pm2 delete aknaproff-backend
```
Dev-сервер будет доступен по http://127.0.0.1:3000 (или через выданный URL `GetServiceUrl`). Логи: `pm2 logs aknaproff-backend --nostream`.
## 🎯 Следующие шаги
## Контроль прогресса
Каждый завершённый чекпоинт фиксируется в `docs/CHECKLIST.md` с обновлением версии (v0.x.0). После CP9 проект готов к финальному деплою.
1. Тестирование всех функций на соответствие оригиналу
2. Проверка всех модальных окон
3. Проверка генерации отчётов
4. Deploy на Cloudflare Pages
## Полезные ссылки
- [Cloudflare Wrangler Docs](https://developers.cloudflare.com/workers/wrangler/)
- [Hono Documentation](https://hono.dev)
- [Cloudflare D1](https://developers.cloudflare.com/d1/)
---
**Версия 4.0.0** - Полное восстановление из архива с соблюдением принципа "Архив - это основа" 🎉