- Move root-level status/feature/summary MDs into docs/ subdirs - Convert .txt documentation files to .md format - Tests-related MD moved to tests/ - Root now only contains README.md, CLAUDE.md, GEMINI.md
4.3 KiB
4.3 KiB
Test: Smart Pakke - Timer Opgaver Fix 🔧
Problem Beskrivelse
Issue: Tilføjelse af opgaver fra database eller manuelt i Smart Pakke virker ikke - opgaver gemmes ikke til databasen.
Root Cause
- Opgaver blev kun tilføjet til React state (
selectedPackage.tasksellerstandardTasks) - Ingen API call blev lavet for at gemme opgaver til databasen
- Derfor forsvandt opgaver ved genindlæsning
Løsning Implementeret
1. Ny Funktion: saveTaskToDatabase()
Tilføjet i InlineSmartPackage.js:
const saveTaskToDatabase = async (packageId, taskData) => {
const response = await fetch(`${apiBaseUrl}/api/smart-packages/${packageId}/tasks`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(taskData)
});
// ... error handling
}
2. Opdateret: addTaskFromSearch()
Nu gemmer opgaver til database efter tilføjelse til UI:
const addTaskFromSearch = async (task) => {
// ... UI opdatering
// GEM TIL DATABASE
if (selectedPackage.id && !isPredefinedPackage) {
await saveTaskToDatabase(selectedPackage.id, taskForDB);
}
}
3. Opdateret: Manuel Opgave Tilføjelse
Button onClick er nu async og gemmer til database:
onClick={async () => {
// ... UI opdatering
// GEM TIL DATABASE
if (selectedPackage.id && !isPredefinedPackage) {
await saveTaskToDatabase(selectedPackage.id, taskForDB);
}
}}
4. Backend Route Opdateret
smartPackagesRoutes.js accepterer nu også timeUnit og timePerUnit:
router.post('/:id/tasks', async (req, res) => {
const {
name, description, hours, rate,
timeUnit, timePerUnit // NYE FELTER
} = req.body;
// ...
});
Test Scenarie
A. Test Database Opgave Tilføjelse
- Start backend:
npm run devi/backendfolder - Start frontend:
npm starti/frontendfolder - Login til systemet
- Opret eller vælg projekt
- Gå til Smart Pakke step
- Vælg en database pakke (IKKE de predefined som "B7 Tag Udskiftning")
- Klik "🔍 Søg i opgaver database"
- Søg efter en opgave (f.eks. "montering")
- Klik på en opgave fra søgeresultater
- Indtast timer og timeløn
- Verificer:
- Opgave vises i UI
- Console viser:
💾 Gemmer opgave til database: - Console viser:
✅ Opgave gemt til database: - Reload siden → Opgave skal stadig være der
B. Test Manuel Opgave Tilføjelse
- Følg step 1-6 fra A
- Klik "➕ Tilføj opgave manuelt"
- Indtast:
- Navn: "Test opgave"
- Timer pr. m²: 0.5
- Timeløn: 580
- Beskrivelse: "Test"
- Verificer samme som A.11
C. Test Predefined Pakker (Skulle IKKE gemme)
- Vælg "B7 Tag Udskiftning - Komplet" (predefined)
- Tilføj opgave (søg eller manuelt)
- Verificer:
- Opgave vises i UI
- Console viser IKKE database gem (korrekt - predefined pakker gemmes ikke)
Database Verificering
SQL Check
-- Tjek at opgaven blev gemt
SELECT
spt.id,
spt.package_id,
spt.name,
spt.description,
spt.hours,
spt.rate,
spt.time_unit,
spt.time_per_unit,
spt.task_order,
mp.name as package_name
FROM smart_package_tasks spt
JOIN material_packages mp ON spt.package_id = mp.id
WHERE spt.created_at > NOW() - INTERVAL 10 MINUTE
ORDER BY spt.created_at DESC;
Expected Behavior
✅ Før Fix
- Opgaver kunne tilføjes til UI
- Opgaver gemmes til database
- Opgaver persisteres ved reload
✅ Efter Fix
- Opgaver kunne tilføjes til UI
- Opgaver gemmes til database
- Opgaver persisteres ved reload
- Error handling hvis database fejl
- User feedback ved fejl
Filer Ændret
-
/frontend/src/components/InlineSmartPackage.js- Tilføjet
saveTaskToDatabase()funktion - Opdateret
addTaskFromSearch()til async med database gem - Opdateret manuel opgave button til async med database gem
- Tilføjet
-
/backend/src/routes/smartPackagesRoutes.js- Tilføjet
timeUnitogtimePerUnittil POST /:id/tasks endpoint
- Tilføjet
Status
- ✅ Frontend fix implementeret
- ✅ Backend route opdateret
- ⏳ Afventer test i udviklings-miljø
Næste Skridt
- Test i browser med developer tools åben
- Verificer database entries
- Test edge cases (ingen package selected, predefined packages)
- Mark som completed når verificeret ✓