For Developers
Welcome to the developer documentation for time cockpit! This section covers everything you need to customize the data model, build integrations, automate workflows, and extend time cockpit's functionality.
🚀 Quick Start
New to Time Cockpit Development?
- Developer FAQ - Common questions and quick answers
- Data Model Overview - Understand the entity structure
- Web API Overview - Access time cockpit programmatically
- TCQL Overview - Learn the query language
Popular Use Cases
- Budgetary Control Implementation
- Project Budget Tracking
- JIRA Integration
- Custom Workflow Automation
📊 Data Model
Understand time cockpit's data structure and relationships.
Core Concepts
Entity Relationships - Visual ER diagrams for all domains
- Project & Billing domain
- Time & Attendance domain
- Security & User Management
- Master Data & Configuration
Standard Entities Reference - Complete entity documentation
- APP_Timesheet, APP_Project, APP_Task
- Properties, relationships, permissions
- TCQL and Web API examples
Permissions & Security Guide - Security architecture
- Role-based access control (RBAC)
- Row-level security patterns
- Named sets
- Common permission scenarios
Customization
- Data Model Customization Overview
- Creating Custom Entities
- Custom Lists
- Custom Forms
- Permission Configuration
- Navigation Customization
- Dashboards
- Feature Flags
🔍 TCQL - Time Cockpit Query Language
TCQL is the expression-based query language for accessing and manipulating time cockpit data.
Core Syntax
- Overview - Introduction to TCQL
- From Clause - Data source selection
- Where Clause - Filtering data
- Select Clause - Projections and aggregations
- Order By Clause - Sorting results
- Expression Language - Operators and functions
Specialized Functions
- Working Time & Holiday Functions
:GetWorkTime()- Calculate working hours:GetWeeklyHoursOfWork()- Expected hours:BookingCompletionDateOfUser()- Closing date:FirstOfMonth(),:LastOfMonth()- Date helpers
Advanced Topics
- TCQL AST API - Programmatic query construction
Example Queries
Get unbilled hours per project:
From T In APP_Timesheet
Where T.APP_Billable = True And T.APP_Billed = False
Select New With {
.ProjectCode = T.APP_Project.APP_Code,
.TotalHours = Sum(T.APP_DurationInHours),
.Revenue = Sum(T.APP_Revenue)
}
Find timesheets in wrong department:
From T In APP_Timesheet
Where
T.APP_Project <> Null And
T.APP_UserDetail.APP_Department <> T.APP_Project.APP_Customer.APP_Department
Select T
More examples → Developer FAQ
🔌 Web API
Access time cockpit data via REST/OData API.
API Documentation
- Overview - API architecture
- Authentication - OAuth, bearer tokens
- OData Endpoint - REST CRUD operations
- Query Endpoint - Execute TCQL via HTTP
- ExecuteList Endpoint - Run predefined lists
- ExecuteAction Endpoint - Trigger actions
- Reporting Endpoint - Generate reports
- Sample Implementation - Client library
Quick Examples
Get current user's timesheets:
GET https://api.timecockpit.com/odata/APP_Timesheet
?$filter=APP_UserDetailUuid eq current-user-uuid
&$expand=APP_Project,APP_Task
&$orderby=APP_BeginTime desc
&$top=50
Create a timesheet:
POST https://api.timecockpit.com/odata/APP_Timesheet
Content-Type: application/json
{
"APP_BeginTime": "2026-02-09T09:00:00Z",
"APP_EndTime": "2026-02-09T12:30:00Z",
"APP_Description": "Development work",
"APP_ProjectUuid": "...",
"APP_UserDetailUuid": "..."
}
Execute TCQL query:
POST https://api.timecockpit.com/query
Content-Type: application/json
{
"query": "From T In APP_Timesheet Where T.APP_BeginTime >= @StartDate Select T",
"parameters": {
"@StartDate": "2026-02-01T00:00:00Z"
}
}
More examples → Web API Documentation
⚙️ Scripting & Automation
Automate workflows and extend functionality using Python (IronPython).
Core Concepts
- Scripting Overview - Introduction to scripting
- Actions - User-triggered operations
- Triggers - Event-driven automation
- Automating Scripts - Scheduled execution
Common Scenarios
How-To Guides:
- Add a File Property
- Add Holidays Using a Script
- Export Data to Excel
- Import Data from CSV
- Import from SQL Server
- Modify the Data Model
- Send Mails When Over Budget
- Use .NET Framework Classes
- Use C# to Access API
- Use XML in Scripts
Example: Auto-Approve Vacation
def approveVacationTrigger(actionContext):
dc = actionContext.DataContext
vacation = actionContext.InputSet.First()
# Auto-approve if less than 1 day
if vacation.APP_BeginTime == vacation.APP_EndTime:
vacation.APP_ApprovedTimestampUtc = DateTime.UtcNow
vacation.APP_Approver = dc.Environment.CurrentUser
dc.SaveObject(vacation)
More examples → Scripting How-To Guides
📈 Reporting
Create custom reports and data visualizations.
- Overview - Reporting architecture
- Standard Print View - Built-in templates
- Custom Reports - Create your own
- Built-In Reports - Available reports
💡 Use Cases & Examples
Real-world implementation examples:
- Budgetary Control - Project budget tracking with calculated metrics
- Hours booked vs. budgeted
- Revenue vs. costs analysis
- Effective billing rates
- Python-based list implementation
More use cases coming soon!
📦 Integration Patterns
Common Integration Scenarios
1. External Project Management (JIRA, Azure DevOps)
- Sync projects/tasks into time cockpit
- Push time entries back to external system → JIRA Integration Example
2. Accounting Systems (DATEV, SAP)
- Export invoices and billable hours
- Import customer/project master data → Data Export
3. HR Systems
- Sync employee master data
- Export working time for payroll → Data Import/Export
4. Custom Dashboards (Power BI, Tableau)
- Query timesheet data via OData
- Build real-time dashboards → OData Endpoint
🔐 Security for Developers
- Permissions Guide - Implement custom security
- Default Permissions Migration - Enable new security model
- AAD Integration - Enterprise authentication
🛠️ Development Tools
Testing Your Changes
TCQL Console: Test queries interactively in the web client Script Debugger: Available in full client for script development API Testing: Use Postman or similar tools with Bearer authentication
Best Practices
- Always test permissions - Verify users can't access unauthorized data
- Use transactions - Wrap multi-step operations in
BeginTransaction()/CommitTransaction() - Handle errors gracefully - Use try/catch blocks in scripts
- Document custom code - Add comments explaining business logic
- Version control - Export data model changes regularly
📞 Getting Help
Resources
- Developer FAQ - Quick answers to common questions
- Release Notes - Stay updated on API changes
- Support - Contact time cockpit support for technical assistance
Community
- Share custom scripts and solutions
- Learn from others' implementations
- Contribute use cases and examples
Looking for User Documentation?
If you're looking for information on how to use time cockpit as an end user: → For Users