Мобільна навчальна платформа Carlsberg Ukraine — курси з тестами для
співробітників, кабінет керівника з аналітикою по команді та внутрішня
адмінка для конструювання курсів і керування співробітниками. Мігровано з
vanilla JS + Google Sheets (архів — /legacy) на Next.js
(App Router) + Prisma + Postgres.
Кабінет співробітника (/hub, /courses/[slug]) — мобільний
курс-плеєр (Модуль → Екран → Компонент): інфо-екрани, тести з декількох
типів питань, чек-листи, таймлайни, фотозвіти. Прохідний бал і пауза між
модулями налаштовуються окремо на кожен курс; курс зараховано лише коли
складено кожен модуль. Сертифікат — за 100% проходження. Реальний
адаптивний вигляд: той самий контент автоматично перебудовується під
широкий десктопний екран (CSS container query), не лишається “мобільною
карткою” на великому моніторі.
Кабінет керівника (/manager) — дерево команди з підсумком по
кожному курсу (складено/не складено/прострочено), детальний розбір по
кожному модулю, тижневий тренд активності, Excel-звіт по всій видимій
команді.
Адмінка (/admin) — окремий вхід за паролем:
@prisma/adapter-pg, конфіг у prisma7.config.mjs) + Postgres (Neon)npm install
npm run dev
Відкрийте http://localhost:3000.
Потрібні змінні середовища (.env, не комітиться):
| Змінна | Призначення |
|---|---|
DATABASE_URL |
підключення до Postgres (Neon) |
SESSION_SECRET |
підпис сесійних cookie співробітника |
ADMIN_PASSWORD |
єдиний пароль входу в /admin |
CRON_SECRET |
авторизація щоденного cron (прострочення, авто-ачивки, авто-призначення) |
RESEND_API_KEY |
продова пошта (PIN-коди) |
BLOB_READ_WRITE_TOKEN |
Vercel Blob (фото в курсах) |
EMAIL_PROVIDER, GMAIL_USER, GMAIL_APP_PASSWORD |
опційно, лише для dev — надсилання PIN через Gmail SMTP замість Resend |
SYNTHETIC_DEMO_DATABASE_URL |
окрема БД для prisma/seed-synthetic-demo*.js (навмисно відділена від DATABASE_URL, щоб демо-скрипти не могли зачепити реальні дані) |
Міграції та наповнення бази:
npx prisma migrate deploy # застосувати міграції
npx prisma generate # згенерувати клієнт (також автоматично при npm install)
node prisma/seed.js # системний адмін-акаунт (для assignedById/awardedById) + перший курс
prisma/import-employees.js / import-territories.js — одноразовий
імпорт реальної оргструктури з Excel. prisma/seed-synthetic-demo.js +
seed-synthetic-demo-departments.js — повністю вигадана демо-організація
(жодних реальних людей) для розробки/демонстрацій.
npm run lint
npm run test -- --run
npm run build
Повністю робоча версія на vanilla JS + Google Sheets лежить у
/legacy — використовується лише як довідка при перенесенні
логіки, окремо не деплоїться.