stdnum 1.10.0 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/no/fodselsnummer.js +2 -2
- package/lib/esm/no/fodselsnummer.js +2 -2
- package/package.json +5 -2
- package/src/ad/index.ts +1 -0
- package/src/ad/nrt.spec.ts +36 -0
- package/src/ad/nrt.ts +87 -0
- package/src/al/index.ts +1 -0
- package/src/al/nipt.spec.ts +43 -0
- package/src/al/nipt.ts +111 -0
- package/src/ar/cbu.spec.ts +28 -0
- package/src/ar/cbu.ts +96 -0
- package/src/ar/cuit.spec.ts +28 -0
- package/src/ar/cuit.ts +102 -0
- package/src/ar/dni.spec.ts +22 -0
- package/src/ar/dni.ts +72 -0
- package/src/ar/index.ts +3 -0
- package/src/at/businessid.spec.ts +34 -0
- package/src/at/businessid.ts +73 -0
- package/src/at/index.ts +4 -0
- package/src/at/tin.spec.ts +173 -0
- package/src/at/tin.ts +140 -0
- package/src/at/uid.spec.ts +44 -0
- package/src/at/uid.ts +84 -0
- package/src/at/vnr.spec.ts +38 -0
- package/src/at/vnr.ts +84 -0
- package/src/au/abn.spec.ts +28 -0
- package/src/au/abn.ts +78 -0
- package/src/au/acn.spec.ts +34 -0
- package/src/au/acn.ts +76 -0
- package/src/au/index.ts +3 -0
- package/src/au/tfn.spec.ts +28 -0
- package/src/au/tfn.ts +79 -0
- package/src/az/index.ts +2 -0
- package/src/az/pin.spec.ts +16 -0
- package/src/az/pin.ts +61 -0
- package/src/az/tin.spec.ts +28 -0
- package/src/az/tin.ts +64 -0
- package/src/ba/index.ts +1 -0
- package/src/ba/jmbg.spec.ts +28 -0
- package/src/ba/jmbg.ts +85 -0
- package/src/be/bis.spec.ts +184 -0
- package/src/be/bis.ts +85 -0
- package/src/be/index.ts +4 -0
- package/src/be/insz.spec.ts +51 -0
- package/src/be/insz.ts +55 -0
- package/src/be/nn.spec.ts +117 -0
- package/src/be/nn.ts +77 -0
- package/src/be/personIdentifierHelpers.spec.ts +254 -0
- package/src/be/personIdentifierHelpers.ts +130 -0
- package/src/be/vat.spec.ts +46 -0
- package/src/be/vat.ts +84 -0
- package/src/bg/egn.spec.ts +28 -0
- package/src/bg/egn.ts +75 -0
- package/src/bg/index.ts +3 -0
- package/src/bg/pnf.spec.ts +28 -0
- package/src/bg/pnf.ts +73 -0
- package/src/bg/vat.spec.ts +34 -0
- package/src/bg/vat.ts +120 -0
- package/src/br/cnpj.spec.ts +34 -0
- package/src/br/cnpj.ts +89 -0
- package/src/br/cpf.spec.ts +34 -0
- package/src/br/cpf.ts +87 -0
- package/src/br/index.ts +2 -0
- package/src/by/index.ts +1 -0
- package/src/by/unp.spec.ts +34 -0
- package/src/by/unp.ts +108 -0
- package/src/bz/index.ts +1 -0
- package/src/bz/tin.spec.ts +28 -0
- package/src/bz/tin.ts +67 -0
- package/src/ca/bn.spec.ts +40 -0
- package/src/ca/bn.ts +88 -0
- package/src/ca/gst.spec.ts +34 -0
- package/src/ca/gst.ts +70 -0
- package/src/ca/index.ts +5 -0
- package/src/ca/pst.spec.ts +28 -0
- package/src/ca/pst.ts +71 -0
- package/src/ca/qst.spec.ts +47 -0
- package/src/ca/qst.ts +88 -0
- package/src/ca/sin.spec.ts +34 -0
- package/src/ca/sin.ts +72 -0
- package/src/ch/index.ts +3 -0
- package/src/ch/ssn.spec.ts +50 -0
- package/src/ch/ssn.ts +74 -0
- package/src/ch/uid.spec.ts +34 -0
- package/src/ch/uid.ts +82 -0
- package/src/ch/vat.spec.ts +28 -0
- package/src/ch/vat.ts +83 -0
- package/src/cl/index.ts +2 -0
- package/src/cl/run.ts +13 -0
- package/src/cl/rut.spec.ts +50 -0
- package/src/cl/rut.ts +97 -0
- package/src/cn/index.ts +2 -0
- package/src/cn/ric.spec.ts +34 -0
- package/src/cn/ric.ts +86 -0
- package/src/cn/uscc.spec.ts +34 -0
- package/src/cn/uscc.ts +110 -0
- package/src/co/index.ts +1 -0
- package/src/co/nit.spec.ts +40 -0
- package/src/co/nit.ts +85 -0
- package/src/cr/cpf.spec.ts +34 -0
- package/src/cr/cpf.ts +93 -0
- package/src/cr/cpj.spec.ts +28 -0
- package/src/cr/cpj.ts +111 -0
- package/src/cr/cr.spec.ts +28 -0
- package/src/cr/cr.ts +75 -0
- package/src/cr/index.ts +3 -0
- package/src/cu/index.ts +1 -0
- package/src/cu/ni.spec.ts +34 -0
- package/src/cu/ni.ts +74 -0
- package/src/cy/index.ts +1 -0
- package/src/cy/vat.spec.ts +28 -0
- package/src/cy/vat.ts +98 -0
- package/src/cz/dic.spec.ts +28 -0
- package/src/cz/dic.ts +127 -0
- package/src/cz/index.ts +2 -0
- package/src/cz/rc.spec.ts +44 -0
- package/src/cz/rc.ts +95 -0
- package/src/de/idnr.spec.ts +34 -0
- package/src/de/idnr.ts +91 -0
- package/src/de/index.ts +6 -0
- package/src/de/passport.spec.ts +31 -0
- package/src/de/passport.ts +86 -0
- package/src/de/pwnr.spec.ts +62 -0
- package/src/de/pwnr.ts +190 -0
- package/src/de/stnr.spec.ts +85 -0
- package/src/de/stnr.ts +193 -0
- package/src/de/svnr.spec.ts +56 -0
- package/src/de/svnr.ts +158 -0
- package/src/de/vat.spec.ts +28 -0
- package/src/de/vat.ts +74 -0
- package/src/dk/cpr.spec.ts +34 -0
- package/src/dk/cpr.ts +129 -0
- package/src/dk/cvr.spec.ts +28 -0
- package/src/dk/cvr.ts +81 -0
- package/src/dk/index.ts +2 -0
- package/src/do/cedula.spec.ts +34 -0
- package/src/do/cedula.ts +67 -0
- package/src/do/index.ts +3 -0
- package/src/do/ncf.spec.ts +34 -0
- package/src/do/ncf.ts +133 -0
- package/src/do/rnc.spec.ts +40 -0
- package/src/do/rnc.ts +74 -0
- package/src/dz/index.ts +1 -0
- package/src/dz/nif.spec.ts +39 -0
- package/src/dz/nif.ts +80 -0
- package/src/ec/ci.spec.ts +28 -0
- package/src/ec/ci.ts +92 -0
- package/src/ec/index.ts +2 -0
- package/src/ec/ruc.spec.ts +37 -0
- package/src/ec/ruc.ts +117 -0
- package/src/ee/ik.spec.ts +28 -0
- package/src/ee/ik.ts +114 -0
- package/src/ee/index.ts +3 -0
- package/src/ee/kmkr.spec.ts +28 -0
- package/src/ee/kmkr.ts +76 -0
- package/src/ee/registrikood.spec.ts +28 -0
- package/src/ee/registrikood.ts +80 -0
- package/src/eg/index.ts +1 -0
- package/src/eg/tn.spec.ts +44 -0
- package/src/eg/tn.ts +96 -0
- package/src/es/cif.spec.ts +43 -0
- package/src/es/cif.ts +84 -0
- package/src/es/dni.spec.ts +28 -0
- package/src/es/dni.ts +83 -0
- package/src/es/index.ts +5 -0
- package/src/es/nie.spec.ts +28 -0
- package/src/es/nie.ts +79 -0
- package/src/es/nif.spec.ts +52 -0
- package/src/es/nif.ts +95 -0
- package/src/es/nss.spec.ts +28 -0
- package/src/es/nss.ts +132 -0
- package/src/exceptions.ts +66 -0
- package/src/fi/alv.spec.ts +28 -0
- package/src/fi/alv.ts +76 -0
- package/src/fi/hetu.spec.ts +37 -0
- package/src/fi/hetu.ts +108 -0
- package/src/fi/index.ts +3 -0
- package/src/fi/ytunnus.spec.ts +28 -0
- package/src/fi/ytunnus.ts +49 -0
- package/src/fo/index.ts +1 -0
- package/src/fo/vn.spec.ts +34 -0
- package/src/fo/vn.ts +71 -0
- package/src/fr/index.ts +5 -0
- package/src/fr/nif.spec.ts +34 -0
- package/src/fr/nif.ts +82 -0
- package/src/fr/nir.spec.ts +36 -0
- package/src/fr/nir.ts +98 -0
- package/src/fr/siren.spec.ts +28 -0
- package/src/fr/siren.ts +68 -0
- package/src/fr/siret.spec.ts +38 -0
- package/src/fr/siret.ts +79 -0
- package/src/fr/tva.spec.ts +40 -0
- package/src/fr/tva.ts +125 -0
- package/src/gb/index.ts +3 -0
- package/src/gb/nino-prefixes.ts +245 -0
- package/src/gb/nino.spec.ts +80 -0
- package/src/gb/nino.ts +80 -0
- package/src/gb/utr.spec.ts +28 -0
- package/src/gb/utr.ts +76 -0
- package/src/gb/vat.spec.ts +40 -0
- package/src/gb/vat.ts +112 -0
- package/src/gen/ean.spec.ts +34 -0
- package/src/gen/ean.ts +71 -0
- package/src/gen/index.ts +1 -0
- package/src/gh/index.ts +1 -0
- package/src/gh/tin.spec.ts +42 -0
- package/src/gh/tin.ts +93 -0
- package/src/gn/index.ts +1 -0
- package/src/gn/nifp.spec.ts +40 -0
- package/src/gn/nifp.ts +72 -0
- package/src/gr/amka.spec.ts +28 -0
- package/src/gr/amka.ts +76 -0
- package/src/gr/index.ts +2 -0
- package/src/gr/vat.spec.ts +34 -0
- package/src/gr/vat.ts +84 -0
- package/src/gt/cui.spec.ts +34 -0
- package/src/gt/cui.ts +110 -0
- package/src/gt/index.ts +2 -0
- package/src/gt/nit.spec.ts +34 -0
- package/src/gt/nit.ts +86 -0
- package/src/hk/hkid.spec.ts +52 -0
- package/src/hk/hkid.ts +90 -0
- package/src/hk/index.ts +1 -0
- package/src/hr/index.ts +1 -0
- package/src/hr/oib.spec.ts +28 -0
- package/src/hr/oib.ts +67 -0
- package/src/hu/anum.spec.ts +28 -0
- package/src/hu/anum.ts +71 -0
- package/src/hu/index.ts +1 -0
- package/src/id/index.ts +1 -0
- package/src/id/npwp.spec.ts +34 -0
- package/src/id/npwp.ts +116 -0
- package/src/ie/index.ts +2 -0
- package/src/ie/pps.spec.ts +58 -0
- package/src/ie/pps.ts +81 -0
- package/src/ie/vat.spec.ts +40 -0
- package/src/ie/vat.ts +99 -0
- package/src/il/hp.spec.ts +38 -0
- package/src/il/hp.ts +75 -0
- package/src/il/idnr.spec.ts +28 -0
- package/src/il/idnr.ts +70 -0
- package/src/il/index.ts +2 -0
- package/src/in/aadhaar.spec.ts +40 -0
- package/src/in/aadhaar.ts +85 -0
- package/src/in/epic.spec.ts +34 -0
- package/src/in/epic.ts +85 -0
- package/src/in/gstin.spec.ts +34 -0
- package/src/in/gstin.ts +156 -0
- package/src/in/index.ts +4 -0
- package/src/in/pan.spec.ts +40 -0
- package/src/in/pan.ts +93 -0
- package/src/index.ts +404 -0
- package/src/is/index.ts +2 -0
- package/src/is/kennitala.spec.ts +46 -0
- package/src/is/kennitala.ts +80 -0
- package/src/is/vsk.spec.ts +22 -0
- package/src/is/vsk.ts +60 -0
- package/src/it/aic.spec.ts +40 -0
- package/src/it/aic.ts +97 -0
- package/src/it/codicefiscale.spec.ts +28 -0
- package/src/it/codicefiscale.ts +167 -0
- package/src/it/index.ts +3 -0
- package/src/it/iva.spec.ts +28 -0
- package/src/it/iva.ts +65 -0
- package/src/jp/cn.spec.ts +28 -0
- package/src/jp/cn.ts +77 -0
- package/src/jp/index.ts +1 -0
- package/src/ke/index.ts +1 -0
- package/src/ke/pin.spec.ts +34 -0
- package/src/ke/pin.ts +77 -0
- package/src/kr/brn.spec.ts +28 -0
- package/src/kr/brn.ts +91 -0
- package/src/kr/index.ts +2 -0
- package/src/kr/rrn.spec.ts +34 -0
- package/src/kr/rrn.ts +104 -0
- package/src/li/index.ts +1 -0
- package/src/li/peid.spec.ts +22 -0
- package/src/li/peid.ts +71 -0
- package/src/lt/asmens.spec.ts +28 -0
- package/src/lt/asmens.ts +73 -0
- package/src/lt/index.ts +2 -0
- package/src/lt/pvm.spec.ts +34 -0
- package/src/lt/pvm.ts +75 -0
- package/src/lu/index.ts +1 -0
- package/src/lu/tva.spec.ts +28 -0
- package/src/lu/tva.ts +70 -0
- package/src/lv/index.ts +1 -0
- package/src/lv/pvn.spec.ts +44 -0
- package/src/lv/pvn.ts +102 -0
- package/src/ma/ice.spec.ts +39 -0
- package/src/ma/ice.ts +72 -0
- package/src/ma/ice9.spec.ts +28 -0
- package/src/ma/ice9.ts +62 -0
- package/src/ma/index.ts +2 -0
- package/src/mc/index.ts +1 -0
- package/src/mc/tva.spec.ts +28 -0
- package/src/mc/tva.ts +67 -0
- package/src/md/idno.spec.ts +28 -0
- package/src/md/idno.ts +78 -0
- package/src/md/index.ts +1 -0
- package/src/me/index.ts +2 -0
- package/src/me/jmbg.ts +17 -0
- package/src/me/pib.spec.ts +158 -0
- package/src/me/pib.ts +77 -0
- package/src/mk/edb.spec.ts +50 -0
- package/src/mk/edb.ts +88 -0
- package/src/mk/index.ts +2 -0
- package/src/mk/jmbg.ts +17 -0
- package/src/mt/index.ts +1 -0
- package/src/mt/vat.spec.ts +28 -0
- package/src/mt/vat.ts +69 -0
- package/src/mu/index.ts +1 -0
- package/src/mu/nid.spec.ts +34 -0
- package/src/mu/nid.ts +89 -0
- package/src/mx/banks.ts +658 -0
- package/src/mx/clabe.spec.ts +68 -0
- package/src/mx/clabe.ts +105 -0
- package/src/mx/curp.spec.ts +28 -0
- package/src/mx/curp.ts +261 -0
- package/src/mx/index.ts +3 -0
- package/src/mx/rfc.spec.ts +69 -0
- package/src/mx/rfc.ts +193 -0
- package/src/my/index.ts +1 -0
- package/src/my/nric.spec.ts +40 -0
- package/src/my/nric.ts +91 -0
- package/src/nl/bsn.spec.ts +68 -0
- package/src/nl/bsn.ts +81 -0
- package/src/nl/btw.spec.ts +40 -0
- package/src/nl/btw.ts +95 -0
- package/src/nl/index.ts +3 -0
- package/src/nl/onderwijsnummer.spec.ts +34 -0
- package/src/nl/onderwijsnummer.ts +77 -0
- package/src/no/fodselsnummer.spec.ts +56 -0
- package/src/no/fodselsnummer.ts +118 -0
- package/src/no/index.ts +4 -0
- package/src/no/kontonr.spec.ts +34 -0
- package/src/no/kontonr.ts +84 -0
- package/src/no/mva.spec.ts +28 -0
- package/src/no/mva.ts +80 -0
- package/src/no/orgnr.spec.ts +28 -0
- package/src/no/orgnr.ts +75 -0
- package/src/nz/bank.spec.ts +28 -0
- package/src/nz/bank.ts +238 -0
- package/src/nz/index.ts +2 -0
- package/src/nz/ird.spec.ts +34 -0
- package/src/nz/ird.ts +102 -0
- package/src/pe/ce.spec.ts +46 -0
- package/src/pe/ce.ts +61 -0
- package/src/pe/cui.spec.ts +28 -0
- package/src/pe/cui.ts +85 -0
- package/src/pe/index.ts +3 -0
- package/src/pe/ruc.spec.ts +46 -0
- package/src/pe/ruc.ts +84 -0
- package/src/pk/cnic.spec.ts +34 -0
- package/src/pk/cnic.ts +97 -0
- package/src/pk/index.ts +2 -0
- package/src/pk/ntn.spec.ts +22 -0
- package/src/pk/ntn.ts +65 -0
- package/src/pl/index.ts +3 -0
- package/src/pl/nip.spec.ts +34 -0
- package/src/pl/nip.ts +74 -0
- package/src/pl/pesel.spec.ts +34 -0
- package/src/pl/pesel.ts +97 -0
- package/src/pl/regon.spec.ts +52 -0
- package/src/pl/regon.ts +88 -0
- package/src/pt/cc.spec.ts +43 -0
- package/src/pt/cc.ts +74 -0
- package/src/pt/index.ts +3 -0
- package/src/pt/nif.spec.ts +28 -0
- package/src/pt/nif.ts +78 -0
- package/src/pt/nipc.ts +27 -0
- package/src/py/cedula.spec.ts +46 -0
- package/src/py/cedula.ts +73 -0
- package/src/py/index.ts +2 -0
- package/src/py/ruc.spec.ts +40 -0
- package/src/py/ruc.ts +93 -0
- package/src/ro/cif.spec.ts +40 -0
- package/src/ro/cif.ts +62 -0
- package/src/ro/cnp.spec.ts +50 -0
- package/src/ro/cnp.ts +158 -0
- package/src/ro/cui.spec.ts +28 -0
- package/src/ro/cui.ts +83 -0
- package/src/ro/index.ts +4 -0
- package/src/ro/onrc.spec.ts +28 -0
- package/src/ro/onrc.ts +109 -0
- package/src/rs/index.ts +2 -0
- package/src/rs/jmbg.ts +16 -0
- package/src/rs/pib.spec.ts +28 -0
- package/src/rs/pib.ts +69 -0
- package/src/ru/index.ts +1 -0
- package/src/ru/inn.spec.ts +32 -0
- package/src/ru/inn.ts +106 -0
- package/src/se/index.ts +3 -0
- package/src/se/orgnr.spec.ts +28 -0
- package/src/se/orgnr.ts +68 -0
- package/src/se/personnummer.spec.ts +45 -0
- package/src/se/personnummer.ts +143 -0
- package/src/se/vat.spec.ts +28 -0
- package/src/se/vat.ts +73 -0
- package/src/sg/index.ts +1 -0
- package/src/sg/uen.spec.ts +46 -0
- package/src/sg/uen.ts +209 -0
- package/src/si/ddv.spec.ts +28 -0
- package/src/si/ddv.ts +76 -0
- package/src/si/emso.spec.ts +15 -0
- package/src/si/emso.ts +27 -0
- package/src/si/index.ts +3 -0
- package/src/si/jmbg.ts +20 -0
- package/src/sk/dph.spec.ts +28 -0
- package/src/sk/dph.ts +71 -0
- package/src/sk/index.ts +2 -0
- package/src/sk/rc.ts +12 -0
- package/src/sm/coe.spec.ts +34 -0
- package/src/sm/coe.ts +80 -0
- package/src/sm/index.ts +1 -0
- package/src/sv/index.ts +1 -0
- package/src/sv/nit.spec.ts +34 -0
- package/src/sv/nit.ts +117 -0
- package/src/th/idnr.spec.ts +41 -0
- package/src/th/idnr.ts +80 -0
- package/src/th/index.ts +3 -0
- package/src/th/moa.spec.ts +62 -0
- package/src/th/moa.ts +85 -0
- package/src/th/tin.spec.ts +77 -0
- package/src/th/tin.ts +56 -0
- package/src/tn/index.ts +1 -0
- package/src/tn/mf.spec.ts +37 -0
- package/src/tn/mf.ts +169 -0
- package/src/tr/index.ts +2 -0
- package/src/tr/tckimlik.spec.ts +40 -0
- package/src/tr/tckimlik.ts +87 -0
- package/src/tr/vkn.spec.ts +28 -0
- package/src/tr/vkn.ts +87 -0
- package/src/tw/ban.spec.ts +28 -0
- package/src/tw/ban.ts +67 -0
- package/src/tw/index.ts +5 -0
- package/src/tw/natid.spec.ts +28 -0
- package/src/tw/natid.ts +105 -0
- package/src/tw/tax_code.spec.ts +34 -0
- package/src/tw/tax_code.ts +98 -0
- package/src/tw/ubn.spec.ts +28 -0
- package/src/tw/ubn.ts +80 -0
- package/src/tw/ui.spec.ts +38 -0
- package/src/tw/ui.ts +107 -0
- package/src/types.ts +82 -0
- package/src/ua/edrpou.spec.ts +28 -0
- package/src/ua/edrpou.ts +88 -0
- package/src/ua/index.ts +2 -0
- package/src/ua/rntrc.spec.ts +28 -0
- package/src/ua/rntrc.ts +77 -0
- package/src/us/ein.spec.ts +28 -0
- package/src/us/ein.ts +179 -0
- package/src/us/index.ts +2 -0
- package/src/us/ssn.spec.ts +28 -0
- package/src/us/ssn.ts +117 -0
- package/src/util/checksum.spec.ts +70 -0
- package/src/util/checksum.ts +258 -0
- package/src/util/index.ts +13 -0
- package/src/util/isValidDate.spec.ts +49 -0
- package/src/util/isValidDate.ts +87 -0
- package/src/util/iso7064.spec.ts +17 -0
- package/src/util/iso7064.ts +8 -0
- package/src/util/pymod.ts +8 -0
- package/src/util/strings/char.ts +18 -0
- package/src/util/strings/clean.spec.ts +15 -0
- package/src/util/strings/clean.ts +305 -0
- package/src/util/strings/format.ts +18 -0
- package/src/util/strings/index.ts +5 -0
- package/src/util/strings/reverseString.ts +3 -0
- package/src/util/strings/splitAt.spec.ts +15 -0
- package/src/util/strings/splitAt.ts +16 -0
- package/src/uy/cedula.spec.ts +28 -0
- package/src/uy/cedula.ts +74 -0
- package/src/uy/index.ts +3 -0
- package/src/uy/nie.spec.ts +28 -0
- package/src/uy/nie.ts +84 -0
- package/src/uy/rut.spec.ts +34 -0
- package/src/uy/rut.ts +99 -0
- package/src/ve/index.ts +1 -0
- package/src/ve/rif.spec.ts +38 -0
- package/src/ve/rif.ts +92 -0
- package/src/vn/index.ts +1 -0
- package/src/vn/mst.spec.ts +40 -0
- package/src/vn/mst.ts +100 -0
- package/src/za/idnr.spec.ts +28 -0
- package/src/za/idnr.ts +84 -0
- package/src/za/index.ts +2 -0
- package/src/za/tin.spec.ts +28 -0
- package/src/za/tin.ts +75 -0
package/src/si/ddv.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID za DDV (Davčna številka, Slovenian VAT number).
|
|
3
|
+
*
|
|
4
|
+
* The DDV number (Davčna številka) is used for VAT (DDV, Davek na dodano
|
|
5
|
+
* vrednost) purposes and consist of 8 digits of which the last is a check
|
|
6
|
+
* digit.
|
|
7
|
+
*
|
|
8
|
+
* ENTITY
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import * as exceptions from '../exceptions';
|
|
12
|
+
import { strings } from '../util';
|
|
13
|
+
import { Validator, ValidateReturn } from '../types';
|
|
14
|
+
import { weightedSum } from '../util/checksum';
|
|
15
|
+
|
|
16
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
17
|
+
return strings.cleanUnicode(input, ' -', 'SI');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const impl: Validator = {
|
|
21
|
+
name: 'Slovenian VAT Number',
|
|
22
|
+
localName: 'Identifikacijska številka za DDV',
|
|
23
|
+
abbreviation: 'ID za DDV',
|
|
24
|
+
compact(input: string): string {
|
|
25
|
+
const [value, err] = clean(input);
|
|
26
|
+
|
|
27
|
+
if (err) {
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return value;
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
format(input: string): string {
|
|
35
|
+
const [value] = clean(input);
|
|
36
|
+
|
|
37
|
+
return value;
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
validate(input: string): ValidateReturn {
|
|
41
|
+
const [value, error] = clean(input);
|
|
42
|
+
|
|
43
|
+
if (error) {
|
|
44
|
+
return { isValid: false, error };
|
|
45
|
+
}
|
|
46
|
+
if (value.length !== 8) {
|
|
47
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
48
|
+
}
|
|
49
|
+
if (!strings.isdigits(value)) {
|
|
50
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const [front, check] = strings.splitAt(value, -1);
|
|
54
|
+
|
|
55
|
+
const sum =
|
|
56
|
+
11 -
|
|
57
|
+
weightedSum(front, {
|
|
58
|
+
weights: [8, 7, 6, 5, 4, 3, 2, 1],
|
|
59
|
+
modulus: 11,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
if (String(sum % 10) !== check) {
|
|
63
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
isValid: true,
|
|
68
|
+
compact: value,
|
|
69
|
+
isIndividual: false,
|
|
70
|
+
isCompany: true,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
76
|
+
impl;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { validate } from './emso';
|
|
2
|
+
|
|
3
|
+
describe('si/emso', () => {
|
|
4
|
+
test.each([
|
|
5
|
+
'0101006500006',
|
|
6
|
+
'1211981500126',
|
|
7
|
+
'1508995500237',
|
|
8
|
+
'2001939010010',
|
|
9
|
+
'2902932505526',
|
|
10
|
+
])('validate:%s', value => {
|
|
11
|
+
const result = validate(value);
|
|
12
|
+
|
|
13
|
+
expect(result.isValid).toEqual(true);
|
|
14
|
+
});
|
|
15
|
+
});
|
package/src/si/emso.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enotna matična številka občana (Unique Master Citizen Number).
|
|
3
|
+
*
|
|
4
|
+
* The EMŠO is used for uniquely identify persons including foreign citizens
|
|
5
|
+
* living in Slovenia, It is issued by Centralni Register Prebivalstva CRP
|
|
6
|
+
* (Central Citizen Registry).
|
|
7
|
+
* The number consists of 13 digits and includes the person's date of birth, a
|
|
8
|
+
* political region of birth and a unique number that encodes a person's gender
|
|
9
|
+
* followed by a check digit.
|
|
10
|
+
*
|
|
11
|
+
* Source:
|
|
12
|
+
* https://en.wikipedia.org/wiki/Unique_Master_Citizen_Number
|
|
13
|
+
* https://sl.wikipedia.org/wiki/Enotna_matična_številka_občana
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { Validator } from '../types';
|
|
17
|
+
import * as jmbg from '../ba/jmbg';
|
|
18
|
+
|
|
19
|
+
const impl: Validator = {
|
|
20
|
+
...jmbg,
|
|
21
|
+
name: 'Slovene Unique Master Citizen Number',
|
|
22
|
+
localName: 'Enotna Matična Številka Občana',
|
|
23
|
+
abbreviation: 'EMŠO',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
27
|
+
impl;
|
package/src/si/index.ts
ADDED
package/src/si/jmbg.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slovene JMBG
|
|
3
|
+
*
|
|
4
|
+
* https://en.wikipedia.org/wiki/Unique_Master_Citizen_Number
|
|
5
|
+
*
|
|
6
|
+
* This is really the EMSO -- here for legacy support
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { Validator } from '../types';
|
|
10
|
+
import * as jmbg from '../ba/jmbg';
|
|
11
|
+
|
|
12
|
+
const impl: Validator = {
|
|
13
|
+
...jmbg,
|
|
14
|
+
name: 'Slovene Unique Master Citizen Number',
|
|
15
|
+
localName: 'Enotna Matična Številka Občana',
|
|
16
|
+
abbreviation: 'EMŠO',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
20
|
+
impl;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { validate, format } from './dph';
|
|
2
|
+
import { InvalidLength, InvalidChecksum } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('sk/dph', () => {
|
|
5
|
+
it('format:SK 202 274 96 19', () => {
|
|
6
|
+
const result = format('SK 202 274 96 19');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('202 274 96 19');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('validate:SK 202 274 96 19', () => {
|
|
12
|
+
const result = validate('SK 202 274 96 19');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('2022749619');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('validate:12345678', () => {
|
|
18
|
+
const result = validate('12345678');
|
|
19
|
+
|
|
20
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:SK 202 274 96 18', () => {
|
|
24
|
+
const result = validate('SK 202 274 96 18');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
27
|
+
});
|
|
28
|
+
});
|
package/src/sk/dph.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IČ DPH (IČ pre daň z pridanej hodnoty, Slovak VAT number).
|
|
3
|
+
*
|
|
4
|
+
* The IČ DPH (Identifikačné číslo pre daň z pridanej hodnoty) is a 10-digit
|
|
5
|
+
* number used for VAT purposes. It has a straightforward checksum.
|
|
6
|
+
*
|
|
7
|
+
* Source
|
|
8
|
+
*
|
|
9
|
+
* ENTITY
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import * as exceptions from '../exceptions';
|
|
13
|
+
import { strings } from '../util';
|
|
14
|
+
import { Validator, ValidateReturn } from '../types';
|
|
15
|
+
|
|
16
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
17
|
+
return strings.cleanUnicode(input, ' -', 'SK');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const impl: Validator = {
|
|
21
|
+
name: 'Slovak VAT Number',
|
|
22
|
+
localName: 'Identifikačné Číslo pre Daň z Pridanej Hodnoty',
|
|
23
|
+
abbreviation: 'IČ DPH',
|
|
24
|
+
compact(input: string): string {
|
|
25
|
+
const [value, err] = clean(input);
|
|
26
|
+
|
|
27
|
+
if (err) {
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return value;
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
format(input: string): string {
|
|
35
|
+
const [value] = clean(input);
|
|
36
|
+
|
|
37
|
+
return strings.splitAt(value, 3, 6, 8).join(' ');
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
validate(input: string): ValidateReturn {
|
|
41
|
+
const [value, error] = clean(input);
|
|
42
|
+
|
|
43
|
+
if (error) {
|
|
44
|
+
return { isValid: false, error };
|
|
45
|
+
}
|
|
46
|
+
if (value.length !== 10) {
|
|
47
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
48
|
+
}
|
|
49
|
+
if (!strings.isdigits(value)) {
|
|
50
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!'234789'.includes(value[0])) {
|
|
54
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (parseInt(value, 10) % 11 !== 0) {
|
|
58
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
isValid: true,
|
|
63
|
+
compact: value,
|
|
64
|
+
isIndividual: false,
|
|
65
|
+
isCompany: true,
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
71
|
+
impl;
|
package/src/sk/index.ts
ADDED
package/src/sk/rc.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Validator } from '../types';
|
|
2
|
+
import * as rc from '../cz/rc';
|
|
3
|
+
|
|
4
|
+
const impl: Validator = {
|
|
5
|
+
...rc,
|
|
6
|
+
name: 'Slovak Birth Number',
|
|
7
|
+
localName: 'Rodné číslo',
|
|
8
|
+
abbreviation: 'RC',
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
12
|
+
impl;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { validate, format } from './coe';
|
|
2
|
+
import { InvalidLength, InvalidFormat } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('sm/coe', () => {
|
|
5
|
+
it('format:51', () => {
|
|
6
|
+
const result = format('51');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('51');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('validate:51', () => {
|
|
12
|
+
const result = validate('51');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('51');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('validate:024165', () => {
|
|
18
|
+
const result = validate('024165');
|
|
19
|
+
|
|
20
|
+
expect(result.isValid && result.compact).toEqual('24165');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:2416A', () => {
|
|
24
|
+
const result = validate('2416A');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidFormat);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('validate:1124165', () => {
|
|
30
|
+
const result = validate('1124165');
|
|
31
|
+
|
|
32
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
33
|
+
});
|
|
34
|
+
});
|
package/src/sm/coe.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COE (Codice operatore economico, San Marino national tax number).
|
|
3
|
+
*
|
|
4
|
+
* The COE is a tax identification number of up to 5-digits used in San Marino.
|
|
5
|
+
* Leading zeroes are commonly dropped.
|
|
6
|
+
*
|
|
7
|
+
* ENTITY
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import * as exceptions from '../exceptions';
|
|
11
|
+
import { strings } from '../util';
|
|
12
|
+
import { Validator, ValidateReturn } from '../types';
|
|
13
|
+
|
|
14
|
+
// All small valued registered entities
|
|
15
|
+
const lowNumbers = new Set([
|
|
16
|
+
2, 4, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21, 25, 26, 30, 32, 33, 35, 36,
|
|
17
|
+
37, 38, 39, 40, 42, 45, 47, 49, 51, 52, 55, 56, 57, 58, 59, 61, 62, 64, 65,
|
|
18
|
+
66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 79, 80, 81, 84, 85, 87, 88, 91,
|
|
19
|
+
92, 94, 95, 96, 97, 99,
|
|
20
|
+
]);
|
|
21
|
+
|
|
22
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
23
|
+
const [value, err] = strings.cleanUnicode(input, ' .');
|
|
24
|
+
|
|
25
|
+
if (err) {
|
|
26
|
+
return [value, err];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return [value.replace(/^0+/, ''), null];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const impl: Validator = {
|
|
33
|
+
name: 'San Marino National Tax Number',
|
|
34
|
+
localName: 'Codice Operatore Eeconomico',
|
|
35
|
+
abbreviation: 'COE',
|
|
36
|
+
|
|
37
|
+
compact(input: string): string {
|
|
38
|
+
const [value, err] = clean(input);
|
|
39
|
+
|
|
40
|
+
if (err) {
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return value;
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
format(input: string): string {
|
|
48
|
+
const [value] = clean(input);
|
|
49
|
+
|
|
50
|
+
return value;
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
validate(input: string): ValidateReturn {
|
|
54
|
+
const [value, error] = clean(input);
|
|
55
|
+
|
|
56
|
+
if (error) {
|
|
57
|
+
return { isValid: false, error };
|
|
58
|
+
}
|
|
59
|
+
if (value.length > 5 || value.length === 0) {
|
|
60
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
61
|
+
}
|
|
62
|
+
if (!strings.isdigits(value)) {
|
|
63
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (value.length < 3 && !lowNumbers.has(parseInt(value, 10))) {
|
|
67
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
isValid: true,
|
|
72
|
+
compact: value,
|
|
73
|
+
isIndividual: false,
|
|
74
|
+
isCompany: true,
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
80
|
+
impl;
|
package/src/sm/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as coe from './coe';
|
package/src/sv/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as nit from './nit';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { validate, format } from './nit';
|
|
2
|
+
import { InvalidLength, InvalidChecksum } from '../exceptions';
|
|
3
|
+
|
|
4
|
+
describe('sv/nit', () => {
|
|
5
|
+
it('format:06140507071048', () => {
|
|
6
|
+
const result = format('06140507071048');
|
|
7
|
+
|
|
8
|
+
expect(result).toEqual('0614-050707-104-8');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('validate:0614-050707-104-8', () => {
|
|
12
|
+
const result = validate('0614-050707-104-8');
|
|
13
|
+
|
|
14
|
+
expect(result.isValid && result.compact).toEqual('06140507071048');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('validate:SV 0614-050707-104-8', () => {
|
|
18
|
+
const result = validate('SV 0614-050707-104-8');
|
|
19
|
+
|
|
20
|
+
expect(result.isValid && result.compact).toEqual('06140507071048');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('validate:1234567890123', () => {
|
|
24
|
+
const result = validate('1234567890123');
|
|
25
|
+
|
|
26
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('validate:0614-050707-104-0', () => {
|
|
30
|
+
const result = validate('0614-050707-104-0');
|
|
31
|
+
|
|
32
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
33
|
+
});
|
|
34
|
+
});
|
package/src/sv/nit.ts
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NIT (Número de Identificación Tributaria, El Salvador tax number).
|
|
3
|
+
*
|
|
4
|
+
* This number consists of 14 digits, usually separated into four groups
|
|
5
|
+
* using hyphens to make it easier to read, like XXXX-XXXXXX-XXX-X.
|
|
6
|
+
*
|
|
7
|
+
* The first four digits indicate the code for the municipality of birth
|
|
8
|
+
* for natural persons or the municipality of stablishment for juridical
|
|
9
|
+
* persons. NIT for El Salvador nationals begins with either 0 or 1, and
|
|
10
|
+
* for foreigners it begins with 9.
|
|
11
|
+
*
|
|
12
|
+
* The following six digits indicate the date of birth for the natural
|
|
13
|
+
* person, or the stablishment date for the juridical person, using the
|
|
14
|
+
* format DDMMYY, where DD is the day, MM is the month, and YY is the
|
|
15
|
+
* year. For example XXXX-051180-XXX-X is (November 5 1980)
|
|
16
|
+
*
|
|
17
|
+
* The next 3 digits are a sequential number.
|
|
18
|
+
*
|
|
19
|
+
* The last digit is the check digit, which is used to verify the number
|
|
20
|
+
* was correctly typed.
|
|
21
|
+
*
|
|
22
|
+
* Source
|
|
23
|
+
* https://es.wikipedia.org/wiki/Identificaci%C3%B3n_tributaria
|
|
24
|
+
* https://www.listasal.info/articulos/nit-el-salvador.shtml
|
|
25
|
+
* https://tramitesyrequisitos.com/el-salvador/nit/#Estructura_del_NIT
|
|
26
|
+
* https://www.svcommunity.org/forum/programacioacuten/como-calcular-digito-verificador-del-dui-y-nit/msg951882/#msg951882
|
|
27
|
+
*
|
|
28
|
+
* PERSON/ENTITY
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import * as exceptions from '../exceptions';
|
|
32
|
+
import { strings, weightedSum } from '../util';
|
|
33
|
+
import { Validator, ValidateReturn } from '../types';
|
|
34
|
+
|
|
35
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
36
|
+
const [value, err] = strings.cleanUnicode(input, ' -');
|
|
37
|
+
|
|
38
|
+
if (err !== null) {
|
|
39
|
+
return [value, err];
|
|
40
|
+
}
|
|
41
|
+
if (value.startsWith('SV')) {
|
|
42
|
+
return [value.substr(2), err];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return [value, err];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const impl: Validator = {
|
|
49
|
+
name: 'El Salvador Tax Number',
|
|
50
|
+
localName: 'Número de Identificación Tributaria',
|
|
51
|
+
abbreviation: 'NIT',
|
|
52
|
+
compact(input: string): string {
|
|
53
|
+
const [value, err] = clean(input);
|
|
54
|
+
|
|
55
|
+
if (err) {
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return value;
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
format(input: string): string {
|
|
63
|
+
const [value] = clean(input);
|
|
64
|
+
|
|
65
|
+
return strings.splitAt(value, 4, -4, -1).join('-');
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
validate(input: string): ValidateReturn {
|
|
69
|
+
const [value, error] = clean(input);
|
|
70
|
+
|
|
71
|
+
if (error) {
|
|
72
|
+
return { isValid: false, error };
|
|
73
|
+
}
|
|
74
|
+
if (value.length !== 14) {
|
|
75
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
76
|
+
}
|
|
77
|
+
if (!strings.isdigits(value)) {
|
|
78
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
79
|
+
}
|
|
80
|
+
if (!['0', '1', '9'].includes(value[0])) {
|
|
81
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let sum;
|
|
85
|
+
const [front, check] = strings.splitAt(value, 13);
|
|
86
|
+
|
|
87
|
+
if (value.substr(10, 3) === '100') {
|
|
88
|
+
sum =
|
|
89
|
+
weightedSum(front, {
|
|
90
|
+
weights: [14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2],
|
|
91
|
+
modulus: 11,
|
|
92
|
+
}) % 10;
|
|
93
|
+
} else {
|
|
94
|
+
sum =
|
|
95
|
+
(11 -
|
|
96
|
+
weightedSum(front, {
|
|
97
|
+
weights: [2, 7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2],
|
|
98
|
+
modulus: 11,
|
|
99
|
+
})) %
|
|
100
|
+
10;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (check !== String(sum)) {
|
|
104
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
isValid: true,
|
|
109
|
+
compact: value,
|
|
110
|
+
isIndividual: true,
|
|
111
|
+
isCompany: true,
|
|
112
|
+
};
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
117
|
+
impl;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { validate, format } from './idnr';
|
|
2
|
+
import {
|
|
3
|
+
InvalidLength,
|
|
4
|
+
InvalidChecksum,
|
|
5
|
+
InvalidComponent,
|
|
6
|
+
} from '../exceptions';
|
|
7
|
+
|
|
8
|
+
describe('th/idnr', () => {
|
|
9
|
+
it('format:1112034563562', () => {
|
|
10
|
+
const result = format('1112034563562');
|
|
11
|
+
|
|
12
|
+
expect(result).toEqual('1-1120-34563-56-2');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test.each(['3100600445635', '1-2345-45678-78-1', '1112034563562'])(
|
|
16
|
+
'validate:%s',
|
|
17
|
+
value => {
|
|
18
|
+
const result = validate(value);
|
|
19
|
+
|
|
20
|
+
expect(result.isValid).toEqual(true);
|
|
21
|
+
},
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
it('validate:12345678', () => {
|
|
25
|
+
const result = validate('12345678');
|
|
26
|
+
|
|
27
|
+
expect(result.error).toBeInstanceOf(InvalidLength);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('validate:0101700230705', () => {
|
|
31
|
+
const result = validate('0101700230705');
|
|
32
|
+
|
|
33
|
+
expect(result.error).toBeInstanceOf(InvalidComponent);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('validate:1101700230705', () => {
|
|
37
|
+
const result = validate('1101700230705');
|
|
38
|
+
|
|
39
|
+
expect(result.error).toBeInstanceOf(InvalidChecksum);
|
|
40
|
+
});
|
|
41
|
+
});
|
package/src/th/idnr.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IDNR (Thai identity card)
|
|
3
|
+
*
|
|
4
|
+
* The Thai identity card (Thai: บัตรประจำตัวประชาชนไทย)
|
|
5
|
+
* is an official identity document issued to Thai nationals between the age of 7 and 70 years.
|
|
6
|
+
*
|
|
7
|
+
* Source
|
|
8
|
+
* https://en.wikipedia.org/wiki/Thai_identity_card
|
|
9
|
+
*
|
|
10
|
+
* PERSON
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import * as exceptions from '../exceptions';
|
|
14
|
+
import { strings } from '../util';
|
|
15
|
+
import { Validator, ValidateReturn } from '../types';
|
|
16
|
+
import { weightedSum } from '../util/checksum';
|
|
17
|
+
|
|
18
|
+
function clean(input: string): ReturnType<typeof strings.cleanUnicode> {
|
|
19
|
+
return strings.cleanUnicode(input, ' -');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const impl: Validator = {
|
|
23
|
+
name: 'Thai National Identity Card Number',
|
|
24
|
+
localName: 'บัตรประจำตัวประชาชนไทย',
|
|
25
|
+
abbreviation: 'IDNR',
|
|
26
|
+
compact(input: string): string {
|
|
27
|
+
const [value, err] = clean(input);
|
|
28
|
+
|
|
29
|
+
if (err) {
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return value;
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
format(input: string): string {
|
|
37
|
+
const [value] = clean(input);
|
|
38
|
+
|
|
39
|
+
return strings.splitAt(value, 1, 5, 10, 12).join('-');
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
validate(input: string): ValidateReturn {
|
|
43
|
+
const [value, error] = clean(input);
|
|
44
|
+
|
|
45
|
+
if (error) {
|
|
46
|
+
return { isValid: false, error };
|
|
47
|
+
}
|
|
48
|
+
if (value.length !== 13) {
|
|
49
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
50
|
+
}
|
|
51
|
+
if (!strings.isdigits(value)) {
|
|
52
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if ('09'.includes(value[0])) {
|
|
56
|
+
return { isValid: false, error: new exceptions.InvalidComponent() };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const [front, check] = strings.splitAt(value, 12);
|
|
60
|
+
|
|
61
|
+
const sum = weightedSum(front, {
|
|
62
|
+
weights: [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
|
|
63
|
+
modulus: 11,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (String((11 - sum) % 10) !== check) {
|
|
67
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
isValid: true,
|
|
72
|
+
compact: value,
|
|
73
|
+
isIndividual: true,
|
|
74
|
+
isCompany: false,
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const { name, localName, abbreviation, validate, format, compact } =
|
|
80
|
+
impl;
|
package/src/th/index.ts
ADDED