关于系统:线上开票系统设计实践

48次阅读

共计 5659 个字符,预计需要花费 15 分钟才能阅读完成。

导读:为响应国家号召,晋升业务效率,更好的服务企业用户,云信于 9 月末上线了线上开票性能。本文次要介绍了发票相干的基本知识,以及如何实现线上开票性能,遇到的问题和解决方案。

文|璐西 夜雨

2020 年 9 月 29 日,税务总局等十三部门联结公布《对于推动征税缴费便利化改革优化税收营商环境若干措施的告诉》,指出要稳步推动发票电子化改革,促成办税提速增效降负,2020 年底前根本实现新办纳税人增值税专用发票电子化。

为了晋升业务效率,更好的服务于企业客户,同时响应政策号召,网易云信 2020 年 9 月起反对线上开具电子发票,增值税一般电子发票将能够脱离线下人工开票流程,间接在线上实现主动开票。小小的一张发票背地,是一套集用户后盾、业务后盾、第三方平台于一体的线上开票零碎。线上开票场景实用于各类行业,只有产生线上交易,无论 toB 还是 toC,均会波及。

本文次要从 财税常识科普、产品设计、技术设计多个维度 分享线上增值税开票零碎的实际,心愿能对大家有所帮忙。

财务常识科普

在进行线上开票零碎的设计之前,须要深刻理解相干背景常识,这样能力了解整个业务流程。相干阐明次要基于外部设计开展,仅供参考。

1. 传统开票形式

一家新企业须要先到税局申请发票,再向税控服务公司购买税控设施。税控设施装置好后,再携带税盘(金税盘或税控盘)到主管税务机关初始发行,发行后到柜台领用发票。之后企业税务人员就能够装置开票软件,进行企业外部的线下开票了(纸质或电子)。

金税盘、税控盘:俗称白盘,黑盘,分属于两个不同的协税公司,金税盘属于航天信息,税控盘属于百旺。

2. 发票信息

以电子普通发票为例,一张发票次要波及以下几个重点信息,理解了这些信息对后续第三方平台的对接会有很大帮忙。

购买方信息:

  • 名称:若购买方为 B 端企业 / 组织,则此处应填写增值税纳税人的名称,纳税人辨认号,地址、电话,开户银行及账号,并确保单位名称和纳税人登记号的相应关系准确无误。若购买方为集体,则须要填写集体身份证姓名。

订单信息:

  • 服务名称:由商品名称 + 商品服务类型组成。个别格局为 商品名称 商品服务类型

    商品服务类型,和税收分类编码对应,第三方开票平台会依据税收分类编码主动生成商品服务类型,如 信息技术服务 技术服务费。

  • 单价:这里指不含税单价,计算公式为 不含税单价 =round(不含税金额 / 数量, 8),保留 8 位小数,舍入模式为四舍五入。
  • 金额:这里指不含税商品金额,每个企业都会有对应的发票限额,需提前与税务确认限额,单张发票的总金额不能超过限额,超过后须要零碎主动拆分为多张。
  • 税率:不同的税收分类编码对应不同的税率。
  • 税额:国家收取的税收金额,计算公式为 税额 =round((数量×含税单价)×税率)÷(1+ 税率),2),保留 2 位小数,舍入模式是四舍五入。
  • 价税共计:即单张发票的含税总金额。

    若供给两种不同税率的应税我的项目,且合并开具发票的,其商品或劳务的名称、计量单位、数量、单价、金额,必须按不同税率别离填写。对供给的货物既有应税货物,又有免税货物的,供给的免税货物应独自开具普通发票,不得和应税货物合并开具增值税专用发票。

销售方信息:

  • 名称等:销售方企业名称和后续单方合同的乙方名称需保持一致。且名称、证件号需非法无效。
  • 收款人:个别为销售方财务人员,可与公司财税人员确认。
  • 复核:个别为销售方财务人员,可与公司财税人员确认。
  • 开票人:个别为销售方税务人员,可与公司财税人员确认。

销货清单

当发票上的订单信息超过货物或应税劳务、服务名称一栏展现范畴时,会生成用于记录残缺订单信息的销售货物或者提供应税劳务、服务清单,发票货物或应税劳务、服务名称一栏内容为(详见销货清单)。

