Skip to content
This repository was archived by the owner on Dec 23, 2023. It is now read-only.

Commit cc16364

Browse files
committed
init
0 parents  commit cc16364

File tree

6 files changed

+829
-0
lines changed

6 files changed

+829
-0
lines changed

common.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from enum import Enum
2+
3+
class EntryType(Enum):
4+
TRANSPORT = "Transport"
5+
OTHERS = "Others"
6+
7+

firebase.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from firebase_config import db
2+
import datetime as dt
3+
from common import EntryType
4+
5+
# new user setup
6+
def new_user_setup(telegram_id, sheet_id):
7+
ref = db.reference('/users/' + str(telegram_id))
8+
ref.update({
9+
'sheet_id': sheet_id,
10+
})
11+
12+
# check if user exists
13+
def check_if_user_exists(telegram_id):
14+
ref = db.reference('/users/' + str(telegram_id))
15+
return ref.get() is not None
16+
17+
# get user sheet id
18+
def get_user_sheet_id(telegram_id):
19+
ref = db.reference('/users/' + str(telegram_id) + '/sheet_id')
20+
return ref.get()

firebase_config.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import firebase_admin
2+
from firebase_admin import credentials
3+
from firebase_admin import db
4+
import os
5+
6+
databaseURL = os.getenv("TRACKER_TELEGRAM_TOKEN")
7+
8+
cred = credentials.Certificate("accounts/firebase_account.json")
9+
firebase_admin.initialize_app(cred, {
10+
'databaseURL': databaseURL
11+
})

