telegram-pms-bot / google_services.py
nssuwan186's picture
Create google_services.py
f82b111 verified
--- 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()