83 lines
2.6 KiB
Dart
83 lines
2.6 KiB
Dart
import 'package:shared_preferences/shared_preferences.dart';
|
||
|
||
import '../models/dokument_typ.dart';
|
||
|
||
/// Lokale Kennzahlen (keine Cloud) – Fokus: PDFs & Dokumenttypen.
|
||
class WorkflowMetricsService {
|
||
WorkflowMetricsService._();
|
||
|
||
static const _kPdfTotal = 'hp_metrics_pdf_total';
|
||
static const _kPdfWeek = 'hp_metrics_pdf_week';
|
||
static const _kPdfWeekId = 'hp_metrics_pdf_week_id';
|
||
static const _kLastPdfAt = 'hp_metrics_last_pdf_at';
|
||
static const _kPrefixDoc = 'hp_metrics_doc_';
|
||
|
||
static DateTime _montagNullUhr(DateTime d) {
|
||
final t = DateTime(d.year, d.month, d.day);
|
||
return t.subtract(Duration(days: t.weekday - DateTime.monday));
|
||
}
|
||
|
||
static int _kalenderWocheSchluessel(DateTime d) {
|
||
final m = _montagNullUhr(d);
|
||
return m.year * 10000 + m.month * 100 + m.day;
|
||
}
|
||
|
||
static Future<void> recordPdfExported() async {
|
||
final p = await SharedPreferences.getInstance();
|
||
final now = DateTime.now();
|
||
final wid = _kalenderWocheSchluessel(now);
|
||
final stored = p.getInt(_kPdfWeekId);
|
||
var week = p.getInt(_kPdfWeek) ?? 0;
|
||
if (stored != wid) {
|
||
week = 0;
|
||
await p.setInt(_kPdfWeekId, wid);
|
||
}
|
||
week += 1;
|
||
final total = (p.getInt(_kPdfTotal) ?? 0) + 1;
|
||
await p.setInt(_kPdfWeek, week);
|
||
await p.setInt(_kPdfTotal, total);
|
||
await p.setString(_kLastPdfAt, now.toIso8601String());
|
||
}
|
||
|
||
static Future<void> recordDokumentGespeichert(DokumentTyp typ) async {
|
||
final p = await SharedPreferences.getInstance();
|
||
final k = '$_kPrefixDoc${typ.storageValue}';
|
||
await p.setInt(k, (p.getInt(k) ?? 0) + 1);
|
||
}
|
||
|
||
static Future<WorkflowMetricsSnapshot> load() async {
|
||
final p = await SharedPreferences.getInstance();
|
||
final wid = _kalenderWocheSchluessel(DateTime.now());
|
||
final stored = p.getInt(_kPdfWeekId);
|
||
final week = (stored == wid) ? (p.getInt(_kPdfWeek) ?? 0) : 0;
|
||
final total = p.getInt(_kPdfTotal) ?? 0;
|
||
final last = DateTime.tryParse(p.getString(_kLastPdfAt) ?? '');
|
||
final byDoc = <String, int>{};
|
||
for (final t in DokumentTyp.values) {
|
||
final k = '$_kPrefixDoc${t.storageValue}';
|
||
final n = p.getInt(k);
|
||
if (n != null && n > 0) byDoc[t.storageValue] = n;
|
||
}
|
||
return WorkflowMetricsSnapshot(
|
||
pdfThisCalendarWeek: week,
|
||
pdfAllTime: total,
|
||
lastPdfAt: last,
|
||
savesByDokumentTyp: byDoc,
|
||
);
|
||
}
|
||
}
|
||
|
||
class WorkflowMetricsSnapshot {
|
||
WorkflowMetricsSnapshot({
|
||
required this.pdfThisCalendarWeek,
|
||
required this.pdfAllTime,
|
||
required this.lastPdfAt,
|
||
required this.savesByDokumentTyp,
|
||
});
|
||
|
||
final int pdfThisCalendarWeek;
|
||
final int pdfAllTime;
|
||
final DateTime? lastPdfAt;
|
||
final Map<String, int> savesByDokumentTyp;
|
||
}
|