Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save vascoferreira25/2f3b4a95214d6f441665946faafe78c5 to your computer and use it in GitHub Desktop.
Save vascoferreira25/2f3b4a95214d6f441665946faafe78c5 to your computer and use it in GitHub Desktop.
Portuguese NIF Validator made with Clojure
(defn in?
"Evaluate true if collection contains element."
[coll elem]
(some #(= elem %) coll))
(defn str->int
"Transform string with number into vector of ints."
[nif-vector]
(mapv #(Integer/parseInt %) (map str nif-vector)))
(defn calculate-control-number
"Multiply each number and sum it."
[fiscal-number]
(reduce + (mapv * (butlast fiscal-number) [9 8 7 6 5 4 3 2])))
(defn fiscal-modulo
"Calculate modulo control number."
[control-number]
(- control-number (* (int (/ control-number 11)) 11)))
(defn fiscal-number-validator
"Takes a string of fiscal number ex.:'`589102392`' and checks if it is
a valid Portuguese Fiscal Number.
Returns `true` if valid and `nil` if invalid."
[nif]
(let [fiscal-number (str->int nif)]
(if (= 9 (count fiscal-number))
(if (or (in? [1 2 5 6 8 9] (first fiscal-number))
(some true? (map #(= (vec (first fiscal-number) (second fiscal-number))))))
(let
[control-number (calculate-control-number fiscal-number)
modulo (fiscal-modulo control-number)]
(if (or (= modulo 0) (= modulo 1))
(= (last fiscal-number) 0)
(= (last fiscal-number) (- 11 modulo))))))))
(fiscal-number-validator "505795663")
; => true
(fiscal-number-validator "525795663")
; => false
(fiscal-number-validator "862585236")
; => true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment