Spaces:
Runtime error
Runtime error
| --- START OF FILE google_services.py --- | |
| import gspread | |
| from google.oauth2.service_account import Credentials | |
| from googleapiclient.discovery import build | |
| from googleapiclient.http import MediaFileUpload | |
| import pandas as pd | |
| import time | |
| from config import ( | |
| GOOGLE_CREDENTIALS_FILE, DATA_DB_SHEET_ID, RECEIPT_ENGINE_SHEET_ID, | |
| DRIVE_SLIPS_FOLDER_ID, DRIVE_ID_CARDS_FOLDER_ID, DRIVE_EXPENSES_FOLDER_ID | |
| ) | |
| class GoogleAPIHandler: | |
| def __init__(self): | |
| self.scopes = [ | |
| "https://www.googleapis.com/auth/spreadsheets", | |
| "https://www.googleapis.com/auth/drive" | |
| ] | |
| self.creds = Credentials.from_service_account_file(GOOGLE_CREDENTIALS_FILE, scopes=self.scopes) | |
| self.gspread_client = gspread.authorize(self.creds) | |
| self.drive_service = build('drive', 'v3', credentials=self.creds) | |
| self.data_db = self.gspread_client.open_by_key(DATA_DB_SHEET_ID) | |
| self.receipt_engine = self.gspread_client.open_by_key(RECEIPT_ENGINE_SHEET_ID) | |
| # เก็บ Drive Folder IDs | |
| self.DRIVE_SLIPS_FOLDER_ID = DRIVE_SLIPS_FOLDER_ID | |
| self.DRIVE_ID_CARDS_FOLDER_ID = DRIVE_ID_CARDS_FOLDER_ID | |
| self.DRIVE_EXPENSES_FOLDER_ID = DRIVE_EXPENSES_FOLDER_ID | |
| # Cache | |
| self.cache = { | |
| "employees": None, | |
| "rooms": None, | |
| "last_fetch_time": 0 | |
| } | |
| print("เชื่อมต่อ Google Services สำเร็จ!") | |
| async def _update_cache(self, force=False): | |
| """อัปเดตข้อมูลใน Cache ทุก 5 นาที""" | |
| current_time = time.time() | |
| if not force and (current_time - self.cache["last_fetch_time"]) < 300: | |
| return | |
| print("กำลังอัปเดต Cache จาก Google Sheets...") | |
| employees_sheet = self.data_db.worksheet("Employee List") | |
| df_employees = pd.DataFrame(employees_sheet.get_all_records()) | |
| # ทำให้แน่ใจว่าคอลัมน์ ID คือ 'telegram_user_id' | |
| if 'telegram_user_id' not in df_employees.columns and 'discord_user_id' in df_employees.columns: | |
| df_employees = df_employees.rename(columns={'discord_user_id': 'telegram_user_id'}) | |
| self.cache["employees"] = df_employees | |
| rooms_sheet = self.data_db.worksheet("Room Status") | |
| self.cache["rooms"] = pd.DataFrame(rooms_sheet.get_all_records()) | |
| self.cache["last_fetch_time"] = current_time | |
| print("Cache อัปเดตเรียบร้อยแล้ว") | |
| async def get_employees(self): | |
| await self._update_cache() | |
| return self.cache["employees"] | |
| async def get_rooms(self): | |
| await self._update_cache() | |
| return self.cache["rooms"] | |
| def check_receipt_queue(self): | |
| """ตรวจสอบสถานะในคิวใบเสร็จ""" | |
| sheet = self.receipt_engine.worksheet("Receipt_Queue") | |
| df = pd.DataFrame(sheet.get_all_records()) | |
| done_rows = df[(df['status'] == 'Done') | (df['status'] == 'DONE')] | |
| return done_rows | |
| def archive_receipt_row(self, row_index): | |
| """เปลี่ยนสถานะในคิวใบเสร็จเป็น Archived""" | |
| sheet = self.receipt_engine.worksheet("Receipt_Queue") | |
| status_col = sheet.find("status").col | |
| sheet.update_cell(row_index + 2, status_col, "Archived") | |
| def upload_file_to_drive(self, file_path, folder_id, file_name): | |
| """อัปโหลดไฟล์ไปที่ Google Drive""" | |
| file_metadata = { | |
| 'name': file_name, | |
| 'parents': [folder_id] | |
| } | |
| mimetype = 'image/jpeg' if file_name.lower().endswith(('.jpg', '.jpeg')) else 'application/octet-stream' | |
| media = MediaFileUpload(file_path, mimetype=mimetype) | |
| file = self.drive_service.files().create( | |
| body=file_metadata, | |
| media_body=media, | |
| fields='id, webViewLink' | |
| ).execute() | |
| self.drive_service.permissions().create(fileId=file.get('id'), body={'type': 'anyone', 'role': 'reader'}).execute() | |
| return file.get('webViewLink') | |
| google_handler = GoogleAPIHandler() |