bmc_hub/app/modules/sag
Christian 1cfe5aee76 feat(migrations): add AI benchmark and vTiger archive tables
- Created tables for AI benchmark runs and results to facilitate model evaluation.
- Added expected answers column to benchmark results.
- Introduced tables for internet connection change cases and vTiger archive management, including records, relations, and checkpoints.
- Implemented triggers to enforce append-only behavior for vTiger archive records and files.
- Enhanced solution management with soft delete capabilities for sag_solutions and knowledge_articles.

feat(scripts): add CRM benchmarking script for Ollama models

- Developed a Python script to benchmark CRM models exposed through Ollama, including various test cases and scoring mechanisms.

test(tests): add comprehensive tests for new features

- Implemented tests for internet change case service, vTiger archive functionality, and sag solution knowledge management.
- Ensured coverage for edge cases and error handling in the new features.
2026-08-31 13:01:35 +02:00
..
backend feat(migrations): add AI benchmark and vTiger archive tables 2026-08-31 13:01:35 +02:00
frontend feat(migrations): add AI benchmark and vTiger archive tables 2026-08-31 13:01:35 +02:00
migrations feat(sag): Add Varekøb & Salg module with database migration and frontend template 2026-02-02 20:23:56 +01:00
scripts feat: Add end-to-end tests for Sag module HTTP API 2026-07-28 14:18:24 +02:00
services feat: Add end-to-end tests for Sag module HTTP API 2026-07-28 14:18:24 +02:00
templates feat(migrations): add AI benchmark and vTiger archive tables 2026-08-31 13:01:35 +02:00
module.json feat(sag): Initialize case management module with CRUD operations, relations, and tags 2026-01-29 23:07:33 +01:00
README.md Refactor case management views and templates for improved structure and styling 2026-02-01 00:38:10 +01:00

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 key
  • titel - Case title
  • beskrivelse - Detailed description
  • type - Case type (ticket, opgave, ordre, etc.)
  • status - Status (åben, i_gang, afsluttet, on_hold)
  • customer_id - Foreign key to customers table
  • ansvarlig_bruger_id - Assigned user
  • deadline - Due date
  • created_at - Creation timestamp
  • updated_at - Last update (auto-updated via trigger)
  • deleted_at - Soft-delete timestamp (NULL = active)

sag_relationer (Relations)

  • id - Primary key
  • kilde_sag_id - Source case
  • målsag_id - Target case
  • relationstype - Relation type (forælder, barn, afledt_af, blokkerer, udfører_for)
  • created_at - Creation timestamp
  • deleted_at - Soft-delete timestamp

sag_tags (Tags)

  • id - Primary key
  • sag_id - Case reference
  • tag_navn - Tag name (support, urgent, vip, ompakning, etc.)
  • created_at - Creation timestamp
  • deleted_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 filters
  • GET /sag/{id} - View case details
  • GET /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

  1. Customer calls → Create Sag with type="ticket", tag="support"
  2. Urgency high → Add tag="urgent"
  3. Create order for new hardware → Create related Sag with type="ordre", relation="afledt_af"
  4. 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_at is 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() from app.core.database
  • Parameterized queries with %s placeholders (SQL injection prevention)
  • RealDictCursor for dict-like row access
  • Triggers maintain updated_at automatically
  • Relations are first-class citizens (not just links)