File size: 7,157 Bytes
bcc6ee1 47809f3 bcc6ee1 e46e6d6 bcc6ee1 e46e6d6 bcc6ee1 798364d bcc6ee1 47809f3 bcc6ee1 47809f3 326562e bcc6ee1 47809f3 bcc6ee1 5f2fd77 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | 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('<div style="display: flex; justify-content: center; align-items: center; font-size: 20px; font-weight: bold; color: #333; background: #E2E6FA; padding: 10px; border-radius: 8px; box-shadow: 2px 2px 5px rgba(0,0,0,0.2);">🗞 CONCUR 経費報告書チェック</div>')
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)
|