
    k)i                         d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
Z
ddlmZ  ede	      Zdd	ed
edefdZddedefdZddededefdZddedefdZ	 ddedee   dededef
dZy)z4
Shared utility functions used by multiple modules.
    N)Session)TypeTypeVar)Base)slugify	ModelType)boundprependlengthreturnc                     t         j                  t         j                  z   dj                  fdt	        |      D              }| r|  d| S |S )z
    Generate a secure random ID with optional prefix.
    
    Args:
        prepend: String to prepend to the ID
        length: Length of the random part
        
    Returns:
        Secure random ID string
     c              3   H   K   | ]  }t        j                          y w)N)secretschoice).0_alphabets     [/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/base/utils/functions.py	<genexpr>z%generate_secure_id.<locals>.<genexpr>   s     Jq'..2Js   "r   )stringascii_lettersdigitsjoinrange)r
   r   random_partr   s      @r   generate_secure_idr      sK     ##fmm3H''JE&MJJK!K=))    decimalsc                 `    t        | d|z  z  dz         d|z  z  }|dz  dk(  rt        |      }|S )zJ
    This function rounds a number half up. Eg. 18.5 will round to 19
    
   g      ?   r   )int)numberr   rounded_values      r   round_half_upr&   $   sB     "h,/#56"h,GMqAM*r   val	precisionc                 \    dj                  |      }	 |j                  | dz        S #  Y yxY w)Nz
{{:,.{}f}}d   0)format)r'   r(   formatted_amounts      r   format_amountr.   .   s7    #**95&&sSy11s   ' +sizec                     dj                  t        j                  t        j                  t        j
                  z   |             S )z0
    Generate a random string of given size
    r   )k)r   randomchoicesr   ascii_uppercaser   r/   s    r   random_string_generatorr6   6   s-     776>>&"8"86=="HDQRRr   dbinstance
slug_labelnew_slugc                     ||}nt        |      }| j                  |      j                  |j                  |k(        j	                         }|r,dj                  |t        d            }t        | ||d      S |S )zp
    This is for a FastAPI project and it assumes your instance
    is a model, and generates a unique slug
    Nz{slug}-{randstr}   r5   )slugrandstr)r7   r8   r:   r9   )r   queryfilterr=   firstr,   r6   generate_unique_slug)r7   r8   r9   r:   r=   	qs_existss         r   rB   rB   =   s     z" "))(--4*?@FFHI%,,6A> - 
 $HxD
 	
 Kr   )r      )r   )   )   )NN)__doc__r   r   sqlalchemy.ormr   typingr   r   src.apps.base.modelsr   r2   r   r   strr#   r   r&   floatr.   r6   rB    r   r   <module>rN      s      "   %  Kt,	 # s (C  u  S S# Sc S UY	?8;NQr   