You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A Python application that connects Cisco IP phone systems with UKG Pro Workforce Management for employee time tracking. Employees call a designated phone number and use the phone's display to clock in/out. Punches are recorded locally and synced to UKG.
Architecture
┌──────────────┐ ┌─────────────────┐ ┌──────────────┐
│ Cisco IP │────>│ CUCM │────>│ This App │
│ Phone │ │ CTI Route Point │ │ (Flask) │
│ │<────│ │<────│ │
│ XML Display │ │ HTTP Trigger │ │ XML Services│
└──────────────┘ └─────────────────┘ └──────┬───────┘
│
┌──────▼───────┐
│ UKG Pro WFM │
│ REST API │
└──────────────┘
Call Flow
Employee dials the clock-in extension (CTI Route Point)
CUCM sends an HTTP trigger to /webhook/call
App looks up caller by Caller ID
Known caller → shows main menu (Clock In / Clock Out / Check Status)
Unknown caller → prompts for Employee ID via phone keypad
Employee selects an action
App records the punch in SQLite and submits to UKG API
Confirmation displayed on phone screen
Setup
Prerequisites
Python 3.10+
Cisco CUCM with CTI Route Point configured
UKG Pro WFM API credentials
Network connectivity between this app and both CUCM and UKG
Installation
pip install -r requirements.txt
cp .env.example .env
# Edit .env with your Cisco CUCM and UKG credentials
CUCM Configuration
Create a CTI Route Point in CUCM Administration
Device > CTI Route Point > Add New
Assign a Directory Number (e.g., 5000)
Create an Application User with CTI permissions
Configure HTTP Trigger to point to http://<app-host>:5000/webhook/call
Pass callerid and callednumber as query parameters
Running
# Development
python app.py
# Production
gunicorn "app:create_app()" -b 0.0.0.0:5000 -w 4