carlsberg-LMS

Мобільна навчальна платформа Carlsberg Ukraine — курси з тестами для співробітників, кабінет керівника з аналітикою по команді та внутрішня адмінка для конструювання курсів і керування співробітниками. Мігровано з vanilla JS + Google Sheets (архів — /legacy) на Next.js (App Router) + Prisma + Postgres.

Що є в застосунку

Кабінет співробітника (/hub, /courses/[slug]) — мобільний курс-плеєр (Модуль → Екран → Компонент): інфо-екрани, тести з декількох типів питань, чек-листи, таймлайни, фотозвіти. Прохідний бал і пауза між модулями налаштовуються окремо на кожен курс; курс зараховано лише коли складено кожен модуль. Сертифікат — за 100% проходження. Реальний адаптивний вигляд: той самий контент автоматично перебудовується під широкий десктопний екран (CSS container query), не лишається “мобільною карткою” на великому моніторі.

Кабінет керівника (/manager) — дерево команди з підсумком по кожному курсу (складено/не складено/прострочено), детальний розбір по кожному модулю, тижневий тренд активності, Excel-звіт по всій видимій команді.

Адмінка (/admin) — окремий вхід за паролем:

Стек

Розробка

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)

Повністю робоча версія на vanilla JS + Google Sheets лежить у /legacy — використовується лише як довідка при перенесенні логіки, окремо не деплоїться.