Repository: focus-shift/jollyday (java)

Issue:
Add all missing subdivisions of France 
### More information

based on https://github.com/focus-shift/jollyday/blob/main/.adr/001-document-every-subdivision.md we want to define all subdivisions of France based on https://www.iso.org/obp/ui/#iso:code:3166:FR

Pull request:
france: add missing subdivisions
closes #566 

refs #576
refs #577 

Patch:
diff --git a/jollyday-core/src/main/resources/holidays/Holidays_fr.xml b/jollyday-core/src/main/resources/holidays/Holidays_fr.xml
index 1c66e873..2080996f 100644
--- a/jollyday-core/src/main/resources/holidays/Holidays_fr.xml
+++ b/jollyday-core/src/main/resources/holidays/Holidays_fr.xml
@@ -19,51 +19,330 @@
     <ChristianHoliday type="WHIT_MONDAY" validFrom="2008" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
   </Holidays>
 
-  <SubConfigurations hierarchy="ges" description="Grand Est">
+  <!-- ARA - Auvergne-Rhône-Alpes-->
+  <SubConfigurations hierarchy="01" description="Ain">
     <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="03" description="Allier">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="07" description="Ardèche">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="15" description="Cantal">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="26" description="Drôme">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="43" description="Haute-Loire">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="38" description="Isère">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="74" description="Haute-Savoie">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="42" description="Loire">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="69M" description="Métropole de Lyon">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="63" description="Puy-de-Dôme">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="69" description="Rhône">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="73" description="Savoie">
+    <Holidays/>
+  </SubConfigurations>
 
-    <SubConfigurations hierarchy="57" description="Moselle">
-      <Holidays>
-        <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="SECOND_CHRISTMAS_DAY"/>
-      </Holidays>
-    </SubConfigurations>
+  <!-- BFC - Bourgogne-Franche-Comté -->
+  <SubConfigurations hierarchy="21" description="Côte-d'Or">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="25" description="Doubs">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="70" description="Haute-Saône">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="39" description="Jura">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="58" description="Nièvre">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="71" description="Saône-et-Loire">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="90" description="Territoire de Belfort">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="89" description="Yonne">
+    <Holidays/>
+  </SubConfigurations>
+
+  <!-- BRE - Bretagne -->
+  <SubConfigurations hierarchy="22" description="Côtes-d'Armor">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="29" description="Finistère">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="35" description="Ille-et-Vilaine">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="56" description="Morbihan">
+    <Holidays/>
+  </SubConfigurations>
 
-    <SubConfigurations hierarchy="67" description="Bas-Rhin">
-      <Holidays>
-        <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="SECOND_CHRISTMAS_DAY"/>
-        <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      </Holidays>
-    </SubConfigurations>
+  <!-- CVL - Centre-Val de Loire -->
+  <SubConfigurations hierarchy="18" description="Cher">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="28" description="Eure-et-Loir">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="36" description="Indre">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="37" description="Indre-et-Loire">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="41" description="Loir-et-Cher">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="45" description="Loiret">
+    <Holidays/>
+  </SubConfigurations>
 
-    <SubConfigurations hierarchy="68" description="Haut-Rhin">
-      <Holidays>
-        <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="SECOND_CHRISTMAS_DAY"/>
-        <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      </Holidays>
-    </SubConfigurations>
+  <!-- 20R - Corse -->
+  <SubConfigurations hierarchy="2A" description="Corse-du-Sud">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="2B" description="Haute-Corse">
+    <Holidays/>
   </SubConfigurations>
 
-  <SubConfigurations hierarchy="971" description="Guadeloupe">
+  <!-- 6AE - European Collectivity of Alsace -->
+  <SubConfigurations hierarchy="67" description="Bas-Rhin">
     <Holidays>
-      <Fixed month="MAY" day="27" descriptionPropertiesKey="ABOLITION_OF_SLAVERY"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="SECOND_CHRISTMAS_DAY"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
     </Holidays>
   </SubConfigurations>
-
-  <SubConfigurations hierarchy="972" description="Martinique">
+  <SubConfigurations hierarchy="68" description="Haut-Rhin">
     <Holidays>
-      <Fixed month="MAY" day="22" descriptionPropertiesKey="ABOLITION_OF_SLAVERY"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="SECOND_CHRISTMAS_DAY"/>
+      <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
     </Holidays>
   </SubConfigurations>
 
-  <SubConfigurations hierarchy="973" description="Guyane">
+  <!-- GES - Grand-Est -->
+  <SubConfigurations hierarchy="08" description="Ardennes">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="10" description="Aube">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="52" description="Haute-Marne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="51" description="Marne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="54" description="Meurthe-et-Moselle">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="55" description="Meuse">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="57" description="Moselle">
     <Holidays>
