Add edit_time.py
This commit is contained in:
90
edit_time.py
Normal file
90
edit_time.py
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
import sqlite3
|
||||||
|
import os
|
||||||
|
|
||||||
|
def connect_db():
|
||||||
|
db_file = 'time_tracker.db'
|
||||||
|
if not os.path.exists(db_file):
|
||||||
|
print(f"Error: Database file '{db_file}' not found.")
|
||||||
|
return None
|
||||||
|
return sqlite3.connect(db_file)
|
||||||
|
|
||||||
|
def display_entry_details(entry):
|
||||||
|
print("\n--- Current Entry Details ---")
|
||||||
|
print(f"ID: {entry[0]} | Project: {entry[1]} | Date: {entry[4]}")
|
||||||
|
print(f"Description: {entry[2]}")
|
||||||
|
print(f"Hours: {entry[5]}")
|
||||||
|
print("-" * 30)
|
||||||
|
|
||||||
|
def edit_time_entry():
|
||||||
|
conn = connect_db()
|
||||||
|
if not conn: return
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 1. Select Client
|
||||||
|
cursor.execute('SELECT client_id, client_name FROM clients ORDER BY client_name')
|
||||||
|
clients = cursor.fetchall()
|
||||||
|
|
||||||
|
print("\n--- Select Client to Edit Time ---")
|
||||||
|
for cid, name in clients:
|
||||||
|
print(f"{cid}: {name}")
|
||||||
|
|
||||||
|
client_id = input("\nEnter Client ID (or 0 to go back): ")
|
||||||
|
if client_id == '0' or not client_id: return
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# 2. List Uninvoiced Entries for Client
|
||||||
|
cursor.execute('''SELECT entry_id, project, description, invoiced, date, hours
|
||||||
|
FROM time_tracking WHERE client_id = ? AND invoiced = 0
|
||||||
|
ORDER BY date DESC''', (client_id,))
|
||||||
|
entries = cursor.fetchall()
|
||||||
|
|
||||||
|
if not entries:
|
||||||
|
print("No uninvoiced entries found for this client.")
|
||||||
|
break
|
||||||
|
|
||||||
|
print(f"\n--- Time Entries for Client {client_id} ---")
|
||||||
|
for e in entries:
|
||||||
|
print(f"ID {e[0]}: [{e[4]}] {e[1]} - {e[5]} hrs")
|
||||||
|
print("0: Back to Main Menu")
|
||||||
|
|
||||||
|
entry_choice = input("\nSelect Entry ID to edit: ")
|
||||||
|
if entry_choice == '0': break
|
||||||
|
|
||||||
|
# Find the specific entry
|
||||||
|
selected_entry = next((e for e in entries if str(e[0]) == entry_choice), None)
|
||||||
|
if not selected_entry:
|
||||||
|
print("Invalid Entry ID.")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 3. Edit Fields one by one
|
||||||
|
display_entry_details(selected_entry)
|
||||||
|
|
||||||
|
# Project
|
||||||
|
new_project = input(f"Project [{selected_entry[1]}]: ") or selected_entry[1]
|
||||||
|
# Description
|
||||||
|
new_desc = input(f"Description [{selected_entry[2]}]: ") or selected_entry[2]
|
||||||
|
# Date
|
||||||
|
new_date = input(f"Date [{selected_entry[4]}]: ") or selected_entry[4]
|
||||||
|
# Hours
|
||||||
|
new_hours_raw = input(f"Hours [{selected_entry[5]}]: ")
|
||||||
|
new_hours = float(new_hours_raw) if new_hours_raw else selected_entry[5]
|
||||||
|
|
||||||
|
# 4. Update Database
|
||||||
|
cursor.execute('''UPDATE time_tracking
|
||||||
|
SET project = ?, description = ?, date = ?, hours = ?
|
||||||
|
WHERE entry_id = ?''',
|
||||||
|
(new_project, new_desc, new_date, new_hours, entry_choice))
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
print("\nUpdate Successful! New Values:")
|
||||||
|
print(f"Project: {new_project}\nDescription: {new_desc}\nDate: {new_date}\nHours: {new_hours}")
|
||||||
|
print("="*30)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"An error occurred: {e}")
|
||||||
|
finally:
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
edit_time_entry()
|
||||||
Reference in New Issue
Block a user