Ë
    Ã?Æi*  ã                  ó‚  — d Z ddlmZ ddlZddlZddl­ ddlmZ dZerddl	m
Z
 dZd!d	„Z ed
„ eD «       «      Zej                  d„ dD «       «       dZddddddddddddddœZdZddj'                  e«      z  ZdZedz   ez   dz   ez   dz   edz   ez   dz   ez   dz   gZd"d„Zd#d„Zd$d%d„Zd&d„ZdZ	 	 d'	 	 	 	 	 	 	 d(d „Zy))a  Handelsregisternummer (German company register number).

The number consists of the court where the company has registered, the type
of register and the registration number.

The type of the register is either HRA or HRB where the letter "B" stands for
HR section B, where limited liability companies and corporations are entered
(GmbH's and AG's). There is also a section HRA for business partnerships
(OHG's, KG's etc.). In other words: businesses in section HRB are limited
liability companies, while businesses in HRA have personally liable partners.

More information:

* https://www.handelsregister.de/
* https://en.wikipedia.org/wiki/German_Trade_Register
* https://offeneregister.de/

>>> validate('Aachen HRA 11223')
'Aachen HRA 11223'
>>> validate('Frankfurt/Oder GnR 11223', company_form='e.G.')
'Frankfurt/Oder GnR 11223'
>>> validate('Aachen HRC 44123')
Traceback (most recent call last):
  ...
InvalidFormat: ...
>>> validate('Aachen HRA 44123', company_form='GmbH')
Traceback (most recent call last):
  ...
InvalidComponent: ...
é    )ÚannotationsN)Ú*)ÚcleanF)ÚAny)—ÚAachenÚ	AltenburgÚAmbergÚAnsbachÚApoldaÚArnsbergzArnstadt Zweigstelle IlmenauÚArnstadtÚAschaffenburgÚAugsburgÚAurichzBad HersfeldúBad Homburg v.d.H.zBad KreuznachzBad OeynhausenzBad SalzungenÚBambergÚBayreuthúBerlin (Charlottenburg)Ú	BielefeldÚBochumÚBonnÚBraunschweigÚBremenÚChemnitzÚCoburgÚCoesfeldÚCottbusÚ	DarmstadtÚ
DeggendorfÚDortmundÚDresdenÚDuisburgu   DÃ¼renu   DÃ¼sseldorfÚEisenachÚErfurtÚEschwegeÚEssenÚ	FlensburgzFrankfurt am MainzFrankfurt/OderÚFreiburgÚ	FriedbergÚFritzlarÚFuldau   FÃ¼rthÚGelsenkirchenÚGerau   GieÃŸenÚGothaÚGreizu
   GÃ¶ttingenu
   GÃ¼terslohÚHagenÚHamburgÚHammÚHanauÚHannoverzHeilbad HeiligenstadtÚHildburghausenÚ
HildesheimÚHofÚHomburgÚ
IngolstadtÚIserlohnÚJenaÚKaiserslauternÚKasselõ   Kempten (AllgÃ¤u)ÚKielÚKleveÚKoblenzÚKorbachÚKrefeldõ   KÃ¶lnu   KÃ¶nigsteinÚLandauÚLandshutÚ
LangenfeldÚLebachÚLeipzigÚLemgoÚLimburgú#Ludwigshafen a.Rhein (Ludwigshafen)u   LÃ¼becku	   LÃ¼neburgÚMainzÚMannheimÚMarburgÚ	MeiningenÚ	MemmingenÚMerzigÚ	Montabauru   MÃ¶nchengladbachu   MÃ¼hlhausenu   MÃ¼nchenu   MÃ¼nsterÚNeubrandenburgÚNeunkirchenÚ	NeuruppinÚNeussÚ
Nordhausenu	   NÃ¼rnbergzOffenbach am MainúOldenburg (Oldenburg)u
   OsnabrÃ¼ckÚ	OttweilerÚ	PaderbornÚPassauÚ	PinnebergÚPotsdamu$   PÃ¶ÃŸneck Zweigstelle Bad Lobensteinu	   PÃ¶ÃŸneckÚRecklinghausenÚ
