Created
April 7, 2018 03:51
-
-
Save vascoferreira25/2f3b4a95214d6f441665946faafe78c5 to your computer and use it in GitHub Desktop.
Portuguese NIF Validator made with Clojure
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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