ó
    õhÉj·
  ã                   ó  • S r SSKrSSKrSSKrSSKr\R
                  " \5      rSrSr	\R                  " S5      r\R                  " S5      rSS\S\4S	 jjrS
\S\4S jrS\S\4S jrS\S\4S jrS\S\4S jrS
\S\4S jrg)u   
Generador de cÃ³digos de familia alfanumÃ©ricos (mismo formato que hec-photo-app).

Formato: {PREFIJO}-{3 caracteres}-{3 caracteres}   â†’  ej: MAR-P8Y-D23

Charset sin caracteres ambiguos (0/O/1/I/L), pensado para leerse a ojo y para que
el OCR de rescate del organizer pueda recuperar un cÃ³digo cuando el QR no
descodifica. 31^6 â‰ˆ 887 millones de combinaciones por prefijo: adivinar el cÃ³digo
de otra familia deja de ser viable (el formato antiguo, 3 letras + 4 dÃ­gitos,
tenÃ­a solo 10 000 por prefijo).
é    NÚ23456789ABCDEFGHJKMNPQRSTUVWXYZé   z^[A-Z]{2,6}$z^[A-Z0-9][A-Z0-9-]{1,23}$ÚlengthÚreturnc                 ón   • SR                  [        R                  " 5       R                  [        U S95      $ )NÚ )Úk)ÚjoinÚrandomÚSystemRandomÚchoicesÚCHARSET)r   s    ÚWD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\utils\code_generator.pyÚ_segmentr      s*   € Ø�7‰7”6×&Ò&Ó(×0Ñ0´¸FÐ0ÐCÓDÐDó    Úprefixc                 ót   • U R                  5       R                  S5      n U  S[        5        S[        5        3$ )u)   CÃ³digo candidato sin verificar unicidad.Ú-)ÚupperÚstripr   )r   s    r   Ú
build_coder      s3   € à�\‰\‹^×!Ñ! #Ó&€FØˆX�Q”x“z�l !¤H£J <Ð0Ð0r   Úrawc                 ób   • U R                  5       R                  SS5      R                  SS5      $ )uE   'MAR-P8Y-D23' â†’ 'MARP8YD23'. Para comparar sin guiones ni espacios.r   r   Ú )r   Úreplace)r   s    r   Únormalize_coder   %   s(   € à�9‰9‹;×Ñ˜s BÓ'×/Ñ/°°RÓ8Ð8r   Úcodec                 ó   • U R                  5       R                  SS5      n SU ;   a  U $ [        R                  " SU 5      nU(       a7  UR	                  S5       SUR	                  S5       SUR	                  S5       3$ U $ )u?   'MARP8YD23' â†’ 'MAR-P8Y-D23' (lo que se enseÃ±a y se imprime).r   r   r   zP^([A-Z]{2,6})([23456789A-HJKMNPQRSTUVWXYZ]{3})([23456789A-HJKMNPQRSTUVWXYZ]{3})$é   é   é   )r   r   ÚreÚmatchÚgroup)r   Úms     r   Úformat_code_displayr&   *   sn   € à�:‰:‹<×Ñ  RÓ(€DØ
ˆdƒ{ØˆÜ
�ŠÐdÐfjÓk€AÞ89ˆa�g‰g�a‹jˆ\˜˜1Ÿ7™7 1›:˜, a¨¯©°«
 |Ð4ÐC¸tÐCr   Únamec                 óö   • SR                  S [        R                  " SU =(       d    S5       5       5      nSR                  S UR                  5        5       5      nUSS =(       d    SR	                  SS5      $ )	uT   Prefijo por defecto de un colegio: sus 3 primeras letras (sin acentos), MAYÃšSCULAS.r   c              3   ó^   #   • U  H#  n[         R                  " U5      S :w  d  M  Uv •  M%     g7f)ÚMnN)ÚunicodedataÚcategory©Ú.0Úcs     r   Ú	<genexpr>Ú#prefix_from_name.<locals>.<genexpr>5   s(   é € ÐjÒF˜Ì+×J^ÒJ^Ð_`ÓJaÐeiÑJi—1‘1ÒFùs   ‚-¤	-ÚNFDc              3   óL   #   • U  H  nS Us=::  a  S::  d  M  O  M  Uv •  M     g7f)ÚAÚZN© r-   s     r   r0   r1   6   s   é € ÐA¢˜A°¸µ¸S±“a±—a¢ùs   ‚$—$›	$Nr!   ÚFOTÚX)r
   r+   Ú	normalizer   Úljust)r'   ÚbaseÚletterss      r   Úprefix_from_namer=   3   s_   € à�7‰7Ñjœk×3Ò3°E¸4¿:À2ÔFÓjÓj€DØ�g‰gÑA §¡¤ÓAÓA€GØ�B�QˆK× ˜5×'Ñ'¨¨3Ó/Ð/r   c                 ó  • [        S[        S-   5       HZ  n[        U5      nU R                  SU[	        U5      45      R                  5       nU(       d  Us  $ [        R                  SX#5        M\     [        SU S[         S35      e)uS   CÃ³digo Ãºnico (global: el cÃ³digo identifica familia Y colegio) contra `families`.r   z=SELECT 1 FROM families WHERE code=? OR REPLACE(code,'-','')=?u)   ColisiÃ³n de cÃ³digo en el intento %d: %sz-Could not generate a unique code with prefix z after z	 attempts)	ÚrangeÚMAX_RETRIESr   Úexecuter   ÚfetchoneÚloggerÚwarningÚRuntimeError)Úconnr   Úattemptr   Útakens        r   Úgenerate_unique_coderI   :   s‚   € ä˜œK¨!™OÖ,ˆÜ˜&Ó!ˆØ—‘ØKØ”> $Ó'Ð(ó*ç*2©(«*ð 	ö ØŠKÜ�‰ÐBÀGÖRñ -ô ÐFÀvÀhÈgÔVaÐUbÐbkÐlÓ
mÐmr   )r!   )Ú__doc__Úloggingr   r"   r+   Ú	getLoggerÚ__name__rC   r   r@   ÚcompileÚ	PREFIX_REÚCODE_REÚintÚstrr   r   r   r&   r=   rI   r6   r   r   Ú<module>rS      sÌ   ðñ
ó Û Û 	Û à	×	Ò	˜8Ó	$€à
+€Ø€Ø�JŠJ�Ó'€	ð �*Š*Ð1Ó
2€ñE�Sð E õ Eð1�sð 1˜sô 1ð9˜ð 9 ô 9ð
D˜cð D cô Dð0˜3ð 0 3ô 0ð
n sð 
n¨sõ 
nr   