# boha-app-ts

Internal business-management system for a Czech company (attendance, invoicing,
leave/trips, projects, vehicles, warehouse, HR) — a TypeScript/Node.js rewrite
of the legacy PHP app. User-facing text is Czech by design.

> For full architecture, conventions, and gotchas, see **[CLAUDE.md](./CLAUDE.md)**.

## Stack

- **Backend:** Fastify 5 · Prisma 6 → MySQL · Zod 4 · JWT (HS256) + TOTP 2FA
- **Frontend:** React 18 · Vite · Material UI v7 (Emotion) · TanStack Query — an
  SPA in `src/admin/`, served by the same Fastify process (Vite middleware in
  dev, static files in prod)
- **Other:** Puppeteer (PDF) · nodemailer · node-cron · `@anthropic-ai/sdk` (the
  admins-only "Odin" assistant)

## Prerequisites

- Node.js (LTS) and a MySQL database
- Copy `.env.example` → `.env` and fill in the **required** vars (`DATABASE_URL`,
  `JWT_SECRET`, `TOTP_ENCRYPTION_KEY` — generate the keys with `openssl rand -hex 32`)

## Setup

```bash
npm install
npx prisma generate
npx prisma migrate dev      # apply migrations to your dev DB
npx prisma db seed          # optional: dev-only sample data (NEVER on prod)
```

## Develop

```bash
npm run dev:server   # API (tsx watch) on http://127.0.0.1:3050
npm run dev:client   # Vite dev server (manage separately)
```

## Build & run

```bash
npm run build        # tsc server → dist/  +  vite client → dist-client/
npm start            # node dist/server.js
```

## Test

```bash
npm test             # vitest run — hits a real test DB (.env.test); no Prisma mocks
```

## Quality gates

Before committing, all of these must pass:

```bash
npx tsc -b --noEmit  # typecheck (NOT `tsc -p tsconfig.json`)
npm run build
npx vitest run
npm run lint         # ESLint (incl. react-hooks) — see eslint.config.js
```

## Database migrations

Every schema/data change is a tracked Prisma migration — **never** `prisma db push`
or raw SQL on production. Stop the dev server before running `prisma migrate dev`.
See CLAUDE.md → _Database Migrations_ for the full workflow and the production
deploy/hotfix process.

## License

ISC
