feat(programmer): day sheet providers + controller

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-09-28 14:00:29 +08:00
parent 20e95ffe37
commit cc8d8ab8bf
4 changed files with 741 additions and 0 deletions
@@ -37,6 +37,9 @@ class DaySheetSnapshot {
'rows': rows.map((r) => r.toJson()).toList(),
};
/// Alias for [toJson]; used by the approval RPC payload.
Map<String, dynamic> toMap() => toJson();
factory DaySheetSnapshot.fromJson(Map<String, dynamic> j) {
final rowsList = (j['rows'] as List? ?? [])
.map((r) => DaySheetRow.fromJson(r as Map<String, dynamic>))
@@ -0,0 +1,32 @@
/// A single audit-trail event on a programmer day sheet.
class ProgrammerDaySheetEvent {
final String id;
final String sheetId;
final String kind;
final String? actorId;
final String? body;
final List<String> flaggedTaskIds;
final DateTime createdAt;
const ProgrammerDaySheetEvent({
required this.id,
required this.sheetId,
required this.kind,
this.actorId,
this.body,
required this.flaggedTaskIds,
required this.createdAt,
});
factory ProgrammerDaySheetEvent.fromMap(Map<String, dynamic> m) {
return ProgrammerDaySheetEvent(
id: m['id'] as String,
sheetId: m['sheet_id'] as String,
kind: m['kind'] as String,
actorId: m['actor_id'] as String?,
body: m['body'] as String?,
flaggedTaskIds: List<String>.from(m['flagged_task_ids'] as List? ?? []),
createdAt: DateTime.parse(m['created_at'] as String),
);
}
}