Skip to content

Commit

Permalink
feat(gui): support extended GUI format validation
Browse files Browse the repository at this point in the history
  • Loading branch information
enylin committed Oct 28, 2021
1 parent f240535 commit 617920a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 8 deletions.
26 changes: 21 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* 台灣身分證字號驗證
* 舊版臺灣地區無戶籍國民、外國人、大陸地區人民及香港或澳門居民之專屬代號
* 新版臺灣地區無戶籍國民、外國人、大陸地區人民及香港或澳門居民之專屬代號
* 公司統一編號驗證
* 公司統一編號驗證 (2021/10/28 新增新版統一編號檢查)
* 自然人憑證編號驗證
* 電子發票手機條碼驗證
* 電子發票捐贈碼驗證
Expand All @@ -25,8 +25,10 @@ CDN:
<meta charset="utf-8" />
<script src="https://unpkg.com/taiwan-id-validator"></script>
<script>
console.log(taiwanIdValidator.isGuiNumberValid('04595252', true)); // 新版統一編號
console.log(taiwanIdValidator.isGuiNumberValid('12345675')); // 統一編號
console.log(taiwanIdValidator.isNationalIdentificationNumberValid('A12345678')); // 身分證字號
console.log(taiwanIdValidator.isNationalIdentificationNumberValid('A123456789')); // 身分證字號
console.log(taiwanIdValidator.isResidentCertificateNumberValid('AA00000009')); // 居留證編號 (舊式與新式)
console.log(taiwanIdValidator.isNewResidentCertificateNumberValid('A800000014')); // 新式居留證編號
console.log(taiwanIdValidator.isOriginalResidentCertificateNumberValid('AA00000009')); // 舊式居留證編號
Expand All @@ -43,8 +45,10 @@ JavaScript:

var taiwanIdValidator = require("taiwan-id-validator");

console.log(taiwanIdValidator.isGuiNumberValid('04595252', true)); // 新版統一編號

console.log(taiwanIdValidator.isGuiNumberValid('12345675')); // 統一編號
console.log(taiwanIdValidator.isNationalIdentificationNumberValid('A12345678')); // 身分證字號
console.log(taiwanIdValidator.isNationalIdentificationNumberValid('A123456789')); // 身分證字號
console.log(taiwanIdValidator.isResidentCertificateNumberValid('AA00000009')); // 居留證編號 (舊式與新式)
console.log(taiwanIdValidator.isNewResidentCertificateNumberValid('A800000014')); // 新式居留證編號
console.log(taiwanIdValidator.isOriginalResidentCertificateNumberValid('AA00000009')); // 舊式居留證編號
Expand Down Expand Up @@ -76,8 +80,10 @@ import {
isEInvoiceDonateCodeValid // 捐贈碼
} from 'taiwan-id-validator'

console.log(isGuiNumberValid('04595252', true)) // 新版統一編號