3. 发票类型

发票次要分为以下几类,线上开票仅波及增值税普通发票(以下简称普票)及增值税专用发票(以下简称专票),除电子发票可线上主动开票外,纸质发票的业务逻辑也须要一并兼容。

4. 常见术语

蓝票、红票:失常开具发票为“蓝票”,呈现退货或开具的发票有谬误,须要作废发票或开具“红票”(也叫负票)用以冲减当期开票方的销售收入(也叫红冲)。

如果是增值税专用发票,在同一个月开票退货且发票未认证的,可间接作废发票;跨月退票的,须要红冲,开具负(红字)发票,冲减当期销售;如已通过同认证的,需购货方税务局出具《开具红字发票通知单》,销货方凭此《通知单》能力开具红字(正数)发票。此流程个别须要线下解决。

产品设计

相熟了基本知识,在正式进入线上开票零碎的产品设计之前,须要进行第三方开票平台的选型。确定选型后联合第三方平台的接口,梳理业务流程及相干性能点。

第三方开票平台

中国电子发票产业链的外围环节包含 税控设施商和第三方电子发票服务平台

税控设施商是国有控股的爱信诺、百旺双寡头格局。第三方电子发票服务平台次要分为三大营垒,包含百望股份、高灯科技为代表的新兴企业;由税控设施商、传统纸质发票印刷商组成的老牌发票服务商;以用友、金蝶为代表的老牌软件服务商。能够依据企业状况,抉择第三方开票平台。

企业可通过第三方平台接口实现于自有零碎对接,可抉择自行同步发票,也可抉择扫码开票。后者在线下门店开票中较为常见。

业务流程

依据业务特点进行需要剖析,设计适宜本人业务的开票流程。此过程倡议与财税同学放弃亲密沟通,防止设计进去的开票流程不合乎财税要求。

订单领取实现后,以电子发票线上开票及退票为例,次要业务流程(含状态流转)参考如下:

阐明:

  • 为了升高发票的退票率及虚开发票的危险,设计中退出了实名认证的环节,确保发票低头和证件号真实有效,且一一对应。
  • 局部历史数据(历史曾经线下开过票的订单),可思考通过下单或领取工夫进行限度,躲避反复开票的危险。
  • 财务审核环节可依据公司财税要求确定是否须要保留,但纸质发票流程个别都会波及到后盾审核。

    性能

线上开票零碎次要波及用户和业务后盾,外围性能点参考下图:

阐明:

  • 对于后盾操作人员来说,批量解决能够很大水平上晋升工作效率。
  • 不同的发票状态对应不同的操作类型。
  • 销售后盾需思考纸质发票的作废流程。
  • 纸质发票的快递状态跟踪也可思考作为低优先级性能逐渐优化。

    其余业务场景

理论业务中,还会波及一些非凡场景,如 提前开票、退款退票 等。

提前 开票,即客户先开发票再进行领取。很多大企业外部报销审核严格,须要销售方先开具发票,而后依据发票报销打款。

退款退票,即客户购买后,因为各种起因进行了退款操作,蕴含全副退款或局部退款。如果曾经开具发票,则须要同步实现退票流程。针对全副退款的状况,只须要走失常退票流程即可。但针对局部退款的状况,原来曾经开具发票的须要整体退票之后,再开具残余未退款金额的发票。

这些非凡场景也须要实现线上化,通过零碎闭环所有开票流程,其优先级可依据本身业务需要制订。

技术设计

对于技术人员来说,在设计任何一个零碎时首先都会遇到以下个问题:

  1. 零碎面向的使用者是谁?
  2. 租户隔离要隔离什么数据?
  3. 零碎的内部依赖有哪些,逻辑架构应该怎么设计?

解决了上述问题后,就轮到咱们的 开票零碎独有的外部业务问题了:

  1. 发票上的各项金额别离代表什么含意,如何计算?
  2. 多订单合并开票或大额订单开票时,发票应该如何拆分?

