§
    ÝŸ’j�  ã                  ó˜   — d Z ddlmZ ddlmZmZ ddlmZ eee	e
ef         Z ed¦  «        fdd
„Zdd„Zddd„Zddd„ZeZd d„Zd!d„ZdS )"zÔEnterprise Financial & Arithmetic Precision Utilities.
Strict Rule: No float/double for financial amounts or BoQ quantity calculations.
Uses Decimal(18, 4) arithmetic and standard Vietnamese currency formatting.
é    )Úannotations)ÚROUND_HALF_UPÚDecimal)ÚUnionÚvalúNumericType | NoneÚdefaultr   Úreturnc                óf  — | €|S t          | t          ¦  «        r| S 	 t          | ¦  «                             dd¦  «                             dd¦  «                             dd¦  «                             dd¦  «                             ¦   «         }|s|S t          |¦  «        S # t
          $ r |cY S w xY w)zRSafely convert any numeric or string value to Decimal with precision preservation.Nú,Ú ú u   â‚«u   Ä‘)Ú
isinstancer   ÚstrÚreplaceÚstripÚ	Exception)r   r	   Ús_vals      ú*C:\Projects\DSCons\app\common\financial.pyÚ
to_decimalr      s¼   € à
€{ØˆÝ�#•wÑÔð Øˆ
ðõ �‰HŒHßŠW�S˜"ÑÔßŠW�S˜"ÑÔßŠW�U˜BÑÔßŠW�T˜2ÑÔßŠU‰WŒWð 	ð ð 	ØˆNÝ�u‰~Œ~ÐøÝð ð ð Øˆˆˆðøøøs   �A4B! ÂB! Â!B0Â/B0c                ór   — t          | ¦  «        }|                     t          d¦  «        t          ¬¦  «        S )zMRound to nearest VND integer (0 decimals) per standard Vietnamese accounting.é   ©Úrounding)r   Úquantizer   r   )r   Úds     r   Úround_currencyr   %   s)   € å�3‰Œ€AØ�:Š:•g˜a‘j”j­=ˆ:Ñ9Ô9Ð9ó    é   ÚplacesÚintc                ó~   — t          | ¦  «        }t          d¦  «        | z  }|                     |t          ¬¦  «        S )zGRound engineering BoQ quantity to specified decimal places (default 4).é
   r   )r   r   r   r   )r   r    r   Útargets       r   Úround_quantityr%   +   s5   € å�3‰Œ€AÝ�R‰[Œ[˜V˜GÑ#€FØ�:Š:�f¥}ˆ:Ñ5Ô5Ð5r   TÚshow_symbolÚboolr   c                ó€   — t          | ¦  «        }t          |¦  «        }|d›                     dd¦  «        }|r|› d�n|S )u�   Format currency to standard Vietnamese locale with dot thousand separators.
    Example: 123456789 -> '123.456.789 â‚«' or '123.456.789'
    r   ú.u    â‚«)r   r!   r   )r   r&   r   Úint_valÚ	formatteds        r   Ú
format_vndr,   2   sN   € õ 	�sÑÔ€AÝ�!‰fŒf€GØ��×&Ò& s¨CÑ0Ô0€IØ!,Ð;ˆiÐÐÐÐ°)Ð;r   c                ó²  — t          | ¦  «        }||                     ¦   «         k    r%t          |¦  «        d›                     dd¦  «        S |d›                     d¦  «                             d¦  «        }|                     d¦  «        }t          |d         ¦  «        d›                     dd¦  «        }t          |¦  «        dk    r|› d|d         › �n|S )zFFormat BoQ quantity cleanly, stripping trailing zeros if whole number.r   r)   z.4fÚ0r   r   )r   Úto_integralr!   r   ÚrstripÚsplitÚlen)r   r   ÚsÚpartsÚint_parts        r   Úformat_quantityr6   ?   sÄ   € å�3‰Œ€AØˆA�MŠM‰OŒOÒÐÝ�a‘&”&ˆ}ˆ}×$Ò$ S¨#Ñ.Ô.Ð.Øˆ
ˆ
×Ò˜#ÑÔ×%Ò% cÑ*Ô*€AØ�GŠG�C‰LŒL€EÝ�e˜A”h‘-”-Ð#Ð#×+Ò+¨C°Ñ5Ô5€HÝ'*¨5¡z¤z°A¢~ ~ˆhÐ#Ð#˜˜qœÐ#Ð#Ð#¸8ÐCr   ÚnumberÚNumericTypec                ó¨  ‡— t          | ¦  «        }t          |¦  «        }|dk    rdS |dk     rdt          | ¦  «        z   S g d¢Šg d¢}ddˆfd„}g }|}|dk    r#|                     |dz  ¦  «         |dz  }|dk    °#g }t	          |¦  «        D ]g\  }}	|	dk    r\|t          |¦  «        dz
  k    }
 ||	|