console.log(isGuiNumberValid('12345675'))
console.log(isNationalIdentificationNumberValid('A12345678'))
console.log(isNationalIdentificationNumberValid('A123456789'))
console.log(isResidentCertificateNumberValid('AA00000009')) // 居留證編號 (舊式與新式)
console.log(isNewResidentCertificateNumberValid('A800000014')) // 新式居留證編號
console.log(isOriginalResidentCertificateNumberValid('AA00000009')) // 舊式居留證編號
Expand Down Expand Up @@ -107,7 +113,7 @@ const isCellPhoneBarcode = isEInvoiceCellPhoneBarcodeValid
const isDonateCode = isEInvoiceDonateCodeValid
```

## 新式外來人口統一證號檢查
## 補充資料

### 內政部移民署新式外來人口統一證號專案說明

Expand All @@ -122,3 +128,13 @@ const isDonateCode = isEInvoiceDonateCodeValid
1. [新式外來人口統一證號懶人包](https://www.immigration.gov.tw/5382/5385/7445/238440/238442/241508/)
1. [資料標準](https://schema.gov.tw/Commonality/Commonality/Common%20Data)
1. [Introduction to the Replacement Issuance of New UI No. for Foreign Nationals](https://www.roc-taiwan.org/uploads/sites/3/2021/01/Introduction-to-the-Replacement-Issuance-of-New-UI-No.-for-Foreign-Nationals.pdf)

### 新版統一編號

一、營利事業統一編號(下稱統一編號)供營利事業及扣繳單位配號使用,預估空號將於113年用罄。\
二、為擴增統一編號號碼並與現行配賦之統一編號相容(新舊統一編號格式相同),後續請公私部門配合修改統一編號檢核程式,主要係修正「檢查邏輯由可被『10』整除改為可被『5』整除」,相關說明詳如附件。\
三、全國公私部門倘有使用統一編號檢核程式,請於112年3月31日前完成統一編號檢核程式修改作業,相關系統文件請併同檢視修正。\
四、預計112年4月以後,將視舊號餘存狀況逐步釋出新產製之統一編號。\

參考資料:
[附件-營利事業統一編號檢查碼邏輯修正說明](https://www.fia.gov.tw/download/37cd8c16911244c29e00f85b2be4ebab)
13 changes: 10 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@
* Verify the input is a valid GUI Number (中華民國統一編號)
*
* @param { string | number } input GUI Number
* @param { boolean } extended check input using extended format: https://www.fia.gov.tw/singlehtml/6?cntId=aaa97a9dcf2649d5bdd317f554e24f75
* @returns { boolean } is `input` a valid GUI number
*/
export function isGuiNumberValid(input: string | number): boolean {
export function isGuiNumberValid(
input: string | number,
extended = false
): boolean {
if (typeof input !== 'string' && typeof input !== 'number') return false

/**
Expand Down Expand Up @@ -55,9 +59,12 @@ export function isGuiNumberValid(input: string | number): boolean {
* 4-1: 若是餘數為 0,則為正確的統一編號
* 4-2: 若是餘數為 9,且原統一編號的第七位是 7,則也為正確的統一編號
*/

const divisor = extended ? 5 : 10

return (
checksum % 10 === 0 ||
(parseInt(n.charAt(6), 10) === 7 && (checksum + 1) % 10 === 0)
checksum % divisor === 0 ||
(parseInt(n.charAt(6), 10) === 7 && (checksum + 1) % divisor === 0)
)
}

Expand Down
22 changes: 22 additions & 0 deletions test/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ describe('isGuiNumValid', () => {
expect(isGuiNumberValid(12345676)).toBe(true)
expect(isGuiNumberValid('12345675')).toBe(true)
expect(isGuiNumberValid('12345676')).toBe(true) // 6th char is 7
expect(isGuiNumberValid('04595257')).toBe(true)
})

it('should return false if the input is incorrect', () => {
Expand All @@ -35,6 +36,27 @@ describe('isGuiNumValid', () => {
expect(isGuiNumberValid('123456769')).toBe(false)
expect(isGuiNumberValid(123456769)).toBe(false)
expect(isGuiNumberValid('12345678')).toBe(false)
expect(isGuiNumberValid('12345670')).toBe(false)
expect(isGuiNumberValid('04595252')).toBe(false)
})
})

describe('isGuiNumValid extended format', () => {
it('should return true if the input is correct', () => {
expect(isGuiNumberValid(12345676)).toBe(true)
expect(isGuiNumberValid('12345675', true)).toBe(true)
expect(isGuiNumberValid('12345676', true)).toBe(true) // 6th char is 7
expect(isGuiNumberValid('12345670', true)).toBe(true)
expect(isGuiNumberValid('04595257', true)).toBe(true)
expect(isGuiNumberValid('04595252', true)).toBe(true)
})

it('should return false if the input is incorrect', () => {
expect(isGuiNumberValid('1234567', true)).toBe(false)
expect(isGuiNumberValid(1234567, true)).toBe(false)
expect(isGuiNumberValid('123456769', true)).toBe(false)
expect(isGuiNumberValid(123456769, true)).toBe(false)
expect(isGuiNumberValid('12345678', true)).toBe(false)
})
})

Expand Down

0 comments on commit 617920a

Please sign in to comment.