Prefix the project name or note column with ~ to mark an entry as
count-but-don't-export. Marked entries are included in summary and
status totals but omitted from all csv output (both --raw and
aggregated, single-day and weekly).
| 09:00 | 17:00 | 8:00 | ~Leave | | Day off |
| 09:00 | 17:00 | 8:00 | Leave | | ~Day off |
The ~ is stripped from whichever field carries it before any
downstream processing, so project map resolution is unaffected.
Implementation:
- parse_table sets skip_csv=True on marked rows and strips the ~
- new filter_skip_csv() helper in parser.py
- to_csv_entries() skips skip_csv rows
- _cmd_csv calls filter_skip_csv() before aggregate_rows()
- Add get_date_format() to config.py: reads [csv] date_format, returns
None when absent (falls back to the default %d/%m/%y)
- _cmd_csv applies the format to both single-day and weekly date strings
- Add 3 tests for get_date_format in TestGetters
- Update timesheets.example.toml and README with [csv] date_format key
- Extract _add_output_arg() helper; add it explicitly to summary, csv,
and stories subparsers (removes it implicitly from status)
- _cmd_stories now honours args.output, redirecting print_stories output
to the given file (same pattern as _cmd_summary)
- Update README with stories -o example
- Add `write_csv_weekly()` to output.py: writes entries from multiple
days as a single CSV with one header row, correct date per row
- Add `-w`/`--weekly` flag to csv subparser
- _cmd_csv branches on args.weekly: fetches week sections, formats
per-day date strings, calls write_csv_weekly; --raw is honoured
- Add TestWriteCsvWeekly with 6 tests
- Update README with weekly csv usage examples
- Add `to_csv_entries()` to output.py: converts raw rows to write_csv
entries one-for-one, without merging by (project, description)
- Add `--raw` flag to the csv subparser; _cmd_csv branches on it
- Add TestToCsvEntries with 6 tests
- Update README with --raw usage example
- Add .coverage and htmlcov/ to .gitignore