Austria’s Covid legislation: Duration of parliamentarian consultation period in comparison.

Austria
Corona
pdftools
A (relative) deep dive into the length of the public consultation period for draft bills in Austria, and whether three days for three pages are actually ‘normal’.
Author

Roland Schmidt

Published

20 Feb 2021

1 Context

This is an addition to my previous posts on COVID related legislation in Austria.

Over New Year (!), the Austrian government introduced another bill with the aim to get a grip on the COVID pandemic. With the speed with which things have been developping and the flurry of hard/soft/de facto lockdowns, I have to confess that I would have to look into the text to recall the changes introduced by bill 88/ME (XXVII) (in full: ‘Epidemiegesetz, COVID-19-Maßnahmengesetz, Änderung’). However, what made the bill memorable even during these times was its legislative genesis, with the government limiting the public consultative process to only three days. As mentioned in previous posts, Austria’s legislative procedure includes a public consultation process which allows citizens, NGOs, churches etc. to file submissions in which they can raise concerns and provide feedback on the draft law. At least in theory, it’s a feedback loop which allows the government to solicit input and revise its bills.

Unsurprisingly, at least to me, the government was harshly criticized for this short consultation period and accused of rendering any meaningful consideration impossible. I am no expert on the legislative process, but a quick Google search led me to a circular from 2008 in which the Chancellery’s own constitutional service urged ministries to provide a consultative period of at least six weeks. In contrast, some pointed out that the bill had only three pages and that - in light of the urgency due to a pandemic - three days should suffice to read and comment on the bill.

This debate made me wonder how long other bills were open for the consultative process and how bill 88/ME (XXVII) would compare, also when considering their documents’ lengths. To answer these questions, I a) extracted from the parliament’s website the start and end dates of all bill’s consultative period since 1975, as published on the parliament’s website. Based on these dates I calculated the length of the consultative process; b) downloaded the text of all pertaining bills and retrieved their number of pages. Putting the length of the consultation process and the length of the bill together should allow to better evaluate the three day notice for the amendment to the epidemic bill.

I’ll first present the results and other stuff I found noteworthy, and then focus on some of the required steps in R to obtain them. The raw dataset containing the consolidated results is here.

2 Results

2.1 Number of submissions

