approval / app.py
EricGEGE's picture
Update app.py
027c997 verified
raw
history blame
18.2 kB
import pandas as pd
import gradio as gr
from datetime import datetime
import gspread
from google.oauth2.service_account import Credentials
import os
# Google Sheets setting
SHEET_ID = os.getenv('SHEET_ID') # Replace with your Google Sheet ID
log = 'cevauto'
password = os.getenv('PASSWORD')
USERS_SHEET = 'Users'
PURCHASE_ORDERS_SHEET = 'PurchaseOrders'
# Service account credentials file path
CREDENTIALS_FILE = 'credentials.json' # Replace with the path to your service account credentials file
# Initialize Google Sheets client
SCOPES = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive']
creds = Credentials.from_service_account_file(CREDENTIALS_FILE, scopes=SCOPES)
gc = gspread.authorize(creds)
sheet = gc.open_by_key(SHEET_ID)
# Initialize Google Sheets
def init_sheets():
if USERS_SHEET not in [s.title for s in sheet.worksheets()]:
sheet.add_worksheet(title=USERS_SHEET, rows="100", cols="20")
users = sheet.worksheet(USERS_SHEET)
users.append_row(['id', 'username', 'role'])
new_users = [
['1', 'cevcaigou159', '采购'],
['2', 'cevdanzheng789', '单证'],
['3', 'cevcaiwu369', '财务'],
['4', 'cevboss888', '总经理'],
['5', 'cevcaigou357', '采购'],
['6', 'investor888', '观察员'],
['7', 'cevcaigou888', '采购经理'],
['8', 'cevcaigou005', '采购'],
['9', 'cevchuna001', '出纳'] # Added new user
]
for user in new_users:
users.append_row(user)
if PURCHASE_ORDERS_SHEET not in [s.title for s in sheet.worksheets()]:
sheet.add_worksheet(title=PURCHASE_ORDERS_SHEET, rows="100", cols="20")
orders = sheet.worksheet(PURCHASE_ORDERS_SHEET)
orders.append_row([
'付款抬头', '合同号', '运编号', '采购编号', '车辆信息', '销售合同价', '采购价',
'费用名称', '费用金额', '采购款收款抬头', '采购款收款账号信息',
'业务员', '客户名称', '客户国家', '在途状态', '开票类型',
'收款状态', '审批状态', '退款说明', '备注', 'timestamp', '毛利'
])
init_sheets()
# Approval process control
def get_next_approval_status(current_status):
try:
if current_status == '待单证审批':
return '待采购经理/总经理审批'
elif current_status == '待采购经理/总经理审批':
return '待财务审批'
elif current_status == '待财务审批':
return '已批准'
elif current_status == '已批准':
return '已付款'
return current_status
except Exception as e:
return "操作有误: {}".format(e)
def approve_order(order_id, approver_role):
try:
orders = sheet.worksheet(PURCHASE_ORDERS_SHEET)
order_records = orders.get_all_records()
order_index = next((index for (index, d) in enumerate(order_records) if d["采购编号"] == order_id), None)
if order_index is None:
return '订单未找到'
current_status = order_records[order_index]['审批状态']
if (current_status == '待单证审批' and approver_role != '单证') or \
(current_status == '待采购经理/总经理审批' and approver_role not in ['采购经理', '总经理']) or \
(current_status == '待财务审批' and approver_role != '财务') or \
(current_status == '待出纳审批' and approver_role != '出纳'):
return f'只有{current_status}角色可以批准当前订单'
next_status = get_next_approval_status(current_status)
headers = list(order_records[0].keys())
orders.update_cell(order_index + 2, headers.index('审批状态') + 1, next_status) # Update approval status
orders.update_cell(order_index + 2, headers.index('timestamp') + 1,
datetime.now().strftime('%Y-%m-%d')) # Update timestamp
return '订单已批准'
except Exception as e:
return "操作有误: {}".format(e)
# Global session state
session_state = {'user_id': None, 'username': None, 'role': None, 'order_id': None}
def login(username):
try:
users = sheet.worksheet(USERS_SHEET).get_all_records()
user = next((u for u in users if u['username'] == username), None)
if user:
session_state['user_id'] = user['id']
session_state['username'] = user['username']
session_state['role'] = user['role']
return "登录成功,用户:{}".format(username)
else:
return "用户未找到"
except Exception as e:
return "操作有误: {}".format(e)
def submit_order1(
username,付款抬头,
运编号,车辆信息,销售合同价, 采购价,
费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
在途状态, 开票类型,
收款状态, 退款说明, 备注
):
try:
global profit
login(username)
if session_state['role'] not in ['采购', '采购经理']:
return "只有采购角色可以提交订单"
orders = sheet.worksheet(PURCHASE_ORDERS_SHEET)
# Generate purchase order name based on username
prefix = 'DING00000'
if session_state['username'] == 'cevcaigou159':
prefix = 'SHEN00000'
elif session_state['username'] == 'cevcaigou888':
prefix = 'NIU00000'
elif session_state['username'] == 'cevcaigou005':
prefix = 'HAN00000'
all_records = orders.get_all_records()
existing_records = [record for record in all_records if record['采购编号'].startswith(prefix)]
n = len(existing_records)
i = n + 1
order_name = f"{prefix}{i}"
existing_records1 = [record for record in all_records if record['运编号'] == 运编号]
existing_record = existing_records1[0]
profit = float(销售合同价) * 7 - float(采购价) + float(采购价) * 0.115
new_order = [
付款抬头, existing_record['合同号'], 运编号, order_name, 车辆信息, 销售合同价, 采购价,
费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
existing_record['业务员'], existing_record['客户名称'], existing_record['客户国家'], 在途状态, 开票类型,
收款状态, '待单证审批', 退款说明, 备注,
datetime.now().strftime('%Y-%m-%d'), profit
]
orders.append_row(new_order)
session_state.clear()
return "订单已提交"
session_state.clear()
except Exception as e:
return "操作有误: {}".format(e)
def submit_order2(
username,
付款抬头, 合同号, 运编号, 车辆信息, 销售合同价, 采购价,
费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
业务员, 客户名称, 客户国家, 在途状态, 开票类型,
收款状态, 退款说明, 备注
):
try:
global profit
login(username)
if session_state['role'] not in ['采购', '采购经理']:
return "只有采购角色可以提交订单"
orders = sheet.worksheet(PURCHASE_ORDERS_SHEET)
# Generate purchase order name based on username
prefix = 'DING00000'
if session_state['username'] == 'cevcaigou159':
prefix = 'SHEN00000'
elif session_state['username'] == 'cevcaigou888':
prefix = 'NIU00000'
elif session_state['username'] == 'cevcaigou005':
prefix = 'HAN00000'
all_records = orders.get_all_records()
existing_records = [record for record in all_records if record['采购编号'].startswith(prefix)]
n = len(existing_records)
i = n + 1
order_name = f"{prefix}{i}"
profit = float(销售合同价) * 7.25 - float(采购价) + float(采购价) * 0.115
new_order = [
付款抬头, 合同号, 运编号, order_name, 车辆信息, 销售合同价, 采购价,
费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
业务员, 客户名称, 客户国家, 在途状态, 开票类型,
收款状态, '待单证审批', 退款说明, 备注,
datetime.now().strftime('%Y-%m-%d'), profit
]
orders.append_row(new_order)
session_state.clear()
return "订单已提交"
session_state.clear()
except Exception as e:
return "操作有误: {}".format(e)
def format_order(order):
try:
return f"""
<table border="1">
<tr><th>审批状态</b></th><td><b>{order['审批状态']}</b></td></tr>
<tr><th>付款抬头</th><td>{order['付款抬头']}</td></tr>
<tr><th>合同号</th><td>{order['合同号']}</td></tr>
<tr><th>运编号</th><td>{order['运编号']}</td></tr>
<tr><th>采购编号</th><td>{order['采购编号']}</td></tr>
<tr><th>车辆信息</th><td>{order['车辆信息']}</td></tr>
<tr><th>销售合同价(FOB美元)</th><td>{order['销售合同价']}</td></tr>
<tr><th>采购价(人民币)</th><td>{order['采购价']}</td></tr>
<tr><th>费用名称</th><td>{order['费用名称']}</td></tr>
<tr><th>费用金额</th><td>{order['费用金额']}</td></tr>
<tr><th>采购款收款抬头</th><td>{order['采购款收款抬头']}</td></tr>
<tr><th>采购款收款账号信息</th><td>{order['采购款收款账号信息']}</td></tr>
<tr><th>业务员</th><td>{order['业务员']}</td></tr>
<tr><th>客户名称</th><td>{order['客户名称']}</td></tr>
<tr><th>客户国家</th><td>{order['客户国家']}</td></tr>
<tr><th>在途状态</th><td>{order['在途状态']}</td></tr>
<tr><th>开票类型</th><td>{order['开票类型']}</td></tr>
<tr><th>收款状态</th><td>{order['收款状态']}</td></tr>
<tr><th>退款说明</th><td>{order['退款说明']}</td></tr>
<tr><th>备注</th><td>{order['备注']}</td></tr>
<tr><th>时间</th><td>{order['timestamp']}</td></tr>
<tr><th>毛利</th><td>{order['毛利']}</td></tr>
<tr><th>当前身份</th><td>{session_state['username']}</td></tr>
</table>
"""
except Exception as e:
return "操作有误: {}".format(e)
def display_orders(username):
try:
login(username)
allowed_roles = [
'采购', '单证', '财务',
'总经理', '观察员', '采购经理', '出纳' # Added '出纳' to allowed roles
]
if session_state['role'] not in allowed_roles:
return ["请登录后查看订单"]
orders = sheet.worksheet(PURCHASE_ORDERS_SHEET).get_all_records()
orders_df = pd.DataFrame(orders)
orders_df['timestamp'] = pd.to_datetime(orders_df['timestamp'], errors='coerce')
orders_df['index'] = range(len(orders_df))
orders_df = orders_df.sort_values(by=['timestamp', 'index'], ascending=[False, False]).reset_index(drop=True)
orders_df = orders_df.drop(columns=['index'])
order_list = [format_order(order) for _, order in orders_df.iterrows()]
session_state.clear()
return order_list
session_state.clear()
except Exception as e:
return "操作有误: {}".format(e)
def approve_order_interface(username, order_id):
try:
login(username)
allowed_roles = ['单证', '财务', '总经理', '采购经理', '出纳'] # Added '出纳' to allowed roles
if session_state['role'] not in allowed_roles:
return "您没有批准订单的权限"
role1 = session_state['role']
result = approve_order(order_id, role1)
session_state.clear()
return result
session_state.clear()
except Exception as e:
return "操作有误: {}".format(e)
with gr.Blocks() as app:
with gr.TabItem("提交费用(旧运编号)"):
username_submit = gr.Textbox(label="用户名")
付款抬头 = gr.Textbox(label="付款抬头")
运编号 = gr.Textbox(label="运编号")
车辆信息 = gr.Textbox(label="车辆信息")
销售合同价 = gr.Textbox(label="销售合同价(FOB美元)")
采购价 = gr.Textbox(label="采购价(人民币)")
费用名称 = gr.Dropdown(
choices=[
'采车定金', '采车定金(抵车款)', '采车定金(全额退回)', '采车定金(部分退回)',
'采车尾款(含背户费)', '采车尾款', '背户手续费', '系统刷机费', '充电桩费',
'保险费(短期交强)', '保险费(长期交强)', '保险费(全险)', '国内运费(市内)', '国内运费',
'购置税费', '仓储费', '检测报告费', '车辆用品费', '车辆改装费', '港杂费', '海运费', '海运费+港杂费',
'其他费用'
],
label="费用名称")
费用金额 = gr.Textbox(label="费用金额")
采购款收款抬头 = gr.Textbox(label="采购款收款抬头")
采购款收款账号信息 = gr.Textbox(label="采购款收款账号信息")
在途状态 = gr.Dropdown(
choices=[
'工厂', '4S店', '车管所',
'改装店', '运输中', '物流站点', '货代仓库', '装箱',
'发运', '到达目的港'
],
label="在途状态")
开票类型 = gr.Dropdown(
choices=[
'增票', '普票', '低开', '无票'
],
label="开票类型")
收款状态 = gr.Textbox(label="收款状态")
退款说明 = gr.Textbox(label="退款说明")
备注 = gr.Textbox(label="备注")
submit_button = gr.Button("提交订单")
submit_output = gr.HTML(label="输出")
submit_button.click(fn=submit_order1, inputs=[
username_submit, 付款抬头,运编号,车辆信息, 销售合同价, 采购价,
费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
在途状态, 开票类型,
收款状态, 退款说明, 备注
], outputs=submit_output)
with gr.TabItem("提交订单(新运编号)"):
username_submit = gr.Textbox(label="用户名")
运编号_submit = gr.Textbox(label="运编号")
付款抬头 = gr.Textbox(label="付款抬头")
合同号 = gr.Textbox(label="合同号")
车辆信息 = gr.Textbox(label="车辆信息")
销售合同价 = gr.Textbox(label="销售合同价(FOB美元)")
采购价 = gr.Textbox(label="采购价(人民币)")
费用名称 = gr.Dropdown(
choices=[
'采车定金', '采车定金(抵车款)', '采车定金(全额退回)', '采车定金(部分退回)',
'采车尾款(含背户费)', '采车尾款', '背户手续费', '系统刷机费', '充电桩费',
'保险费(短期交强)', '保险费(长期交强)', '保险费(全险)', '国内运费(市内)', '国内运费',
'购置税费', '仓储费', '检测报告费', '车辆用品费', '车辆改装费', '港杂费', '海运费', '海运费+港杂费',
'其他费用'
],
label="费用名称")
费用金额 = gr.Textbox(label="费用金额")
采购款收款抬头 = gr.Textbox(label="采购款收款抬头")
采购款收款账号信息 = gr.Textbox(label="采购款收款账号信息")
业务员 = gr.Textbox(label="业务员")
客户名称 = gr.Textbox(label="客户名称")
客户国家 = gr.Textbox(label="客户国家")
在途状态 = gr.Dropdown(
choices=[
'工厂', '4S店', '车管所',
'改装店', '运输中', '物流站点', '货代仓库', '装箱',
'发运', '到达目的港'
],
label="在途状态")
开票类型 = gr.Dropdown(
choices=[
'增票', '普票', '低开', '无票'
],
label="开票类型")
收款状态 = gr.Textbox(label="收款状态")
退款说明 = gr.Textbox(label="退款说明")
备注 = gr.Textbox(label="备注")
submit_button = gr.Button("提交订单")
submit_output = gr.HTML(label="输出")
submit_button.click(fn=submit_order2, inputs=[
username_submit, 付款抬头, 合同号, 运编号_submit, 车辆信息, 销售合同价, 采购价,
费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
业务员, 客户名称, 客户国家, 在途状态, 开票类型,
收款状态, 退款说明, 备注
], outputs=submit_output)
with gr.TabItem("所有订单"):
username_display = gr.Textbox(label="用户名")
display_button = gr.Button("显示所有订单")
orders_output = gr.HTML(label="订单")
display_button.click(fn=display_orders, inputs=username_display, outputs=orders_output)
with gr.TabItem("批准订单"):
username_approve = gr.Textbox(label="用户名")
order_id = gr.Textbox(label="采购编号")
approve_order_button = gr.Button("批准订单")
approve_order_output = gr.HTML(label="输出")
approve_order_button.click(fn=approve_order_interface, inputs=[username_approve, order_id],
outputs=approve_order_output)
app.launch(auth=(log, password))