“意大利的電子發(fā)票集成到Node.js項(xiàng)目里?光是200頁(yè)的FatturaPA規(guī)范、沒文檔的跨字段校驗(yàn)、SDI返回的神秘錯(cuò)誤碼,就夠你喝一壺了。npm上的相關(guān)庫(kù)要么年久失修,要么用PHP寫的。”——這種痛苦,做過的人不用解釋。但一個(gè)叫fattura-elettronica-sdi-builder的開源TypeScript庫(kù),把流程壓縮到三個(gè)函數(shù)。
下面逐條拆解它為什么能省下你無數(shù)個(gè)抓狂的下午。
第一,依賴輕到可以忽略。 安裝一個(gè)命令:npm install fattura-elettronica-sdi-builder。沒有笨重的外部依賴,校驗(yàn)邏輯全部手寫且?guī)ь愋停\(yùn)行時(shí)零外部庫(kù)。這意味著不會(huì)陷入“裝個(gè)發(fā)票庫(kù)還要整一套JVM”的地獄。
第二,工作流就三步,而且返回結(jié)果從不亂拋異常。 庫(kù)只暴露三個(gè)函數(shù),必須按順序用:applyDefaults、validate、buildXml。它們都返回統(tǒng)一的Result類型——一種要么成功帶值、要么失敗帶錯(cuò)誤的對(duì)象,絕不拋未處理的異常。你終于可以和try-catch堆棧說再見了。
第三,給你偷懶的默認(rèn)值。 applyDefaults會(huì)幫你自動(dòng)補(bǔ)上貨幣(EUR)和當(dāng)天日期等可選字段。比如發(fā)票中的Divisa和Data你不填,它就替你設(shè)好。但這不是魔法,只是務(wù)實(shí)。
第四,校驗(yàn)不依賴Schema,規(guī)則更貼近真實(shí)SDI。 傳說的200頁(yè)規(guī)范里藏著一堆文檔沒寫的交叉驗(yàn)證規(guī)則,這個(gè)庫(kù)把它們做進(jìn)了validate。例如,B2B場(chǎng)景下CodiceDestinatario必須是7個(gè)字符,這類暗坑它直接幫你檢查,不必等SDI返回SC0046之類的編號(hào)去猜謎。
第五,一個(gè)完整的B2B發(fā)票生成示例,22%增值稅、銀行轉(zhuǎn)賬支付,從零到XML。 構(gòu)建一個(gè)FatturaElettronicaInput對(duì)象,填好傳輸數(shù)據(jù)、銷售方和購(gòu)買方的稅號(hào)、地址,加上單據(jù)頭(TD01類型、編號(hào))、一行包含服務(wù)描述和單價(jià)的明細(xì)、匯總的稅額,最后塞進(jìn)付款指令(MP05表示轉(zhuǎn)賬)。先調(diào)用applyDefaults補(bǔ)全缺省值,再validate檢查,如果validation.ok為真,一個(gè)buildXml就能輸出能被SDI吃掉的XML。
這不是什么顛覆性技術(shù),只是終于有人把意大利官僚系統(tǒng)的技術(shù)債消化了,做成三個(gè)函數(shù)交給你。用CedentePrestatore、CessionarioCommittente這類意大利名稱你別怕,結(jié)構(gòu)本身已經(jīng)替你扛住了復(fù)雜度。如果要吐槽,大概只剩一點(diǎn):200頁(yè)的規(guī)范還能壓榨出多少?zèng)]人發(fā)現(xiàn)的交叉規(guī)則?但至少此刻,你有了一把還算鋒利的刀。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.