- Introduced Technician Dashboard V1 (tech_v1_overview.html) with KPI cards and new cases overview. - Implemented Technician Dashboard V2 (tech_v2_workboard.html) featuring a workboard layout for daily tasks and opportunities. - Developed Technician Dashboard V3 (tech_v3_table_focus.html) with a power table for detailed case management. - Created a dashboard selector page (technician_dashboard_selector.html) for easy navigation between dashboard versions. - Added user dashboard preferences migration (130_user_dashboard_preferences.sql) to store default dashboard paths. - Enhanced sag_sager table with assigned group ID (131_sag_assignment_group.sql) for better case management. - Updated sag_subscriptions table to include cancellation rules and billing dates (132_subscription_cancellation.sql, 134_subscription_billing_dates.sql). - Implemented subscription staging for CRM integration (136_simply_subscription_staging.sql). - Added a script to move time tracking section in detail view (move_time_section.py). - Created a test script for subscription processing (test_subscription_processing.py).
116 lines
5.5 KiB
HTML
116 lines
5.5 KiB
HTML
{% extends "shared/frontend/base.html" %}
|
|
|
|
{% block title %}Salg Dashboard - BMC Hub{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="container-fluid py-4">
|
|
<div class="d-flex justify-content-between align-items-start flex-wrap gap-3 mb-4">
|
|
<div>
|
|
<h1 class="h3 mb-1">💼 Salg Dashboard</h1>
|
|
<p class="text-muted mb-0">Pipeline-overblik og opfølgning for salgsteamet</p>
|
|
</div>
|
|
<div class="d-flex gap-2">
|
|
<a href="/opportunities" class="btn btn-outline-primary btn-sm">Åbn Opportunities</a>
|
|
<a href="/" class="btn btn-outline-secondary btn-sm">Til hoveddashboard</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="alert alert-info border-0 shadow-sm mb-4" role="alert">
|
|
Vælg standard-dashboard under <strong>Indstillinger → System</strong>. Dashboard åbnes altid fra roden <code>/</code>.
|
|
</div>
|
|
|
|
<div class="row g-3 mb-4">
|
|
<div class="col-6 col-lg-3">
|
|
<div class="card border-0 shadow-sm h-100">
|
|
<div class="card-body text-center">
|
|
<div class="small text-muted">Åbne opportunities</div>
|
|
<div class="h3 mb-0">{{ pipeline_stats.open_count or 0 }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-6 col-lg-3">
|
|
<div class="card border-0 shadow-sm h-100">
|
|
<div class="card-body text-center">
|
|
<div class="small text-muted">Lukkede opportunities</div>
|
|
<div class="h3 mb-0">{{ pipeline_stats.closed_count or 0 }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-6 col-lg-3">
|
|
<div class="card border-0 shadow-sm h-100">
|
|
<div class="card-body text-center">
|
|
<div class="small text-muted">Åben pipeline værdi</div>
|
|
<div class="h4 mb-0">{{ "{:,.0f}".format((pipeline_stats.open_value or 0)|float).replace(',', '.') }} kr.</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-6 col-lg-3">
|
|
<div class="card border-0 shadow-sm h-100">
|
|
<div class="card-body text-center">
|
|
<div class="small text-muted">Gns. sandsynlighed</div>
|
|
<div class="h3 mb-0">{{ "%.0f"|format((pipeline_stats.avg_probability or 0)|float) }}%</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-4">
|
|
<div class="col-lg-8">
|
|
<div class="card border-0 shadow-sm h-100">
|
|
<div class="card-header bg-white border-0"><h5 class="mb-0">Seneste opportunities</h5></div>
|
|
<div class="card-body p-0">
|
|
<div class="table-responsive">
|
|
<table class="table table-hover mb-0">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Titel</th>
|
|
<th>Kunde</th>
|
|
<th>Stage</th>
|
|
<th>Beløb</th>
|
|
<th>Sandsynlighed</th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for item in recent_opportunities %}
|
|
<tr>
|
|
<td>#{{ item.id }}</td>
|
|
<td>{{ item.titel }}</td>
|
|
<td>{{ item.customer_name }}</td>
|
|
<td>{{ item.pipeline_stage or '-' }}</td>
|
|
<td>{{ "{:,.0f}".format((item.pipeline_amount or 0)|float).replace(',', '.') }} kr.</td>
|
|
<td>{{ "%.0f"|format((item.pipeline_probability or 0)|float) }}%</td>
|
|
<td><a href="/sag/{{ item.id }}" class="btn btn-sm btn-outline-primary">Åbn</a></td>
|
|
</tr>
|
|
{% else %}
|
|
<tr><td colspan="7" class="text-center text-muted py-4">Ingen opportunities fundet.</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-4">
|
|
<div class="card border-0 shadow-sm h-100">
|
|
<div class="card-header bg-white border-0"><h5 class="mb-0">Deadline næste 14 dage</h5></div>
|
|
<div class="card-body">
|
|
{% for item in due_soon %}
|
|
<div class="border rounded p-2 mb-2">
|
|
<div class="fw-semibold">{{ item.titel }}</div>
|
|
<div class="small text-muted">{{ item.customer_name }} · {{ item.owner_name }}</div>
|
|
<div class="small text-muted">Deadline: {{ item.deadline.strftime('%d/%m/%Y') if item.deadline else '-' }}</div>
|
|
<a href="/sag/{{ item.id }}" class="btn btn-sm btn-outline-secondary mt-2">Åbn</a>
|
|
</div>
|
|
{% else %}
|
|
<p class="text-muted mb-0">Ingen deadlines de næste 14 dage.</p>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|