Skip to content

Commit 385c0d7

Browse files
committed
WIP: demo invoicing workflow
1 parent 385c9af commit 385c0d7

File tree

3 files changed

+51
-15
lines changed

3 files changed

+51
-15
lines changed

app/Tuttle.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from loguru import logger
22
from textwrap import dedent
3+
from pathlib import Path
34

45
import flet
56
from flet import (
@@ -25,6 +26,7 @@
2526
import widgets
2627

2728
from tuttle.controller import Controller
29+
from tuttle.preferences import Preferences
2830
from tuttle.model import (
2931
Contact,
3032
Contract,
@@ -187,15 +189,15 @@ def update_content(self):
187189

188190
projects = self.app.con.query(Project)
189191

190-
project_select = Dropdown(
192+
self.project_select = Dropdown(
191193
label="Project",
192194
hint_text="Select the project",
193-
options=[dropdown.Option(project.title) for project in projects],
195+
options=[dropdown.Option(project.tag) for project in projects],
194196
autofocus=True,
195197
)
196198

197-
date_from_select = widgets.DateSelector()
198-
date_to_select = widgets.DateSelector()
199+
self.date_from_select = widgets.DateSelector()
200+
self.date_to_select = widgets.DateSelector()
199201

200202
self.main_column.controls = [
201203
Row(
@@ -236,19 +238,19 @@ def update_content(self):
236238
Row(
237239
[
238240
Icon(icons.WORK),
239-
project_select,
241+
self.project_select,
240242
]
241243
),
242244
Row(
243245
[
244246
# Icon(icons.DATE_RANGE),
245-
date_from_select,
247+
self.date_from_select,
246248
Icon(icons.ARROW_FORWARD),
247-
date_to_select,
249+
self.date_to_select,
248250
TextButton(
249251
"Select",
250252
on_click=lambda event: logger.info(
251-
f"Selected date range: {date_from_select.get_date()} -> {date_to_select.get_date()}"
253+
f"Selected date range: {self.date_from_select.get_date()} -> {self.date_to_select.get_date()}"
252254
),
253255
),
254256
]
@@ -258,19 +260,33 @@ def update_content(self):
258260
ElevatedButton(
259261
"Generate invoice",
260262
icon=icons.EDIT_NOTE,
261-
# on_click=self.add_demo_data,
263+
on_click=self.generate_invoices_clicked,
262264
),
263265
]
264266
),
265267
]
266268
self.update()
267269

270+
def generate_invoices_clicked(self, event):
271+
"""Generate invoices for the selected project and date range."""
272+
logger.info("Generate invoices clicked")
273+
self.app.con.billing(
274+
project_tags=[self.project_select.value],
275+
period_start=self.date_from_select.get_date(),
276+
period_end=self.date_to_select.get_date(),
277+
timetracking_method="file_calendar",
278+
calendar_file_path=None,
279+
)
280+
268281

269282
def main(page: Page):
270283

271284
con = Controller(
272285
in_memory=True,
273286
verbose=False,
287+
preferences=Preferences(
288+
invoice_dir=Path("Invoices"),
289+
),
274290
)
275291

276292
app = App(

tuttle/controller.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,20 @@
1212
from loguru import logger
1313

1414
from . import model, timetracking, dataviz, rendering, invoicing, calendar, cloud
15+
from .preferences import Preferences
1516

1617

1718
class Controller:
1819
"""The application controller."""
1920

20-
def __init__(self, home_dir=None, verbose=False, in_memory=False):
21-
if home_dir is None:
21+
def __init__(self, preferences: Preferences, verbose=False, in_memory=False):
22+
self.preferences = preferences
23+
# set home directory
24+
if preferences.home_dir is None:
2225
self.home = Path.home() / ".tuttle"
2326
else:
24-
self.home = Path(home_dir)
27+
self.home = self.preferences.home_dir
28+
# make directories
2529
if not os.path.exists(self.home):
2630
os.mkdir(self.home)
2731
if in_memory:
@@ -204,19 +208,25 @@ def duration_to_revenue(
204208
def billing(
205209
self,
206210
project_tags,
207-
out_dir,
208211
period_start,
209212
period_end=None,
210-
timetracking_method="calendar",
213+
timetracking_method="cloud_calendar",
214+
calendar_file_path=None,
211215
):
212216
"""Generate time sheets and invoices for a given period"""
217+
out_dir = self.home / self.preferences.invoice_dir
213218
# TODO: read method from user settings
214-
if timetracking_method == "calendar":
219+
if timetracking_method == "cloud_calendar":
215220
timetracking_calendar = calendar.ICloudCalendar(
216221
icloud=cloud.login_iCloud(user_name=self.user.icloud_account.user_name),
217222
# TODO: read from user settings
218223
name="TimeTracking",
219224
)
225+
elif timetracking_method == "file_calendar":
226+
timetracking_calendar = calendar.FileCalendar(
227+
path=calendar_file_path,
228+
name=calendar_file_path.stem,
229+
)
220230
else:
221231
raise ValueError(f"unsupported time tracking method: {timetracking_method}")
222232

tuttle/preferences.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from dataclasses import dataclass
2+
from pathlib import Path
3+
4+
5+
@dataclass
6+
class Preferences:
7+
"""Settings for the application."""
8+
9+
home_dir: Path = None
10+
invoice_dir: Path = Path("Invoices")

0 commit comments

Comments
 (0)