理顺了外部业务逻辑,最初就该思考 如何对外提供服务,并尽量晋升服务体验,也就是要解决以下问题:

  • 接口时序是怎么的,哪些步骤应该异步化?

    零碎使用者

通常对于一个集团公司来说,业务构造是出现金字塔形态的,即集团公司下有不同的子公司,子公司下有不同的产品线,但也偶然有一些产品线是由不同的子公司甚至内部公司组成。

因而咱们应该 把终端产品线作为租户

终端隔离

明确了零碎使用者,接下来就须要思考租户应该隔离哪些数据。

目前市面上的开票供应商提供的都是销方账户隔离,有 两点限度

  1. 同一销方账户内订单号必须惟一;
  2. 销方账户每张发票的不含税金额有下限;

在理论的线下开票中,咱们还会碰到以下场景

  1. 雷同的税收分类编码在不同产品线中有不同的商品名称;
  2. 雷同的商品在不同产品线或者同一产品线中有不同的商品规格、商品单价;

因而,咱们的 租户对应的数据映射关系如下

  1. 租户和销方账户是 1 对 1 的关系;
  2. 租户和单张发票不含税金额下限是 1 对 1 的关系;
  3. 租户和订单编号是 1 对 N 的关系;
  4. 租户和容许开票的商品 SKU(即容许的名称 / 税收分类编码 / 规格 / 单价组合)是 1 对 N 的关系;

    逻辑架构

发票的生成须要以下 必要元素

  1. 发票主体;
  2. 订单信息;
  3. 商品信息;
  4. 理论开票能力;

按微服务来说,就是咱们要依赖 4 个内部 服务

  1. 用户核心负责提供通过实名认证的发票主体信息;
  2. 订单核心负责提供订单编号以及蕴含的商品 SKU 购买数量数据;
  3. 商品核心负责提供商品 SKU 的名称、税收分类编码、商品规格、含税单价数据;
  4. 开票供应商负责提供理论的电子开票能力;

于是,咱们的逻辑架构图应该如下图:

金额计算

发票里的各项属性的含意能够参考上文,通过各项金额的定义,咱们能够失去以下 计算公式

  • 税额 =round((数量×含税单价)×税率)÷(1+ 税率),2),保留 2 位小数,舍入模式是四舍五入。
  • 税额 =round((数量×不含税单价×税率), 2),保留 2 位小数,舍入模式是四舍五入。
  • 不含税单价 =round(含税单价 /(1+ 税率), 8),保留 8 位小数,舍入模式是四舍五入。

    发票拆分

各个产品线在申请开票时都是心愿订单和发票会一一对应,但理论状况是,受限于企业资质,销方开出的每张发票是有不含税金额下限的,超出下限就不能开具发票。

底层的开票供应商通常都具备主动拆票性能,即一笔订单的不含税金额超过下限,就会主动拆分成多张发票。但开票供应商通常会倡议咱们本人封装一套拆票逻辑,这是因为供应商的拆票是面向单笔订单的,如果业务上是多笔订单合并开票,供应商拆票后就会呈现某几张发票的金额远小于下限,造成发票份数的节约。

税务每月能从税务局支付的发票份数是无限的。

1. 蓝票拆分

首先,咱们把蓝票开票流程中波及的对象实体进行形象

(1)把产品线提交的一次蓝票开票申请形象为一个主流程,一个蓝票主流程蕴含一笔或多笔订单;

(2)把拆分后的单张蓝票形象为一个子流程,所以一个蓝票主流程有一个到多个蓝票子流程;

(3)每张蓝票有一行或多行发票明细我的项目,所以一个蓝票子流程有一条到多条发票明细我的项目;

(4)单张发票的不含税金额下限作为拆分时的不含税金额阈值;

而后咱们来进行拆分规定的制订;

(1)商品的不含税单价不得大于不含税金额阈值,如果有超过阈值的会被拆分成一组到 2 组商品:一组商品的单价等于不含税金额阈值,数量为原商品不含税金额 / 拆分不含税金额阈值;如果还有残余不含税金额,则拆分成一个单价为残余不含税金额,数量为 1 的商品,订单编号、商品名称、税收分类编码不变;

