itax_code 0.1.3 → 0.1.4
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.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +1 -0
- data/.github/workflows/build-and-push.yml +27 -0
- data/.github/workflows/lint.yml +18 -0
- data/.github/workflows/test.yml +22 -0
- data/.rubocop.yml +12 -0
- data/Gemfile.lock +37 -36
- data/README.md +1 -1
- data/bin/release +15 -0
- data/itax_code.gemspec +2 -2
- data/lib/itax_code/data/cities.csv +13832 -0
- data/lib/itax_code/data/countries.csv +277 -0
- data/lib/itax_code/encoder.rb +19 -39
- data/lib/itax_code/omocode.rb +36 -0
- data/lib/itax_code/parser.rb +12 -43
- data/lib/itax_code/utils.rb +5 -7
- data/lib/itax_code/validator.rb +5 -12
- data/lib/itax_code/version.rb +1 -1
- data/lib/itax_code.rb +20 -34
- metadata +16 -11
- data/CHANGELOG.md +0 -16
- data/lib/itax_code/data/countries.json +0 -278
- data/lib/itax_code/data/municipalities.json +0 -13833
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"code","province","name"
|
|
2
|
+
"Z100","EE","ALBANIA"
|
|
3
|
+
"Z101","EE","ANDORRA"
|
|
4
|
+
"Z102","EE","AUSTRIA"
|
|
5
|
+
"Z103","EE","BELGIO"
|
|
6
|
+
"Z104","EE","BULGARIA"
|
|
7
|
+
"Z105","EE","CECOSLOVACCHIA"
|
|
8
|
+
"Z106","EE","CITTA DEL VATICANO / VATICANO"
|
|
9
|
+
"Z107","EE","DANIMARCA"
|
|
10
|
+
"Z108","EE","FAER OER"
|
|
11
|
+
"Z109","EE","FINLANDIA"
|
|
12
|
+
"Z110","EE","FRANCIA"
|
|
13
|
+
"Z111","EE","GERMANIA REP. DEMOCRATICA"
|
|
14
|
+
"Z112","EE","GERMANIA REP. FEDERALE / GERMANIA"
|
|
15
|
+
"Z113","EE","GIBILTERRA"
|
|
16
|
+
"Z114","EE","GRAN BRETAGNA"
|
|
17
|
+
"Z115","EE","GRECIA"
|
|
18
|
+
"Z116","EE","IRLANDA"
|
|
19
|
+
"Z117","EE","ISLANDA"
|
|
20
|
+
"Z118","EE","IUGOSLAVIA"
|
|
21
|
+
"Z119","EE","LIECHTENSTEIN"
|
|
22
|
+
"Z120","EE","LUSSEMBURGO"
|
|
23
|
+
"Z121","EE","MALTA"
|
|
24
|
+
"Z122","EE","MAN"
|
|
25
|
+
"Z123","EE","MONACO"
|
|
26
|
+
"Z124","EE","NORMANNE"
|
|
27
|
+
"Z125","EE","NORVEGIA"
|
|
28
|
+
"Z126","EE","PAESI BASSI"
|
|
29
|
+
"Z127","EE","POLONIA"
|
|
30
|
+
"Z128","EE","PORTOGALLO"
|
|
31
|
+
"Z129","EE","ROMANIA"
|
|
32
|
+
"Z130","EE","SAN MARINO"
|
|
33
|
+
"Z131","EE","SPAGNA"
|
|
34
|
+
"Z132","EE","SVEZIA"
|
|
35
|
+
"Z133","EE","SVIZZERA"
|
|
36
|
+
"Z134","EE","UNGHERIA"
|
|
37
|
+
"Z135","EE","URSS"
|
|
38
|
+
"Z136","EE","GEORGIA"
|
|
39
|
+
"Z137","EE","ARMENIA"
|
|
40
|
+
"Z138","EE","UCRAINA"
|
|
41
|
+
"Z139","EE","BIELORUSSIA"
|
|
42
|
+
"Z140","EE","MOLDAVIA"
|
|
43
|
+
"Z141","EE","AZERBAIDJAN"
|
|
44
|
+
"Z142","EE","KIRGHIZISTAN"
|
|
45
|
+
"Z143","EE","UZBEKISTAN"
|
|
46
|
+
"Z144","EE","ESTONIA"
|
|
47
|
+
"Z145","EE","LETTONIA"
|
|
48
|
+
"Z146","EE","LITUANIA"
|
|
49
|
+
"Z147","EE","TAGIKISTAN"
|
|
50
|
+
"Z148","EE","MACEDONIA"
|
|
51
|
+
"Z149","EE","CROAZIA"
|
|
52
|
+
"Z150","EE","SLOVENIA"
|
|
53
|
+
"Z151","EE","TURKEMENISTAN"
|
|
54
|
+
"Z152","EE","KAZAKISTAN"
|
|
55
|
+
"Z153","EE","BOSNIA ED ERZEGOVINA / BOSNIA ERZEGOVINA"
|
|
56
|
+
"Z154","EE","RUSSIA / FEDERAZIONE RUSSA"
|
|
57
|
+
"Z155","EE","REPUBBLICA SLOVACCA"
|
|
58
|
+
"Z156","EE","REPUBBLICA CECA"
|
|
59
|
+
"Z200","EE","AFGHANISTAN"
|
|
60
|
+
"Z201","EE","ARABIA MERIDIONALE"
|
|
61
|
+
"Z202","EE","PROTETTORATO DELLA ARABIA MERIDIONALE"
|
|
62
|
+
"Z203","EE","ARABIA SAUDITA"
|
|
63
|
+
"Z204","EE","BAHREIN"
|
|
64
|
+
"Z205","EE","BHUTAN"
|
|
65
|
+
"Z206","EE","BIRMANIA"
|
|
66
|
+
"Z207","EE","BRUNEI"
|
|
67
|
+
"Z208","EE","CAMBOGIA"
|
|
68
|
+
"Z209","EE","SRI LANKA"
|
|
69
|
+
"Z210","EE","CINA REPUBBLICA POPOLARE / CINA / CHINA"
|
|
70
|
+
"Z211","EE","CIPRO"
|
|
71
|
+
"Z212","EE","COCOS"
|
|
72
|
+
"Z213","EE","REPUBBLICA DI COREA"
|
|
73
|
+
"Z214","EE","COREA REPUBBLICA POPOLARE"
|
|
74
|
+
"Z215","EE","EMIRATI ARABI UNITI"
|
|
75
|
+
"Z216","EE","FILIPPINE"
|
|
76
|
+
"Z217","EE","CINA REPUBBLICA NAZIONALE"
|
|
77
|
+
"Z218","EE","TERRITORIO DI GAZA"
|
|
78
|
+
"Z219","EE","GIAPPONE"
|
|
79
|
+
"Z220","EE","GIORDANIA"
|
|
80
|
+
"Z221","EE","HONG KONG"
|
|
81
|
+
"Z222","EE","INDIA"
|
|
82
|
+
"Z223","EE","INDONESIA"
|
|
83
|
+
"Z224","EE","IRAN"
|
|
84
|
+
"Z225","EE","IRAQ"
|
|
85
|
+
"Z226","EE","ISRAELE"
|
|
86
|
+
"Z227","EE","KUWAIT"
|
|
87
|
+
"Z228","EE","LAOS"
|
|
88
|
+
"Z229","EE","LIBANO"
|
|
89
|
+
"Z230","EE","MALESIA"
|
|
90
|
+
"Z231","EE","MACAO"
|
|
91
|
+
"Z232","EE","MALDIVE"
|
|
92
|
+
"Z233","EE","MONGOLIA REP. POPOLARE"
|
|
93
|
+
"Z234","EE","NEPAL"
|
|
94
|
+
"Z235","EE","OMAN"
|
|
95
|
+
"Z236","EE","PAKISTAN"
|
|
96
|
+
"Z237","EE","QATAR"
|
|
97
|
+
"Z238","EE","RYUKYU"
|
|
98
|
+
"Z239","EE","SIKKIM"
|
|
99
|
+
"Z240","EE","SIRIA"
|
|
100
|
+
"Z241","EE","THAILANDIA"
|
|
101
|
+
"Z242","EE","TIMOR"
|
|
102
|
+
"Z243","EE","TURCHIA"
|
|
103
|
+
"Z244","EE","VIETNAM DEL SUD"
|
|
104
|
+
"Z245","EE","VIETNAM DEL NORD"
|
|
105
|
+
"Z246","EE","YEMEN"
|
|
106
|
+
"Z247","EE","MALAYSIA"
|
|
107
|
+
"Z248","EE","SINGAPORE"
|
|
108
|
+
"Z249","EE","BANGLADESH"
|
|
109
|
+
"Z250","EE","YEMEN REP. DEM. POPOLARE"
|
|
110
|
+
"Z251","EE","VIETNAM"
|
|
111
|
+
"Z300","EE","NAMIBIA"
|
|
112
|
+
"Z301","EE","ALGERIA"
|
|
113
|
+
"Z302","EE","ANGOLA"
|
|
114
|
+
"Z303","EE","BASUTOLAND SUD AFRICA BRITANNICO"
|
|
115
|
+
"Z304","EE","BECIUANIA SUD AFRICA BRITANNICO"
|
|
116
|
+
"Z305","EE","BURUNDI"
|
|
117
|
+
"Z306","EE","CAMERUN"
|
|
118
|
+
"Z307","EE","CAPO VERDE"
|
|
119
|
+
"Z308","EE","IMPERO CENTROAFRICANO"
|
|
120
|
+
"Z309","EE","CIAD"
|
|
121
|
+
"Z310","EE","COMORE"
|
|
122
|
+
"Z311","EE","CONGO REPUBBLICA POPOLARE"
|
|
123
|
+
"Z312","EE","ZAIRE"
|
|
124
|
+
"Z313","EE","COSTA D'AVORIO"
|
|
125
|
+
"Z314","EE","BENIN"
|
|
126
|
+
"Z315","EE","ETIOPIA"
|
|
127
|
+
"Z316","EE","GABON"
|
|
128
|
+
"Z317","EE","GAMBIA"
|
|
129
|
+
"Z318","EE","GHANA"
|
|
130
|
+
"Z319","EE","GUINEA"
|
|
131
|
+
"Z320","EE","GUINEA BISSAU"
|
|
132
|
+
"Z321","EE","GUINEA EQUATORIALE"
|
|
133
|
+
"Z322","EE","KENYA"
|
|
134
|
+
"Z323","EE","IFNI"
|
|
135
|
+
"Z324","EE","LA REUNION"
|
|
136
|
+
"Z325","EE","LIBERIA"
|
|
137
|
+
"Z326","EE","LIBIA"
|
|
138
|
+
"Z327","EE","MADAGASCAR"
|
|
139
|
+
"Z328","EE","MALAWI"
|
|
140
|
+
"Z329","EE","MALI"
|
|
141
|
+
"Z330","EE","MAROCCO"
|
|
142
|
+
"Z331","EE","MAURITANIA"
|
|
143
|
+
"Z332","EE","MAURIZIO"
|
|
144
|
+
"Z333","EE","MOZAMBICO"
|
|
145
|
+
"Z334","EE","NIGER"
|
|
146
|
+
"Z335","EE","NIGERIA"
|
|
147
|
+
"Z336","EE","EGITTO"
|
|
148
|
+
"Z337","EE","ZIMBABWE"
|
|
149
|
+
"Z338","EE","RUANDA"
|
|
150
|
+
"Z339","EE","SAHARA SPAGNOLO"
|
|
151
|
+
"Z340","EE","SANT ELENA"
|
|
152
|
+
"Z341","EE","PRINCIPE"
|
|
153
|
+
"Z342","EE","SEICELLE"
|
|
154
|
+
"Z343","EE","SENEGAL"
|
|
155
|
+
"Z344","EE","SIERRA LEONE"
|
|
156
|
+
"Z345","EE","SOMALIA"
|
|
157
|
+
"Z346","EE","SOMALIA FRANCESE"
|
|
158
|
+
"Z347","EE","REPUBBLICA SUDAFRICANA"
|
|
159
|
+
"Z348","EE","SUDAN"
|
|
160
|
+
"Z349","EE","SWAZILAND"
|
|
161
|
+
"Z350","EE","TANGANICA"
|
|
162
|
+
"Z351","EE","TOGO"
|
|
163
|
+
"Z352","EE","TUNISIA"
|
|
164
|
+
"Z353","EE","UGANDA"
|
|
165
|
+
"Z354","EE","BURKINA FASO"
|
|
166
|
+
"Z355","EE","ZAMBIA"
|
|
167
|
+
"Z356","EE","ZANZIBAR"
|
|
168
|
+
"Z357","EE","TANZANIA"
|
|
169
|
+
"Z358","EE","BOTSWANA"
|
|
170
|
+
"Z359","EE","LESOTHO"
|
|
171
|
+
"Z360","EE","MAYOTTE"
|
|
172
|
+
"Z361","EE","GIBUTI"
|
|
173
|
+
"Z362","EE","SAHARA MERIDIONALE"
|
|
174
|
+
"Z363","EE","SAHARA SETTENTRIONALE"
|
|
175
|
+
"Z364","EE","BOPHUTHATSWANA"
|
|
176
|
+
"Z365","EE","TRANSKEI"
|
|
177
|
+
"Z366","EE","VENDA"
|
|
178
|
+
"Z367","EE","CISKEI"
|
|
179
|
+
"Z368","EE","ERITREA"
|
|
180
|
+
"Z400","EE","BERMUDE"
|
|
181
|
+
"Z401","EE","CANADA"
|
|
182
|
+
"Z402","EE","GROENLANDIA"
|
|
183
|
+
"Z403","EE","SAINT PIERRE ET MIQUELON"
|
|
184
|
+
"Z404","EE","STATI UNITI D'AMERICA"
|
|
185
|
+
"Z500","EE","ANTILLE BRITANNICHE"
|
|
186
|
+
"Z501","EE","ANTILLE OLANDESI"
|
|
187
|
+
"Z502","EE","BAHAMA"
|
|
188
|
+
"Z503","EE","COSTA RICA"
|
|
189
|
+
"Z504","EE","CUBA"
|
|
190
|
+
"Z505","EE","REPUBBLICA DOMINICANA"
|
|
191
|
+
"Z506","EE","EL SALVADOR"
|
|
192
|
+
"Z507","EE","GIAMAICA"
|
|
193
|
+
"Z508","EE","GUADALUPA"
|
|
194
|
+
"Z509","EE","GUATEMALA"
|
|
195
|
+
"Z510","EE","HAITI"
|
|
196
|
+
"Z511","EE","HONDURAS"
|
|
197
|
+
"Z512","EE","BELIZE"
|
|
198
|
+
"Z513","EE","MARTINICA"
|
|
199
|
+
"Z514","EE","MESSICO"
|
|
200
|
+
"Z515","EE","NICARAGUA"
|
|
201
|
+
"Z516","EE","PANAMA"
|
|
202
|
+
"Z517","EE","PANAMA ZONA DEL CANALE"
|
|
203
|
+
"Z518","EE","PUERTO RICO"
|
|
204
|
+
"Z519","EE","TURKS"
|
|
205
|
+
"Z520","EE","ISOLE VERGINI"
|
|
206
|
+
"Z522","EE","BARBADOS"
|
|
207
|
+
"Z523","EE","ANTILLE BRITANNICHE"
|
|
208
|
+
"Z524","EE","GRENADA"
|
|
209
|
+
"Z525","EE","ISOLE VERGINI BRITANNICHE "
|
|
210
|
+
"Z526","EE","DOMINICA"
|
|
211
|
+
"Z527","EE","SAINT LUCIA"
|
|
212
|
+
"Z528","EE","SAINT VINCENT E GRENADINE"
|
|
213
|
+
"Z529","EE","ISOLA ANGUILLA"
|
|
214
|
+
"Z530","EE","ISOLE CAYMAN"
|
|
215
|
+
"Z531","EE","MONTSERRAT"
|
|
216
|
+
"Z532","EE","ANTIGUE E BARBUDA"
|
|
217
|
+
"Z533","EE","SAINT KITTS E NEVIS"
|
|
218
|
+
"Z600","EE","ARGENTINA"
|
|
219
|
+
"Z601","EE","BOLIVIA"
|
|
220
|
+
"Z602","EE","BRASILE"
|
|
221
|
+
"Z603","EE","CILE"
|
|
222
|
+
"Z604","EE","COLOMBIA"
|
|
223
|
+
"Z605","EE","ECUADOR"
|
|
224
|
+
"Z606","EE","REPUBBLICA DELLA GUAYANA"
|
|
225
|
+
"Z607","EE","GUAYANA FRANCESE"
|
|
226
|
+
"Z608","EE","SURINAME"
|
|
227
|
+
"Z609","EE","MALVINE"
|
|
228
|
+
"Z610","EE","PARAGUAY"
|
|
229
|
+
"Z611","EE","PERU"
|
|
230
|
+
"Z612","EE","TRINIDAD E TOBAGO"
|
|
231
|
+
"Z613","EE","URUGUAY"
|
|
232
|
+
"Z614","EE","VENEZUELA"
|
|
233
|
+
"Z700","EE","AUSTRALIA"
|
|
234
|
+
"Z701","EE","CAROLINE"
|
|
235
|
+
"Z702","EE","CHRISTMAS"
|
|
236
|
+
"Z703","EE","COOK"
|
|
237
|
+
"Z704","EE","FIGI O VITI"
|
|
238
|
+
"Z705","EE","ELLICE"
|
|
239
|
+
"Z706","EE","GUAM"
|
|
240
|
+
"Z707","EE","IRIAN OCCIDENTALE"
|
|
241
|
+
"Z708","EE","MACQUARIE"
|
|
242
|
+
"Z709","EE","MARCUS"
|
|
243
|
+
"Z710","EE","MARIANNE"
|
|
244
|
+
"Z711","EE","MARSHALL"
|
|
245
|
+
"Z712","EE","MIDWAY"
|
|
246
|
+
"Z713","EE","NAURU"
|
|
247
|
+
"Z714","EE","SAVAGE"
|
|
248
|
+
"Z715","EE","NORFOLK"
|
|
249
|
+
"Z716","EE","NUOVA CALEDONIA"
|
|
250
|
+
"Z717","EE","NUOVE EBRIDI"
|
|
251
|
+
"Z718","EE","NUOVA GUINEA"
|
|
252
|
+
"Z719","EE","NUOVA ZELANDA"
|
|
253
|
+
"Z720","EE","PAPUASIA"
|
|
254
|
+
"Z721","EE","PASQUA"
|
|
255
|
+
"Z722","EE","PITCAIRN"
|
|
256
|
+
"Z723","EE","POLINESIA"
|
|
257
|
+
"Z724","EE","SALOMONE"
|
|
258
|
+
"Z725","EE","SAMOA AMERICANE"
|
|
259
|
+
"Z726","EE","SAMOA OCCIDENTALI"
|
|
260
|
+
"Z727","EE","TOKELAU"
|
|
261
|
+
"Z728","EE","TONGA O DEGLI AMICI"
|
|
262
|
+
"Z729","EE","WALLIS"
|
|
263
|
+
"Z730","EE","PAPUA NUOVA GUINEA"
|
|
264
|
+
"Z731","EE","KIRIBATI"
|
|
265
|
+
"Z732","EE","TUVALU"
|
|
266
|
+
"Z733","EE","VANUATU"
|
|
267
|
+
"Z734","EE","PALAU REPUBBLICA"
|
|
268
|
+
"Z735","EE","MICRONESIA STATI FEDERALI / MICRONESIA"
|
|
269
|
+
"Z800","EE","DIPENDENZE CANADESI"
|
|
270
|
+
"Z801","EE","DIPENDENZE NORVEGESI"
|
|
271
|
+
"Z802","EE","DIPENDENZE SOVIETICHE"
|
|
272
|
+
"Z900","EE","DIPENDENZE AUSTRALIANE"
|
|
273
|
+
"Z901","EE","DIPENDENZE BRITANNICHE"
|
|
274
|
+
"Z902","EE","DIPENDENZE FRANCESI"
|
|
275
|
+
"Z903","EE","DIPENDENZE NEOZELANDESI"
|
|
276
|
+
"Z905","EE","DIPENDENZE NORVEGESI"
|
|
277
|
+
"Z906","EE","DIPENDENZE SUDAFRICANE"
|
data/lib/itax_code/encoder.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module ItaxCode
|
|
2
|
-
|
|
3
|
-
# This class handles the tax code generation logic.
|
|
2
|
+
# Handles the tax code generation logic.
|
|
4
3
|
#
|
|
5
4
|
# @param [String] surname The user first name
|
|
6
5
|
# @param [String] name The user last name
|
|
@@ -9,7 +8,6 @@ module ItaxCode
|
|
|
9
8
|
# @param [String] birthplace The user birthplace
|
|
10
9
|
#
|
|
11
10
|
# @example
|
|
12
|
-
#
|
|
13
11
|
# ItaxCode::Encoder.new(
|
|
14
12
|
# surname: "Rossi",
|
|
15
13
|
# name: "Matteo",
|
|
@@ -19,33 +17,29 @@ module ItaxCode
|
|
|
19
17
|
# ).encode
|
|
20
18
|
#
|
|
21
19
|
# @return [String] The encoded tax code
|
|
22
|
-
|
|
23
20
|
class Encoder
|
|
24
21
|
class MissingDataError < StandardError; end
|
|
25
22
|
|
|
26
23
|
def initialize(data = {}, utils = Utils.new)
|
|
27
24
|
@surname = data[:surname]
|
|
28
25
|
@name = data[:name]
|
|
29
|
-
@gender = data[:gender]
|
|
30
|
-
@birthdate =
|
|
26
|
+
@gender = data[:gender]&.upcase
|
|
27
|
+
@birthdate = Date.parse(data[:birthdate].to_s)
|
|
31
28
|
@birthplace = data[:birthplace]
|
|
29
|
+
@utils = utils
|
|
32
30
|
|
|
33
31
|
instance_variables.each do |ivar|
|
|
34
32
|
next if instance_variable_get(ivar).present?
|
|
35
33
|
|
|
36
34
|
raise MissingDataError, "missing #{ivar} value"
|
|
37
35
|
end
|
|
38
|
-
|
|
39
|
-
@utils = utils
|
|
40
36
|
end
|
|
41
37
|
|
|
42
|
-
|
|
43
|
-
# This method calculates the tax code.
|
|
38
|
+
# Computes the tax code from its components.
|
|
44
39
|
#
|
|
45
40
|
# @return [String] The calculated tax code
|
|
46
|
-
|
|
47
41
|
def encode
|
|
48
|
-
code
|
|
42
|
+
code = encode_surname
|
|
49
43
|
code += encode_name
|
|
50
44
|
code += encode_birthdate
|
|
51
45
|
code += encode_birthplace
|
|
@@ -55,29 +49,23 @@ module ItaxCode
|
|
|
55
49
|
|
|
56
50
|
private
|
|
57
51
|
|
|
58
|
-
attr_accessor :surname,
|
|
59
|
-
:name,
|
|
60
|
-
:gender,
|
|
61
|
-
:birthdate,
|
|
62
|
-
:birthplace,
|
|
63
|
-
:utils
|
|
52
|
+
attr_accessor :surname, :name, :gender, :birthdate, :birthplace, :utils
|
|
64
53
|
|
|
65
54
|
def encode_surname
|
|
66
|
-
|
|
67
|
-
consonants = utils.extract_consonants
|
|
68
|
-
vowels = utils.extract_vowels
|
|
55
|
+
chars = utils.slugged(surname).chars
|
|
56
|
+
consonants = utils.extract_consonants chars
|
|
57
|
+
vowels = utils.extract_vowels chars
|
|
69
58
|
"#{consonants[0..2]}#{vowels[0..2]}XXX"[0..2].upcase
|
|
70
59
|
end
|
|
71
60
|
|
|
72
61
|
def encode_name
|
|
73
|
-
|
|
74
|
-
consonants = utils.extract_consonants
|
|
75
|
-
vowels = utils.extract_vowels
|
|
62
|
+
chars = utils.slugged(name).chars
|
|
63
|
+
consonants = utils.extract_consonants chars
|
|
64
|
+
vowels = utils.extract_vowels chars
|
|
76
65
|
|
|
77
66
|
if consonants.length > 3
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
consonants = arr.join
|
|
67
|
+
consonants =
|
|
68
|
+
consonants.chars.values_at(0, 2..consonants.chars.size).join
|
|
81
69
|
end
|
|
82
70
|
|
|
83
71
|
"#{consonants[0..2]}#{vowels[0..2]}XXX"[0..2].upcase
|
|
@@ -90,23 +78,15 @@ module ItaxCode
|
|
|
90
78
|
"#{year}#{month}#{day}"
|
|
91
79
|
end
|
|
92
80
|
|
|
93
|
-
def encode_birthplace(src = utils.
|
|
94
|
-
place = src.find do |
|
|
95
|
-
utils.slugged(
|
|
81
|
+
def encode_birthplace(src = utils.cities, exit: false)
|
|
82
|
+
place = src.find do |item|
|
|
83
|
+
utils.slugged(birthplace) == utils.slugged(item["name"])
|
|
96
84
|
end
|
|
97
85
|
|
|
98
86
|
code = place.try(:[], "code")
|
|
99
87
|
return code if code.present?
|
|
100
|
-
return if exit
|
|
101
88
|
|
|
102
|
-
encode_birthplace
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def parsed_date(date)
|
|
106
|
-
case date.class.name
|
|
107
|
-
when "Date", "Time", "DateTime" then date
|
|
108
|
-
else Date.parse(date)
|
|
109
|
-
end
|
|
89
|
+
exit || encode_birthplace(utils.countries, exit: true)
|
|
110
90
|
end
|
|
111
91
|
end
|
|
112
92
|
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module ItaxCode
|
|
2
|
+
class Omocode
|
|
3
|
+
attr_reader :tax_code, :utils
|
|
4
|
+
|
|
5
|
+
# Creates a new instance for a given tax_code.
|
|
6
|
+
#
|
|
7
|
+
# @param [String] tax_code
|
|
8
|
+
# @param [Utils] utils
|
|
9
|
+
def initialize(tax_code, utils = Utils.new)
|
|
10
|
+
@tax_code = tax_code
|
|
11
|
+
@utils = utils
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Computes the omocodes from a given tax_code.
|
|
15
|
+
#
|
|
16
|
+
# @return [Array]
|
|
17
|
+
def list
|
|
18
|
+
chars = tax_code[0..14].chars
|
|
19
|
+
(omocodes(:decode, chars) + omocodes(:encode, chars)).uniq
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def omocodes(action, chars)
|
|
25
|
+
utils.omocodia_subs_indexes.reverse.map do |i|
|
|
26
|
+
chars[i] = utils.public_send("omocodia_#{action}".to_sym, chars[i])
|
|
27
|
+
omocode(chars)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def omocode(chars)
|
|
32
|
+
code = chars.join
|
|
33
|
+
code + utils.encode_cin(code)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/itax_code/parser.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
require "itax_code/omocode"
|
|
2
|
+
|
|
1
3
|
module ItaxCode
|
|
2
|
-
|
|
3
|
-
# This class handles the parsing logic.
|
|
4
|
+
# Handles the parsing logic.
|
|
4
5
|
#
|
|
5
6
|
# @param [String] tax_code
|
|
6
7
|
#
|
|
@@ -9,23 +10,20 @@ module ItaxCode
|
|
|
9
10
|
# ItaxCode::Parser.new("RSSMRA70A01L726S").decode
|
|
10
11
|
#
|
|
11
12
|
# @return [Hash]
|
|
12
|
-
|
|
13
13
|
class Parser
|
|
14
14
|
class NoTaxCodeError < StandardError; end
|
|
15
15
|
class InvalidTaxCodeError < StandardError; end
|
|
16
16
|
|
|
17
17
|
def initialize(tax_code, utils = Utils.new)
|
|
18
|
+
@tax_code = tax_code&.upcase
|
|
18
19
|
@utils = utils
|
|
19
|
-
@tax_code = (tax_code || "").upcase
|
|
20
20
|
raise NoTaxCodeError if @tax_code.blank?
|
|
21
21
|
raise InvalidTaxCodeError unless Validator.standard_length?(@tax_code)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
# This method decodes the tax code.
|
|
24
|
+
# Decodes the tax code into its components.
|
|
26
25
|
#
|
|
27
26
|
# @return [Hash]
|
|
28
|
-
|
|
29
27
|
def decode
|
|
30
28
|
year = decode_year
|
|
31
29
|
month = utils.months.find_index(raw[:birthdate_month]) + 1
|
|
@@ -37,7 +35,7 @@ module ItaxCode
|
|
|
37
35
|
gender: gender,
|
|
38
36
|
birthdate: [year, month, day].join("-"),
|
|
39
37
|
birthplace: birthplace,
|
|
40
|
-
omocodes:
|
|
38
|
+
omocodes: Omocode.new(tax_code).list,
|
|
41
39
|
raw: raw
|
|
42
40
|
}
|
|
43
41
|
end
|
|
@@ -79,50 +77,21 @@ module ItaxCode
|
|
|
79
77
|
end
|
|
80
78
|
end
|
|
81
79
|
|
|
82
|
-
def decode_birthplace(src = utils.
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
def decode_birthplace(src = utils.cities, exit: false)
|
|
81
|
+
place = src.find do |item|
|
|
82
|
+
item["code"] == city_code && !item["name"].include?("soppresso")
|
|
85
83
|
end
|
|
86
84
|
|
|
87
|
-
place = places.find { |m| !m["name"].include? "soppresso" }
|
|
88
|
-
place = place.presence || places.last
|
|
89
|
-
|
|
90
85
|
if place.nil?
|
|
91
|
-
return
|
|
92
|
-
|
|
93
|
-
decode_birthplace utils.countries, exit: true
|
|
86
|
+
exit ? return : decode_birthplace(utils.countries, exit: true)
|
|
94
87
|
else
|
|
95
88
|
place["name"] = place["name"].gsub(" (soppresso)", "")
|
|
96
|
-
place.deep_symbolize_keys
|
|
89
|
+
place.to_h.deep_symbolize_keys
|
|
97
90
|
end
|
|
98
91
|
end
|
|
99
92
|
|
|
100
|
-
def
|
|
93
|
+
def city_code
|
|
101
94
|
raw[:birthplace][0] + utils.omocodia_decode(raw[:birthplace][1..-1])
|
|
102
95
|
end
|
|
103
|
-
|
|
104
|
-
def omocodes
|
|
105
|
-
code_chars = tax_code[0..14].chars
|
|
106
|
-
codes = []
|
|
107
|
-
|
|
108
|
-
utils.omocodia_subs_indexes.reverse_each do |i|
|
|
109
|
-
code_chars[i] = utils.omocodia_decode(code_chars[i])
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
code = code_chars.join
|
|
113
|
-
code_cin = utils.encode_cin(code)
|
|
114
|
-
code += code_cin
|
|
115
|
-
codes.push(code)
|
|
116
|
-
|
|
117
|
-
utils.omocodia_subs_indexes.reverse_each do |i|
|
|
118
|
-
code_chars[i] = utils.omocodia_encode(code_chars[i])
|
|
119
|
-
code = code_chars.join
|
|
120
|
-
code_cin = utils.encode_cin(code)
|
|
121
|
-
code += code_cin
|
|
122
|
-
codes.push(code)
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
codes
|
|
126
|
-
end
|
|
127
96
|
end
|
|
128
97
|
end
|
data/lib/itax_code/utils.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require "csv"
|
|
2
|
+
|
|
1
3
|
module ItaxCode
|
|
2
4
|
class Utils
|
|
3
5
|
def regex
|
|
@@ -97,16 +99,12 @@ module ItaxCode
|
|
|
97
99
|
cin_remainders[tot % 26]
|
|
98
100
|
end
|
|
99
101
|
|
|
100
|
-
def
|
|
101
|
-
|
|
102
|
-
File.read("#{__dir__}/data/municipalities.json")
|
|
103
|
-
)
|
|
102
|
+
def cities
|
|
103
|
+
CSV.foreach("#{__dir__}/data/cities.csv", headers: true)
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
def countries
|
|
107
|
-
|
|
108
|
-
File.read("#{__dir__}/data/countries.json")
|
|
109
|
-
)
|
|
107
|
+
CSV.foreach("#{__dir__}/data/countries.csv", headers: true)
|
|
110
108
|
end
|
|
111
109
|
end
|
|
112
110
|
end
|
data/lib/itax_code/validator.rb
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
module ItaxCode
|
|
2
|
-
|
|
3
|
-
# This class holds the validation logic.
|
|
2
|
+
# Handles the validation logic.
|
|
4
3
|
#
|
|
5
4
|
# @param [Hash] data The user input data
|
|
6
|
-
|
|
7
5
|
class Validator
|
|
8
6
|
LENGTH = 16
|
|
9
7
|
|
|
@@ -12,27 +10,22 @@ module ItaxCode
|
|
|
12
10
|
end
|
|
13
11
|
|
|
14
12
|
class << self
|
|
15
|
-
|
|
16
|
-
#
|
|
17
|
-
# against user and business fical code standards.
|
|
13
|
+
# Checks the tax code standard length against user
|
|
14
|
+
# and business fical code standards.
|
|
18
15
|
#
|
|
19
16
|
# @param [String] code The tax code
|
|
20
17
|
#
|
|
21
18
|
# @return [true, false]
|
|
22
|
-
|
|
23
19
|
def standard_length?(code)
|
|
24
20
|
code.length == LENGTH
|
|
25
21
|
end
|
|
26
22
|
end
|
|
27
23
|
|
|
28
|
-
|
|
29
|
-
# This method check pre calculated tax code validity
|
|
30
|
-
# against newly encoded tax code.
|
|
24
|
+
# Checks pre computed tax code validity against newly encoded tax code.
|
|
31
25
|
#
|
|
32
|
-
# @param [String] tax_code The pre
|
|
26
|
+
# @param [String] tax_code The pre computed tax code
|
|
33
27
|
#
|
|
34
28
|
# @return [true, false]
|
|
35
|
-
|
|
36
29
|
def valid?(tax_code)
|
|
37
30
|
encoded[0..10] == tax_code[0..10]
|
|
38
31
|
end
|
data/lib/itax_code/version.rb
CHANGED