¦  «        }||         }|r|                     |› d|› �¦  «         ŒR|                     |¦  «         Œhd                     t          |¦  «        ¦  «                             ¦   «         }|d          	                    ¦   «         |dd…         z   dz   }|S )zCConvert integer or decimal VND amount to standard Vietnamese words.r   u   KhÃ´ng Ä‘á»“ngu   Ã‚m )
u   khÃ´ngu   má»™tÚhaiÚbau   bá»‘nu   nÄƒmu   sÃ¡uu   báº£yu   tÃ¡mu   chÃ­n)r   u   nghÃ¬nu   triá»‡uu   tá»·u   nghÃ¬n tá»·u   triá»‡u tá»·FÚnr!   Ú
is_highestr'   r
   r   c                óì  •— | dz  }| dz  dz  }| dz  }g }|dk    s|s|                      ‰|         dz   ¦  «         |dk    rx|                      ‰|         dz   ¦  «         |dk    r|                      d¦  «         nå|dk    r|                      d	¦  «         nÉ|dk    r|                      ‰|         ¦  «         n§|dk    rS|                      d
¦  «         |dk    r|                      d	¦  «         np|dk    r|                      ‰|         ¦  «         nN|dk    rH|dk    rB|dk    s|s|                      d‰|         z   ¦  «         n|                      ‰|         ¦  «         d                     |¦  «        S )Néd   r#   r   u    trÄƒmr   u    mÆ°Æ¡iu   má»‘té   u   lÄƒmu   mÆ°á»�iu   láº» r   )ÚappendÚjoin)r<   r=   ÚhÚtÚuÚresÚdigitss         €r   Úread_three_digitsz5number_to_vietnamese_words.<locals>.read_three_digitsV   s‹  ø€ Ø�‰HˆØ�‰W˜‰OˆØ�‰FˆØˆàˆqŠ5ˆ5˜
ˆ5Ø�JŠJ�v˜a”y 8Ñ+Ñ,Ô,Ð,àˆqŠ5ˆ5Ø�JŠJ�v˜a”y 9Ñ,Ñ-Ô-Ð-Ø�AŠvˆvØ—
’
˜7Ñ#Ô#Ð#Ð#Ø�a’�Ø—
’
˜6Ñ"Ô"Ð"Ð"Ø�Q’�Ø—
’
˜6 !œ9Ñ%Ô%Ð%øØ�!ŠVˆVØ�JŠJ�yÑ!Ô!Ð!Ø�AŠvˆvØ—
’
˜6Ñ"Ô"Ð"Ð"Ø�Q’�Ø—
’
˜6 !œ9Ñ%Ô%Ð%øØ�!ŠVˆVØ�1ŠuˆuØ�q’5�5 
�5Ø—J’J˜w¨°¬Ñ2Ñ3Ô3Ð3Ð3à—J’J˜v aœyÑ)Ô)Ð)à�xŠx˜‰}Œ}Ðr   iè  r   r   Nu    Ä‘á»“ng cháºµn.)F)r<   r!   r=   r'   r
   r   )
r   r!   Únumber_to_vietnamese_wordsrA   Ú	enumerater2   rB   Úreversedr   Úupper)r7   r   ÚnumÚunitsrH   ÚgroupsÚtempÚresult_wordsÚidxÚgrpr=   ÚwordsÚunitÚfull_strrG   s                 @r   rI   rI   J   s°  ø€ å�vÑÔ€AÝ
ˆa‰&Œ&€CØ
ˆa‚x€xØÐØ
ˆQ‚w€wØÕ2°C°4Ñ8Ô8Ñ8Ð8à`Ð`Ð`€FØLÐLÐL€Eðð ð ð ð ð ð ð@ €FØ€DØ
�Š(ˆ(Ø�Š�d˜T‘kÑ"Ô"Ð"Ø�‰ˆð �Š(ˆ(ð €LÝ˜fÑ%Ô%ð +ð +‰ˆˆSØ�Š7ˆ7Ø¥ F¡¤¨a¡Ò/ˆJØ%Ð% c¨:Ñ6Ô6ˆEØ˜”:ˆDØð +Ø×#Ò# uÐ$5Ð$5¨tÐ$5Ð$5Ñ6Ô6Ð6Ð6à×#Ò# EÑ*Ô*Ð*øà�xŠx� Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7€HØ˜Œ{× Ò Ñ"Ô" X¨a¨b¨b¤\Ñ1Ð4FÑF€HØ€Or   N)r   r   r	   r   r
   r   )r   r   r
   r   )r   )r   r   r    r!   r
   r   )T)r   r   r&   r'   r
   r   )r   r   r
   r   )r7   r8   r
   r   )Ú__doc__Ú
__future__r   Údecimalr   r   Útypingr   r!   Úfloatr   r8   r   r   r%   r,   Úformat_currencyr6   rI   © r   r   ú<module>r^      s
  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð à�C˜  WÐ,Ô-€ð <C¸7À1¹:¼:ð ð ð ð ð ð.:ð :ð :ð :ð6ð 6ð 6ð 6ð 6ð<ð <ð <ð <ð <ð €ðDð Dð Dð Dð?ð ?ð ?ð ?ð ?ð ?r   