b4108c5a36
Phase 1 of the maintenance-reminders feature. - notification_kind: + maintenance_due_soon, maintenance_overdue. These are distinct from maintenance_event_recorded (service performed) so the bell list can group/filter reminder vs service cleanly. - New maintenance_reminder_kind enum: due_soon | overdue. - New maintenance_reminders_sent table with UNIQUE(schedule_id, kind, due_at). The cron uses INSERT … ON CONFLICT DO NOTHING on this composite to make the fire-once-per-window guarantee atomic even under concurrent runs. Once the schedule's next_due_at advances after a service event, the tuple is fresh and a new reminder fires. No service code yet — Phase 2 wires the readers and orchestrator. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
146 lines
3.0 KiB
JSON
146 lines
3.0 KiB
JSON
{
|
|
"version": "7",
|
|
"dialect": "postgresql",
|
|
"entries": [
|
|
{
|
|
"idx": 0,
|
|
"version": "7",
|
|
"when": 1776760498088,
|
|
"tag": "0000_init",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 1,
|
|
"version": "7",
|
|
"when": 1776912796532,
|
|
"tag": "0001_phase1_assets_properties_documents",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 2,
|
|
"version": "7",
|
|
"when": 1776912900000,
|
|
"tag": "0002_phase1_constraints_and_search",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 3,
|
|
"version": "7",
|
|
"when": 1776913896873,
|
|
"tag": "0003_phase2_checklists_and_maintenance",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 4,
|
|
"version": "7",
|
|
"when": 1776913950000,
|
|
"tag": "0004_phase2_partial_indexes_and_triggers",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 5,
|
|
"version": "7",
|
|
"when": 1776915278123,
|
|
"tag": "0005_phase3_projects_and_decisions",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 6,
|
|
"version": "7",
|
|
"when": 1776915350000,
|
|
"tag": "0006_phase3_partial_index_and_triggers",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 7,
|
|
"version": "7",
|
|
"when": 1776916197473,
|
|
"tag": "0007_phase4_wiki",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 8,
|
|
"version": "7",
|
|
"when": 1776916020000,
|
|
"tag": "0008_phase4_wiki_fts_and_uniq",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 9,
|
|
"version": "7",
|
|
"when": 1776918611593,
|
|
"tag": "0009_rooms_and_floors",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 10,
|
|
"version": "7",
|
|
"when": 1776918700000,
|
|
"tag": "0010_rooms_check_and_triggers",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 11,
|
|
"version": "7",
|
|
"when": 1776919853043,
|
|
"tag": "0011_property_accounts",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 12,
|
|
"version": "7",
|
|
"when": 1776919900000,
|
|
"tag": "0012_accounts_updated_at_trigger",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 13,
|
|
"version": "7",
|
|
"when": 1776930973516,
|
|
"tag": "0013_notifications",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 14,
|
|
"version": "7",
|
|
"when": 1776932841675,
|
|
"tag": "0014_property_expenses",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 15,
|
|
"version": "7",
|
|
"when": 1776932900000,
|
|
"tag": "0015_expenses_updated_at_trigger",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 16,
|
|
"version": "7",
|
|
"when": 1777268853483,
|
|
"tag": "0016_property_parent_id",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 17,
|
|
"version": "7",
|
|
"when": 1777268853484,
|
|
"tag": "0017_property_parent_check",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 18,
|
|
"version": "7",
|
|
"when": 1777268985448,
|
|
"tag": "0018_checklist_scope_property",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 19,
|
|
"version": "7",
|
|
"when": 1777281036233,
|
|
"tag": "0019_maintenance_reminders",
|
|
"breakpoints": true
|
|
}
|
|
]
|
|
} |