RecoReco -- calendar-scheduled recurring cards

Kanboard's built-in recurrence is event-triggered (a card recurs when you move or close it). RecoReco adds calendar-triggered recurrence: a card fires on a date, on its own, via cron -- made for bills, rent, and subscriptions.

A card marked recurring stays as a template; on schedule, RecoReco spawns a plain (non-recurring) copy into a column you choose. The template advances to the next date; the copy keeps the fired date.

RecoReco is opt-in per card and inert until you mark a card, so it needs no per-board setting. It leaves native recurrence untouched (the two are mutually exclusive per card).

The idea

  • The due date is the anchor. All timing (day, month, weekday, time) is read from the card's due date -- there are no separate date inputs. A card without a due date cannot be made recurring.
  • Frequencies: yearly, monthly by day, monthly by weekday, weekly, daily.
  • Last day of the month: an explicit checkbox (honored only when the due date is the last day, or the last such weekday, of its month).
  • Lead time: "create the copy N days before the due date", so the card shows up early enough to act on; the copy is still due on the real day.

Scheduling (cron)

The engine runs from the CLI command recoreco:run. Add it to cron four times a day -- at 05:58, 11:58, 17:58 and 23:58:

58 5,11,17,23 * * * cd /path/to/kanboard && php cli recoreco:run >> /var/log/recoreco.log 2>&1

(Point the path at your install and run it as the user that owns Kanboard's data.) Each run looks ahead 12 hours; the runs overlap by 6 hours, so a single missed run is covered by the next one.

Each run walks a template forward from its current due date and spawns every occurrence whose fire time has arrived -- so occurrences already in the past are backfilled, not skipped. To avoid flooding the board when a template was set far in the past, a single run spawns at most the 12 most recent due occurrences; any older overflow is skipped (contiguous, no gap) and the template advances straight to the next future occurrence. days before shifts a copy earlier within the lead. Runs are idempotent: an occurrence is never spawned twice, so running an extra time is safe.

You can trigger the exact same pass by hand -- either on the CLI (php cli recoreco:run) or with the Run now button under Settings -> RecoReco (admin only). The button and cron do the identical thing.

Status

All five frequencies work (yearly, monthly by day, monthly by weekday, weekly, daily) with the last-day rule, board recurrence icons, backfill with the 12-occurrence cap, the Run-now button, and the FinanceBuddy installment hand-off.

Requirements

  • Kanboard >= 1.2.0
  • cron (to run recoreco:run)

Installation

Copy this folder into your Kanboard installation as plugins/RecoReco/. The directory name must be exactly RecoReco (Kanboard derives the plugin namespace from the folder name). No build step and no database migration. Then add the cron entry above.

License

AGPL-3.0. See LICENSE.

Description
No description provided
Readme AGPL-3.0 220 KiB
Languages
PHP 90.2%
JavaScript 9.8%