|
5 | 5 | import json
|
6 | 6 | from bot.error_handler import GoogleSheetError
|
7 | 7 |
|
| 8 | +import datetime as dt |
| 9 | +import pytz |
| 10 | + |
| 11 | +timezone = pytz.timezone("Asia/Singapore") |
| 12 | + |
8 | 13 | GOOGLE_JSON = os.getenv("GOOGLE_JSON")
|
9 | 14 | google_service = json.loads(GOOGLE_JSON)
|
10 | 15 |
|
@@ -98,7 +103,7 @@ def get_sub_dropdown_value(spreadsheet_id, main_value, entry_type):
|
98 | 103 | raise GoogleSheetError(message=f"Error with retrieving values for sub dropdown value for entrytype: {entry_type}", extra_info=str(e))
|
99 | 104 |
|
100 | 105 |
|
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): |
102 | 107 | month = month.title()
|
103 | 108 | try:
|
104 | 109 | if last_row == 0:
|
@@ -148,26 +153,25 @@ def create_date(spreadsheet_id, day, month, first_row):
|
148 | 153 | raise GoogleSheetError(message=f"Fail to create new day for {day} {month}", extra_info=str(e))
|
149 | 154 |
|
150 | 155 |
|
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) |
157 | 158 | month = month.title()
|
158 |
| - |
159 |
| - |
160 | 159 | data = [price, remarks, category, payment]
|
161 |
| - sheet_column_start = "H" |
| 160 | + |
| 161 | + sheet_column_start = "A" |
162 | 162 | sheet_column_end = "K"
|
163 | 163 | if entry_type == EntryType.TRANSPORT:
|
164 | 164 | remarks_list = [remark.strip() for remark in remarks.split(",")]
|
165 |
| - sheet_column_start = "C" |
166 |
| - sheet_column_end = "G" |
167 | 165 | data = [price] + remarks_list + [category, payment]
|
| 166 | + else: |
| 167 | + data = [None] * 5 + data |
168 | 168 |
|
| 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 |
169 | 174 | try:
|
170 |
| - body = {"values": [data]} |
171 | 175 | range_name = (
|
172 | 176 | f"{month}!{sheet_column_start}{row_tracker}:{sheet_column_end}{row_tracker}"
|
173 | 177 | )
|
@@ -196,89 +200,78 @@ def get_sheet_id_by_title(spreadsheet_id, title_to_find):
|
196 | 200 | except Exception as e:
|
197 | 201 | raise GoogleSheetError(message=f"Fail to retrieve sheet id by title: {title_to_find}", extra_info=str(e))
|
198 | 202 |
|
| 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)) |
199 | 232 |
|
200 | 233 | 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() |
206 | 234 | backlog_month = backlog_month.title()
|
207 |
| - |
208 | 235 | try:
|
209 | 236 | day_first_entry_index = get_day_first_entry_index(
|
210 | 237 | spreadsheet_id, backlog_month, backlog_day
|
211 | 238 | )
|
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)) |
213 | 240 | 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 |
215 | 242 | sheet_id = get_sheet_id_by_title(spreadsheet_id, backlog_month.title())
|
216 | 243 |
|
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() |
257 | 250 |
|
| 251 | + # If there is no entry for the day, create a new date |
258 | 252 | 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) |
260 | 254 | day_first_entry_index = new_entry_row
|
261 | 255 |
|
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 | + |
270 | 274 |
|
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)) |
282 | 275 | except GoogleSheetError as e:
|
283 | 276 | raise e
|
284 | 277 | except Exception as e:
|
|
0 commit comments