google_sheet.py

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
from google.oauth2 import service_account
2+
from googleapiclient.discovery import build
3+
from common import EntryType
4+
import datetime as dt
5+
6+
# Path to the downloaded JSON key file
7+
SERVICE_ACCOUNT_FILE = 'accounts/service_account.json'
8+
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
9+
creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
10+
sheets_api = build('sheets', 'v4', credentials=creds)
11+
12+
# Dropdown range
13+
transport_range = ["Dropdown!A3:A9"]
14+
others_sub_range = [f"Dropdown!{chr(i)}2:{chr(i)}9" for i in range(ord('B'), ord('K'))]
15+
others_main_range = ["Dropdown!A2:J2"]
16+
payment_sub_range = [f"Dropdown!{chr(i)}12:{chr(i)}19" for i in range(ord('A'), ord('K'))]
17+
payment_main_range = ["Dropdown!A12:J12"]
18+
19+
# Get the main dropdown values
20+
def get_main_dropdown_value(sheet_id, entry_type):
21+
range = []
22+
if entry_type == EntryType.TRANSPORT:
23+
range = transport_range
24+
elif entry_type == EntryType.OTHERS:
25+
range = others_main_range
26+
else:
27+
range = payment_main_range
28+
# Make the request
29+
results = sheets_api.spreadsheets().values().batchGet(
30+
spreadsheetId=sheet_id,
31+
ranges=range).execute()
32+
33+
# Get the values from the result
34+
value_ranges = results.get('valueRanges', [])
35+
36+
dropdown = []
37+
for value in value_ranges:
38+
dropdown.append(value.get('values', []))
39+
40+
if entry_type == EntryType.TRANSPORT:
41+
new_list = list(dropdown[0])
42+
flat_list = [item for sublist in new_list for item in sublist]
43+
return flat_list
44+
return dropdown[0][0]
45+
46+
# Get the sub dropdown values
47+
def get_sub_dropdown_value(sheet_id, main_value, entry_type):
48+
range = []
49+
if entry_type == EntryType.OTHERS:
50+
range = others_sub_range
51+
else:
52+
range = payment_sub_range
53+
# Make the request
54+
results = sheets_api.spreadsheets().values().batchGet(
55+
spreadsheetId=sheet_id,
56+
ranges=range).execute()
57+
58+
# Get the values from the result
59+
value_ranges = results.get('valueRanges', [])
60+
61+
dropdown = []
62+
for value in value_ranges:
63+
if value.get('values', []):
64+
if main_value == value.get('values', [])[0][0]:
65+
dropdown.append(value.get('values', []))
66+
pass
67+
68+
flat_list = [item for sublist in dropdown[0] for item in sublist]
69+
return flat_list
70+
71+
# Sum up previous day
72+
def update_prev_day(sheet_id, month, first_row):
73+
last_row = get_new_row(sheet_id, month)
74+
# Write the message to the Google Sheet
75+
body = {'values': [[f'=SUM(C{first_row}:H{last_row})']]}
76+
range_name = f'{month}!B{first_row}'
77+
sheets_api.spreadsheets().values().update(
78+
spreadsheetId=sheet_id,
79+
range=range_name,
80+
valueInputOption='USER_ENTERED',
81+
body=body).execute()
82+
83+
# Get new row no in sheets
84+
def get_new_row(sheet_id, month):
85+
result = sheets_api.spreadsheets().values().get(
86+
spreadsheetId=sheet_id,
87+
range=f'{month}!A:K').execute()
88+
values = result.get('values', [])
89+
return len(values)
90+
91+
# Enter new date into cell
92+
def create_date(sheet_id, day, month, first_row):
93+
# Update date in column A
94+
body = {'values': [[day]]}
95+
range_name = f'{month}!A{first_row}'
96+
sheets_api.spreadsheets().values().update(
97+
spreadsheetId=sheet_id,
98+
range=range_name,
99+
valueInputOption='USER_ENTERED',
100+
body=body).execute()
101+
102+
# create new entry into google sheet
103+
def create_entry(sheet_id, month, row_tracker, row_data):
104+
entry_type = row_data[0]
105+
price = row_data[1].strip()
106+
remarks = row_data[2].strip()
107+
category = row_data[3].strip()
108+
payment = row_data[4].strip()
109+
110+
data = [price, remarks, category, payment]
111+
sheet_column_start = 'H'
112+
sheet_column_end = 'K'
113+
if entry_type == EntryType.TRANSPORT:
114+
remarks_list = [remark.strip() for remark in remarks.split(',')]
115+
sheet_column_start = 'C'
116+
sheet_column_end = 'G'
117+
data = [price] + remarks_list + [category, payment]
118+
119+
# Write the message to the Google Sheet
120+
body = {'values': [data]}
121+
range_name = f'{month}!{sheet_column_start}{row_tracker}:{sheet_column_end}{row_tracker}'
122+
sheets_api.spreadsheets().values().update(
123+
spreadsheetId=sheet_id,
124+
range=range_name,
125+
valueInputOption='USER_ENTERED',
126+
body=body).execute()
127+
128+
def get_trackers(sheet_id):
129+
result = sheets_api.spreadsheets().values().get(
130+
spreadsheetId=sheet_id,
131+
range=f'Tracker!B3:E3').execute()
132+
values = result.get('values', [])
133+
return values[0]
134+
135+
def update_rows(sheet_id, day, new_row):
136+
values = [[day] + [new_row] * 3] # Create a row with the same value repeated 3 times
137+
range_name = 'Tracker!B3:E3'
138+
body = {'values': values}
139+
request = sheets_api.spreadsheets().values().update(
140+
spreadsheetId=sheet_id,
141+
range=range_name,
142+
valueInputOption='USER_ENTERED',
143+
body=body
144+
)
145+
request.execute()
146+
147+
148+
def row_incremental(sheet_id, entry_type):
149+
range_name = 'Tracker!B3:E3'
150+
response = sheets_api.spreadsheets().values().get(
151+
spreadsheetId=sheet_id,
152+
range=range_name,
153+
majorDimension='ROWS'
154+
).execute()
155+
156+
values = response.get('values', [])
157+
if values:
158+
row_values = values[0]
159+
if entry_type == EntryType.OTHERS:
160+
row_values[1] = str(int(row_values[1]) + 1) # Increment others count
161+
elif entry_type == EntryType.TRANSPORT:
162+
row_values[2] = str(int(row_values[2]) + 1) # Increment transport count
163+
164+
body = {'values': [row_values]}
165+
sheets_api.spreadsheets().values().update(
166+
spreadsheetId=sheet_id,
167+
range=range_name,
168+
valueInputOption='USER_ENTERED',
169+
body=body
170+
).execute()
171+
172+
def get_quick_add_settings(sheet_id, entry_type):
173+
range_name = 'Tracker!G3:J3' # Replace with the desired range in your Google Sheet
174+
response = sheets_api.spreadsheets().values().get(
175+
spreadsheetId=sheet_id,
176+
range=range_name,
177+
majorDimension='ROWS'
178+
).execute()
179+
180+
values = response.get('values', [])
181+
if values:
182+
if entry_type == EntryType.TRANSPORT:
183+
transport_payment = values[0][0] if len(values[0]) > 0 else None
184+
transport_type = values[0][1] if len(values[0]) > 1 else None
185+
return transport_payment, transport_type
186+
else:
187+
others_payment = values[0][2] if len(values[0]) > 2 else None
188+
others_type = values[0][3] if len(values[0]) > 3 else None
189+
return others_payment, others_type
190+
191+
return None
192+
193+
def update_quick_add_settings(sheet_id, entry_type, payment, type):
194+
range_name = 'Tracker!G3:J3' # Replace with the desired range in your Google Sheet
195+
196+
# Get existing values from the range, or an empty list if the range is empty
197+
response = sheets_api.spreadsheets().values().get(
198+
spreadsheetId=sheet_id,
199+
range=range_name,
200+
majorDimension='ROWS'
201+
).execute()
202+
203+
values = response.get('values', []) # Initialize with an empty list if no values are present
204+
205+
if not values:
206+
values = [[]] # Create an empty row if the range is empty
207+
208+
if len(values) == 0:
209+
values.append([]) # Add a row if the values list is empty
210+
211+
# Determine the number of columns needed
212+
num_columns = max(4, len(values[0]))
213+
214+
if len(values[0]) < num_columns:
215+
values[0].extend([''] * (num_columns - len(values[0]))) # Extend the existing row with empty strings
216+
217+
if entry_type == EntryType.TRANSPORT:
218+
values[0][0] = payment if payment else ''
219+
values[0][1] = type if type else ''
220+
else:
221+
values[0][2] = payment if payment else ''
222+
values[0][3] = type if type else ''
223+
224+
body = {'values': values}
225+
sheets_api.spreadsheets().values().update(
226+
spreadsheetId=sheet_id,
227+
range=range_name,
228+
valueInputOption='USER_ENTERED',
229+
body=body
230+
).execute()
231+
232+
return True

0 commit comments

Comments
 (0)