- Introduced `overdueCases` state to track overdue cases in the planner. - Enhanced `loadCases` function to fetch and store overdue cases. - Updated `renderCases` to display overdue cases with appropriate labels. - Modified case card rendering to highlight overdue cases. fix(telefoni): ensure WebSocket connection on DOMContentLoaded - Adjusted WebSocket connection logic to handle cases where the script loads after DOMContentLoaded. test(tests): add tests for case creation and internal ticket handling - Added tests to ensure ticket creation commits all optional data. - Implemented tests for internal ticket creation, ensuring correct customer and user assignments. feat(migrations): add new tables for email configuration and case assignments - Created `email_connection_configurations` table for managing email settings. - Introduced `sag_case_assignees` table to handle individual case assignments. - Added `sag_case_details` table for structured case type details. - Updated existing case types to align with new templates and added support for internal tickets. fix(timetracking): allow manual time creation without case customer - Modified manual time creation to support entries without a customer. - Updated settlement options to recommend internal settlement for customerless time. feat(v4): enhance case detail template with new features - Added new features to the case detail template, including compact icons and inline relation creation. - Improved comment actions and time tracking functionalities. |
||
|---|---|---|
| .. | ||
| backend | ||
| frontend | ||
| migrations | ||
| scripts | ||
| services | ||
| templates | ||
| module.json | ||
| README.md | ||
Sag Module - Case Management
Oversigt
Sag-modulet implementerer en universel sag-håndtering system hvor tickets, opgaver og ordrer er blot sager med forskellige tags og relationer.
Kerneidé: Der er kun én ting: en Sag. Alt andet er metadata, tags og relationer.
Database Schema
sag_sager (Hovedtabel)
id- Primary keytitel- Case titlebeskrivelse- Detailed descriptiontype- Case type (ticket, opgave, ordre, etc.)status- Status (åben, i_gang, afsluttet, on_hold)customer_id- Foreign key to customers tableansvarlig_bruger_id- Assigned userdeadline- Due datecreated_at- Creation timestampupdated_at- Last update (auto-updated via trigger)deleted_at- Soft-delete timestamp (NULL = active)
sag_relationer (Relations)
id- Primary keykilde_sag_id- Source casemålsag_id- Target caserelationstype- Relation type (forælder, barn, afledt_af, blokkerer, udfører_for)created_at- Creation timestampdeleted_at- Soft-delete timestamp
sag_tags (Tags)
id- Primary keysag_id- Case referencetag_navn- Tag name (support, urgent, vip, ompakning, etc.)created_at- Creation timestampdeleted_at- Soft-delete timestamp
API Endpoints
Cases CRUD
List cases
GET /api/v1/sag?status=åben&tag=support&customer_id=1
Create case
POST /api/v1/sag
Content-Type: application/json
{
"titel": "Skærm mangler",
"beskrivelse": "Kunde har brug for ny skærm",
"type": "ticket",
"customer_id": 1,
"status": "åben"
}
Get case
GET /api/v1/sag/1
Update case
PATCH /api/v1/sag/1
Content-Type: application/json
{
"status": "i_gang",
"ansvarlig_bruger_id": 5
}
Delete case (soft)
DELETE /api/v1/sag/1
Relations
Get relations
GET /api/v1/sag/1/relationer
Add relation
POST /api/v1/sag/1/relationer
Content-Type: application/json
{
"målsag_id": 2,
"relationstype": "afledt_af"
}
Delete relation
DELETE /api/v1/sag/1/relationer/5
Tags
Get tags
GET /api/v1/sag/1/tags
Add tag
POST /api/v1/sag/1/tags
Content-Type: application/json
{
"tag_navn": "urgent"
}
Delete tag
DELETE /api/v1/sag/1/tags/3
Frontend Routes
GET /sag- List all cases with filtersGET /sag/{id}- View case detailsGET /sag/new- Create new case (future)GET /sag/{id}/edit- Edit case (future)
Features
✅ Soft-delete with data preservation ✅ Nordic Top design with dark mode support ✅ Responsive mobile-friendly UI ✅ Case relations (parent/child) ✅ Dynamic tagging system ✅ Full-text search ✅ Status filtering ✅ Customer tracking
Example Workflows
Support Ticket
- Customer calls → Create Sag with type="ticket", tag="support"
- Urgency high → Add tag="urgent"
- Create order for new hardware → Create related Sag with type="ordre", relation="afledt_af"
- Pack and ship → Create related Sag with type="opgave", tag="ompakning"
Future Integrations
- Activity logging (who changed what when)
- e-conomic integration (auto-create orders)
- SLA tracking (response/resolution times)
- Workflow automation (auto-tags based on conditions)
- Dependency management (can't start case B until case A done)
Soft-Delete Safety
All DELETE operations use soft-delete:
- Data is preserved in database
deleted_atis set to current timestamp- All queries filter
WHERE deleted_at IS NULL - Data can be recovered if module is disabled
- Audit trail is maintained
Development Notes
- All queries use
execute_query()fromapp.core.database - Parameterized queries with
%splaceholders (SQL injection prevention) RealDictCursorfor dict-like row access- Triggers maintain
updated_atautomatically - Relations are first-class citizens (not just links)