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)