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