a. 例如订单 1 / 商品 A / 税收分类编码 TC1/ 数量 2 件 / 单价 18 万会被拆分成订单 1 / 商品 A / 税收分类编码 TC1/ 数量 3 件 / 单价 10 万和订单 1 / 商品 A / 税收分类编码 TC1/ 数量 1 件 / 单价 6 万;

b. 例如订单 1 / 商品 A / 税收分类编码 TC1/ 数量 2 件 / 单价 15 万会被拆分成订单 1 / 商品 A / 税收分类编码 TC1/ 数量 3 件 / 单价 10 万;

(2) 将 (订单 + 商品名称 + 税收分类编码 + 不含税单价) 作为拆分维度的最小单位,商品数量最小为 1,如果以后发票含税金额的残余额度小于商品单价则主动开具下一张发票,如果以后发票含税金额的残余额度大于商品单价,则以后发票最多可搁置以后商品的数量 =min((残余额度 / 商品单价), 商品数量),如果全副商品数量都能够放下则切换到下一个商品,否则将残余商品数量放到下一张发票里;

上述的规定阐明中是以技术服务类这种没有规格的商品作为阐明的,如果是实体类商品则需把商品规格也退出到拆分维度中。

具体拆分步骤见流程图:

拆分示例:

假如销方单张发票的不含税金额下限为 10 万,产品线提交的原始开票订单以及商品列表如下:

咱们冀望不含税单价溢出商品拆分后,单价溢出的商品 8 被拆分成两组商品:

咱们冀望最终的拆分后果为 7 张发票:

2. 红票拆分

红票是依据对应蓝票来开具的,红票和蓝票有以下映射关系

  1. 红票发票明细和蓝票发票明细一一对应,除了商品数量、不含税金额、税额、含税金额是对应蓝票发票明细的正数外,其余各项属性都是雷同的;
  2. 红票的发票备注中须要以 ” 对应负数发票代码:xxxxxxxxxxxx 号码:xxxxxxxx” 的模式填充上对应蓝票的发票代码和发票号码;

所以只须要依据蓝票的拆分后果就能实现红票拆分。

参照蓝票拆分中的实体定义,对红票开票流程中波及的对象实体进行形象:

  1. 把产品线提交的一次红票开票申请形象为一个主流程,一个红票主流程必须关联且只关联一个蓝票主流程;
  2. 把拆分后的单张红票形象为一个子流程,一个红票主流程有一个到多个红票子流程,每个红票子流程和蓝票主流程关联的蓝票子流程一一对应,红票子流程的发票备注以 ” 对应负数发票代码:xxxxxxxxxxxx 号码:xxxxxxxx” 的模式填充上对应蓝票子流程的发票代码和发票号码;
  3. 每张红票有一行或多行发票明细我的项目,每个红票发票明细和蓝票子流程关联的蓝票发票明细一一对应,红票发票明细的商品数量、不含税金额、税额、含税金额是对应蓝票发票明细的正数,其余各项属性雷同;

    接口时序和异步化

逻辑架构中的订单核心、用户核心、商品核心都是提供只读服务,因而能够采纳同步调用疾速失败的形式进行熔断。然而对于大额订单开票来说,蓝票拆分逻辑较为简单耗时,且和开票供应商交互生成发票的过程不可控,因而咱们能够将这两个步骤异步化,并且在异步化流程中退出谬误重试机制。

开具蓝票的接口时序:

开具红票的接口时序:

异步流程:

在异步流程中,咱们须要实现以下两个性能:

  1. 蓝票 / 红票拆分成蓝票 / 红票子流程,拆分出的子流程有 4 种状态:

a. 供应商待申请 - 尚未提交给开票供应商;

b. 供应商开票胜利;

c. 供应商开票失败;

d. 供应商开票中 – 既不是开票胜利,也不是开票失败的其余状态都属于开票中;

  1. 蓝票 / 红票子流程提交给开票供应商生成电子发票,包含开票后果的查问以及开票异样的重试;

具体步骤见流程图:

以上就是网易云信线上开票零碎设计的实际,目前该性能曾经上线,欢送大家体验!

正文完
 0