Skip to content

Commit 5b76230

Browse files
committed
checkpoint: demo: create_fake_timesheet
1 parent 7ce4e3a commit 5b76230

File tree

3 files changed

+57
-6
lines changed

3 files changed

+57
-6
lines changed

app/demo.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
BankAccount,
2626
Invoice,
2727
InvoiceItem,
28+
Timesheet,
29+
TimeTrackingItem,
2830
)
2931
from tuttle import rendering
3032

@@ -129,6 +131,46 @@ def invoice_number_counting():
129131
invoice_number_counter = invoice_number_counting()
130132

131133

134+
def create_fake_timesheet(
135+
project: Project,
136+
fake: faker.Faker,
137+
) -> Timesheet:
138+
"""
139+
Create a fake timesheet object with random values.
140+
141+
Args:
142+
project (Project): The project associated with the timesheet.
143+
fake (faker.Faker): An instance of the Faker class to generate random values.
144+
145+
Returns:
146+
Timesheet: A fake timesheet object.
147+
"""
148+
timesheet = Timesheet(
149+
title=fake.bs(),
150+
comment=fake.paragraph(nb_sentences=2),
151+
date=datetime.date.today(),
152+
project=project,
153+
)
154+
number_of_items = fake.random_int(min=1, max=5)
155+
for _ in range(number_of_items):
156+
unit = fake.random_element(elements=("hours", "days"))
157+
if unit == "hours":
158+
unit_price = abs(round(numpy.random.normal(50, 20), 2))
159+
elif unit == "days":
160+
unit_price = abs(round(numpy.random.normal(400, 200), 2))
161+
time_tracking_item = TimeTrackingItem(
162+
timesheet=timesheet,
163+
begin=fake.date_time_this_year(before_now=True, after_now=False),
164+
end=fake.date_time_this_year(before_now=True, after_now=False),
165+
duration=datetime.timedelta(hours=fake.random_int(min=1, max=8)),
166+
title=f"{fake.bs()} for #{project.tag}",
167+
tag=project.tag,
168+
description=fake.paragraph(nb_sentences=2),
169+
)
170+
timesheet.items.append(time_tracking_item)
171+
return timesheet
172+
173+
132174
def create_fake_invoice(
133175
project: Project,
134176
user: User,
@@ -146,7 +188,7 @@ def create_fake_invoice(
146188
"""
147189
invoice_number = next(invoice_number_counter)
148190
invoice = Invoice(
149-
number=invoice_number,
191+
number=str(invoice_number), # TODO: replace with generated number
150192
date=datetime.date.today(),
151193
sent=fake.pybool(),
152194
paid=fake.pybool(),

app/invoicing/intent.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,21 @@ def create_invoice(
117117

118118
if render:
119119
# TODO: render timesheet
120-
120+
user = self._user_data_source.get_user()
121+
try:
122+
rendering.render_timesheet(
123+
user=user,
124+
timesheet=timesheet,
125+
out_dir=Path.home() / ".tuttle" / "Timesheets",
126+
)
127+
logger.info(f"✅ rendered timesheet for {project.title}")
128+
except Exception as ex:
129+
logger.error(
130+
f"❌ Error rendering timesheet for {project.title}: {ex}"
131+
)
132+
logger.exception(ex)
121133
# render invoice
122134
try:
123-
user = self._user_data_source.get_user()
124135
rendering.render_invoice(
125136
user=user,
126137
invoice=invoice,

tuttle/model.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,9 +439,7 @@ class TimeTrackingItem(SQLModel, table=True):
439439
timesheet: Optional["Timesheet"] = Relationship(back_populates="items")
440440
#
441441
begin: datetime.datetime = Field(description="Start time of the time interval.")
442-
end: Optional[datetime.datetime] = Field(
443-
description="End time of the time interval."
444-
)
442+
end: datetime.datetime = Field(description="End time of the time interval.")
445443
duration: datetime.timedelta = Field(description="Duration of the time interval.")
446444
title: str = Field(description="A short description of the time interval.")
447445
tag: str = Field(

0 commit comments

Comments
 (0)