grid_tariffs/
municipality.rs

1use serde::Serialize;
2
3use crate::{
4    County, TaxReductions, Taxes,
5    constants::{DEFAULT_SE_TAX_REDUCTIONS, DEFAULT_SE_TAXES, REDUCED_SE_TAXES},
6};
7use County::*;
8
9#[derive(Debug, Clone, Serialize)]
10pub struct Municipality {
11    pub code: u16,
12    pub name: &'static str,
13    pub county: County,
14    pub taxes: Taxes,
15    pub tax_reductions: TaxReductions,
16}
17
18impl Municipality {
19    const fn new(
20        code: u16,
21        name: &'static str,
22        county: County,
23        taxes: Taxes,
24        tax_reductions: TaxReductions,
25    ) -> Self {
26        Self {
27            code,
28            name,
29            county,
30            taxes,
31            tax_reductions,
32        }
33    }
34
35    const fn new_default_se(code: u16, name: &'static str, county: County) -> Self {
36        Self::new(
37            code,
38            name,
39            county,
40            DEFAULT_SE_TAXES,
41            DEFAULT_SE_TAX_REDUCTIONS,
42        )
43    }
44
45    const fn new_reduced_se(code: u16, name: &'static str, county: County) -> Self {
46        Self::new(
47            code,
48            name,
49            county,
50            REDUCED_SE_TAXES,
51            DEFAULT_SE_TAX_REDUCTIONS,
52        )
53    }
54
55    /// Find a municipality by its code
56    pub const fn get_by_code(code: u16) -> Option<&'static Municipality> {
57        let mut i = 0;
58        while i < MUNICIPALITIES.len() {
59            let m = &MUNICIPALITIES[i];
60            if m.code == code {
61                return Some(m);
62            }
63            i += 1;
64        }
65        None
66    }
67
68    /// Find a municipality by its name
69    pub const fn get_by_name(name: &str) -> Option<&'static Municipality> {
70        let mut i = 0;
71        while i < MUNICIPALITIES.len() {
72            let m = &MUNICIPALITIES[i];
73            if m.name.eq_ignore_ascii_case(name) {
74                return Some(m);
75            }
76            i += 1;
77        }
78        None
79    }
80
81    pub const fn taxes(&self) -> Taxes {
82        self.taxes
83    }
84
85    pub const fn tax_reductions(&self) -> TaxReductions {
86        self.tax_reductions
87    }
88
89    pub fn with_current_taxes(mut self) -> Self {
90        self.taxes = self.taxes.with_current_only();
91        self
92    }
93
94    pub fn with_current_tax_reductions(mut self) -> Self {
95        self.tax_reductions = self.tax_reductions.with_current_only();
96        self
97    }
98}
99
100pub const MUNICIPALITIES: &[Municipality] = &[
101    Municipality::new_default_se(1440, "Ale kommun", VästraGötalandsLän),
102    Municipality::new_default_se(1489, "Alingsås kommun", VästraGötalandsLän),
103    Municipality::new_default_se(764, "Alvesta kommun", KronobergsLän),
104    Municipality::new_default_se(604, "Aneby kommun", JönköpingsLän),
105    Municipality::new_default_se(1984, "Arboga kommun", VästmanlandsLän),
106    Municipality::new_reduced_se(2506, "Arjeplogs kommun", NorrbottensLän),
107    Municipality::new_reduced_se(2505, "Arvidsjaurs kommun", NorrbottensLän),
108    Municipality::new_default_se(1784, "Arvika kommun", VärmlandsLän),
109    Municipality::new_default_se(1882, "Askersunds kommun", ÖrebroLän),
110    Municipality::new_default_se(2084, "Avesta kommun", DalarnasLän),
111    Municipality::new_default_se(1460, "Bengtsfors kommun", VästraGötalandsLän),
112    Municipality::new_reduced_se(2326, "Bergs kommun", JämtlandsLän),
113    Municipality::new_reduced_se(2403, "Bjurholms kommun", VästerbottensLän),
114    Municipality::new_default_se(1260, "Bjuvs kommun", SkåneLän),
115    Municipality::new_reduced_se(2582, "Bodens kommun", NorrbottensLän),
116    Municipality::new_default_se(1443, "Bollebygds kommun", VästraGötalandsLän),
117    Municipality::new_default_se(2183, "Bollnäs kommun", GävleborgsLän),
118    Municipality::new_default_se(885, "Borgholms kommun", KalmarLän),
119    Municipality::new_default_se(2081, "Borlänge kommun", DalarnasLän),
120    Municipality::new_default_se(1490, "Borås kommun", VästraGötalandsLän),
121    Municipality::new_default_se(127, "Botkyrka kommun", StockholmsLän),
122    Municipality::new_default_se(560, "Boxholms kommun", ÖstergötlandsLän),
123    Municipality::new_default_se(1272, "Bromölla kommun", SkåneLän),
124    Municipality::new_reduced_se(2305, "Bräcke kommun", JämtlandsLän),
125    Municipality::new_default_se(1231, "Burlövs kommun", SkåneLän),
126    Municipality::new_default_se(1278, "Båstads kommun", SkåneLän),
127    Municipality::new_default_se(1438, "Dals-Eds kommun", VästraGötalandsLän),
128    Municipality::new_default_se(162, "Danderyds kommun", StockholmsLän),
129    Municipality::new_default_se(1862, "Degerfors kommun", ÖrebroLän),
130    Municipality::new_reduced_se(2425, "Dorotea kommun", VästerbottensLän),
131    Municipality::new_default_se(1730, "Eda kommun", VärmlandsLän),
132    Municipality::new_default_se(125, "Ekerö kommun", StockholmsLän),
133    Municipality::new_default_se(686, "Eksjö kommun", JönköpingsLän),
134    Municipality::new_default_se(862, "Emmaboda kommun", KalmarLän),
135    Municipality::new_default_se(381, "Enköpings kommun", UppsalaLän),
136    Municipality::new_default_se(484, "Eskilstuna kommun", SödermanlandsLän),
137    Municipality::new_default_se(1285, "Eslövs kommun", SkåneLän),
138    Municipality::new_default_se(1445, "Essunga kommun", VästraGötalandsLän),
139    Municipality::new_default_se(1982, "Fagersta kommun", VästmanlandsLän),
140    Municipality::new_default_se(1382, "Falkenbergs kommun", HallandsLän),
141    Municipality::new_default_se(1499, "Falköpings kommun", VästraGötalandsLän),
142    Municipality::new_default_se(2080, "Falu kommun", DalarnasLän),
143    Municipality::new_default_se(1782, "Filipstads kommun", VärmlandsLän),
144    Municipality::new_default_se(562, "Finspångs kommun", ÖstergötlandsLän),
145    Municipality::new_default_se(482, "Flens kommun", SödermanlandsLän),
146    Municipality::new_default_se(1763, "Forshaga kommun", VärmlandsLän),
147    Municipality::new_default_se(1439, "Färgelanda kommun", VästraGötalandsLän),
148    Municipality::new_default_se(2026, "Gagnefs kommun", DalarnasLän),
149    Municipality::new_default_se(662, "Gislaveds kommun", JönköpingsLän),
150    Municipality::new_default_se(461, "Gnesta kommun", SödermanlandsLän),
151    Municipality::new_default_se(617, "Gnosjö kommun", JönköpingsLän),
152    Municipality::new_default_se(980, "Gotlands kommun", GotlandsLän),
153    Municipality::new_default_se(1764, "Grums kommun", VärmlandsLän),
154    Municipality::new_default_se(1444, "Grästorps kommun", VästraGötalandsLän),
155    Municipality::new_default_se(1447, "Gullspångs kommun", VästraGötalandsLän),
156    Municipality::new_reduced_se(2523, "Gällivare kommun", NorrbottensLän),
157    Municipality::new_default_se(2180, "Gävle kommun", GävleborgsLän),
158    Municipality::new_default_se(1480, "Göteborgs kommun", VästraGötalandsLän),
159    Municipality::new_default_se(1471, "Götene kommun", VästraGötalandsLän),
160    Municipality::new_default_se(643, "Habo kommun", JönköpingsLän),
161    Municipality::new_default_se(1783, "Hagfors kommun", VärmlandsLän),
162    Municipality::new_default_se(1861, "Hallsbergs kommun", ÖrebroLän),
163    Municipality::new_default_se(1961, "Hallstahammars kommun", VästmanlandsLän),
164    Municipality::new_default_se(1380, "Halmstads kommun", HallandsLän),
165    Municipality::new_default_se(1761, "Hammarö kommun", VärmlandsLän),
166    Municipality::new_default_se(136, "Haninge kommun", StockholmsLän),
167    Municipality::new_reduced_se(2583, "Haparanda kommun", NorrbottensLän),
168    Municipality::new_default_se(331, "Heby kommun", UppsalaLän),
169    Municipality::new_default_se(2083, "Hedemora kommun", DalarnasLän),
170    Municipality::new_default_se(1283, "Helsingborgs kommun", SkåneLän),
171    Municipality::new_default_se(1466, "Herrljunga kommun", VästraGötalandsLän),
172    Municipality::new_default_se(1497, "Hjo kommun", VästraGötalandsLän),
173    Municipality::new_default_se(2104, "Hofors kommun", GävleborgsLän),
174    Municipality::new_default_se(126, "Huddinge kommun", StockholmsLän),
175    Municipality::new_default_se(2184, "Hudiksvalls kommun", GävleborgsLän),
176    Municipality::new_default_se(860, "Hultsfreds kommun", KalmarLän),
177    Municipality::new_default_se(1315, "Hylte kommun", HallandsLän),
178    Municipality::new_default_se(305, "Håbo kommun", UppsalaLän),
179    Municipality::new_default_se(1863, "Hällefors kommun", ÖrebroLän),
180    Municipality::new_reduced_se(2361, "Härjedalens kommun", JämtlandsLän),
181    Municipality::new_default_se(2280, "Härnösands kommun", VästernorrlandsLän),
182    Municipality::new_default_se(1401, "Härryda kommun", VästraGötalandsLän),
183    Municipality::new_default_se(1293, "Hässleholms kommun", SkåneLän),
184    Municipality::new_default_se(1284, "Höganäs kommun", SkåneLän),
185    Municipality::new_default_se(821, "Högsby kommun", KalmarLän),
186    Municipality::new_default_se(1266, "Hörby kommun", SkåneLän),
187    Municipality::new_default_se(1267, "Höörs kommun", SkåneLän),
188    Municipality::new_reduced_se(2510, "Jokkmokks kommun", NorrbottensLän),
189    Municipality::new_default_se(123, "Järfälla kommun", StockholmsLän),
190    Municipality::new_default_se(680, "Jönköpings kommun", JönköpingsLän),
191    Municipality::new_reduced_se(2514, "Kalix kommun", NorrbottensLän),
192    Municipality::new_default_se(880, "Kalmar kommun", KalmarLän),
193    Municipality::new_default_se(1446, "Karlsborgs kommun", VästraGötalandsLän),
194    Municipality::new_default_se(1082, "Karlshamns kommun", BlekingeLän),
195    Municipality::new_default_se(1883, "Karlskoga kommun", ÖrebroLän),
196    Municipality::new_default_se(1080, "Karlskrona kommun", BlekingeLän),
197    Municipality::new_default_se(1780, "Karlstads kommun", VärmlandsLän),
198    Municipality::new_default_se(483, "Katrineholms kommun", SödermanlandsLän),
199    Municipality::new_default_se(1715, "Kils kommun", VärmlandsLän),
200    Municipality::new_default_se(513, "Kinda kommun", ÖstergötlandsLän),
201    Municipality::new_reduced_se(2584, "Kiruna kommun", NorrbottensLän),
202    Municipality::new_default_se(1276, "Klippans kommun", SkåneLän),
203    Municipality::new_default_se(330, "Knivsta kommun", UppsalaLän),
204    Municipality::new_default_se(2282, "Kramfors kommun", VästernorrlandsLän),
205    Municipality::new_default_se(1290, "Kristianstads kommun", SkåneLän),
206    Municipality::new_default_se(1781, "Kristinehamns kommun", VärmlandsLän),
207    Municipality::new_reduced_se(2309, "Krokoms kommun", JämtlandsLän),
208    Municipality::new_default_se(1881, "Kumla kommun", ÖrebroLän),
209    Municipality::new_default_se(1384, "Kungsbacka kommun", HallandsLän),
210    Municipality::new_default_se(1960, "Kungsörs kommun", VästmanlandsLän),
211    Municipality::new_default_se(1482, "Kungälvs kommun", VästraGötalandsLän),
212    Municipality::new_default_se(1261, "Kävlinge kommun", SkåneLän),
213    Municipality::new_default_se(1983, "Köpings kommun", VästmanlandsLän),
214    Municipality::new_default_se(1381, "Laholms kommun", HallandsLän),
215    Municipality::new_default_se(1282, "Landskrona kommun", SkåneLän),
216    Municipality::new_default_se(1860, "Laxå kommun", ÖrebroLän),
217    Municipality::new_default_se(1814, "Lekebergs kommun", ÖrebroLän),
218    Municipality::new_default_se(2029, "Leksands kommun", DalarnasLän),
219    Municipality::new_default_se(1441, "Lerums kommun", VästraGötalandsLän),
220    Municipality::new_default_se(761, "Lessebo kommun", KronobergsLän),
221    Municipality::new_default_se(186, "Lidingö kommun", StockholmsLän),
222    Municipality::new_default_se(1494, "Lidköpings kommun", VästraGötalandsLän),
223    Municipality::new_default_se(1462, "Lilla Edets kommun", VästraGötalandsLän),
224    Municipality::new_default_se(1885, "Lindesbergs kommun", ÖrebroLän),
225    Municipality::new_default_se(580, "Linköpings kommun", ÖstergötlandsLän),
226    Municipality::new_default_se(781, "Ljungby kommun", KronobergsLän),
227    Municipality::new_reduced_se(2161, "Ljusdals kommun", GävleborgsLän),
228    Municipality::new_default_se(1864, "Ljusnarsbergs kommun", ÖrebroLän),
229    Municipality::new_default_se(1262, "Lomma kommun", SkåneLän),
230    Municipality::new_default_se(2085, "Ludvika kommun", DalarnasLän),
231    Municipality::new_reduced_se(2580, "Luleå kommun", NorrbottensLän),
232    Municipality::new_default_se(1281, "Lunds kommun", SkåneLän),
233    Municipality::new_reduced_se(2481, "Lycksele kommun", VästerbottensLän),
234    Municipality::new_default_se(1484, "Lysekils kommun", VästraGötalandsLän),
235    Municipality::new_default_se(1280, "Malmö kommun", SkåneLän),
236    Municipality::new_reduced_se(2023, "Malung-Sälens kommun", DalarnasLän),
237    Municipality::new_reduced_se(2418, "Malå kommun", VästerbottensLän),
238    Municipality::new_default_se(1493, "Mariestads kommun", VästraGötalandsLän),
239    Municipality::new_default_se(1463, "Marks kommun", VästraGötalandsLän),
240    Municipality::new_default_se(767, "Markaryds kommun", KronobergsLän),
241    Municipality::new_default_se(1461, "Melleruds kommun", VästraGötalandsLän),
242    Municipality::new_default_se(586, "Mjölby kommun", ÖstergötlandsLän),
243    Municipality::new_reduced_se(2062, "Mora kommun", DalarnasLän),
244    Municipality::new_default_se(583, "Motala kommun", ÖstergötlandsLän),
245    Municipality::new_default_se(642, "Mullsjö kommun", JönköpingsLän),
246    Municipality::new_default_se(1430, "Munkedals kommun", VästraGötalandsLän),
247    Municipality::new_default_se(1762, "Munkfors kommun", VärmlandsLän),
248    Municipality::new_default_se(1481, "Mölndals kommun", VästraGötalandsLän),
249    Municipality::new_default_se(861, "Mönsterås kommun", KalmarLän),
250    Municipality::new_default_se(840, "Mörbylånga kommun", KalmarLän),
251    Municipality::new_default_se(182, "Nacka kommun", StockholmsLän),
252    Municipality::new_default_se(1884, "Nora kommun", ÖrebroLän),
253    Municipality::new_default_se(1962, "Norbergs kommun", VästmanlandsLän),
254    Municipality::new_default_se(2132, "Nordanstigs kommun", GävleborgsLän),
255    Municipality::new_reduced_se(2401, "Nordmalings kommun", VästerbottensLän),
256    Municipality::new_default_se(581, "Norrköpings kommun", ÖstergötlandsLän),
257    Municipality::new_default_se(188, "Norrtälje kommun", StockholmsLän),
258    Municipality::new_reduced_se(2417, "Norsjö kommun", VästerbottensLän),
259    Municipality::new_default_se(881, "Nybro kommun", KalmarLän),
260    Municipality::new_default_se(140, "Nykvarns kommun", StockholmsLän),
261    Municipality::new_default_se(480, "Nyköpings kommun", SödermanlandsLän),
262    Municipality::new_default_se(192, "Nynäshamns kommun", StockholmsLän),
263    Municipality::new_default_se(682, "Nässjö kommun", JönköpingsLän),
264    Municipality::new_default_se(2101, "Ockelbo kommun", GävleborgsLän),
265    Municipality::new_default_se(1060, "Olofströms kommun", BlekingeLän),
266    Municipality::new_reduced_se(2034, "Orsa kommun", DalarnasLän),
267    Municipality::new_default_se(1421, "Orusts kommun", VästraGötalandsLän),
268    Municipality::new_default_se(1273, "Osby kommun", SkåneLän),
269    Municipality::new_default_se(882, "Oskarshamns kommun", KalmarLän),
270    Municipality::new_default_se(2121, "Ovanåkers kommun", GävleborgsLän),
271    Municipality::new_default_se(481, "Oxelösunds kommun", SödermanlandsLän),
272    Municipality::new_reduced_se(2521, "Pajala kommun", NorrbottensLän),
273    Municipality::new_default_se(1402, "Partille kommun", VästraGötalandsLän),
274    Municipality::new_default_se(1275, "Perstorps kommun", SkåneLän),
275    Municipality::new_reduced_se(2581, "Piteå kommun", NorrbottensLän),
276    Municipality::new_reduced_se(2303, "Ragunda kommun", JämtlandsLän),
277    Municipality::new_reduced_se(2409, "Robertsfors kommun", VästerbottensLän),
278    Municipality::new_default_se(1081, "Ronneby kommun", BlekingeLän),
279    Municipality::new_default_se(2031, "Rättviks kommun", DalarnasLän),
280    Municipality::new_default_se(1981, "Sala kommun", VästmanlandsLän),
281    Municipality::new_default_se(128, "Salems kommun", StockholmsLän),
282    Municipality::new_default_se(2181, "Sandvikens kommun", GävleborgsLän),
283    Municipality::new_default_se(191, "Sigtuna kommun", StockholmsLän),
284    Municipality::new_default_se(1291, "Simrishamns kommun", SkåneLän),
285    Municipality::new_default_se(1265, "Sjöbo kommun", SkåneLän),
286    Municipality::new_default_se(1495, "Skara kommun", VästraGötalandsLän),
287    Municipality::new_reduced_se(2482, "Skellefteå kommun", VästerbottensLän),
288    Municipality::new_default_se(1904, "Skinnskattebergs kommun", VästmanlandsLän),
289    Municipality::new_default_se(1264, "Skurups kommun", SkåneLän),
290    Municipality::new_default_se(1496, "Skövde kommun", VästraGötalandsLän),
291    Municipality::new_default_se(2061, "Smedjebackens kommun", DalarnasLän),
292    Municipality::new_reduced_se(2283, "Sollefteå kommun", VästernorrlandsLän),
293    Municipality::new_default_se(163, "Sollentuna kommun", StockholmsLän),
294    Municipality::new_default_se(184, "Solna kommun", StockholmsLän),
295    Municipality::new_reduced_se(2422, "Sorsele kommun", VästerbottensLän),
296    Municipality::new_default_se(1427, "Sotenäs kommun", VästraGötalandsLän),
297    Municipality::new_default_se(1230, "Staffanstorps kommun", SkåneLän),
298    Municipality::new_default_se(1415, "Stenungsunds kommun", VästraGötalandsLän),
299    Municipality::new_default_se(180, "Stockholms kommun", StockholmsLän),
300    Municipality::new_default_se(1760, "Storfors kommun", VärmlandsLän),
301    Municipality::new_reduced_se(2421, "Storumans kommun", VästerbottensLän),
302    Municipality::new_default_se(486, "Strängnäs kommun", SödermanlandsLän),
303    Municipality::new_default_se(1486, "Strömstads kommun", VästraGötalandsLän),
304    Municipality::new_reduced_se(2313, "Strömsunds kommun", JämtlandsLän),
305    Municipality::new_default_se(183, "Sundbybergs kommun", StockholmsLän),
306    Municipality::new_default_se(2281, "Sundsvalls kommun", VästernorrlandsLän),
307    Municipality::new_default_se(1766, "Sunne kommun", VärmlandsLän),
308    Municipality::new_default_se(1907, "Surahammars kommun", VästmanlandsLän),
309    Municipality::new_default_se(1214, "Svalövs kommun", SkåneLän),
310    Municipality::new_default_se(1263, "Svedala kommun", SkåneLän),
311    Municipality::new_default_se(1465, "Svenljunga kommun", VästraGötalandsLän),
312    Municipality::new_default_se(1785, "Säffle kommun", VärmlandsLän),
313    Municipality::new_default_se(2082, "Säters kommun", DalarnasLän),
314    Municipality::new_default_se(684, "Sävsjö kommun", JönköpingsLän),
315    Municipality::new_default_se(2182, "Söderhamns kommun", GävleborgsLän),
316    Municipality::new_default_se(582, "Söderköpings kommun", ÖstergötlandsLän),
317    Municipality::new_default_se(181, "Södertälje kommun", StockholmsLän),
318    Municipality::new_default_se(1083, "Sölvesborgs kommun", BlekingeLän),
319    Municipality::new_default_se(1435, "Tanums kommun", VästraGötalandsLän),
320    Municipality::new_default_se(1472, "Tibro kommun", VästraGötalandsLän),
321    Municipality::new_default_se(1498, "Tidaholms kommun", VästraGötalandsLän),
322    Municipality::new_default_se(360, "Tierps kommun", UppsalaLän),
323    Municipality::new_default_se(2262, "Timrå kommun", VästernorrlandsLän),
324    Municipality::new_default_se(763, "Tingsryds kommun", KronobergsLän),
325    Municipality::new_default_se(1419, "Tjörns kommun", VästraGötalandsLän),
326    Municipality::new_default_se(1270, "Tomelilla kommun", SkåneLän),
327    Municipality::new_reduced_se(1737, "Torsby kommun", VärmlandsLän),
328    Municipality::new_default_se(834, "Torsås kommun", KalmarLän),
329    Municipality::new_default_se(1452, "Tranemo kommun", VästraGötalandsLän),
330    Municipality::new_default_se(687, "Tranås kommun", JönköpingsLän),
331    Municipality::new_default_se(1287, "Trelleborgs kommun", SkåneLän),
332    Municipality::new_default_se(1488, "Trollhättans kommun", VästraGötalandsLän),
333    Municipality::new_default_se(488, "Trosa kommun", SödermanlandsLän),
334    Municipality::new_default_se(138, "Tyresö kommun", StockholmsLän),
335    Municipality::new_default_se(160, "Täby kommun", StockholmsLän),
336    Municipality::new_default_se(1473, "Töreboda kommun", VästraGötalandsLän),
337    Municipality::new_default_se(1485, "Uddevalla kommun", VästraGötalandsLän),
338    Municipality::new_default_se(1491, "Ulricehamns kommun", VästraGötalandsLän),
339    Municipality::new_reduced_se(2480, "Umeå kommun", VästerbottensLän),
340    Municipality::new_default_se(114, "Upplands Väsby kommun", StockholmsLän),
341    Municipality::new_default_se(139, "Upplands-Bro kommun", StockholmsLän),
342    Municipality::new_default_se(380, "Uppsala kommun", UppsalaLän),
343    Municipality::new_default_se(760, "Uppvidinge kommun", KronobergsLän),
344    Municipality::new_default_se(584, "Vadstena kommun", ÖstergötlandsLän),
345    Municipality::new_default_se(665, "Vaggeryds kommun", JönköpingsLän),
346    Municipality::new_default_se(563, "Valdemarsviks kommun", ÖstergötlandsLän),
347    Municipality::new_default_se(115, "Vallentuna kommun", StockholmsLän),
348    Municipality::new_default_se(2021, "Vansbro kommun", DalarnasLän),
349    Municipality::new_default_se(1470, "Vara kommun", VästraGötalandsLän),
350    Municipality::new_default_se(1383, "Varbergs kommun", HallandsLän),
351    Municipality::new_default_se(187, "Vaxholms kommun", StockholmsLän),
352    Municipality::new_default_se(1233, "Vellinge kommun", SkåneLän),
353    Municipality::new_default_se(685, "Vetlanda kommun", JönköpingsLän),
354    Municipality::new_reduced_se(2462, "Vilhelmina kommun", VästerbottensLän),
355    Municipality::new_default_se(884, "Vimmerby kommun", KalmarLän),
356    Municipality::new_reduced_se(2404, "Vindelns kommun", VästerbottensLän),
357    Municipality::new_default_se(428, "Vingåkers kommun", SödermanlandsLän),
358    Municipality::new_default_se(1442, "Vårgårda kommun", VästraGötalandsLän),
359    Municipality::new_default_se(1487, "Vänersborgs kommun", VästraGötalandsLän),
360    Municipality::new_reduced_se(2460, "Vännäs kommun", VästerbottensLän),
361    Municipality::new_default_se(120, "Värmdö kommun", StockholmsLän),
362    Municipality::new_default_se(683, "Värnamo kommun", JönköpingsLän),
363    Municipality::new_default_se(883, "Västerviks kommun", KalmarLän),
364    Municipality::new_default_se(1980, "Västerås kommun", VästmanlandsLän),
365    Municipality::new_default_se(780, "Växjö kommun", KronobergsLän),
366    Municipality::new_default_se(512, "Ydre kommun", ÖstergötlandsLän),
367    Municipality::new_default_se(1286, "Ystads kommun", SkåneLän),
368    Municipality::new_default_se(1492, "Åmåls kommun", VästraGötalandsLän),
369    Municipality::new_reduced_se(2260, "Ånge kommun", VästernorrlandsLän),
370    Municipality::new_reduced_se(2321, "Åre kommun", JämtlandsLän),
371    Municipality::new_default_se(1765, "Årjängs kommun", VärmlandsLän),
372    Municipality::new_reduced_se(2463, "Åsele kommun", VästerbottensLän),
373    Municipality::new_default_se(1277, "Åstorps kommun", SkåneLän),
374    Municipality::new_default_se(561, "Åtvidabergs kommun", ÖstergötlandsLän),
375    Municipality::new_default_se(765, "Älmhults kommun", KronobergsLän),
376    Municipality::new_reduced_se(2039, "Älvdalens kommun", DalarnasLän),
377    Municipality::new_default_se(319, "Älvkarleby kommun", UppsalaLän),
378    Municipality::new_reduced_se(2560, "Älvsbyns kommun", NorrbottensLän),
379    Municipality::new_default_se(1292, "Ängelholms kommun", SkåneLän),
380    Municipality::new_default_se(1407, "Öckerö kommun", VästraGötalandsLän),
381    Municipality::new_default_se(509, "Ödeshögs kommun", ÖstergötlandsLän),
382    Municipality::new_default_se(1880, "Örebro kommun", ÖrebroLän),
383    Municipality::new_default_se(1257, "Örkelljunga kommun", SkåneLän),
384    Municipality::new_reduced_se(2284, "Örnsköldsviks kommun", VästernorrlandsLän),
385    Municipality::new_reduced_se(2380, "Östersunds kommun", JämtlandsLän),
386    Municipality::new_default_se(117, "Österåkers kommun", StockholmsLän),
387    Municipality::new_default_se(382, "Östhammars kommun", UppsalaLän),
388    Municipality::new_default_se(1256, "Östra Göinge kommun", SkåneLän),
389    Municipality::new_reduced_se(2513, "Överkalix kommun", NorrbottensLän),
390    Municipality::new_reduced_se(2518, "Övertorneå kommun", NorrbottensLän),
391];
392
393#[cfg(test)]
394mod tests {
395    use super::*;
396    use crate::Money;
397    use chrono::NaiveDate;
398
399    #[test]
400    fn debug_stockholm_taxes_structure() {
401        use crate::constants::DEFAULT_SE_TAXES;
402        let stockholm = Municipality::get_by_name("Stockholms kommun").unwrap();
403
404        eprintln!("Stockholm: {:?}", stockholm.name);
405        eprintln!("Stockholm taxes pointer: {:p}", &stockholm.taxes);
406        eprintln!("DEFAULT_SE_TAXES pointer: {:p}", &DEFAULT_SE_TAXES);
407
408        let date = NaiveDate::from_ymd_opt(2025, 1, 15).unwrap();
409        eprintln!("Testing with date: {:?}", date);
410
411        let taxes = stockholm.taxes();
412        eprintln!("Taxes object: {:?}", taxes);
413
414        let tax_list = taxes.for_date(date);
415        eprintln!("Tax list length: {}", tax_list.len());
416        eprintln!("Tax list: {:?}", tax_list);
417
418        let total = taxes.kwh_total(date);
419        eprintln!("Tax total: {:?}", total);
420    }
421
422    #[test]
423    fn stockholm_has_taxes() {
424        let stockholm = Municipality::get_by_name("Stockholms kommun").unwrap();
425        let taxes = stockholm.taxes();
426
427        // Use a date that's definitely in the tax period from constants.rs (2025-01-01 to 2025-12-31)
428        let date = NaiveDate::from_ymd_opt(2025, 1, 15).unwrap();
429
430        let tax_list = taxes.for_date(date);
431
432        assert!(
433            !tax_list.is_empty(),
434            "Stockholm should have taxes for date {:?}",
435            date
436        );
437        assert!(
438            taxes.kwh_total(date) > Money::new(0, 0),
439            "Stockholm should have non-zero tax amount"
440        );
441    }
442
443    #[test]
444    fn stockholm_has_tax_reductions() {
445        let stockholm = Municipality::get_by_name("Stockholms kommun").unwrap();
446        let tax_reductions = stockholm.tax_reductions();
447        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
448
449        assert!(
450            !tax_reductions.for_date(date).is_empty(),
451            "Stockholm should have tax reductions"
452        );
453        assert!(
454            tax_reductions.kwh_total(date) > Money::new(0, 0),
455            "Stockholm should have non-zero tax reduction amount"
456        );
457    }
458
459    #[test]
460    fn goteborg_has_taxes() {
461        let goteborg = Municipality::get_by_name("Göteborgs kommun").unwrap();
462        let taxes = goteborg.taxes();
463        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
464
465        assert!(
466            !taxes.for_date(date).is_empty(),
467            "Göteborg should have taxes"
468        );
469        assert!(
470            taxes.kwh_total(date) > Money::new(0, 0),
471            "Göteborg should have non-zero tax amount"
472        );
473    }
474
475    #[test]
476    fn goteborg_has_tax_reductions() {
477        let goteborg = Municipality::get_by_name("Göteborgs kommun").unwrap();
478        let tax_reductions = goteborg.tax_reductions();
479        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
480
481        assert!(
482            !tax_reductions.for_date(date).is_empty(),
483            "Göteborg should have tax reductions"
484        );
485        assert!(
486            tax_reductions.kwh_total(date) > Money::new(0, 0),
487            "Göteborg should have non-zero tax reduction amount"
488        );
489    }
490
491    #[test]
492    fn malmo_has_taxes() {
493        let malmo = Municipality::get_by_name("Malmö kommun").unwrap();
494        let taxes = malmo.taxes();
495        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
496
497        assert!(!taxes.for_date(date).is_empty(), "Malmö should have taxes");
498        assert!(
499            taxes.kwh_total(date) > Money::new(0, 0),
500            "Malmö should have non-zero tax amount"
501        );
502    }
503
504    #[test]
505    fn malmo_has_tax_reductions() {
506        let malmo = Municipality::get_by_name("Malmö kommun").unwrap();
507        let tax_reductions = malmo.tax_reductions();
508        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
509
510        assert!(
511            !tax_reductions.for_date(date).is_empty(),
512            "Malmö should have tax reductions"
513        );
514        assert!(
515            tax_reductions.kwh_total(date) > Money::new(0, 0),
516            "Malmö should have non-zero tax reduction amount"
517        );
518    }
519
520    #[test]
521    fn kiruna_has_reduced_taxes() {
522        // Kiruna uses reduced taxes
523        let kiruna = Municipality::get_by_name("Kiruna kommun").unwrap();
524        let taxes = kiruna.taxes();
525        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
526
527        assert!(!taxes.for_date(date).is_empty(), "Kiruna should have taxes");
528        assert!(
529            taxes.kwh_total(date) > Money::new(0, 0),
530            "Kiruna should have non-zero tax amount"
531        );
532    }
533
534    #[test]
535    fn kiruna_has_tax_reductions() {
536        let kiruna = Municipality::get_by_name("Kiruna kommun").unwrap();
537        let tax_reductions = kiruna.tax_reductions();
538        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
539
540        assert!(
541            !tax_reductions.for_date(date).is_empty(),
542            "Kiruna should have tax reductions"
543        );
544        assert!(
545            tax_reductions.kwh_total(date) > Money::new(0, 0),
546            "Kiruna should have non-zero tax reduction amount"
547        );
548    }
549
550    #[test]
551    fn gallivare_has_reduced_taxes() {
552        // Gällivare uses reduced taxes
553        let gallivare = Municipality::get_by_name("Gällivare kommun").unwrap();
554        let taxes = gallivare.taxes();
555        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
556
557        assert!(
558            !taxes.for_date(date).is_empty(),
559            "Gällivare should have taxes"
560        );
561        assert!(
562            taxes.kwh_total(date) > Money::new(0, 0),
563            "Gällivare should have non-zero tax amount"
564        );
565    }
566
567    #[test]
568    fn gallivare_has_tax_reductions() {
569        let gallivare = Municipality::get_by_name("Gällivare kommun").unwrap();
570        let tax_reductions = gallivare.tax_reductions();
571        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
572
573        assert!(
574            !tax_reductions.for_date(date).is_empty(),
575            "Gällivare should have tax reductions"
576        );
577        assert!(
578            tax_reductions.kwh_total(date) > Money::new(0, 0),
579            "Gällivare should have non-zero tax reduction amount"
580        );
581    }
582
583    #[test]
584    fn reduced_tax_municipalities_have_lower_taxes_than_default() {
585        // Compare a reduced tax municipality to a default tax municipality
586        let kiruna = Municipality::get_by_name("Kiruna kommun").unwrap();
587        let stockholm = Municipality::get_by_name("Stockholms kommun").unwrap();
588        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
589
590        let kiruna_taxes = kiruna.taxes().kwh_total(date);
591        let stockholm_taxes = stockholm.taxes().kwh_total(date);
592
593        assert!(
594            kiruna_taxes < stockholm_taxes,
595            "Kiruna (reduced tax) should have lower taxes than Stockholm (default tax)"
596        );
597    }
598
599    #[test]
600    fn all_municipalities_have_taxes_and_reductions() {
601        let date = NaiveDate::from_ymd_opt(2025, 6, 1).unwrap();
602
603        for municipality in MUNICIPALITIES {
604            let taxes = municipality.taxes();
605            let tax_reductions = municipality.tax_reductions();
606
607            assert!(
608                !taxes.for_date(date).is_empty(),
609                "{} should have taxes",
610                municipality.name
611            );
612            assert!(
613                taxes.kwh_total(date) > Money::new(0, 0),
614                "{} should have non-zero tax amount",
615                municipality.name
616            );
617
618            assert!(
619                !tax_reductions.for_date(date).is_empty(),
620                "{} should have tax reductions",
621                municipality.name
622            );
623            assert!(
624                tax_reductions.kwh_total(date) > Money::new(0, 0),
625                "{} should have non-zero tax reduction amount",
626                municipality.name
627            );
628        }
629    }
630
631    #[test]
632    fn can_lookup_municipality_by_code() {
633        // Test a few municipality codes
634        let stockholm = Municipality::get_by_code(180).unwrap();
635        assert_eq!(stockholm.name, "Stockholms kommun");
636
637        let goteborg = Municipality::get_by_code(1480).unwrap();
638        assert_eq!(goteborg.name, "Göteborgs kommun");
639
640        let malmo = Municipality::get_by_code(1280).unwrap();
641        assert_eq!(malmo.name, "Malmö kommun");
642    }
643
644    #[test]
645    fn can_lookup_municipality_by_name() {
646        let stockholm = Municipality::get_by_name("Stockholms kommun").unwrap();
647        assert_eq!(stockholm.code, 180);
648
649        let goteborg = Municipality::get_by_name("Göteborgs kommun").unwrap();
650        assert_eq!(goteborg.code, 1480);
651
652        let malmo = Municipality::get_by_name("Malmö kommun").unwrap();
653        assert_eq!(malmo.code, 1280);
654    }
655
656    #[test]
657    fn with_current_taxes_filters_to_current_date() {
658        let stockholm = Municipality::get_by_name("Stockholms kommun")
659            .unwrap()
660            .clone();
661        let stockholm_current = stockholm.with_current_taxes();
662
663        // The with_current_taxes should filter to only current taxes
664        // We can't easily test this without knowing the exact date, but we can verify it doesn't panic
665        let _ = stockholm_current.taxes();
666    }
667
668    #[test]
669    fn with_current_tax_reductions_filters_to_current_date() {
670        let stockholm = Municipality::get_by_name("Stockholms kommun")
671            .unwrap()
672            .clone();
673        let stockholm_current = stockholm.with_current_tax_reductions();
674
675        // The with_current_tax_reductions should filter to only current reductions
676        // We can't easily test this without knowing the exact date, but we can verify it doesn't panic
677        let _ = stockholm_current.tax_reductions();
678    }
679}