Skip to content

Commit 5e5fd45

Browse files
authored
V2.4.2 fix backlog entry (#52)
1 parent 003faf9 commit 5e5fd45

File tree

6 files changed

+95
-93
lines changed

6 files changed

+95
-93
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,5 @@ cython_debug/
164164
test_func.py
165165
users_backup.json
166166
one_off_func.py
167-
*.json
167+
*.json
168+
send_notification.py

bot/google_sheet_service.py

Lines changed: 74 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
import json
66
from bot.error_handler import GoogleSheetError
77

8+
import datetime as dt
9+
import pytz
10+
11+
timezone = pytz.timezone("Asia/Singapore")
12+
813
GOOGLE_JSON = os.getenv("GOOGLE_JSON")
914
google_service = json.loads(GOOGLE_JSON)
1015

@@ -98,7 +103,7 @@ def get_sub_dropdown_value(spreadsheet_id, main_value, entry_type):
98103
raise GoogleSheetError(message=f"Error with retrieving values for sub dropdown value for entrytype: {entry_type}", extra_info=str(e))
99104

100105

101-
def update_prev_day(spreadsheet_id, month, first_row, last_row=0):
106+
def update_day_total_sum(spreadsheet_id, month, first_row, last_row=0):
102107
month = month.title()
103108
try:
104109
if last_row == 0:
@@ -148,26 +153,25 @@ def create_date(spreadsheet_id, day, month, first_row):
148153
raise GoogleSheetError(message=f"Fail to create new day for {day} {month}", extra_info=str(e))
149154

150155

151-
def create_entry(spreadsheet_id, month, row_tracker, row_data):
152-
entry_type = row_data[0]
153-
price = row_data[1].strip()
154-
remarks = row_data[2].strip()
155-
category = row_data[3].strip()
156-
payment = row_data[4].strip()
156+
def create_entry(spreadsheet_id, month, row_tracker, row_data, backlog_day=None):
157+
entry_type, price, remarks, category, payment = (item.strip() if isinstance(item, str) else item for item in row_data)
157158
month = month.title()
158-
159-
160159
data = [price, remarks, category, payment]
161-
sheet_column_start = "H"
160+
161+
sheet_column_start = "A"
162162
sheet_column_end = "K"
163163
if entry_type == EntryType.TRANSPORT:
164164
remarks_list = [remark.strip() for remark in remarks.split(",")]
165-
sheet_column_start = "C"
166-
sheet_column_end = "G"
167165
data = [price] + remarks_list + [category, payment]
166+
else:
167+
data = [None] * 5 + data
168168

169+
# prepend data
170+
data = [backlog_day] + [None] + data if backlog_day else [None] * 2 + data
171+
body = {"values": [data]}
172+
173+
# creating the entry in google sheet
169174
try:
170-
body = {"values": [data]}
171175
range_name = (
172176
f"{month}!{sheet_column_start}{row_tracker}:{sheet_column_end}{row_tracker}"
173177
)
@@ -196,89 +200,78 @@ def get_sheet_id_by_title(spreadsheet_id, title_to_find):
196200
except Exception as e:
197201
raise GoogleSheetError(message=f"Fail to retrieve sheet id by title: {title_to_find}", extra_info=str(e))
198202

203+
def move_row_down(spreadsheet_id, sheet_id, first_row_to_move, last_row_to_move):
204+
try:
205+
requests = [
206+
{
207+
"copyPaste": {
208+
"source": {
209+
"sheetId": sheet_id,
210+
"startRowIndex": first_row_to_move - 1,
211+
"endRowIndex": last_row_to_move,
212+
"startColumnIndex": start_column_index,
213+
"endColumnIndex": end_column_index,
214+
},
215+
"destination": {
216+
"sheetId": sheet_id,
217+
"startRowIndex": first_row_to_move,
218+
"endRowIndex": last_row_to_move + 1,
219+
"startColumnIndex": start_column_index,
220+
"endColumnIndex": end_column_index,
221+
},
222+
"pasteType": "PASTE_NORMAL",
223+
"pasteOrientation": "NORMAL",
224+
}
225+
}
226+
]
227+
sheets_api.spreadsheets().batchUpdate(
228+
spreadsheetId=spreadsheet_id, body={"requests": requests}
229+
).execute()
230+
except Exception as e:
231+
raise GoogleSheetError(message=f"Fail to move existing entry down", extra_info=str(e))
199232

200233
def create_backlog_entry(spreadsheet_id, backlog_day, backlog_month, row_data):
201-
entry_type = row_data[0]
202-
price = row_data[1].strip()
203-
remarks = row_data[2].strip()
204-
category = row_data[3].strip()
205-
payment = row_data[4].strip()
206234
backlog_month = backlog_month.title()
207-
208235
try:
209236
day_first_entry_index = get_day_first_entry_index(
210237
spreadsheet_id, backlog_month, backlog_day
211238
)
212-
row_to_move = int(get_first_row_to_move(spreadsheet_id, backlog_month, backlog_day))
239+
first_row_to_move = int(get_first_row_to_move(spreadsheet_id, backlog_month, backlog_day))
213240
last_row_to_move = int(get_last_entered_row(spreadsheet_id, backlog_month))
214-
new_entry_row = row_to_move
241+
new_entry_row = first_row_to_move
215242
sheet_id = get_sheet_id_by_title(spreadsheet_id, backlog_month.title())
216243

217-
if row_to_move is None:
218-
new_entry_row = last_row_to_move + 1
219-
else:
220-
requests = [
221-
{
222-
"copyPaste": {
223-
"source": {
224-
"sheetId": sheet_id,
225-
"startRowIndex": row_to_move - 1,
226-
"endRowIndex": last_row_to_move,
227-
"startColumnIndex": start_column_index,
228-
"endColumnIndex": end_column_index,
229-
},
230-
"destination": {
231-
"sheetId": sheet_id,
232-
"startRowIndex": row_to_move,
233-
"endRowIndex": last_row_to_move + 1,
234-
"startColumnIndex": start_column_index,
235-
"endColumnIndex": end_column_index,
236-
},
237-
"pasteType": "PASTE_NORMAL",
238-
"pasteOrientation": "NORMAL",
239-
}
240-
}
241-
]
242-
try:
243-
sheets_api.spreadsheets().batchUpdate(
244-
spreadsheetId=spreadsheet_id, body={"requests": requests}
245-
).execute()
246-
247-
clear_range = f"{backlog_month}!A{new_entry_row}:K{new_entry_row}"
248-
sheets_api.spreadsheets().values().clear(
249-
spreadsheetId=spreadsheet_id, range=clear_range
250-
).execute()
251-
252-
update_prev_day(spreadsheet_id, backlog_month, day_first_entry_index, new_entry_row)
253-
except GoogleSheetError as e:
254-
raise e
255-
except Exception as e:
256-
raise GoogleSheetError(message=f"Fail to move existing entry down", extra_info=str(e))
244+
if last_row_to_move >= first_row_to_move:
245+
move_row_down(spreadsheet_id, sheet_id, first_row_to_move, last_row_to_move)
246+
clear_range = f"{backlog_month}!A{new_entry_row}:K{new_entry_row}"
247+
sheets_api.spreadsheets().values().clear(
248+
spreadsheetId=spreadsheet_id, range=clear_range
249+
).execute()
257250

251+
# If there is no entry for the day, create a new date
258252
if day_first_entry_index is None:
259-
create_date(spreadsheet_id, backlog_day, backlog_month, new_entry_row)
253+
create_entry(spreadsheet_id, backlog_month, new_entry_row, row_data, backlog_day)
260254
day_first_entry_index = new_entry_row
261255

262-
data = [price, remarks, category, payment]
263-
sheet_column_start = "H"
264-
sheet_column_end = "K"
265-
if entry_type == EntryType.TRANSPORT:
266-
remarks_list = [remark.strip() for remark in remarks.split(",")]
267-
sheet_column_start = "C"
268-
sheet_column_end = "G"
269-
data = [price] + remarks_list + [category, payment]
256+
else:
257+
# Create the new entry in the new entry row and update day total
258+
create_entry(spreadsheet_id, backlog_month, new_entry_row, row_data)
259+
update_day_total_sum(spreadsheet_id, backlog_month, day_first_entry_index, new_entry_row)
260+
261+
# datatime data
262+
current_datetime = dt.datetime.now(timezone)
263+
month = current_datetime.strftime("%b")
264+
265+
# if backlog month is current month, need to update tracker to reflect backlog changes
266+
if backlog_month.title() == month:
267+
if last_row_to_move < first_row_to_move and day_first_entry_index == new_entry_row:
268+
update_tracker_values(spreadsheet_id, backlog_day, new_entry_row-1, new_entry_row)
269+
if last_row_to_move < first_row_to_move:
270+
row_incremental(spreadsheet_id, EntryType.OTHERS)
271+
else:
272+
row_incremental_all(spreadsheet_id)
273+
270274

271-
try:
272-
body = {"values": [data]}
273-
range_name = f"{backlog_month}!{sheet_column_start}{new_entry_row}:{sheet_column_end}{new_entry_row}"
274-
sheets_api.spreadsheets().values().update(
275-
spreadsheetId=spreadsheet_id,
276-
range=range_name,
277-
valueInputOption="USER_ENTERED",
278-
body=body,
279-
).execute()
280-
except Exception as e:
281-
raise GoogleSheetError(message=f"Fail to create backlog entry", extra_info=str(e))
282275
except GoogleSheetError as e:
283276
raise e
284277
except Exception as e:

bot/sheet_service/sheets_services.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,7 @@ def get_last_entered_row(self, spreadsheet_id, month):
164164
values = result.get("values", [])
165165
return len(values)
166166

167-
# to be rename as update_prev_day_total
168-
def update_prev_day(self, spreadsheet_id, month, first_row, last_row=0):
167+
def update_day_total_sum(self, spreadsheet_id, month, first_row, last_row=0):
169168
"""
170169
This method update the total amount spend for the previous day
171170
"""

bot/telegram_bot.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def set_up(update, context) -> int:
105105
prev_month = (current_datetime - dt.timedelta(days=1)).strftime(
106106
"%b"
107107
)
108-
gs.update_prev_day(sheet_id, prev_month, first_row)
108+
gs.update_day_total_sum(sheet_id, prev_month, first_row)
109109
new_row = gs.get_last_entered_row(sheet_id, month)
110110
first_row = new_row + 1
111111
gs.update_tracker_values(sheet_id, day, new_row, first_row)
@@ -581,7 +581,7 @@ def log_transaction(user_data, update):
581581
prev_month = (current_datetime - dt.timedelta(days=1)).strftime("%b")
582582
# update prev day
583583
msg = f"{msg}\nCreating sum for day {day_tracker}"
584-
gs.update_prev_day(sheet_id, prev_month, first_row)
584+
gs.update_day_total_sum(sheet_id, prev_month, first_row)
585585
if day == 1 | day < day_tracker:
586586
new_row = 4
587587
first_row = 5
@@ -624,15 +624,8 @@ def backlog_transaction(user_data, update):
624624
backlog_day = user_data["backlog_day"]
625625
backlog_month = user_data["backlog_month"]
626626

627-
# datatime data
628-
current_datetime = dt.datetime.now(timezone)
629-
month = current_datetime.strftime("%b")
630627

631628
try:
632-
# if backlog month is current month, need to move all one down
633-
if backlog_month.title() == month:
634-
gs.row_incremental_all(sheet_id)
635-
636629
# user input data
637630
entry_type = user_data["entry_type"]
638631
payment = user_data["payment"]
@@ -643,6 +636,7 @@ def backlog_transaction(user_data, update):
643636

644637
# create backlog entry
645638
gs.create_backlog_entry(sheet_id, backlog_day, backlog_month, row_data)
639+
646640
except GoogleSheetError as e:
647641
raise e
648642
except Exception as e:

dev_testfunction.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import os
2+
from bot.telegram_bot import *
3+
from bot.database_service.firestore_service import FirestoreService
4+
from bot.google_sheet_service import *
5+
from bot.common import EntryType
6+
db = FirestoreService()
7+
8+
# Function to test here

release_notes.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
# Release Notes
2+
## Version 2.4.2 - Date 14 May 2024
3+
### Bug Fix 🛠️
4+
- Fix bug for backlog entry when backlog date doesn't exist
5+
6+
### For Developer 🧑‍💻
7+
- Added new dev_testfunction to quickly test and debug functions
8+
29
## Version 2.4.1.2 - Date 12 May 2024
310
### Bug Fix 🛠️
411
- Error handling for `/notifyall` command

0 commit comments

Comments
 (0)