-      <Fixed month="JUNE" day="10" descriptionPropertiesKey="ABOLITION_OF_SLAVERY"/>
+      <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="ABOLITION_OF_SLAVERY"/>
     </Holidays>
   </SubConfigurations>
+  <SubConfigurations hierarchy="88" description="Vosges">
+    <Holidays/>
+  </SubConfigurations>
 
-  <SubConfigurations hierarchy="974" description="La Reunion">
-    <Holidays>
-      <Fixed month="DECEMBER" day="20" descriptionPropertiesKey="ABOLITION_OF_SLAVERY"/>
-    </Holidays>
+  <!-- HDF - Hauts-de-France -->
+  <SubConfigurations hierarchy="02" description="Aisne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="59" description="Nord">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="60" description="Oise">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="62" description="Pas-de-Calais">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="80" description="Somme">
+    <Holidays/>
+  </SubConfigurations>
+
+  <!-- IDF - Île-de-France -->
+  <SubConfigurations hierarchy="91" description="Essonne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="92" description="Hauts-de-Seine">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="75C" description="Paris">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="93" description="Seine-Saint-Denis">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="77" description="Seine-et-Marne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="95" description="Val-d'Oise">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="94" description="Val-de-Marne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="78" description="Yvelines">
+    <Holidays/>
+  </SubConfigurations>
+
+  <!-- NOR - Normandie -->
+  <SubConfigurations hierarchy="14" description="Calvados">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="27" description="Eure">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="50" description="Manche">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="61" description="Orne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="76" description="Seine-Maritime">
+    <Holidays/>
+  </SubConfigurations>
+
+  <!-- NAQ - Nouvelle-Aquitaine -->
+  <SubConfigurations hierarchy="16" description="Charente">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="17" description="Charente-Maritime">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="19" description="Corrèze">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="23" description="Creuse">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="79" description="Deux-Sèvres">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="24" description="Dordogne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="33" description="Gironde">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="87" description="Haute-Vienne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="40" description="Landes">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="47" description="Lot-et-Garonne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="64" description="Pyrénées-Atlantiques">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="86" description="Vienne">
+    <Holidays/>
+  </SubConfigurations>
+
+  <!-- OCC - Occitanie -->
+  <SubConfigurations hierarchy="09" description="Ariège">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="11" description="Aude">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="12" description="Aveyron">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="30" description="Gard">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="32" description="Gers">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="31" description="Haute-Garonne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="65" description="Hautes-Pyrénées">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="34" description="Hérault">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="46" description="Lot">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="48" description="Lozère">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="66" description="Pyrénées-Orientales">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="81" description="Tarn">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="82" description="Tarn-et-Garonne">
+    <Holidays/>
+  </SubConfigurations>
+
+  <!-- PDL - Pays-de-la-Loire -->
+  <SubConfigurations hierarchy="44" description="Loire-Atlantique">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="49" description="Maine-et-Loire">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="53" description="Mayenne">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="72" description="Sarthe">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="85" description="Vendée">
+    <Holidays/>
+  </SubConfigurations>
+
+  <!-- PAC - Provence-Alpes-Côte-d’Azur -->
+  <SubConfigurations hierarchy="06" description="Alpes-Maritimes">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="04" description="Alpes-de-Haute-Provence">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="13" description="Bouches-du-Rhône">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="05" description="Hautes-Alpes">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="83" description="Var">
+    <Holidays/>
+  </SubConfigurations>
+  <SubConfigurations hierarchy="84" description="Vaucluse">
+    <Holidays/>
   </SubConfigurations>
 </Configuration>


Test patch:
diff --git a/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/country/HolidayFRTest.java b/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/country/HolidayFRTest.java
index ae367f5d..50fb7456 100644
--- a/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/country/HolidayFRTest.java
+++ b/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/country/HolidayFRTest.java
@@ -32,6 +32,25 @@ class HolidayFRTest {
         .between(Year.of(1900), Year.of(2003))
         .notBetween(Year.of(2004), Year.of(2007))
         .between(Year.of(2008), Year.of(2500))
+      .and()
+
+      .hasFixedHoliday("ABOLITION_OF_SLAVERY", DECEMBER, 26)
+        .inSubdivision("57")
+      .and()
+
+      .hasFixedHoliday("SECOND_CHRISTMAS_DAY", DECEMBER, 26)
+        .inSubdivision("67")
+      .and()
+      .hasChristianHoliday("GOOD_FRIDAY")
+        .inSubdivision("67")
+      .and()
+
+      .hasFixedHoliday("SECOND_CHRISTMAS_DAY", DECEMBER, 26)
+        .inSubdivision("68")
+      .and()
+      .hasChristianHoliday("GOOD_FRIDAY")
+        .inSubdivision("68")
+
       .check();
   }
 }