Add Timesheets API with file upload and role-based access

Backend Features:
- Timesheets database table (id, userId, fileName, filePath, fileType, fileSize, year, month, timestamps)
- File upload with multer (memory storage, 10MB limit, PDF/Excel validation)
- Structured file storage: uploads/timesheets/{userId}/{year}/{month}/
- RESTful API endpoints:
  * POST /api/timesheets/upload - Upload timesheet
  * GET /api/timesheets/my - Get user's timesheets (with filters)
  * GET /api/timesheets/all - Get all timesheets (admin only)
  * GET /api/timesheets/:id/download - Download file
  * DELETE /api/timesheets/:id - Delete timesheet
- Role-based permissions: users access own files, admins access all
- Proper error handling and file cleanup on errors
- Database migration for timesheets table

Technical:
- Uses req.user.role for permission checks
- Automatic directory creation for user/year/month structure
- Blob URL cleanup and proper file handling
- Integration with existing auth middleware

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
richardtekula
2025-11-21 08:35:30 +01:00
parent 05be898259
commit bb851639b8
27 changed files with 2847 additions and 532 deletions

125
CLEAN_START_GUIDE.md Normal file
View File

@@ -0,0 +1,125 @@
# CLEAN START - Kompletný Reset CRM Systému
## Problém
- Staré/archivované emaily sa syncujú aj keď nie sú v Thunderbirde
- Emaily majú zlý contactId
- Kontakty sa nedajú vymazať cez UI
## Riešenie: KOMPLETNÝ RESET
### Krok 1: Vyčisti databázu
```bash
node src/scripts/CLEAN_EVERYTHING.js
```
Toto vymaže:
- ✅ Všetky emaily
- ✅ Všetky kontakty
### Krok 2: Teraz môžeš pridať kontakty NANOVO
Nový sync bude:
- ✅ IBA z Inboxu a Sent foldra (nie Archive, Trash, Drafts)
- ✅ IBA emaily z posledných 30 dní
- ✅ IBA emaily FROM alebo TO daný kontakt
### Krok 3: Ako to funguje teraz
Keď pridáš kontakt (napr. `martin@slovensko.ai`):
**SYNCNE:**
- ✅ Emaily FROM martin@slovensko.ai → riso@slovensko.ai (prijaté)
- ✅ Emaily FROM riso@slovensko.ai → martin@slovensko.ai (odoslané)
- ✅ Iba z Inbox a Sent
- ✅ Iba z posledných 30 dní
**NÉSYNCNE:**
- ❌ Emaily od iných ľudí
- ❌ Staré archivované emaily
- ❌ Emaily z Trash/Archive/Drafts
- ❌ Emaily staršie ako 30 dní
## Prečo sa fetchovali staré emaily?
JMAP API fetchuje **zo SERVERA, nie z Thunderbirdu**!
- Thunderbird je len klient
- Server (truemail.sk) má všetky emaily (aj zmazané, archivované)
- Starý buggy kód fetchoval zo všetkých mailboxov bez filtra
## Nové nastavenia syncу
Môžeš zmeniť v kóde:
```javascript
// V contact.service.js, line 56
await syncEmailsFromSender(jmapConfig, emailAccountId, newContact.id, email, {
limit: 50, // Max počet emailov
daysBack: 30 // Dni späť (30 = posledný mesiac)
});
```
**Zmeniť na:**
- `daysBack: 7` - Iba posledný týždeň
- `daysBack: 90` - Posledné 3 mesiace
- `limit: 20` - Max 20 emailov
## Alternatíva: Manuálne vyčistenie cez DB
Ak nechceš používať script:
```sql
-- Vymaž všetky emaily
DELETE FROM emails;
-- Vymaž všetky kontakty
DELETE FROM contacts;
```
## Po vyčistení
1. **Refreshni frontend** (F5)
2. **Pridaj kontakty** cez Inbox page
3. **Počkaj** kým sa syncnú (vidíš loading)
4. **Skontroluj** že sú iba správne emaily
## Ak sa stále fetchujú zlé emaily
Znamená to že sú SKUTOČNE v Inbox/Sent na serveri.
Choď do Thunderbirdu a:
1. Presuň nechcené emaily do Archive
2. Alebo ich TRVALO vymaž (Shift+Delete)
3. WAIT 5 min (server sa musí syncnúť)
4. Potom spusti CLEAN_EVERYTHING.js
5. A pridaj kontakty znova
## Výhody nového systému
✅ Žiadne staré smeti
✅ Iba aktuálna komunikácia
✅ Správne groupovanie
✅ Rýchlejší sync
✅ Menšia databáza
## Testing
Po resete otestuj:
1. **Pridaj kontakt** (napr. foxerdxd@gmail.com)
2. **Skontroluj koľko emailov** sa synclo
3. **Over že sú správne** (FROM alebo TO ten kontakt)
4. **Pošli nový email** cez CRM
5. **Over že sa zobrazí** v konverzácii
## Ak niečo nejde
Check logy pri sync:
```
Filtering: last 30 days, from Inbox/Sent only
Found X emails with contact@email.com
```
Ak je X príliš veľa → zníž `daysBack`
Ak je X 0 → zväčši `daysBack` alebo over že Inbox má emaily