import gradio as gr
import json
import pandas as pd
from groq import Groq
import mysql.connector
import os
from datetime import datetime
#MySQLに接続
conn = mysql.connector.connect(
host="www.ryhintl.com",
user="smairuser",
password="smairuser",
port=36000,
database="smair"
)
# カーソルを取得
cursor = conn.cursor(dictionary=True)
# List API Keys
#select_one_data_query = "SELECT * FROM agentic_apis"
#cursor.execute(select_one_data_query)
#result = cursor.fetchall()
# JSONをパースしてkeyを抽出
#keys = [item['key'] for item in result]
#os.environ["GROQ_API_KEY"] = keys[2]
client = Groq(api_key=os.environ["GROQ_API_KEY"])
def update_total_amount(expenses):
df = pd.DataFrame(expenses)
df["金額 (JPY)"] = df["金額 (JPY)"].astype(float)
total_amount = df["金額 (JPY)"].sum()
grand = int(total_amount)
return grand
def show_image1():
return "./receipt1.png"
def show_image2():
return "./receipt2.png"
def show_image3():
return "./receipt3.png"
def audit_check(indata,rules):
# Set the system prompt
system_prompt = {
"role": "system",
"content": "You are a helpful assistant, answer questions concisely."
}
# Set the user prompt
user_input = f'{indata}+"から不正利用が疑われるreport_idとemployee_nameを教えて。判断条件は[rule]に基づいて評価してください。経費の詳細も教えてください。[rule]='+rules
user_prompt = {
"role": "user", "content": user_input
}
# Initialize the chat history
chat_history = [system_prompt, user_prompt]
response = client.chat.completions.create(
model="llama-3.3-70b-versatile",
messages=chat_history,
max_tokens=1024,
temperature=0)
myresp = response.choices[0].message.content
responded = f'{myresp}'
return responded
def generate_json(report_id, employee_name, department, submission_date, total_amount, status, receipt1, receipt2, receipt3, expenses):
if isinstance(expenses, pd.DataFrame):
expenses = expenses.values.tolist() # DataFrameをリストのリストに変換
expense_list = []
for expense in expenses:
if len(expense) < 5:
print(f"Error: Unexpected data format -> {expense}")
continue # エラー回避のためスキップ
expense_list.append({
"expense_id": expense[0],
"date": expense[1],
"category": expense[2],
"amount": expense[3],
"description": expense[4]
})
report = {
"report_id": report_id,
"employee_name": employee_name,
"department": department,
"submission_date": submission_date,
"total_amount": total_amount,
"status": status,
"expenses": expense_list
}
print("tmp:",report)
return report
#return json.dumps(report, indent=4, ensure_ascii=False)
with gr.Blocks(css="footer {visibility: hidden;}",title="経費報告書チェック") as check:
gr.HTML('
🗞 CONCUR 経費報告書チェック
')
with gr.Tab("💹 経費報告書"):
gr.Markdown("### 経費報告書")
today = datetime.now()
mydate = today.date().strftime("%Y-%m-%d")
report_id = gr.Textbox(label="報告書ID", value="EXP123456")
employee_name = gr.Textbox(label="従業員名", value="山田太郎")
department = gr.Dropdown(
["営業部", "顧客サポート部", "マーケティング部", "人事・総務部"], value="営業部", multiselect=False, label="部署", info="所属部門"
)
submission_date = gr.DateTime(label="提出日", include_time=False, value=mydate)
total_amount = gr.Textbox(label="総額", value="69280")
status = gr.Dropdown(
["承認待ち", "却下", "承認済"], value="承認待ち", multiselect=False, label="部署", info="承認状況"
)
with gr.Row():
receipt1 = gr.Image(value=show_image1, label="交通費")
receipt2 = gr.Image(value=show_image2, label="食事代")
receipt3 = gr.Image(value=show_image3, label="宿泊費")
expenses = gr.Dataframe(headers=["経費ID", "日付", "カテゴリ", "金額 (JPY)", "説明"],
show_search="検索...",
show_copy_button=True,
show_fullscreen_button=True,
show_row_numbers=True,
pinned_columns=1,
static_columns=[0,1,2,4],
column_widths=["300px"],
value=[["EXP001", "2025-04-10", "交通費", "17980", "航空運賃"],
["EXP002", "2025-04-11", "食事代", "9900", "クライアントとのランチ"],
["EXP003", "2025-04-12", "宿泊費", "41400", "出張ホテル代"]],
interactive=True)
expenses.change(fn=update_total_amount, inputs=expenses, outputs=total_amount)
generate_button = gr.Button("経費生成")
output_json = gr.Textbox(label="生成された経費データ", interactive=False, show_copy_button=True)
generate_button.click(generate_json,
inputs=[report_id, employee_name, department, submission_date, total_amount, status, receipt1, receipt2, receipt3, expenses],
outputs=output_json)
with gr.Tab("✔️ 経費報告書チェック"):
gr.Markdown("### 経費報告書チェック")
json = '''{'report_id': 'EXP123456', 'employee_name': '山田太郎', 'department': '営業部', 'submission_date': '2025-04-14', 'total_amount': '69280'', 'status': '承認待ち', 'expenses': [{'expense_id': 'EXP001', 'date': '2025-04-10', 'category': '交通費', 'amount': '17980', 'description': '電車代'}, {'expense_id': 'EXP002', 'date': '2025-04-11', 'category': '食事代', 'amount': '9900', 'description': 'クライアントとのランチ'}, {'expense_id': 'EXP003', 'date': '2025-04-12', 'category': '宿泊費', 'amount': '41400', 'description': '出張ホテル代'}]}'''
concur_json = gr.Textbox(label="経費内訳", value=json,lines=10)
rules = gr.Textbox(label="経費ルール",
value='''1.一回の合計の上限は60000円です。\n2.月の食事代の回数は2回までです。''',lines=10, interactive=True)
concur_output = gr.Textbox(label="経費チェック結果", lines=10)
audit_button = gr.Button("経費チェック")
audit_button.click(audit_check,
inputs=[concur_json,rules],
outputs=concur_output)
check.launch(show_api=False)