feat(contacts): idempotent special-dates sync engine
The engine reconciles device contact dates into the per-type local calendars. Each run is an idempotent diff keyed on the deterministic UID_2445: - new contacts inserted (seeding reminders via resolveDefaultReminder, plus a useful per-calendar all-day default of on-the-day + a week before so birthdays get lead time out of the box); - changed contacts get a targeted managed-column update (title/dtstart/rrule only) — reminders/location/notes are never re-touched, so user edits survive; - removed contacts deleted. Managed calendars are created/adopted/removed per enabled type (reconcileCalendars, self-healing against a stored-id that no longer exists), all-day FREQ=YEARLY events anchored at the birth year (or a leap anchor when year-less). Pure helpers (uid, anchor, age snapshot, title templating) and the diff are extracted for unit testing; a stateful fake exercises full-run idempotency and user-data preservation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -462,4 +462,13 @@
|
||||
<string name="crash_report_body_paste">_(The report was too long for this link — paste it from your clipboard here.)_</string>
|
||||
<string name="report_issue_url" translatable="false">https://codeberg.org/jlmakiola/calendula/issues/new</string>
|
||||
<string name="report_issue_choose_url" translatable="false">https://codeberg.org/jlmakiola/calendula/issues/new/choose</string>
|
||||
|
||||
<!-- Contact special dates (issue #15). {name} is the contact, {age} the age
|
||||
at the upcoming date (dropped when the year is unknown or Show age is off). -->
|
||||
<string name="special_dates_calendar_birthday">Birthdays</string>
|
||||
<string name="special_dates_calendar_anniversary">Anniversaries</string>
|
||||
<string name="special_dates_calendar_custom">Special dates</string>
|
||||
<string name="special_dates_default_title_birthday">{name}\'s birthday ({age})</string>
|
||||
<string name="special_dates_default_title_anniversary">{name}\'s anniversary ({age})</string>
|
||||
<string name="special_dates_default_title_custom">{name}</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user