Superset: Uw complete bedrijf in één dashboard
Een typische ochtend met de Business Cockpit:
| Tijd | Actie | Systeem |
|---|---|---|
| 08:30 | Koffie halen, Superset openen | Superset |
| 08:32 | KPIs bekijken: tickets, pipeline, sprint | Superset |
| 08:35 | 5 urgente tickets - klik door | Zammad |
| 08:40 | P1 ticket escaleren naar development | Zammad |
| 08:45 | Sprint status checken - 67% done | Redmine |
| 08:50 | Pipeline review - 3 proposals pending | ERPNext |
| 09:00 | Standup voorbereid, dag kan beginnen | - |
In 30 minuten van koffie tot volledige grip op uw organisatie.
Geen Excel sheets. Geen losse e-mails. Geen verrassingen.
KPI Uitleg:
| KPI | Bron | Actie bij klik |
|---|---|---|
| Open Tickets | Zammad | Ticket overzicht openen |
| Pipeline | ERPNext | CRM opportunities bekijken |
| Sprint | Redmine | Sprint board openen |
| Capaciteit | ERPNext | Resource planning bekijken |
| Perspectief | Dashboard | Belangrijkste Metrics |
|---|---|---|
| Klant | Support Overview | Open tickets, SLA %, CSAT score |
| IT | Development Status | Sprint progress, bugs, velocity |
| Business | Pipeline & Revenue | Deals, forecast, resource util. |
| Team | Collaboration | Active channels, response times |
Superset charts bevatten clickable links naar bronsystemen:
-- Voorbeeld: Clickable ticket lijst
SELECT
t.number as "Ticket",
t.title as "Onderwerp",
CONCAT(
'<a href="https://zammad.example.com/#ticket/zoom/',
t.id,
'" target="_blank">Open</a>'
) as "Actie"
FROM tickets t
WHERE t.state_id IN (1, 2, 3)
ORDER BY t.priority_id DESC, t.created_at ASC
-- Open tickets per priority
SELECT
CASE p.name
WHEN '1 high' THEN 'Urgent'
WHEN '2 normal' THEN 'Normal'
WHEN '3 low' THEN 'Low'
END as priority,
COUNT(*) as count,
AVG(EXTRACT(EPOCH FROM (NOW() - t.created_at))/3600)::int as avg_hours_open
FROM tickets t
JOIN ticket_priorities p ON t.priority_id = p.id
WHERE t.state_id NOT IN (4, 5) -- Niet closed/merged
GROUP BY p.name, p.id
ORDER BY p.id;
-- Sprint voortgang
SELECT
v.name as sprint,
COUNT(*) as total_issues,
SUM(CASE WHEN s.is_closed THEN 1 ELSE 0 END) as done,
ROUND(
100.0 * SUM(CASE WHEN s.is_closed THEN 1 ELSE 0 END) / COUNT(*),
1
) as progress_pct
FROM issues i
JOIN versions v ON i.fixed_version_id = v.id
JOIN issue_statuses s ON i.status_id = s.id
WHERE v.status = 'open'
GROUP BY v.id, v.name
ORDER BY v.effective_date;
-- Sales pipeline per stage
SELECT
sales_stage as stage,
COUNT(*) as deals,
SUM(opportunity_amount) as value,
AVG(probability) as avg_probability
FROM tabOpportunity
WHERE status = 'Open'
GROUP BY sales_stage
ORDER BY
CASE sales_stage
WHEN 'Prospecting' THEN 1
WHEN 'Qualification' THEN 2
WHEN 'Proposal' THEN 3
WHEN 'Negotiation' THEN 4
ELSE 5
END;
-- Alle open items uit alle systemen
SELECT
'Zammad' as source,
'ZD#' || t.number as id,
t.title,
'Support' as type,
t.created_at,
CONCAT('https://zammad.example.com/#ticket/zoom/', t.id) as url
FROM zammad.tickets t
WHERE t.state_id NOT IN (4, 5)
UNION ALL
SELECT
'Redmine' as source,
'#' || i.id as id,
i.subject as title,
tr.name as type,
i.created_on as created_at,
CONCAT('https://redmine.example.com/issues/', i.id) as url
FROM redmine.issues i
JOIN redmine.trackers tr ON i.tracker_id = tr.id
WHERE i.status_id NOT IN (5, 6)
ORDER BY created_at DESC
LIMIT 50;
| Rapport | Frequentie | Ontvangers | Inhoud |
|---|---|---|---|
| Morning Briefing | Dagelijks 07:30 | Management | KPIs, urgente items |
| Weekly Summary | Maandag 08:00 | Alle teams | Week metrics, trends |
| Sprint Report | Vrijdag 16:00 | Development | Velocity, burndown |
| Monthly Business | 1e van maand | Directie | Revenue, growth, forecast |
# Superset database connections
databases = {
'zammad': {
'type': 'postgresql',
'host': 'asd-postgres',
'port': 5432,
'database': 'zammad_production',
'username': 'superset_readonly'
},
'redmine': {
'type': 'postgresql',
'host': 'asd-postgres',
'port': 5432,
'database': 'redmine',
'username': 'superset_readonly'
},
'erpnext': {
'type': 'mysql',
'host': 'asd-mariadb',
'port': 3306,
'database': 'erpnext_site',
'username': 'superset_readonly'
}
}
# Export dashboard als JSON
superset export-dashboards -d morning_cockpit
# Import op andere instantie
superset import-dashboards -p morning_cockpit.json
| Rol | Dashboards | Rechten |
|---|---|---|
| Viewer | Alle public | Alleen bekijken |
| Analyst | Alle | Queries maken |
| Admin | Alle | Volledige controle |
-- Gebruik materialized views voor zware queries
CREATE MATERIALIZED VIEW mv_daily_metrics AS
SELECT
date_trunc('day', created_at) as date,
COUNT(*) as tickets,
AVG(first_response_time) as avg_response
FROM tickets
GROUP BY 1;
-- Refresh dagelijks
REFRESH MATERIALIZED VIEW mv_daily_metrics;