一般供应链中,都涉及到对账,而发票管理又是其中重要一环.
如果发票每张需要手工输入信息,一方面需要一定的工作量,时间.另一方面有可能输入错误.
百度人工AI,有发票识别(每月1000次免费),有发票真伪验证(收费)
通过脚本,可以将发票发送到百度,并返回发票的内容及真伪
在这张表中,只需要2个动作
-
对应该发票是哪一个对账
-
上传发票图片
标红的是需要手工填写的
然后通过脚本,比对金额是否正确,时间是否合理,开票抬头,税号,税率等是否正确,和发票真伪
一般供应链中,都涉及到对账,而发票管理又是其中重要一环.
如果发票每张需要手工输入信息,一方面需要一定的工作量,时间.另一方面有可能输入错误.
百度人工AI,有发票识别(每月1000次免费),有发票真伪验证(收费)
通过脚本,可以将发票发送到百度,并返回发票的内容及真伪
在这张表中,只需要2个动作
对应该发票是哪一个对账
上传发票图片
标红的是需要手工填写的
然后通过脚本,比对金额是否正确,时间是否合理,开票抬头,税号,税率等是否正确,和发票真伪
牛啊,怎么做的?学习学习
我看到还有很多图像识别功能,例如身份证识别,车船票识别,银行卡识别,主要技术是 OCR 吧。
行政处理日常发票报账,使用比较方便:例如用户或者销售上传图片,然后通过脚本图像识别,并把结果存放的列中,设置自定义通知可以告诉相关负责人进一步处理,大大简化了报销流程。
API 链接:https://ai.baidu.com/ai-doc/OCR/jk9m7mj1l
你的表格和脚本可以复制一份,去掉涉密数据,共享一下吗?
还有企业工商信息比较实用,BAIDU有API,可以识别营业执照
不过对于风险管控,比如股东,司法,立案等,类似企查查,启信宝,天眼查,收费还是挺贵了,0.1-0.2元/次
from seatable_api import Base, context,dateutils
import os
import requests
import base64
import re
nowtime = dateutils.now()
版本号 = "V1.0"
调用API次数 = 0
生成行数 = 0
更新行数 = 0
执行日志 = ""
结束信息 = ""
api_base_man =''
base_man = Base(api_base_man, context.server_url)
base_man.auth()
base = Base(context.api_token, context.server_url)
base.auth()
#请在此输入web页面上生成的apiToken
API_TOKEN = ''
#开始读取api链接参数
headers = {
'Accept':'application/json; charset=utf-8; indent=4',
'Authorization' : ''
}
headers['Authorization'] = 'Token {0}'.format(API_TOKEN)
getValue = requests.get('https://cloud.seatable.cn/api/v2.1/dtable/app-access-token/',headers=headers)
abc = eval(getValue.text)
access_token2 = getValue['access_token']
dtable_server = getValue['dtable_server']
dtable_uuid = getValue['dtable_uuid']
#封装函数锁行,islock为lock和unlock
def lock_row(table_name,table_row,islock):
table_row = '["{0}"]'.format(table_row)
headers = {
'Authorization': '',
'Content-Type': 'application/json',
}
headers['Authorization'] = 'Token {0}'.format(access_token2)
data = '{{"table_name":"{1}","row_ids":{0}}}'.format(table_row,table_name)
url = '{0}api/v1/dtables/{1}/{2}-rows/'.format(dtable_server,dtable_uuid,islock)
return requests.put(url=url, headers=headers, data=data.encode('utf-8'))
row = context.current_row
row_id = row['_id']
表格下单抬头 = row['下单抬头']
表格对应供应商 = row['对应供应商']
发票状态 = row['发票状态']
if 发票状态 != '发票正常':
image_url ="".join(row['上传发票'])
pattern = re.compile('^https.*jpg')
f = pattern.search(image_url)
image_url = f.group()
save_path = "/scripts/fapiao.jpg"
base.download_file(image_url, save_path)
调用API次数+=1
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"
# 二进制方式打开图片文件
f = open('/scripts/fapiao.jpg', 'rb')
img = base64.b64encode(f.read())
params = {"image":img}
#此处填写baidu access_token
access_token = '[]'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
f.close()
if response:
res = eval(response.text)
发票金额 = res['words_result']['AmountInFiguers']
发票号码 = res['words_result']['InvoiceNum']
发票代码 = res['words_result']['InvoiceCode']
供应商识别号 = res['words_result']['SellerRegisterNum']
供应商名称 = res['words_result']['SellerName']
收票人识别号 = res['words_result']['PurchaserRegisterNum']
收票人名称 = res['words_result']['PurchaserName']
未税额 = res['words_result']['TotalAmount']
收款人 = res['words_result']['Payee']
开票日期 = res['words_result']['InvoiceDate']
联数 = res['words_result']['SheetNum']
税额 = res['words_result']['TotalTax']
#print(发票代码,发票金额,发票号码,供应商识别号,供应商名称,收票人识别号,收票人名称,未税额,开票日期,)
if float(税额) > (float(未税额)*0.13-1):
首光纳税号 = "91330110MA2J18H54A" if 表格下单抬头 == "杭州首光" else "91320831MA277CLYXY"
首光名称 = "杭州首光照明有限公司" if 表格下单抬头 == "杭州首光" else "江苏首光照明有限公司"
if 收票人名称 == 首光名称 and 收票人识别号 == 首光纳税号:
if 表格对应供应商 in 供应商名称:
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice_verification"
params = {"check_code":"","invoice_code":"","invoice_date":"","invoice_num":"","invoice_type":"special_vat_invoice","total_amount":""}
params['invoice_code'] = 发票代码
params['invoice_date'] = 开票日期
params['invoice_num'] = 发票号码
params['total_amount'] = 发票金额
request_url = request_url + "?access_token=" + access_token
response = requests.post(request_url, data=params, headers=headers)
if response:
row_date = {"发票状态":'发票正常',"发票号码":发票号码,"发票金额":float(发票金额),"开票时间":开票日期,"发票代码":发票代码,"开票抬头":供应商名称,"纳税人识别号":供应商识别号,"收款人":收款人}
print(lock_row("发票管理",row_id,'lock'))
调用API次数+=1
结束信息 = 表格对应供应商 + 发票号码 + '发票验证通过'
else :
row_date = {'发票状态':'发票验证不通过'}
结束信息 = 表格对应供应商 + 发票号码 + '发票验证不通过'
else:
row_date = {'发票状态':'供应商不符'}
结束信息 = 表格对应供应商 + 发票号码 + '供应商不符'
else:
row_date = {'发票状态':'发票抬头开错'}
结束信息 = 表格对应供应商 + 发票号码 + '发票抬头开错'
else :
row_date = {'发票状态':'发票税点不足13%'}
结束信息 = 表格对应供应商 + 发票号码 + '发票税点不足13%'
else :
row_date = {'发票状态':'上传文件有误'}
结束信息 = 表格对应供应商 + '上传文件有误'
base.update_row("发票管理",row_id,row_date)
调用API次数+=1
更新行数+=1
else:
结束信息 = 表格对应供应商 + '已验证,重复提交'
#以下为脚本记录
调用API次数+=1
生成行数+=1
row_id = ""
endtime = dateutils.now()
执行秒数 = dateutils.datediff(nowtime,endtime,"S")
row_date = {'执行时间':nowtime,'版本号':版本号,'结束信息':结束信息,'生成行数':生成行数,'更新行数':更新行数,'执行秒数':执行秒数,'调用API次数':调用API次数,'执行日志':执行日志}
row_man = base_man.append_row('Python脚本执行情况',row_date)
row_man_id = row_man['_id']
base_man.add_link('xpWL','Python脚本执行情况','Python脚本总表',row_man_id,row_id)
代码写的很糟糕,只是实现功能
Perfect