Code
pl_submissions_per_bill<- df_consolidated %>% 
  mutate(bill_indicator=case_when(str_detect(title, "Epidemie") & legis_period=="XXVII" ~ "yes",
                                  TRUE ~ as.character("no"))) %>% 
  ungroup() %>% 
  ggplot()+
  labs(title="LEGISLATIVE CONSULTATION PROCESS:\nNumber of filed submissions per bill.",
       subtitle="Note log scale of y-axis.",
       x="Date",
       y="Number of submissions (log scale)",
       caption=caption)+
  geom_segment(aes(x=as.Date("2017-01-01"),
               xend=as.Date("2017-01-01"),
               y=0,
               yend=4000),
               color="grey50")+
  geom_text(label=str_wrap("Introduction of possibility to file electronic submissions via parliament's website",30),
            aes(x=as.Date("2016-06-01"),
            y=6000),
            color="grey50",
            lineheight=0.7,
            check_overlap = T,
            hjust=1,
            vjust=1,
            size=3,
            family="Roboto condensed")+
  geom_jitter_interactive(aes(x=date_end_max,
               y=n_obs_submissions,
               tooltip=glue::glue("{str_wrap(title, 40)}
                                  Number of submissions: {n_obs_submissions}
                                  Bill ID: {bill_id}/{legis_period},
                                  
                                  Click to open submission page"),
               onclick=paste0('window.open("', link_single_bill_page, '#tab-Stellungnahmen', '")'),
               color=bill_indicator))+
    geom_text(label=str_wrap("Epidemiegesetz, COVID-19-Maßnahmengesetz, Änderung (88/ME)
", 40),
aes(x=as.Date("2021-01-01"),
    y=19000),
color="firebrick",
lineheight=0.7,
check_overlap = T,
hjust=1,
size=3,
family="Roboto Condensed")+
  scale_x_date(breaks=c(seq.Date(as.Date("1990-01-01"), as.Date("2020-01-01"), by="10 year"), as.Date("2017-01-01"),
                        as.Date(min(df_consolidated$date_end_max))),
               date_labels = "%Y" )+
  scale_y_log10(labels=scales::label_comma(accuracy=1),
                limits=c(1, 20000))+
  scale_color_manual(values=c("yes"="firebrick",
                              "no"="grey50"),
                     labels=c("yes"="Covid-19 related bills",
                              "no"="other"))+
  guides(color=guide_legend(reverse=T))+
  theme_post()+
  theme(plot.title.position = "panel",
        legend.position = "top",
        legend.direction = "horizontal",
        legend.justification = "left",
        legend.title = element_blank(),
        axis.title.x = element_text(hjust=0,
                                    color="grey30"),
        axis.title.y=element_text(hjust=0, 
                                  color="grey30",
                                  angle=90))

pl_submissions_per_bill <- girafe(ggobj = pl_submissions_per_bill,
       height_svg = 5,
       options = list(
    opts_toolbar(saveaspng = FALSE),
    opts_tooltip(css = glue::glue("background-color:{plot_bg_color}; 
                 line-height:100%;
                 color:black;
                 font-size:80%;
                 font-family:'Roboto Condensed';)"))
  ))

To start with, let’s have a look at the number of submissions filed during the consultation process per bill. The plot below shows quite clearly that bills related to Covid triggered record breaking numbers of submissions. Apart from the three latest Covid bills, only the two drafts related to security issues (‘Sicherheitspolizeigesetz’) with around 9,000 submissions were within a similar level. To get details, hover over the dots. Note that the y-axis is log-scaled to keep the variation among bills with fewer submissions visible.

2.2 Duration of consultation process and length of bills

But what about the initial question? How unusual is it that a bill of three pages length, i.e. bill 88/ME (XXVII), is open for consultation for only three days? The plot below addresses this question. As the orange dot in the graph below highlights, there has never been another bill with three pages and as little as three days of consultation. The next bills in the same page-length category had eight days (among them a bill amending the law on gambling/Glückspielgesetz…). So at least from this perspective, the consultation period for bill 88/ME was quite an aberration.

However, if we broaden our view a bit, and also consider bills with fewer or more than three pages, we see that there were several other bills for which consultation periods shorter than three days were granted.

Code
caption_note <- "Note: Each dot represents a specific bill of x pages and y days available for filing a submission as part of the public consultation process. Dots within the same rectangle have the same page - duration combination. Random variation was added to avoid overplotting of dots. Only bills with max 10 pages and max 20 days consultation period are shown. See blog post for details."

pl_length_duration <- df_consolidated %>% 
  filter(duration_collected<21) %>% 
  filter(duration_collected>0) %>% 
  filter(pdf_pages_sum<11) %>% 
  mutate(pdf_pages_sum_fct=forcats::fct_inseq(as.character(pdf_pages_sum))) %>% 
  mutate(duration_collected_fct=fct_inseq(as.character(duration_collected)) %>% fct_rev()) %>% 
  ggplot()+
  labs(title="Duration of consultation process and length of considered bills:",
       subtitle = "",
       caption=glue::glue("{str_wrap(caption_note, 125)}
                          
                          {caption}"),
    x="Number of bill's pages",
       y="Number of days to file a submission")+
  geom_jitter_interactive(aes
                          (x=pdf_pages_sum_fct,
                            y=duration_collected_fct,
                            color=covid_measures_bill,
                            tooltip=glue::glue("Name of bill: {stringr::str_trunc(title, width=25, side=c('right'))},
                              Legislation period: {legis_period}, Bill ID: {bill_id}
                              pages: {pdf_pages_sum}
                              consultation duration: {duration_collected}
                              link: <a href={link_single_bill_page}>Click to open</a>"),
                              onclick=paste0('window.open("', link_single_bill_page , '")'))) +
  scale_color_manual(values=c("COVID-19-Maßnahmengesetz"="orange", "other"="grey50"),
                     labels=c("COVID-19-Maßnahmengesetz"="Epidemiegesetz ME88/XXVII",
                              "other"="other"))+
  facet_grid(duration_collected_fct ~ pdf_pages_sum_fct,
             drop=F,
             switch="both",
             scales="free")+
  theme_post()+
  theme(panel.spacing.x = unit(0, "cm"),
        panel.spacing.y = unit(0, "cm"),
        panel.grid.major.x =  element_blank(),
        panel.grid.major.y =  element_blank(),
        strip.text.y.left = element_text(angle=0,
                                         vjust=0.5,
                                         hjust=1,
                                         color="grey30",
                                         face="plain"), #.left needed
        strip.text.x.bottom = element_text(angle=0,
                                           hjust=0.5,
                                           color="grey30",
                                           face="plain"), #.left needed
        legend.position = "top",
        legend.direction = "horizontal",
        legend.justification = "left",
        legend.title = element_blank(),
        axis.title.x = element_text(hjust=0,
                                    color="grey30"),
        axis.title.y=element_text(hjust=0, 
                                  color="grey30",
                                  angle=90),
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        panel.border = element_rect(color = "black", fill = NA, size = .2))

pl_length_duration <- girafe(ggobj = pl_length_duration,
       height_svg = 5,
       options = list(
    opts_toolbar(saveaspng = FALSE),
    opts_tooltip(css = glue::glue("background-color:{plot_bg_color}; 
                 line-height:100%;
                 color:black;
                 font-size:80%;
                 font-family:'Roboto Condensed';)"))
  ))

Nevertheless, out of the 3683 bills open for consultation, 3527 featured longer consultation periods than three days. There were only 47 bills with three or fewer days (excluding results with negative duration or incomplete start/end dates due to errors in the data source, see here).

Code
pl_consolidated <- df_consolidated %>% 
  filter(duration_collected>=0) %>% #remove those with negative duration
  count(duration_collected<=3) %>% 
  janitor::clean_names() %>%
  mutate(duration_3=as_factor(duration_collected_3)) %>% 
  ggplot()+
  labs(title="Number of bills with three or fewer days of consultation period",
       subtitle="Bill 88/ME XXVII amending the 'law on epidemics' was open for consultation for three days. \nHow many other bills had a similar or shorter consultation period?",
       y="Number of bills",
       x="Length of consultation period",
       caption=glue::glue("{caption}\nAnalysis excluded {nrow(df_duration_mult %>% filter(if_any(starts_with('date'), is.na)))+nrow(df_duration_collected %>% 
  filter(duration_collected<0))} bills with errors in the data source. See blog for details.")
       )+
  geom_bar(aes(x=duration_3,
               y=n,
               fill=duration_3),
           stat="identity",
           position=position_dodge(width=0.9))+
  geom_text(aes(x=as.numeric(duration_3)-(.5*.9),
                y=n,
                label=n),
            # position=position_dodge(width=0.9),
            size=10,
            color="grey30",
            vjust=0,
            hjust=0)+
  scale_x_discrete(labels=c("FALSE"="more than 3 days",
                            "TRUE"="3 days or fewer"),
                   expand = expansion(mult=c(0,0.1)))+
  scale_y_continuous(labels=scales::label_comma(),
                     limits=c(0,NA),
                     expand=expansion(mult=c(0,0.1)))+
  scale_fill_manual(values=c("FALSE"="grey30",
                    "TRUE"="orange"))+
  theme_post()+
  theme(legend.position = "none",
        axis.text.x = element_text(color="grey10"),
        axis.title.y = element_text(color="grey30",
                                    angle=90,
                                    vjust=1,
                                    hjust=0),
        axis.title.x = element_text(color="grey30",
                                    # angle=90,
                                    # vjust=1,
                                    hjust=0))

2.3 Overview table

If you are interested in the details pertaining to each bill, the table below provides them. Note that for the sake of completeness this table also includes those bills for which I retrieved impossible/wrong duration data (see here for details.) However, the latter were excluded from the analysis.

Code
#table.start
tb_consolidated