分享一个发票管理

一般供应链中,都涉及到对账,而发票管理又是其中重要一环.
如果发票每张需要手工输入信息,一方面需要一定的工作量,时间.另一方面有可能输入错误.

百度人工AI,有发票识别(每月1000次免费),有发票真伪验证(收费)

通过脚本,可以将发票发送到百度,并返回发票的内容及真伪

在这张表中,只需要2个动作

  1. 对应该发票是哪一个对账

  2. 上传发票图片

标红的是需要手工填写的

然后通过脚本,比对金额是否正确,时间是否合理,开票抬头,税号,税率等是否正确,和发票真伪

3赞

牛啊,怎么做的?学习学习 :heart_eyes:

增值税发票识别_文字识别OCR-百度AI开放平台 (baidu.com)

看一下百度的参考,挺好用的

我看到还有很多图像识别功能,例如身份证识别,车船票识别,银行卡识别,主要技术是 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)

代码写的很糟糕,只是实现功能 :cold_sweat:

2赞

Perfect :+1: :+1: :+1:

注意下,这个百度的API也有过期时间

通用参考 - 鉴权认证机制 | 百度AI开放平台 (baidu.com)