text: # import Asclepius dependencies
  from asclepius.instelling import GGZ, ZKH
  from asclepius.medewerker import Medewerker
  
  # import other dependencies
  from selenium import webdriver
  from typing import Union
  from time import sleep
  
  class PortaalDriver:
      driver = 'C:\Program Files (x86)\chromedriver.exe'
      
      def __init__(self, gebruiker: Medewerker):
          self.gebruiker = gebruiker
          self.driver = PortaalDriver.driver
          self.portaal = None
          return None
      
      def open_portaal(self):
          self.portaal = webdriver.Chrome(self.driver)
          return None
      
      def inloggen(self, instelling: Union[GGZ, ZKH]):
          # open portaal
          self.portaal = webdriver.Chrome(self.driver)
          
          # haal de loginpagina op
          self.portaal.get(instelling.login)
          sleep(2)
          
          # vind invoer op de pagina
          username = self.portaal.find_element_by_name('username')
          password = self.portaal.find_element_by_name('password')
          submit = self.portaal.find_element_by_name('submit')
          
          # verstuur de informatie van de gebruiker
          username.send_keys(self.gebruiker.gebruikersnaam)
          password.send_keys(self.gebruiker.wachtwoord)
          submit.click()
          sleep(2)
          return
  
      # Download Excel Functies
  
      def download_da_excel(self, instelling: Union[GGZ, ZKH], test: bool = False):
          if test:
              da_link = instelling.daily_audit_test
              da_download_link = instelling.da_test_excel_download
          else:
              da_link = instelling.daily_audit
              da_download_link = instelling.da_excel_download
          
          self.portaal.get(da_link)
          sleep(2)
          if (not test) and (instelling.huidige_omgeving == "productie"):
              quickremove = self.portaal.find_element_by_class_name('quickRemove')
              quickremove_list = quickremove.find_elements_by_tag_name("li")
              for quickremove_item in quickremove_list:
                  if quickremove_item.text == " Behandeld: Ja" or quickremove_item.text == " Behandeld: Nee":
                      delete_behandeld = quickremove_item.find_element_by_class_name('delete')
                      delete_behandeld.click()
                      sleep(3)
                      break
          self.portaal.get(da_download_link)
          sleep(5)
          return None
  
      def download_bi_excel(self, instelling: Union[GGZ, ZKH]):
          self.portaal.get(instelling.bi_prestatiekaart)
          sleep(2)
          self.portaal.get(instelling.bi_excel_download)
          sleep(5)
          return None
  
      def download_zpm_excel(self, instelling: Union[GGZ, ZKH]):
          self.portaal.get(instelling.zpm_prestatiekaart)
          sleep(2)
          self.portaal.get(instelling.zpm_excel_download)
          sleep(5)
          return None
      
      def download_zpm_nza_excel(self, instelling: Union[GGZ, ZKH]):
          self.portaal.get(instelling.zpm_nza_prestatiekaart)
          sleep(2)
          self.portaal.get(instelling.zpm_nza_excel_download)
          sleep(5)
          return None
      
      def get_slm_delta(self, instelling: Union[GGZ, ZKH]):
          self.portaal.get(instelling.slm_per_verzekeraar)
          sleep(2)
          totaal_footer = self.portaal.find_element_by_tag_name('tfoot')
          totaal_list = totaal_footer.find_elements_by_tag_name('th')
          rode_delta = totaal_list[-1].text
          return rode_delta
  
      # Webscraper Portaal Functies
  
      def webscraper_da_portaal(self, instelling: Union[GGZ, ZKH]):
          # inloggen op het portaal
          self.inloggen(instelling)
  
          # download excel controle/norm in productie
          self.download_da_excel(instelling, False)
          self.gebruiker.webscraper_hernoem_bestand(instelling, 'da', False)
          
          sleep(1)
          
              # download excel controle/norm in test
          self.download_da_excel(instelling, True)
          self.gebruiker.webscraper_hernoem_bestand(instelling, 'da', True)
  
          # sluit het portaal af
          self.portaal.close()
          return None
  
      def webscraper_bi_portaal(self, instelling: Union[GGZ, ZKH]):
          # inloggen op het portaal
          self.inloggen(instelling)
          
              # download excel BI prestatiekaart
          self.download_bi_excel(instelling)
          self.gebruiker.webscraper_hernoem_bestand(instelling, 'bi')
          
  
          # sluit het portaal af
          self.portaal.close()
          return None
  
      def webscraper_zpm_portaal(self, instelling: Union[GGZ, ZKH]):
          # inloggen op het portaal
          self.inloggen(instelling)
  
          # download excel ZPM prestatiekaart
          self.download_zpm_excel(instelling)
          self.gebruiker.webscraper_hernoem_bestand(instelling, 'zpm')
  
          # sluit het portaal af
          self.portaal.close()
          return None
  
      def webscraper_zpm_nza_portaal(self, instelling: Union[GGZ, ZKH]):
          # inloggen op het portaal
          self.inloggen(instelling)
  
          # download excel ZPM prestatiekaart
          self.download_zpm_nza_excel(instelling)
          self.gebruiker.webscraper_hernoem_bestand(instelling, 'zpm_nza')
  
          # sluit het portaal af
          self.portaal.close()
          return None
  
      def webscraper_slm_portaal(self, instelling: Union[GGZ, ZKH]):
          # inloggen op het portaal
          self.inloggen(instelling)
  
          # download excel ZPM prestatiekaart
          rode_delta = self.get_slm_delta(instelling)
          instelling.set_slm_delta(rode_delta)
  
          # sluit het portaal af
          self.portaal.close()
          return None
  
      def webscraper_da_groot_portaal(self, instelling: Union[GGZ, ZKH]):
          # inloggen op het portaal
          self.inloggen(instelling)
  
          # download excel controle/norm in productie
          self.portaal.get(instelling.daily_audit)
          sleep(2)
          self.portaal.get(instelling.da_excel_groot_download)
          sleep(30)
          self.gebruiker.webscraper_hernoem_bestand(instelling, 'da', False)
  
          # sluit het portaal af
          self.portaal.close()
          return None
  
      # Webscraper Functies
  
      def webscraper_da(self, instelling: Union[GGZ, ZKH]):
          """Download de DA Excels van de opgegeven instelling (ZKH | GGZ)."""
  
          # download excels uit acceptatie omgeving
          instelling.kies_omgeving('acceptatie')
          self.webscraper_da_portaal(instelling)
  
          # download excels uit productie omgeving
          instelling.kies_omgeving('productie')
          self.webscraper_da_portaal(instelling)
          return None
      
      def webscraper_bi(self, instelling: Union[GGZ, ZKH]):
          """Download de BI Excels van de opgegeven instelling (ZKH | GGZ)."""
  
          # download excels uit acceptatie omgeving
          instelling.kies_omgeving('acceptatie')
          self.webscraper_bi_portaal(instelling)
  
          # download excels uit productie omgeving
          instelling.kies_omgeving('productie')
          self.webscraper_bi_portaal(instelling)
          return None
  
      def webscraper_zpm(self, instelling: Union[GGZ, ZKH]):
          """Download de ZPM Excels van de opgegeven instelling (ZKH | GGZ)."""
  
          # download excels uit acceptatie omgeving
          instelling.kies_omgeving('acceptatie')
          self.webscraper_zpm_portaal(instelling)
  
          # download excels uit productie omgeving
          instelling.kies_omgeving('productie')
          self.webscraper_zpm_portaal(instelling)
          return None
      
      def webscraper_zpm_nza(self, instelling: Union[GGZ, ZKH]):
          """Download de ZPM Excels van de opgegeven instelling (ZKH | GGZ)."""
  
          # download excels uit acceptatie omgeving
          instelling.kies_omgeving('acceptatie')
          self.webscraper_zpm_nza_portaal(instelling)
  
          # download excels uit productie omgeving
          instelling.kies_omgeving('productie')
          self.webscraper_zpm_nza_portaal(instelling)
          return None
  
      def webscraper_slm(self, instelling: Union[GGZ, ZKH]):
          """Download de BI Excels van de opgegeven instelling (ZKH | GGZ)."""
  
          # download excels uit acceptatie omgeving
          instelling.kies_omgeving('acceptatie')
          self.webscraper_slm_portaal(instelling)
  
          # download excels uit productie omgeving
          instelling.kies_omgeving('productie')
          self.webscraper_slm_portaal(instelling)
          return None
  
      def webscraper_da_groot(self, *instellingen: Union[GGZ, ZKH], omgeving: str = 'productie'):
          mislukt_download = []
          for instelling in instellingen:
              #try:
              #    instelling.kies_omgeving(omgeving)
              #    self.webscraper_da_groot_portaal(instelling)
              #except:
              #    mislukt_download.append(instelling.klant_code)
              #    print(f'Het downloaden van {instelling.klant_code} is mislukt!')
              instelling.kies_omgeving(omgeving)
              self.webscraper_da_groot_portaal(instelling)
  
  
          # Print mislukte downloads/tests
          if len(mislukt_download) != 0:
              print('Mislukte downloads:', ' '.join(mislukt_download))
          else:
              print('Geen mislukte downloads!')
          
          return None