RegensburgÚRostockzRudolstadt Zweigstelle SaalfeldÚ
Rudolstadtu   SaarbrÃ¼ckenÚ	SaarlouisÚSchweinfurtÚSchwerinÚSiegburgÚSiegenÚSondershausenÚ	SonnebergúSt. Ingbert (St Ingbert)úSt. Wendel (St Wendel)Ú
StadthagenÚ	StadtrodaÚ	SteinfurtÚStendalÚ	StralsundÚ	StraubingÚ	StuttgartÚSuhlu	   SÃ¶mmerdaÚTostedtÚ
TraunsteinÚUlmu   VÃ¶lklingenÚWalsrodeúWeiden i. d. OPf.ÚWeimarÚWetzlarÚ	WiesbadenÚWittlichÚ	Wuppertalu	   WÃ¼rzburgu   ZweibrÃ¼ckenc                óv   — dj                  d„ t        j                  d| j                  «       «      D «       «      S )zDConvert the court name for quick comparison without encoding issues.Ú c              3  ó(   K  — | ]
  }|d v r|–— Œ y­w)ÚabcdefghijklmnopqrstuvwxyzN© ©Ú.0Úxs     úf/var/www/html/myprovider/mon_projet_qr/lib/python3.12/site-packages/stdnum/de/handelsregisternummer.pyú	<genexpr>z_to_min.<locals>.<genexpr>á   s!   è ø€ ò .ØØÐ,Ñ,ô 	
ñ.ùs   ‚ÚNFD)ÚjoinÚunicodedataÚ	normalizeÚlower)Úcourts    r†   Ú_to_minrŽ   ß   s3   € à�7‰7ñ .Ü×(Ñ(¨°·±³Ó>ô.ó .ð .ó    c              #  ó6   K  — | ]  }t        |«      |f–— Œ y ­w©N©rŽ   )r„   r�   s     r†   r‡   r‡   ç   s   è ø€ ò 8Ø %„WˆUƒ^�UÔñ8ùs   ‚c              #  ó<   K  — | ]  \  }}t        |«      |f–— Œ y ­wr‘   r’   )r„   Úaliasr�   s      r†   r‡   r‡   é   s"   è ø€ ò Ù ,  u„WˆUƒ^�UÔñùs   ‚))u   AllgÃ¤ur>   )zBad Homburgr   )ÚBerlinr   )ÚCharlottenburgr   )zCharlottenburg (Berlin)r   )ÚKalnrD   )ÚKemptenr>   )z$Ludwigshafen am Rhein (Ludwigshafen)rL   )zLudwigshafen am RheinrL   )ÚLudwigshafenrL   )Ú	OldenburgrY   )zSt. Ingbertrj   )z
St. Wendelrk   )zWeiden in der Oberpfalzrx   )ÚWeidenrx   )u   Paderborn frÃ¼her HÃ¶xterr[   )ÚHRAÚHRBÚPRÚGnRÚVRrœ   r    r�   rŸ   rž   )ze.K.ze.V.ÚVereinÚOHGÚKGÚKGaAzVor-GmbHÚGmbHÚUGzUG i.G.ÚAGze.G.ÚPartGz(?P<court>.*)z(?P<registry>%s)ú|u0   (?P<nr>[1-9][0-9]{0,5})(\s*(?P<x>[A-ZÃ–]{1,3}))?z\s+z,?\s+ú$c                ót  — t        | «      j                  «       } t        D ]�  }t        j                  || t        j
                  t        j                  z  ¬«      }|sŒ=|j                  d«      j                  «       |j                  d«      |j                  d«      |j                  d«      fc S  t        «       ‚)zVSplit the number into a court, registry, register number and
    optionally qualifier.)Úflagsr�   ÚregistryÚnrr…   )	r   ÚstripÚ_formatsÚreÚmatchÚIÚUÚgroupÚInvalidFormat)ÚnumberÚfmtÚms      r†   Ú_splitrº   "  s‘   € ô �6‹]× Ñ Ó"€FÜò ^ˆÜ�H‰H�S˜&¬¯©¬r¯t©t©Ô4ˆÚØ—7‘7˜7Ó#×)Ñ)Ó+¨Q¯W©W°ZÓ-@À!Ç'Á'È$Ã-ÐQR×QXÑQXÐY\ÓQ]Ð]Ò]ð^ô ‹/Ðr�   c                óZ   — t        | «      \  }}} }dj                  d„ ||| |fD «       «      S )zˆConvert the number to the minimal representation. This strips the
    number of any valid separators and removes surrounding whitespace.ú c              3  ó&   K  — | ]	  }|sŒ|–— Œ y ­wr‘   r‚   rƒ   s     r†   r‡   zcompact.<locals>.<genexpr>1  ó   è ø€ ÒI˜!Âq”AÑIùó   ‚Š)rº   r‰   )r·   r�   r­   Ú	qualifiers       r†   ÚcompactrÁ   -  s4   € ô *0°«Ñ&€Eˆ8�V˜YØ�8‰8ÑI  x°¸ÐCÔIÓIÐIr�   c                óö   — t        | «      \  }}} }t        j                  t        |«      «      }|s
t	        «       ‚|r"t
        j                  |«      |k7  r
