115 lines
3.9 KiB
Python
115 lines
3.9 KiB
Python
import sqlite3
|
|
import os
|
|
from datetime import date
|
|
|
|
def connect_db():
|
|
"""
|
|
Connects to the SQLite database file and returns the connection object.
|
|
If the file does not exist, it prints an error message.
|
|
"""
|
|
db_file = 'time_tracker.db'
|
|
if not os.path.exists(db_file):
|
|
print(f"Error: Database file '{db_file}' not found. Please run the database creation script first.")
|
|
return None
|
|
|
|
return sqlite3.connect(db_file)
|
|
|
|
def add_time_entry():
|
|
"""
|
|
Prompts the user for details and adds a new time entry to the database.
|
|
"""
|
|
conn = connect_db()
|
|
if not conn:
|
|
return
|
|
|
|
try:
|
|
cursor = conn.cursor()
|
|
|
|
# Display all active clients for selection
|
|
cursor.execute('SELECT client_id, client_name FROM clients WHERE active = 1 ORDER BY client_name')
|
|
active_clients = cursor.fetchall()
|
|
|
|
if not active_clients:
|
|
print("No active clients found. Please add an active client first.")
|
|
return
|
|
|
|
print("\n--- Select a Client ---")
|
|
for client_id, client_name in active_clients:
|
|
print(f"{client_id}: {client_name}")
|
|
print("0: Exit") # Added exit option
|
|
print("----------------------")
|
|
|
|
while True:
|
|
try:
|
|
choice = int(input("Enter the ID of the client (or 0 to exit): "))
|
|
except ValueError:
|
|
print("Invalid input. Please enter a number.")
|
|
continue
|
|
|
|
if choice == 0:
|
|
print("Exiting time entry.")
|
|
return # Exit the function if the user chooses 0
|
|
|
|
# Check if the entered ID is in the list of active clients
|
|
if any(c[0] == choice for c in active_clients):
|
|
client_id = choice
|
|
break
|
|
else:
|
|
print("Invalid client ID. Please enter a valid ID from the list.")
|
|
|
|
print(f"\n--- Add New Time Entry for Client ID {client_id} ---")
|
|
project = input("Enter project name: ")
|
|
description = input("Enter a brief description: ")
|
|
|
|
# Get the hours and validate it's a number
|
|
while True:
|
|
try:
|
|
hours = float(input("Enter number of hours (e.g., 1.5): "))
|
|
if hours <= 0:
|
|
print("Hours must be a positive number.")
|
|
else:
|
|
break
|
|
except ValueError:
|
|
print("Invalid input. Please enter a number for hours.")
|
|
|
|
# Get the date, defaulting to today's date
|
|
entry_date = input(f"Enter the date (YYYY-MM-DD, default is today: {date.today()}): ")
|
|
if not entry_date:
|
|
entry_date = str(date.today())
|
|
|
|
# The 'invoiced' field defaults to 0 (false)
|
|
invoiced = 0
|
|
|
|
# Insert the new time entry into the database
|
|
cursor.execute('''
|
|
INSERT INTO time_tracking (project, description, invoiced, date, hours, client_id)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
''', (project, description, invoiced, entry_date, hours, client_id))
|
|
|
|
conn.commit()
|
|
print("\nTime entry added successfully!")
|
|
|
|
# Fetch and display the newly created entry
|
|
last_id = cursor.lastrowid
|
|
cursor.execute('SELECT * FROM time_tracking WHERE entry_id = ?', (last_id,))
|
|
new_entry = cursor.fetchone()
|
|
|
|
print("\n--- New Time Entry Details ---")
|
|
print(f"ID: {new_entry[0]}")
|
|
print(f"Project: {new_entry[1]}")
|
|
print(f"Description: {new_entry[2]}")
|
|
print(f"Invoiced: {'Yes' if new_entry[3] else 'No'}")
|
|
print(f"Date: {new_entry[4]}")
|
|
print(f"Hours: {new_entry[5]:.2f}")
|
|
print(f"Client ID: {new_entry[6]}")
|
|
print("------------------------------\n")
|
|
|
|
except sqlite3.Error as e:
|
|
print(f"An error occurred: {e}")
|
|
finally:
|
|
if conn:
|
|
conn.close()
|
|
|
|
if __name__ == "__main__":
|
|
add_time_entry()
|