Legacy PMS data archive
I turned years of clunky legacy exports into a queryable archive so year-over-year did not start at zero.
Before the move to a modern PMS, years of history lived in per-property 'forecasting' spreadsheet exports, one file per year, unqueryable. Without them, any year-over-year comparison had no prior year to stand on.
How it works
A Python ingester walks the raw .xls files for eight properties, parses each one's daily rows (which, despite the 'forecasting' name, carry realized actuals for past dates), and upserts them into a SQLite database. A query CLI answers property, date, range, and year-to-date questions and does day-of-week-aligned comparisons across years.
- Each file carries current- and prior-year columns, so one file yields two ingestable years.
- A canonical view picks one row per property-date, preferring current-year over prior-year duplicates and the most recent file.
- Idempotent upserts, so re-dropping a file just replaces its rows.
Live. It is the deliberately boring, standard-library-only companion to the modern data layer, and it feeds the performance dashboard's pre-migration history.
History is leverage. It is what makes 'up or down versus last year' a real answer instead of a shrug. An owner does not have time to hand-parse a decade of exports. An ingest script does it once and answers forever.