t	        «       ‚dj                  d„ ||| |fD «       «      S )zªCheck if the number is a valid company registry number. If a
    company_form (eg. GmbH or PartG) is given, the number is validated to
    have the correct registry type.r¼   c              3  ó&   K  — | ]	  }|sŒ|–— Œ y ­wr‘   r‚   rƒ   s     r†   r‡   zvalidate.<locals>.<genexpr>?  r¾   r¿   )rº   Ú_courtsÚgetrŽ   ÚInvalidComponentÚCOMPANY_FORM_REGISTRY_TYPESr‰   )r·   Úcompany_formr�   r­   rÀ   s        r†   ÚvalidaterÉ   4  sq   € ô
 *0°«Ñ&€Eˆ8�V˜YÜ�K‰Kœ ›Ó'€EÙÜÓ Ð ÙÔ3×7Ñ7¸ÓEÈÒQÜÓ Ð Ø�8‰8ÑI  x°¸ÐCÔIÓIÐIr�   c                óJ   — 	 t        t        | «      «      S # t        $ r Y yw xY w)z7Check if the number is a valid company registry number.F)ÚboolrÉ   ÚValidationError)r·   s    r†   Úis_validrÍ   B  s)   € ðÜ”H˜VÓ$Ó%Ð%øÜò Ùðús   ‚ –	"¡"z.https://db.offeneregister.de/openregister.jsonc           	     ó(  — ddl }t        | «      \  }}} }|j                  t        d|›d|›d| ›�dœ||¬«      }|j	                  «        	 |j                  «       }t        t        |d   |d   d   «      «      S # t        t        f$ r
}	Y d}	~	yd}	~	ww xY w)	a  Retrieve registration information from the OffeneRegister.de web site.

    The `timeout` argument specifies the network timeout in seconds.

    The `verify` argument is either a boolean that determines whether the
    server's certificate is validate or a string which must be a path the CA
    certificate bundle to use for verification.

    This basically returns the JSON response from the web service as a dict.
    It will contain something like the following::

        {
            'companyId': 'U1206_HRB14011',
            'courtCode': 'U1206',
            'courtName': 'Chemnitz',
            'globalId': 'sn_293298',
            'isCurrent': 'True',
            'name': 'Internet hier GmbH Presentation Provider',
            'nativeReferenceNumber': 'Chemnitz HRB 14011',
            'referenceNumberFirstSeen': '2020-06-12',
            'stdRefNo': 'U1206_HRB14011',
            'validFrom': '2020-06-12',
            'validTill': '',
        }

    Will return None if the number is invalid or unknown.
    r   Nz÷
                   select *
                   from ReferenceNumbers
                   join Names on ReferenceNumbers.companyId = Names.companyId
                   where nativeReferenceNumber = :p0
                   limit 1
                   r¼   )ÚsqlÚp0)ÚparamsÚtimeoutÚverifyÚcolumnsÚrows)
Úrequestsrº   rÅ   Ú_offeneregister_urlÚraise_for_statusÚjsonÚdictÚzipÚKeyErrorÚ
IndexError)
r·   rÒ   rÓ   rÖ   r�   r­   rÀ   ÚresponserÙ   Úes
             r†   Úcheck_offeneregisterrà   N  s¢   € óD Ü)/°«Ñ&€Eˆ8�V˜YØ�|‰|Üðò !&¢x±Ð8ñ:ð Øð ó €Hð ×ÑÔðØ�}‰}‹ˆÜ”C˜˜Y™¨¨f©°a©Ó9Ó:Ð:øÜ”jÐ!ò Üûðús   Á
-A8 Á8BÂB)r�   ÚstrÚreturnrá   )r·   rá   râ   z tuple[str, str, str, str | None])r·   rá   râ   rá   r‘   )r·   rá   rÈ   z
str | Nonerâ   rá   )r·   rá   râ   rË   )é   T)r·   rá   rÒ   ÚfloatrÓ   z
bool | strrâ   zdict[str, Any] | None)Ú__doc__Ú
__future__r   r±   rŠ   Ústdnum.exceptionsÚstdnum.utilr   ÚTYPE_CHECKINGÚtypingr   ÚGERMAN_COURTSrŽ   rÚ   rÄ   ÚupdateÚREGISTRY_TYPESrÇ   Ú	_court_rer‰   Ú_registry_reÚ
_number_rer°   rº   rÁ   rÉ   rÍ   r×   rà   r‚   r�   r†   ú<module>rñ      sP  ðñ,õ> #ã 	Û ä Ý ð €ÙÝðX€óv.ñ ñ 8Ø)6ô8ó 8€à ‡�ñ ð1ôô ð,€ð ØØØØ
ØØØØ
ØØ
ØØñÐ ð$ €	Ø" S§X¡X¨nÓ%=Ñ=€Ø@€
à�6Ñ˜JÑ&¨Ñ1°IÑ=ÀÑCØ�Ñ˜<Ñ'¨&Ñ0°:Ñ=ÀÑCð€óóJôJóð GÐ ð
 Øð6Øð6àð6ð ð6ð ô	6r�   