线上开票系统设计实践
導讀:為響應國家號召,提升業務效率,更好的服務企業用戶,云信于9月末上線了線上開票功能。本文主要介紹了發票相關的基本知識,以及如何實現線上開票功能,遇到的問題和解決方案。
?
文|璐西 夜雨
?
2020年9月29日,稅務總局等十三部門聯合發布《關于推進納稅繳費便利化改革優化稅收營商環境若干措施的通知》,指出要穩步推進發票電子化改革,促進辦稅提速增效降負,2020年底前基本實現新辦納稅人增值稅專用發票電子化。
為了提升業務效率,更好的服務于企業客戶,同時響應政策號召,網易云信2020年9月起支持線上開具電子發票,增值稅普通電子發票將可以脫離線下人工開票流程,直接在線上完成自動開票。小小的一張發票背后,是一套集用戶后臺、業務后臺、第三方平臺于一體的線上開票系統。線上開票場景適用于各類行業,只要發生線上交易,無論toB 還是 toC,均會涉及。
本文主要從財稅知識科普、產品設計、技術設計多個維度分享線上增值稅開票系統的實踐,希望能對大家有所幫助。
?
一、財務知識科普
在進行線上開票系統的設計之前,需要深入了解相關背景知識,這樣才能理解整個業務流程。相關說明主要基于內部設計展開,僅供參考。
?
?1.傳統開票方式?
一家新企業需要先到稅局申請發票,再向稅控服務公司購買稅控設備。稅控設備安裝好后,再攜帶稅盤(金稅盤或稅控盤)到主管稅務機關初始發行,發行后到柜臺領用發票。之后企業稅務人員就可以安裝開票軟件,進行企業內部的線下開票了(紙質或電子)。
金稅盤、稅控盤:俗稱白盤,黑盤,分屬于兩個不同的協稅公司,金稅盤屬于航天信息,稅控盤屬于百旺。
?
?2.發票信息?
以電子普通發票為例,一張發票主要涉及以下幾個重點信息,了解了這些信息對后續第三方平臺的對接會有很大幫助。
購買方信息:
- 名稱:若購買方為B端企業/組織,則此處應填寫增值稅納稅人的名稱,納稅人識別號,地址、電話,開戶銀行及賬號,并確保單位名稱和納稅人登記號的相應關系準確無誤。若購買方為個人,則需要填寫個人身份證姓名。
訂單信息:
- 服務名稱:由商品名稱+商品服務類型組成。一般格式為*商品名稱*商品服務類型
商品服務類型,和稅收分類編碼對應,第三方開票平臺會根據稅收分類編碼自動生成商品服務類型,如*信息技術服務*技術服務費。
- 單價:這里指不含稅單價,計算公式為不含稅單價=round(不含稅金額/數量, 8),保留8位小數,舍入模式為四舍五入。
- 金額:這里指不含稅商品金額,每個企業都會有對應的發票限額,需提前與稅務確認限額,單張發票的總金額不能超過限額,超過后需要系統自動拆分為多張。
- 稅率:不同的稅收分類編碼對應不同的稅率。
- 稅額:國家收取的稅收金額,計算公式為?稅額=round((數量×含稅單價)×稅率)÷(1+稅率),2),保留2位小數,舍入模式是四舍五入。
- 價稅合計:即單張發票的含稅總金額。
若供應兩種不同稅率的應稅項目,且合并開具發票的,其商品或勞務的名稱、計量單位、數量、單價、金額,必須按不同稅率分別填寫。對供應的貨物既有應稅貨物,又有免稅貨物的,供應的免稅貨物應單獨開具普通發票,不得和應稅貨物合并開具增值稅專用發票。
?
銷售方信息:
- 名稱等:銷售方企業名稱和后續雙方合同的乙方名稱需保持一致。且名稱、證件號需合法有效。
- 收款人:一般為銷售方財務人員,可與公司財稅人員確認。
- 復核:一般為銷售方財務人員,可與公司財稅人員確認。
- 開票人:一般為銷售方稅務人員,可與公司財稅人員確認。
?
銷貨清單:
當發票上的訂單信息超過貨物或應稅勞務、服務名稱一欄展示范圍時,會生成用于記錄完整訂單信息的銷售貨物或者提供應稅勞務、服務清單,發票貨物或應稅勞務、服務名稱一欄內容為(詳見銷貨清單)。
?
?3.發票類型?
發票主要分為以下幾類,線上開票僅涉及增值稅普通發票(以下簡稱普票)及增值稅專用發票(以下簡稱專票),除電子發票可線上自動開票外,紙質發票的業務邏輯也需要一并兼容。
?
4.常見術語?
藍票、紅票:正常開具發票為“藍票”,出現退貨或開具的發票有錯誤,需要作廢發票或開具“紅票”(也叫負票)用以沖減當期開票方的銷售收入(也叫紅沖)。
如果是增值稅專用發票,在同一個月開票退貨且發票未認證的,可直接作廢發票;跨月退票的,需要紅沖,開具負(紅字)發票,沖減當期銷售;如已通過同認證的,需購貨方稅務局出具《開具紅字發票通知單》,銷貨方憑此《通知單》才能開具紅字(負數)發票。此流程一般需要線下處理。
?
二、產品設計
熟悉了基本知識,在正式進入線上開票系統的產品設計之前,需要進行第三方開票平臺的選型。確定選型后結合第三方平臺的接口,梳理業務流程及相關功能點。
?第三方開票平臺?
中國電子發票產業鏈的核心環節包括稅控設備商和第三方電子發票服務平臺。
?
稅控設備商是國有控股的愛信諾、百旺雙寡頭格局。第三方電子發票服務平臺主要分為三大陣營,包括百望股份、高燈科技為代表的新興企業;由稅控設備商、傳統紙質發票印刷商組成的老牌發票服務商;以用友、金蝶為代表的老牌軟件服務商。可以根據企業情況,選擇第三方開票平臺。
企業可通過第三方平臺接口完成于自有系統對接,可選擇自行同步發票,也可選擇掃碼開票。后者在線下門店開票中較為常見。
?
?業務流程?
根據業務特點進行需求分析,設計適合自己業務的開票流程。此過程建議與財稅同學保持密切溝通,避免設計出來的開票流程不符合財稅要求。
訂單支付完成后,以電子發票線上開票及退票為例,主要業務流程(含狀態流轉)參考如下:
說明:
- 為了降低發票的退票率及虛開發票的風險,設計中加入了實名認證的環節,確保發票抬頭和證件號真實有效,且一一對應。
- 部分歷史數據(歷史已經線下開過票的訂單),可考慮通過下單或支付時間進行限制,規避重復開票的風險。
- 財務審核環節可根據公司財稅要求確定是否需要保留,但紙質發票流程一般都會涉及到后臺審核。
?
?功能?
線上開票系統主要涉及用戶和業務后臺,核心功能點參考下圖:
?
說明:
?
解決了上述問題后,就輪到我們的開票系統獨有的內部業務問題了:
?
?
理順了內部業務邏輯,最后就該思考如何對外提供服務,并盡量提升服務體驗,也就是要解決以下問題:
?
?
?
?系統使用者?
通常對于一個集團公司來說,業務結構是呈現金字塔形狀的,即集團公司下有不同的子公司,子公司下有不同的產品線,但也偶爾有一些產品線是由不同的子公司甚至外部公司組成。
?
?
因此我們應該把終端產品線作為租戶。
?
?終端隔離?
明確了系統使用者,接下來就需要考慮租戶應該隔離哪些數據。
目前市面上的開票供應商提供的都是銷方賬戶隔離,有兩點限制:
?
?
而在實際的線下開票中,我們還會碰到以下場景:
?
?
因此,我們的租戶對應的數據映射關系如下:
?
?
?
?邏輯架構?
發票的生成需要以下必要元素:
?
?
按微服務來說,就是我們要依賴4個外部服務:
?
?
于是,我們的邏輯架構圖應該如下圖:
?
?金額計算?
發票里的各項屬性的含義可以參考上文,通過各項金額的定義,我們可以得到以下計算公式:
?
?
?
?發票拆分?
各個產品線在申請開票時都是希望訂單和發票會一一對應,但實際情況是,受限于企業資質,銷方開出的每張發票是有不含稅金額上限的,超出上限就不能開具發票。
底層的開票供應商通常都具有自動拆票功能,即一筆訂單的不含稅金額超過上限,就會自動拆分成多張發票。但開票供應商通常會建議我們自己封裝一套拆票邏輯,這是因為供應商的拆票是面向單筆訂單的,如果業務上是多筆訂單合并開票,供應商拆票后就會出現某幾張發票的金額遠小于上限,造成發票份數的浪費。
稅務每月能從稅務局領取的發票份數是有限的。
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((剩余額度/商品單價), 商品數量),如果全部商品數量都可以放下則切換到下一個商品,否則將剩余商品數量放到下一張發票里;
上述的規則說明中是以技術服務類這種沒有規格的商品作為說明的,如果是實體類商品則需把商品規格也加入到拆分維度中。
?
- 對于后臺操作人員來說,批量處理可以很大程度上提升工作效率。
- 不同的發票狀態對應不同的操作類型。
- 銷售后臺需考慮紙質發票的作廢流程。
- 紙質發票的快遞狀態跟蹤也可考慮作為低優先級功能逐步優化。
?其他業務場景?
實際業務中,還會涉及一些特殊場景,如提前開票、退款退票等。
?
提前開票,即客戶先開發票再進行支付。很多大企業內部報銷審核嚴格,需要銷售方先開具發票,然后根據發票報銷打款。
退款退票,即客戶購買后,由于各種原因進行了退款操作,包含全部退款或部分退款。如果已經開具發票,則需要同步完成退票流程。針對全部退款的情況,只需要走正常退票流程即可。但針對部分退款的情況,原來已經開具發票的需要整體退票之后,再開具剩余未退款金額的發票。
這些特殊場景也需要完成線上化,通過系統閉環所有開票流程,其優先級可根據自身業務需求制定。
?
三、技術設計
-
對于技術人員來說,在設計任何一個系統時首先都會遇到以下個問題:
- 系統面向的使用者是誰?
- 租戶隔離要隔離什么數據?
- 系統的外部依賴有哪些,邏輯架構應該怎樣設計?
- 發票上的各項金額分別代表什么含義,如何計算?
- 多訂單合并開票或大額訂單開票時,發票應該如何拆分?
- 接口時序是怎樣的,哪些步驟應該異步化?
- 同一銷方賬戶內訂單號必須唯一;
- 銷方賬戶每張發票的不含稅金額有上限;
- 相同的稅收分類編碼在不同產品線中有不同的商品名稱;
- 相同的商品在不同產品線或者同一產品線中有不同的商品規格、商品單價;
- 租戶和銷方賬戶是1對1的關系;
- 租戶和單張發票不含稅金額上限是1對1的關系;
- 租戶和訂單編號是1對N的關系;
- 租戶和允許開票的商品SKU(即允許的名稱/稅收分類編碼/規格/單價組合)是1對N的關系;
- 發票主體;
- 訂單信息;
- 商品信息;
- 實際開票能力;
- 用戶中心負責提供經過實名認證的發票主體信息;
- 訂單中心負責提供訂單編號以及包含的商品SKU購買數量數據;
- 商品中心負責提供商品SKU的名稱、稅收分類編碼、商品規格、含稅單價數據;
- 開票供應商負責提供實際的電子開票能力;
- 稅額=round((數量×含稅單價)×稅率)÷(1+稅率),2),保留2位小數,舍入模式是四舍五入。
- 稅額=round((數量×不含稅單價×稅率), 2) ,保留2位小數,舍入模式是四舍五入。
- 不含稅單價=round(含稅單價/(1+稅率), 8),保留8位小數,舍入模式是四舍五入。
詳細拆分步驟見流程圖:
?
拆分示例:
假設銷方單張發票的不含稅金額上限為10萬,產品線提交的原始開票訂單以及商品列表如下:
?
我們期望不含稅單價溢出商品拆分后,單價溢出的商品8被拆分成兩組商品:
?
我們期望最終的拆分結果為7張發票:
2. 紅票拆分
紅票是根據對應藍票來開具的,紅票和藍票有以下映射關系:
?
所以只需要根據藍票的拆分結果就能完成紅票拆分。
參照藍票拆分中的實體定義,對紅票開票流程中涉及的對象實體進行抽象:
?
?接口時序和異步化?
邏輯架構中的訂單中心、用戶中心、商品中心都是提供只讀服務,因此可以采用同步調用快速失敗的方式進行熔斷。但是對于大額訂單開票來說,藍票拆分邏輯較為復雜耗時,且和開票供應商交互生成發票的過程不可控,因此我們可以將這兩個步驟異步化,并且在異步化流程中加入錯誤重試機制。
開具藍票的接口時序:
?
開具紅票的接口時序:
?
異步流程:
在異步流程中,我們需要實現以下兩個功能:
1. 藍票/紅票拆分成藍票/紅票子流程,拆分出的子流程有4種狀態:
a. 供應商待申請 -尚未提交給開票供應商;
b. 供應商開票成功;
c. 供應商開票失敗;
d. 供應商開票中 - 既不是開票成功,也不是開票失敗的其他狀態都屬于開票中;
2. 藍票/紅票子流程提交給開票供應商生成電子發票,包括開票結果的查詢以及開票異常的重試;
詳細步驟見流程圖:
以上就是網易云信線上開票系統設計的實踐,目前該功能已經上線,歡迎大家體驗!
?
想要探討更多技術干貨,歡迎關注“網易智企技術+”公眾號。
?
*各渠道文章轉載需注明來源及作者
?
總結
以上是生活随笔為你收集整理的线上开票系统设计实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刷新,开启云信下一个 5 年:专注做技术
- 下一篇: 200+猫在线待撸!来pick你最爱的那