# HuoltoERP — Kodinkonehuollon toiminnanohjausjärjestelmä

## Rakenne

```
huoltoerp/
├── huoltoerp_schema.sql     MySQL-tietokantaskeema (aja ensin)
├── api/                     PHP 8.1+ REST API
│   ├── .env.example         Kopioi .env:ksi ja aseta arvot
│   ├── config/              app.php, database.php, routes.php
│   ├── public/              index.php (reititin), .htaccess
│   └── src/
│       ├── controllers/     40 kontrolleria (yksi per toiminto)
│       ├── models/          9 mallia + BaseModel
│       ├── services/        StockService, SmsService, InvoiceCalculator, CustomerSnapshot
│       ├── helpers/         Response, JWT, Validator, InputSanitizer, NumberGenerator, Pagination
│       ├── middleware/      AuthMiddleware, CorsMiddleware
│       └── events/          EventDispatcher
└── frontend/                Vanilla JS, ei frameworkia
    ├── assets/
    │   ├── css/main.css     Täydellinen design system
    │   └── js/
    │       ├── core/        api.js, auth.js, utils.js, toast.js
    │       ├── components/  modal.js, datatable.js
    │       └── modules/     sidebar.js
    ├── pages/               15 HTML-sivua
    └── templates/           layout.html (pohjasivu)
```

## Asennus

### 1. Tietokanta
```sql
CREATE DATABASE huoltoerp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'huoltoerp_user'@'localhost' IDENTIFIED BY 'VAIHDA_SALASANA';
GRANT ALL PRIVILEGES ON huoltoerp.* TO 'huoltoerp_user'@'localhost';
FLUSH PRIVILEGES;
mysql -u huoltoerp_user -p huoltoerp < huoltoerp_schema.sql
```

### 2. Ympäristömuuttujat
```bash
cp api/.env.example api/.env
# Muokkaa .env: DB_*, JWT_SECRET, CORS_ORIGIN
```

### 3. Admin-salasana
```bash
php -r "echo password_hash('OMA_SALASANA', PASSWORD_BCRYPT, ['cost'=>12]);"
mysql -e "UPDATE users SET password_hash='HASH' WHERE username='admin';" huoltoerp
```

### 4. Webpalvelin
Osoita DocumentRoot → `api/public/` (backend) ja `frontend/` (frontend).

## API-endpointit (kaikki vaativat Bearer JWT paitsi /auth/login)

| Moduuli       | Endpointit |
|---------------|------------|
| Auth          | POST /auth/login, GET /auth/me |
| Asiakkaat     | GET/POST /customers, GET/PUT/DELETE /customers/:id |
| Laitteet      | GET/POST /devices, GET/PUT /devices/:id |
| Työmääräimet  | GET/POST /work-orders, GET/PUT /work-orders/:id, PATCH .../status |
|               | POST/DELETE /work-orders/:id/parts |
|               | GET/POST /work-orders/:id/time-logs |
| Varaosat      | GET/POST /parts, GET/PUT /parts/:id, PATCH .../stock |
| Laskutus      | GET/POST /invoices, PATCH /invoices/:id/mark-paid |
| POS           | POST/GET /pos/sales |
| Kalenteri     | GET/POST /bookings, GET /bookings/week, GET /bookings/day |
|               | GET/PUT/DELETE /bookings/:id |
| SMS           | GET /sms, POST /sms/send |
| Raportit      | GET /reports/dashboard|warranty|mechanics|sales |
| Teknikot      | GET /mechanics |
