This tool calculates compensation for on-call shifts based on data from OpsGenie API or CSV files, following specific compensation rules for different time periods and special cases.
- Calculate on-call compensation with standard rates (5.56 € per hour outside working hours)
- Apply special rates for weekend short shifts (< 5 hours: 27.80 €) and night shifts (< 2 hours: 11.12 €)
- Consider individual working hours, time zones, and holidays
- Handle daylight saving time transitions
- Generate detailed reports and compensation summaries
- Create visualizations of daily compensation amounts
- 24.12. + 31.12 are considered 1/2 a workday, unless the downloaded Calendar data suggest a holiday.
- Creates an XSLX File if requested
--export-excel
- Has a separate module for check for 24x7 compliance:
uv run ./check_oncall_rules.py shifts.csv
- Custom Holidays per user (in user_profiles.json) are supported:
"country_code": "AT",
"custom_holidays": [
"2024-06-16",
"2024-10-31",
"2024-12-13"
]
- Make sure you have Python 3.12 or later installed
- Clone this repository
- Install dependencies:
git clone https://github.com/pyveci/minuto.git
cd minuto
uv venv --python 3.12 --seed .venv
source .venv/bin/activate
uv pip install -e .
uv pip install build
You can configure the tool using environment variables in a .env
file:
# OpsGenie API configuration
OPSGENIE_API_TOKEN=your-api-token-here
OPSGENIE_SCHEDULE_ID=your-schedule-id-here
OPSGENIE_START_DATE=2025-01-01
OPSGENIE_END_DATE=2025-05-09
# File paths
OPSGENIE_CSV_FILE=shifts.csv
OPSGENIE_USER_PROFILES=user_profiles.json
OPSGENIE_OUTPUT_PLOT=compensation_chart.png
OPSGENIE_SAVE_CSV=shifts.csv
User profiles are stored in a JSON file and contain information about:
- User's email
- Time zone
- Working days (0-6, where 0 is Monday)
- Working hours
- Country and region for holiday calculation
- Custom holidays
The tool provides these main commands:
Retrieve on-call shift data directly from the OpsGenie API:
uv run main.py opsgenie --api-token YOUR_TOKEN --schedule-id YOUR_SCHEDULE_ID \
--start-date 2025-01-01 --end-date 2025-05-09 \
--save-csv shifts.csv --user-profiles profiles.json
Or using environment variables:
# After setting up your .env file
uv run main.py opsgenie
If you already have on-call data in a CSV file:
uv run main.py csv shifts.csv --user-profiles profiles.json --output-plot compensation_chart.png
Generate default user profiles from existing on-call data:
uv run main.py profiles shifts.csv --output user_profiles.json
Download holiday calendars for specific countries:
uv run main.py calendars --country AT --country FR --country ES --country BG
You can also download all supported calendars at once:
uv run main.py calendars --all
- Fetch data from OpsGenie and save to CSV:
uv run main.py opsgenie \
--api-token YOUR_TOKEN \
--schedule-id YOUR_SCHEDULE_ID \
--start-date 2025-01-01 \
--end-date 2025-05-09 \
--save-csv shifts.csv
- Generate user profiles:
uv run main.py profiles shifts.csv --output user_profiles.json
-
Edit the user profiles to adjust timezones, working hours, etc.
-
Calculate compensation with the updated profiles:
uv run main.py csv shifts.csv --user-profiles user_profiles.json --output-plot chart.png
- Create a
.env
file with your configuration:
OPSGENIE_API_TOKEN=your-token
OPSGENIE_SCHEDULE_ID=your-schedule-id
OPSGENIE_START_DATE=2025-01-01
OPSGENIE_END_DATE=2025-05-09
OPSGENIE_SAVE_CSV=shifts.csv
- Fetch data and save to CSV:
uv run main.py opsgenie
- Create and adjust user profiles:
uv run main.py profiles shifts.csv
# Edit user_profiles.json to adjust settings
- Run the compensation calculation:
uv run main.py csv shifts.csv
The tool generates a detailed compensation report showing:
=== DAILY COMPENSATION SUMMARY ===
User StartDay StartDate Start EndDate End Hours Amount (€) Pauschale
...
=== USER TOTALS ===
User Total Hours Total Amount (€)
...
=== GRAND TOTAL ===
Total compensation amount: XXX.XX €
The CSV file should have the following columns:
start
: Start time of the shift (ISO 8601 format)end
: End time of the shift (ISO 8601 format)hours
: Duration of the shift in hoursuser
: Email of the user who was on call