Initial commit (clean, ignores in place)

This commit is contained in:
2025-08-12 01:13:41 +01:00
commit c74790b014
26 changed files with 2331 additions and 0 deletions

219
README.md Normal file
View File

@@ -0,0 +1,219 @@
# Mileage Logger
Small, reliable mileage-logging tool that ingests **Google Maps Timeline** exports from Android (device-local) and produces **one Excel workbook per month** ready for HR (EveryHR).
- Detects ordered work trips between whitelisted sites (schools, HQ, Home)
- Computes per-hop miles (route catalog → fallback straight-line)
- Writes `mileage_YYYY-MM.xlsx` with the exact columns HR needs
- Filters by date (e.g., **last month**), skips weekends, and (by default) assumes each workday starts at **Home**
---
## Quick Start
### 1) Export Timeline on your phone
Android: `Settings → Location → Location Services → Google Timeline → Export`
Copy **`Timeline.json`** to your computer.
### 2) Put it here
```bash
~/Downloads/Mileage Logger/Timeline.json
```
### 3) Install dependencies
```bash
# in your chosen venv/conda env
pip install -r requirements.txt
```
### 4) Run (monthly workflow: previous calendar month, weekdays only)
```bash
cd ~/Downloads/Mileage\ Logger
python -m mileage_logger.cli import "Timeline.json" --sites config/sites.yml --routes tests/data/routes_golden.csv --output ~/Downloads/Mileage\ Logger/output --last-month --weekdays-only
```
### 5) Find your Excel
Look in `output/` for files like `mileage_YYYY-MM.xlsx`.
---
## Oneword alias (Linux/macOS bash/zsh)
Add this to your `~/.bashrc` or `~/.zshrc`:
```bash
alias mileage='( cd ~/Downloads/Mileage\ Logger && python -m mileage_logger.cli import "Timeline.json" --sites config/sites.yml --routes tests/data/routes_golden.csv --output ~/Downloads/Mileage\ Logger/output --last-month --weekdays-only )'
```
Then run:
```bash
mileage
```
---
## Installing
### Windows (PowerShell)
```powershell
# Run in PowerShell (inside your venv):
pip install -r requirements.txt
function mileage {
Set-Location "$HOME\Downloads\Mileage Logger"
python -m mileage_logger.cli import "Timeline.json" `
--sites config\sites.yml `
--routes tests\data
outes_golden.csv `
--output "$HOME\Downloads\Mileage Logger\output" `
--last-month `
--weekdays-only
}
```
### macOS / Linux
```bash
pip install -r requirements.txt
# (optional) add the alias from Quick Start to your shell rc
```
---
## Configuration
### `config/sites.yml`
Define your whitelisted locations.
```yaml
sites:
- canonical: "Home"
label: "Home"
lat: 52.65236
lon: 1.26983
radius_m: 400
aliases: ["home", "inferred_home", "INFERRED_HOME"]
- canonical: "Henderson Green Primary Academy"
label: "Henderson Green Primary Academy"
lat: 52.6565032
lon: 1.2703586
radius_m: 300
aliases: ["Henderson Green", "Henderson Green Primary"]
- canonical: "Unity SP"
label: "Unity SP (HQ)"
lat: 52.6067
lon: 1.2886
radius_m: 350
aliases: ["WORK", "Unity SP HQ"]
# ...other schools...
```
Tips:
- **radius_m**: start at 300600 m for schools (device visits often pin to car parks, not building centroids).
- Add aliases you see in Timeline (e.g., `WORK`, `INFERRED_HOME`).
### `tests/data/routes_golden.csv`
Preapproved driving distances (miles) for common pairs.
```
origin,destination,miles
Home,Henderson Green Primary Academy,2.9
Henderson Green Primary Academy,Home,2.9
Henderson Green Primary Academy,Valley Primary Academy,1.1
Valley Primary Academy,Heartsease Primary Academy,4.7
# ...etc
```
If a pair isnt found, the tool falls back to straightline (haversine) distance and rounds to 0.1 mi.
---
## CLI Usage
```bash
python -m mileage_logger.cli import TIMELINE.json --sites config/sites.yml --routes tests/data/routes_golden.csv --output output [date filter flags] [behavior flags]
```
### Date filter flags (choose one style)
- `--last-month` — previous calendar month (e.g., run on 1 Sep → processes August)
- `--month YYYY-MM` — specific month (e.g., `--month 2025-08`)
- `--since YYYY-MM-DD` / `--until YYYY-MM-DD` — inclusive range
- `--days N` — last N days relative to today (local time)
### Behavior flags
- `--weekdays-only` — exclude Saturday/Sunday hops
- `--no-assume-home-start` — disable synthetic `Home → FirstSite` at start of day (default is ON)
---
## Output
One workbook per month present in the filtered data:
- File: `mileage_YYYY-MM.xlsx`
- Sheet: `YYYY-MM`
- Columns:
- Date (YYYY-MM-DD)
- Purpose (`Travel from {From} to {To} {Miles}mi`)
- Miles (rounded to 0.1)
- Vehicle
- Job Role
- From
- To
- Notes (empty)
---
## For another user/colleague
- Copy the whole folder.
- Edit `config/sites.yml`:
- Update **Home** lat/lon and radius.
- Keep schools the same unless their coverage differs.
- Update/add `tests/data/routes_golden.csv` lines for Home↔Sites if their home is different.
- Confirm the alias points to their own path.
- Run the same monthly command.
---
## Requirements
- Python 3.10+ (tested on 3.103.13)
- Works on Windows, macOS, Linux
### `requirements.txt`
```
python-dateutil>=2.8
pytz>=2023.3
PyYAML>=6.0
openpyxl>=3.1
geopy>=2.4
# Optional: only needed if you enable external routing APIs later
httpx>=0.27
```
---
## Makefile (optional convenience)
```make
install:
pip install -r requirements.txt
run:
python -m mileage_logger.cli import "Timeline.json" \ --sites config/sites.yml \ --routes tests/data/routes_golden.csv \ --output output \ --last-month \ --weekdays-only
# If you add linting/tests later:
lint:
flake8 mileage_logger
test:
pytest
```
Usage:
```bash
make install
make run
```
---
## Troubleshooting
- **No rows appear** — Increase `radius_m` (e.g., 400600 m). Ensure aliases like `INFERRED_HOME`, `WORK` exist for Home/HQ.
- **Trips start midday** — Ensure you didnt pass `--no-assume-home-start`.
- **Only one workbook created** — Likely only one month had hops in the filtered range (expected with `--last-month`).
- **“Module not found” errors** — Activate the same environment you installed deps into (or reinstall with `pip install -r requirements.txt`).