+
    5¾jhw  ã                   ó	  € ^ RI H t HtHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	H
t
HtHtHt ^ RIHtHtHtHt ^ RIHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ R	IH t  ^ R
I!H"t"H#t#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+H,t, ^ RI-H.t. ^ RI/H0t0H1t1 ^ RI2H3t3H4t4 ^ RI-H5t5 ^ RI6t6^ RI7t7]	! ]! ] ! RRR4      4      .R7      t8]6Pr                  Pu                  ]6Pr                  Pu                  ]6Pr                  Pu                  ]6Pr                  Pw                  ]<4      4      4      4      t=]! ]6Pr                  P}                  ]=R4      R7      t?]P€                  ! 4       tARKR R lltBRKR R lltCR R ltDRKR R lltER R ltF]8P�                  R]R 7      RRR]! ]4      ]! ] ! RRR4      4      3R! R" ll4       tH]8P�                  R#4      R]! ]4      ]! ] ! RRR4      4      3R$ R% ll4       tI]8P�                  R&4      ]! ]4      ]! ] ! RRR4      4      3R' R( ll4       tJ]8P—                  R)4      ]! R*4      ]! R*4      ]! R*4      ]! R*4      ]! R*4      ]! R+4      ]! R,4      ]! ^4      ]! ^4      ]! R-4      ]! R*4      ]! ]4      ]! ] ! R4      4      3R. R/ ll4       tL]8P�                  R04      ]! ]4      3R1 R2 ll4       tM]8P—                  R34      ]! R4      ]! R4      ]! R4      ]! R*4      ]! R4      ]! R44      ]! ^4      ]! R54      ]! R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! R4      ]! ]4      ]! ] ! RRR4      4      3R6 R7 ll4       tN]8P�                  R8]R 7      ]8P�                  R9]R 7      R: 4       4       tO]8P�                  R;]]! ] ! RRR4      4      .R<7      ]! ]4      3R= R> ll4       tP]8P—                  R?4      ]! R*4      ]! ]4      ]! ] ! RRR4      4      3R@ RA ll4       tQ]8P—                  RB4      ]! ]4      ]! ] ! RRR4      4      3RC RD ll4       tR]8P—                  RE4      ]! ]4      ]! ] ! RRR4      4      3RF RG ll4       tS]8P�                  RH]]! ] ! RRR4      4      .R<7      ]! ]4      3RI RJ ll4       tTR# )Lé    )ÚdatetimeÚtimezoneÚ	timedeltaN)Ú	APIRouterÚRequestÚFormÚDependsÚHTTPException)ÚHTMLResponseÚRedirectResponseÚStreamingResponseÚJSONResponse)ÚJinja2Templates)ÚAsyncSession)ÚselectÚupdateÚor_ÚfuncÚcase)Úget_db)Úrequire_roles)ÚVoucherÚVoucherAgentÚHotspotProfileÚVoucherBatchÚMikrotikDeviceÚDeviceCredentialÚSiteÚUserÚPaymentÚWalletTransactionÚAgentCommission)Údecrypt_secret)ÚRealMikrotikAdapterÚMikrotikProvisioningError)Úgenerate_credentialsÚCredentialPolicyError)Úencrypt_secretÚagen_voucherÚadmin_csÚsuper_admin)Údependencieszapp/templates)Ú	directoryc                ól   € V ^8„  d   QhR\         R\        R,          R\        \        \        3,          /# ©é   ÚdbÚ	device_idNÚreturn)r   ÚintÚtupler   r   )Úformats   "Ú,/var/www/html/bestweb/app/routes/vouchers.pyÚ__annotate__r8   =   s2   € ÷ ñ ¤,ð ¼3À½:ð ÔQVÔWeÔgwÐWwÕQxñ ó    c              ƒ   ó¤  "  € V'       dG   V P                  \        V4      G R j  x€L
 pV'       d   VP                  '       g   \        RRR7      hMV P	                  \        \        4      P                  \        P                  R8H  4      P                  \        P                  4      4      G R j  x€L
 P                  4       P                  4       pV'       d   VP                  '       g   \        RRR7      hV P                  \        VP                  4      G R j  x€L
 pV'       d   VP                  '       g   \        RRR7      hW#3#  EL% Lœ L35i)Né”  z:Perangkat MikroTik tujuan tidak ditemukan atau tidak aktif©Ústatus_codeÚdetailTi÷  zDMikroTik Hotspot belum terkonfigurasi atau tidak memiliki kredensialzKredensial MikroTik tidak aktif)Úgetr   Ú	is_activer
   Úexecuter   ÚwhereÚorder_byÚidÚscalarsÚfirstÚcredential_idr   ©r1   r2   ÚmkÚcreds   &&  r7   Ú_get_hotspot_devicerK   =   s  é € çà—6‘6œ.¨)Ó4×4ˆç˜ŸŸ˜ä¨CÐ8tÔuÐuð &ð —J‘Jœv¤nÓ5×;Ñ;¼N×<TÑ<TÐX\Ñ<\Ó]×fÑfÔgu×gxÑgxÓyÓz×z÷  Dñ  Dó  F÷  Lñ  Ló  Nˆç�R×%×%Ð%ä¨Ð4zÔ{Ð{à—‘Ô(¨"×*:Ñ*:Ó;×;€Dç�T—^—^�^ä¨Ð4UÔVÐVàˆ8€Oò) 5ñ {ñ <ùsW   ‚"E¤E	¥E±EÁA,EÂ/EÂ0'EÃEÃ*0EÄEÄEÄ'EÄ9EÅEÅEc                óJ   € V ^8„  d   QhR\         R\        R,          R\        /# r/   )r   r4   r$   )r6   s   "r7   r8   r8   [   s+   € ÷ Sñ Sœ|ð S¼¸d½
ð SÔNañ Sr9   c              ƒ   óÌ   "  € \        W4      G R j  x€L
 w  r#\        VP                  VP                  \	        VP
                  4      VP                  ;'       g    RR7      #  LP5i)Ni"  )ÚhostÚusernameÚpasswordÚapi_port)rK   r$   rN   rO   r#   Úencrypted_secretrQ   rH   s   &&  r7   Ú_hotspot_adapterrS   [   sl   é € ä(¨Ó7×7�H€Bä B§G¡G°d·m±mÌnÐ]a×]rÑ]rÓNsð  A÷  Jñ  J÷  Rð  Rð  NRô  Sð  Sñ 8ùs   ‚A$‘A"’AA$c                ót   € V ^8„  d   QhR\         R\        \        ,          R\        \        \
        3,          /# )r0   r1   Úvouchersr3   )r   Úlistr   Údictr4   r$   )r6   s   "r7   r8   r8   e   s0   € ÷ ñ œlð ´d¼7µmð ÌÌSÔReÐMeÕHfñ r9   c              ƒ   ó„  "  € V Uu0 uF"  q"P                   '       g   K  VP                   kK$  	  pp/ pV'       g[   \        V 4      G R j  x€L
 w  rV\        WP                  4      G R j  x€L
 WEP                  &   V F  pVP                  Vn         K  	  V# V F  p\        W4      G R j  x€L
 WG&   K  	  V# u upi  Lp LS L5i©N)r2   rK   rS   rD   )r1   rU   ÚvÚ
device_idsÚadaptersÚ
default_mkÚ_Údev_ids   &&      r7   Ú_batch_adaptersr`   e   s¢   é € á'/Ó?¡x !·;µ;”+�!—+”+¡x€JÐ?à/1€Hçä1°"Ó5×5‰ˆ
ä(8¸¿]¹]Ó(K×"Kˆ—‘ÑãˆAà$Ÿ-™-ˆAŽKñ ð ˆãˆä!1°"Ó!=×=ˆÓñ ð €Oùò) @ñ 6á"Kñ >ùsD   ‚C ‡B5ŸB5¯C Á	B:Á
C Á(B<Á)?C Â(B>Â)C Â<C Â>C c                óX   € V ^8„  d   QhR\         R,          R\        R,          R\         /# )r0   Ú
uptime_strNÚduration_daysr3   )Ústrr4   )r6   s   "r7   r8   r8   ƒ   s*   € ÷ ñ ¤ t¥ð ¼CÀ$½Jð ÔRUñ r9   c                 óL  € V '       g   V'       d   V R 2# V '       g   R# \        V 4      P                  4       P                  4       pVP                  R4      '       d	   VRR  R2# VP                  R4      '       d	   VRR  R 2# VP                  R4      '       d	   VRR  R2# V # )	z Hariz24 JamÚhNz JamÚdÚmz Menitéÿÿÿÿ)rd   ÚstripÚlowerÚendswith)rb   rc   Úus   && r7   Ú_format_validityrn   ƒ   sš   € çŸ-à� Ð&Ð&çáäˆJ‹×ÑÓ×%Ñ%Ó'€Aà‡z�z�#‡‚à�C�R�&�˜ˆÐà	
�‰�C�Šà�C�R�&�˜ÐÐà	
�‰�C�Šà�C�R�&�˜Ð Ð àÐr9   c                ó0   € V ^8„  d   QhR\         R\         /# )r0   Úcontentr3   )rd   )r6   s   "r7   r8   r8   Ÿ   s   € ÷ *ñ *¤3ð *¬3ñ *r9   c                 ó`  € \         P                  ! ^^^R7      pVP                  V 4       VP                  RR7       VP	                  RRR7      p\
        P                  ! 4       pVP                  VRR7       \        P                  ! VP                  4       4      P                  R	4      pR
V 2# )é   )ÚversionÚbox_sizeÚborderT)ÚfitÚblackÚwhite)Ú
fill_colorÚ
back_colorÚPNG)r6   Úasciizdata:image/png;base64,)ÚqrcodeÚQRCodeÚadd_dataÚmakeÚ
make_imageÚioÚBytesIOÚsaveÚbase64Ú	b64encodeÚgetvalueÚdecode)rp   ÚqrÚimgÚbufÚb64s   &    r7   Ú_generate_qr_data_urir�   Ÿ   s‰   € ä	�Š˜q¨1°QÔ	7€Bà‡K�K�Ôà‡G�G�€GÔà
�-‰- 7°wˆ-Ó
?€Cä
�*Š*‹,€Cà‡H�HˆS˜€HÔä
×
Ò
˜3Ÿ<™<›>Ó
*×
1Ñ
1°'Ó
:€Cà# C 5Ð)Ð)r9   z	/vouchers)Úresponse_classc                óŠ   € V ^8„  d   QhR\         R\        R,          R\        R,          R\        R,          R\        R\        /# )r0   ÚrequestÚqNÚbatchÚ
profile_idr1   Úactor)r   rd   r4   r   r   )r6   s   "r7   r8   r8   ·   sN   € ÷ <ñ <äð<ä˜t�ð<ä36¸µ:ð<ô �d•
ð	<ô 	ð<ô 04ñ<r9   c              ƒ   óŽ	  "  € R pV'       d‚   VP                  4       '       d'   VP                  4       '       d   \        V4      ^ 8:  d   \        RRR7      hVP	                  \
        \        V4      4      G R j  x€L
 pVf   \        RRR7      hVP                  \        \        4      P                  \        P                  R8H  4      P                  \        P                  4      4      G R j  x€L
 P                  4       P                  4       pVP                  \        \        4      P                  \        P                  4      4      G R j  x€L
 P                  4       P                  4       pVP                  \        \         4      P                  \         P                  R8H  4      P                  \         P                  4      4      G R j  x€L
 P                  4       P                  4       p	VP                  \        \
        4      P                  \
        P"                  P%                  4       4      P'                  ^d4      4      G R j  x€L
 P                  4       P                  4       p
VP                  \        \(        4      P                  \(        P                  R8H  4      P                  \(        P                  4      4      G R j  x€L
 P                  4       P                  4       pVP+                  \        \,        P.                  ! \0        P"                  4      4      4      G R j  x€L
 ;'       g    ^ p/ pV EF  pVP+                  \        \,        P.                  ! \
        P"                  4      4      P                  \
        P2                  VP"                  8H  4      4      G R j  x€L
 ;'       g    ^ pVP+                  \        \,        P.                  ! \0        P"                  4      4      P                  \0        P2                  VP"                  8H  4      4      G R j  x€L
 ;'       g    ^ pRVRV/WÞP"                  &   EK	  	  R	.p\4        P7                  T R
RTRTRT	RT
RTRTRT;'       g    RRV'       d"   VP                  4       '       d   \        V4      MR RVRVRVRVRV/R7      #  EL3 ELÂ ELf ELê ELq ELõ EL˜ EL L¥5i)Né¦  zID batch tidak validr<   r;   úBatch voucher tidak ditemukanTÚbatchesrU   Údefaultzvouchers.htmlÚprofilesÚsitesÚdevicesÚagentsÚcurrent_userr‘   Ú r’   Úselected_batchÚselected_profile_idÚtotal_vouchersÚprofile_usageÚprotected_profiles©r�   ÚnameÚcontext)ÚisasciiÚisdigitr4   r
   r?   r   rA   r   r   rB   r@   rC   r¦   rE   Úallr   r   rD   ÚdescÚlimitr   Úscalarr   Úcountr   r“   Ú	templatesÚTemplateResponse)r�   r‘   r’   r“   r1   r”   r    rš   r›   rœ   r˜   r�   Útotal_countr£   ÚpÚnum_batchesÚnum_vouchersr¤   s   &&&&&&            r7   Úvouchers_pagerµ   µ   s“  é € ð €Nçà�}‰}�Š e§m¡m§o¢o¼¸U»Àq¼ä¨CÐ8NÔOÐOà!Ÿv™v¤l´C¸³JÓ?×?ˆàÒ!ä¨CÐ8WÔXÐXð —j‘j¤¬Ó!7×!=Ñ!=¼n×>VÑ>VÐZ^Ñ>^Ó!_×!hÑ!hÔiw×i|Ñi|Ó!}Ó~×~÷  Hñ  Hó  J÷  Nñ  Nó  P€Hà—:‘:œf¤T›l×3Ñ3´D·I±IÓ>Ó?×?×HÑHÓJ×NÑNÓP€Eà—Z‘Z¤¤~Ó 6× <Ñ <¼^×=UÑ=UÐY]Ñ=]Ó ^× gÑ gÔhv×h{Ñh{Ó |Ó}×}÷  Gñ  Gó  I÷  Mñ  Mó  O€Gà—Z‘Z¤¤|Ó 4× =Ñ =¼l¿o¹o×>RÑ>RÓ>TÓ U× [Ñ [Ð\_Ó `Óa×a×jÑjÓl×pÑpÓr€Gà—J‘Jœv¤lÓ3×9Ñ9¼,×:PÑ:PÐTXÑ:XÓY×bÑbÔco×ctÑctÓuÓv×v×Ñó  B÷  Fñ  Fó  H€FàŸ	™	¤&¬¯ª´G·J±JÓ)?Ó"@ÓA×A×FÐFÀQ€Kà€MÜˆØŸI™I¤f¬T¯ZªZ¼¿¹Ó-HÓ&I×&OÑ&OÔP\×PgÑPgÐkl×koÑkoÑPoÓ&pÓq×q×vÐvÐuvˆØŸY™Y¤v¬d¯jªj¼¿¹Ó.DÓ'E×'KÑ'KÌG×L^ÑL^Ðbc×bfÑbfÑLfÓ'gÓh×h×mÐmÐlmˆØ(¨+°zÀ<ÐPˆ—d‘dÔñ ð
 $˜Ðä×%Ñ%¨g¸Oà�H˜g u¨i¸à�7˜H f¨n¸eàˆQ�WˆW�"�g¯U°u·}±}·²œs 5œzÈDà˜.Ð*?Àà˜+Ø˜ØÐ0ðVÐ%ó ð ò9 @ò â?â}âaâvâAò rÙhùsØ   ‚ S£S¹?SÁ8R+Á9A3SÃ,R.Ã-ASÅR1ÅA>SÇ
R4ÇA;SÉR7ÉA>SËR:ËASÌ%R=Ì&
SÌ1A4SÎ%S Î&
SÎ1A,SÐSÐ
SÐ)ASÑ-
SÑ8SÒSÒ.SÒ1SÒ4SÒ7SÒ:SÒ=SÓ SÓSz/api/vouchers/batchesc                óJ   € V ^8„  d   QhR\         R,          R\        R\        /# )r0   r“   Nr1   r”   ©r4   r   r   )r6   s   "r7   r8   r8   û   s1   € ÷ ^ ñ ^ ä�d•
ð^ ô 	ð	^ ô ñ^ r9   c              ƒ   ó  "  € \        \        P                  \        P                  \        P                  \        P
                  \        P                  \        P                  \        P                  ! \        P                  4      P                  R 4      \        P                  ! \        \        P                  R8H  ^3^ R7      4      P                  R4      \        P                  ! \        \        P                  R8H  ^3^ R7      4      P                  R4      \        P                  4
      P!                  \        \        P"                  \        P                  8H  4      P%                  \        P                  4      P'                  \        P                  P)                  4       4      pV '       d#   VP+                  \        P
                  V 8H  4      pVP-                  V4      G Rj  x€L
 P/                  4       p. pV EF}  pVP                  '       d;   VP                  P1                  4       '       d   VP                  P1                  4       MVP                  pVP                  ;'       g    RpVP2                  e   VP2                  MVP4                  p	V RV R	V	 R
2P1                  4       p
TP7                  RVP                  RVP                  RVP                  RVP
                  RVP                  ;'       g    RRT
RVP                  R VP4                  RVP2                  ;'       g    ^ RVP8                  ;'       g    ^ RVP                  '       d   VP                  P;                  R4      MR/4       EK€  	  RV/#  EL�5i)Úvoucher_countÚ	available)Úelse_Úavailable_countÚsoldÚ
sold_countNrŸ   Ú z [Ú]rD   Ú
batch_codeÚprofiler“   ÚcommentÚdisplay_labelÚquantityÚ
created_atz%Y-%m-%d %H:%Mr˜   )r   r   rD   rÁ   rÂ   r“   rÃ   rÅ   r   r®   r   ÚlabelÚsumr   ÚstatusrÆ   ÚjoinÚbatch_idÚgroup_byrC   r«   rB   rA   rª   rj   r¼   r¹   Úappendr¾   Ústrftime)r“   r1   r”   ÚstmtÚresultsr˜   ÚrÚcomment_partÚprofile_partÚ	remainingrÇ   s   &&&        r7   Úlist_voucher_batches_apirÕ   ù   sƒ  é € ô 	ä�O‰Oä×#Ñ#ä× Ñ ä×#Ñ#ä× Ñ ä×!Ñ!ä�JŠJ”w—z‘zÓ"×(Ñ(¨Ó9ä�HŠH”Tœ7Ÿ>™>¨[Ñ8¸!Ð<ÀAÔFÓG×MÑMÐN_Ó`ä�HŠH”Tœ7Ÿ>™>¨VÑ3°QÐ7¸qÔAÓB×HÑHÈÓVä×#Ñ#ó)	
÷0 
‰Œg”w×'Ñ'¬<¯?©?Ñ:Ó	;ç	‰”,—/‘/Ó	"ç	‰”,—/‘/×&Ñ&Ó(Ó	)ð= 	÷D à�z‰zœ,×1Ñ1°ZÑ?Ó@ˆð —Z‘Z Ó%×%×*Ñ*Ó,€Gà€Gäˆà,-¯I¯I¨I¸!¿)¹)¿/¹/×:KÒ:K�q—y‘y—‘Ô(ÐQR×Q]ÑQ]ˆà—y‘y—� Bˆð *+×):Ñ):Ò)F�A×%Ò%ÈAÏOÉOˆ	à�.  , ¨r°)°¸AÐ>×DÑDÓFˆà�‰à�!—$‘$à˜!Ÿ,™,à�q—y‘yà˜!Ÿ,™,à�q—y‘y—� Bà˜Uà˜Ÿ
™
à˜QŸ_™_à˜q×0Ñ0×5Ð5°Aà˜!Ÿ,™,×+Ð+¨!àÀQÇ\Ç\À\˜!Ÿ,™,×/Ñ/Ð0@ÔAÐWYð-
÷ 	ñ ðP �wÐÐòY &ùs8   ‚G#NÇ%NÇ&ANÈ28NÉ+BNË</NÌ,NÍNÍ,Nz/api/vouchers/datatablec                ó<   € V ^8„  d   QhR\         R\        R\        /# )r0   r�   r1   r”   )r   r   r   )r6   s   "r7   r8   r8   a  s-   € ÷ Dñ DäðDô 	ð	Dô ñDr9   c              ƒ   ó¨  "  € V P                   p \        VP                  R ^4      4      p \        ^ \        VP                  R^ 4      4      4      p \        VP                  R^
4      4      pV^ 8:  g   V^d8”  d   ^
pTP                  R4      ;'       g    TP                  R4      ;'       g    RP                  4       pTP                  R4      ;'       g    TP                  R4      pTP                  R4      p	TP                  R	4      p
 \        TP                  R
^ 4      4      pTP                  RR4      P                  4       p^ \        P                  ^\        P                  ^\        P                  ^\        P                  ^\        P                  ^\        P                  ^\        P                  ^\        P                  /pTP                  T\        P                  4      pTR8X  d   TP                  4       MTP!                  4       pTP#                  \%        \&        P(                  ! \        P                  4      4      4      G Rj  x€L
 ;'       g    ^ p. pT'       d[   \+        T4      P-                  4       '       d<   \        T4      ^ 8”  d,   TP/                  \        P                  \        T4      8H  4       T	'       d[   \+        T	4      P-                  4       '       d<   \        T	4      ^ 8”  d,   TP/                  \        P0                  \        T	4      8H  4       T
'       dG   T
P                  4       '       d1   TP/                  \        P                  T
P                  4       8H  4       T'       d¶   RT R2pTP/                  \3        \        P4                  P7                  T4      \        P                  P7                  T4      \        P8                  P7                  T4      \        P                  P7                  T4      \        P                  P7                  T4      4      4       \%        \&        P(                  ! \        P                  4      4      pT'       d   TP:                  ! T!  pTP#                  T4      G Rj  x€L
 ;'       g    ^ p\%        \        4      pT'       d   TP:                  ! T!  pTP=                  T\        P                  P                  4       4      P?                  T4      PA                  T4      pTPC                  T4      G Rj  x€L
 PE                  4       PG                  4       p. pT EF  pTP/                  RTP                  RTP                  ;'       g    TP4                  R\I        TPJ                  4      RTP                  ;'       g    RRTP                  ;'       g    ^ RTP                  e!   RTP                  R 2PM                  RR4      MRR	TP                  RTP                  RTPN                  '       d   TPN                  PQ                  R4      MRRTP8                  ;'       g    R/
4       EK  	  R TRTRTRT/#   \        \        3 d    ^p ELLi ; i  \        \        3 d    ^ p EL@i ; i  \        \        3 d    ^
p EL.i ; i  \        \        3 d    ^ p ELži ; i ELz ELD EL±5i) ÚdrawÚstartÚlengthzsearch[value]r‘   rŸ   r’   rË   r“   rÉ   zorder[0][column]zorder[0][dir]r«   NÚ%rD   rO   Úhas_passwordrÂ   Ú-ÚpriceÚprice_formattedúRp Ú,Ú.zRp 0Ú
expires_atz%Y-%m-%drÃ   ÚrecordsTotalÚrecordsFilteredÚdata))Úquery_paramsr4   r?   Ú
ValueErrorÚ	TypeErrorÚmaxrj   rk   r   rD   rO   rÂ   rÞ   rÉ   rË   r«   Úascr­   r   r   r®   rd   r©   rÍ   r“   r   ÚcodeÚilikerÃ   rB   rC   Úoffsetr¬   rA   rE   rª   ÚboolÚpassword_ciphertextÚreplacerã   rÎ   )r�   r1   r”   ÚparamsrØ   rÙ   rÚ   Úsearch_valueÚbatch_paramÚprofile_paramÚstatus_paramÚorder_col_idxÚ	order_dirÚcol_mapÚ	order_colÚorder_clauseÚrecords_totalÚfiltersÚneedleÚ
count_stmtÚrecords_filteredrÏ   rU   ræ   rZ   s   &&&                      r7   Úvouchers_datatabler  _  s1  é € ð ×!Ñ!€Fðä�6—:‘:˜f aÓ(Ó)ˆðä�A”s˜6Ÿ:™: g¨qÓ1Ó2Ó3ˆð
ä�V—Z‘Z ¨"Ó-Ó.ˆà�QŒ;˜& 3œ,àˆFð —J‘J˜Ó/×HÐH°6·:±:¸c³?×HÐHÀb×OÑOÓQ€Là—*‘*˜WÓ%×?Ð?¨¯©°JÓ)?€Kà—J‘J˜|Ó,€Mà—:‘:˜hÓ'€Lðä˜FŸJ™JÐ'9¸1Ó=Ó>ˆð —
‘
˜?¨FÓ3×9Ñ9Ó;€Ið 	
Œ7�:‰:à	Œ7×Ñà	Œ7�:‰:à	Œ7�?‰?à	Œ7�=‰=à	Œ7�>‰>à	Œ7×Ñà	Œ7�:‰:ð!€Gð( —‘˜M¬7¯:©:Ó6€Ià'0°FÔ':�9—>‘>Ô#À	ÇÁÃ€Lð Ÿ)™)¤F¬4¯:ª:´g·j±jÓ+AÓ$BÓC×C×HÐHÀq€Mð €Gç”s˜;Ó'×/Ñ/×1Ò1´c¸+Ó6FÈÔ6Jà�‰”w×'Ñ'¬3¨{Ó+;Ñ;Ô<çœ˜]Ó+×3Ñ3×5Ò5¼#¸mÓ:LÈqÔ:Pà�‰”w×)Ñ)¬S°Ó-?Ñ?Ô@ç˜×*Ñ*×,Ò,à�‰”w—~‘~¨×);Ñ);Ó)=Ñ=Ô>÷ à�\�N !Ð$ˆà�‰ää—‘×"Ñ" 6Ó*ä× Ñ ×&Ñ& vÓ.ä—‘×%Ñ% fÓ-ä—‘×%Ñ% fÓ-ä—‘×$Ñ$ VÓ,óô	
ô( œŸ
š
¤7§:¡:Ó.Ó/€Jçà×%Ò% wÑ/ˆ
àŸY™Y zÓ2×2×7Ð7°aÐô ”'‹?€Dçà�zŠz˜7Ñ#ˆà�=‰=˜¤w§z¡z§¡Ó'8Ó9×@Ñ@ÀÓG×MÑMÈfÓU€Dà—j‘j Ó&×&×/Ñ/Ó1×5Ñ5Ó7€Hð €Däˆà�‰à�!—$‘$à˜Ÿ
™
×,Ð, a§f¡fàœD ×!6Ñ!6Ó7à�q—y‘y×'Ð' Cà�Q—W‘W—\�\ àÀaÇgÁgÒFY  Q§W¡W¨Q KÐ0×8Ñ8¸¸cÔBÐ_eà�a—h‘hà˜Ÿ
™
à¸q¿|¿|¸|˜!Ÿ,™,×/Ñ/°
Ô;ÐQUà�q—y‘y—� Bð)
÷ 	ñ ð< 	�à˜àÐ+à�ð
ð 
øôU œ	Ð"ô à‹ðûô œ	Ð"ô à‹ðûô œ	Ð"ô à‹ðûô( œ	Ð"ô à‹ðúòD Dòd 3ò 'ùs  ‚[�Y! ¬%Y; Á+Z Á=[Â[Â.([Ã4[ÄZ/ Ä'D([É[	É
[É[É(A![Ë
A![Ì,[Í7[Í:D[Ò[Ò	
[ÒB
[Ô[ÔA[Õ24[Ö'[Ö=A[Ø/[Ù
[Ù!Y8Ù4[Ù7Y8Ù8[Ù;ZÚ[ÚZÚ[ÚZ,Ú([Ú+Z,Ú,[Ú/[Û[Û[Û[Û[Û[z/hotspot-profiles.Ú12hÚ5mÚdaysc                ó´   € V ^8„  d   QhR\         R\         R\        R\        R\        R\         R\         R\        R	\        R
\         R\        R\        R\        /# )r0   r¦   Úlocal_profilerÞ   Ú	rate_downÚrate_upÚsession_timeoutÚidle_timeoutÚsharedÚexpiry_valueÚexpiry_unitr2   r1   r”   )rd   r4   r   r   )r6   s   "r7   r8   r8   -  s¨   € ÷ GJñ GJä
ðGJä*-ðGJäBEðGJô ð	GJô *-ð	GJô LOð	GJô ðGJô -0ðGJô ðGJô 03ðGJô ðGJô %1ðGJô ñGJr9   c              ƒ   óÈ  "  € V P                  4       VP                  4       rV '       d   V'       d   V^ 8  g   V^ 8:  g   V^ 8:  d   \        RRR7      h^Tu;8:  d   ^8:  d   M MV^8  d   \        RRR7      hV	R8X  d)   \        ^\        P                  ! V^,          4      4      pM\        ^\        VR4      4      p\        Wº4      G Rj  x€L
 w  rï\        Wº4      G Rj  x€L
 pV RV R	2p \        P                  ! VP                  VVWVV4      G Rj  x€L
  TP                  \        \        4      P                  \        P                   T 8H  \        P"                  TP"                  8H  4      4      G Rj  x€L
 P%                  4       P'                  4       pTf(   \        YP"                  R7      pTP)                  T4       TTn        Y4uTn        Tn        YVuTn        Tn        YruTn        Tn        TTn        RRuTn        Tn        TP?                  4       G Rj  x€L
  \A        RRR7      #  ELd ELR EL   \         d   p\        R
RT 2R7      ThRp?ii ; i Lä L@5i)r   r–   z Data Hotspot Profile tidak validr<   z,Batas pengguna atau masa berlaku tidak validÚhoursém  Nzk/Úkéö  z&Profile gagal diterapkan ke MikroTik: )r¦   Úsite_idTÚsyncedz/vouchers?profile_saved=1é/  )r=   )!rj   r
   rê   ÚmathÚceilÚminrK   rS   ÚasyncioÚ	to_threadÚupsert_hotspot_profiler%   rA   r   r   rB   r¦   r  rE   rF   Úaddr  r  r  r	  r
  r  rÞ   Úvoucher_expiry_daysr@   Úsync_statusÚcommitr   )r¦   r  rÞ   r  r  r	  r
  r  r  r  r2   r1   r”   r  rI   r^   ÚadapterÚ
rate_limitÚexcrÂ   s   &&&&&&&&&&&&&       r7   Úcreate_hotspot_profiler#  +  sD  é € ð$ Ÿ*™*›,¨×(;Ñ(;Ó(=ˆ-ç—}¨°¬	°YÀ!´^ÀwÐRSÄ|ä¨Ð4VÔWÐWà�Ö˜"× ¨qÔ 0ä¨Ð4bÔcÐcð �gÔä! !¤T§Y¢Y¨|¸bÕ/@Ó%AÓBÑô " !¤S¨°sÓ%;Ó<Ðô & bÓ4×4�E€Bä$ RÓ3×3€Gà�;˜b  	¨Ð+€JðmÜ×Ò × >Ñ >ÀÈzÐ[jð  {Aó  B÷  	Bð  	Bð —Z‘Z¤¤~Ó 6× <Ñ <¼^×=PÑ=PÐTXÑ=XÔZh×ZpÑZpÐtv×t~Ñt~ÑZ~Ó ó  A÷  A÷  Jñ  Jó  L÷  Rñ  Ró  T€Gà‚ä  d·J±JÔ?ˆà
�‰ˆwŒà)€GÔà)2Ð&€GÔ�w”à4CÐ1€GÔ˜WÔ1à$*Ð!€G„N�G”Mà"5€GÔà-1°8Ð*€GÔ�wÔ*à
�)‰)‹+×ÐäÐ7ÀSÔIÐIò? 5â3ò 	BøÜ$ô mÜ¨Ð6\Ð]`Ð\aÐ4bÔcÐilÐlûðmúñ Añ( ùs   ‚/I"²BI"ÃH1ÃI"Ã"H4Ã#I"Ã0'H: ÄH7ÄH: ÄAI"Å9IÅ:B%I"ÈI È I"È4I"È7H: È:IÉIÉIÉI"É I"z)/api/voucher-targets/{device_id}/profilesc                ó0   € V ^8„  d   QhR\         R\        /# )r0   r2   r1   )r4   r   )r6   s   "r7   r8   r8   |  s   € ÷ :ñ :¬#ð :´<ñ :r9   c              ƒ   óz  "  € \        W4      G R j  x€L
 p \        P                  ! VP                  4      G R j  x€L
 pTP                  \        \        4      P                  \        P                  R8H  4      4      G R j  x€L
 P                  4       P                  4       pT Uu/ uF#  qfP                  ;'       g    TP                  TbK%  	  ppRT Uu. uEF'  qˆP                  R4      '       g   K  RTP                  R4      RTP                  R4      T9   RTP                  R4      T9   d"   YxP                  R4      ,          P                   MR R	TP                  R4      T9   d"   YxP                  R4      ,          P"                  MR R
TP                  R4      T9   d"   YxP                  R4      ,          P$                  MR RTP                  R4      T9   d"   YxP                  R4      ,          P&                  MR /NEK*  	  up/#  ELö ELÐ  \         d   p\        RRR7      ThR p?ii ; i EL®u upi u upi 5i)Nr  z#Profile MikroTik tidak dapat dimuatr<   Trš   r¦   Ú
configuredrD   rÞ   r	  r  )rS   r  r  Úlist_hotspot_profilesr%   r
   rA   r   r   rB   r@   rE   rª   r  r¦   r?   rD   rÞ   r	  r  )	r2   r1   r   Úremote_profilesr"  r&  r²   Úby_localÚitems	   &&       r7   Úload_target_profilesr+  z  sä  é € ô % RÓ3×3€Gðdä '× 1Ò 1°'×2OÑ2OÓ P×Pˆð Ÿ
™
¤6¬.Ó#9×#?Ñ#?Ä×@XÑ@XÐ\`Ñ@`Ó#aÓb×b×kÑkÓm×qÑqÓs€Já6@ÓA±j°—‘×)Ð) 1§6¡6¨1Ò,±j€HÐAàñ $ó
9ò $ˆD§x¡x°×'7ôy˜& $§(¡(¨6Ó"2°LÀ$Ç(Á(È6ÓBRÐV^ÑB^à¨t¯x©x¸Ó/?À8Ô/Kˆh—x‘x Ó'Õ(×+Ò+ÐQUà°T·X±X¸fÓ5EÈÔ5Q�Ÿ(™( 6Ó*Õ+×1Ò1ÐW[àÈÏÉÐRXÓIYÐ]eÔIe˜8§H¡H¨VÓ$4Õ5×EÒEÐkoàÐQU×QYÑQYÐZ`ÓQaÐemÔQm˜x¯©°Ó(8Õ9×MÒMÐswôyñ $ñ
9ð 
:ð 
:ò 4ò Qøä$ô dä¨Ð4YÔZÐ`cÐcûðdúò cùâAùò
9ùsy   ‚H;‘H’H;—#H ºH
»H ¿AH;Â H.Â$H;Â%H1Â<H1ÃH;ÃH6Ã3DH6ÈH;È
H ÈH+ÈH&È&H+È+H;È1
H;z/vouchers/generateÚsameÚmixed_alnumc          "      ó~  € V ^8„  d   QhR\         R,          R\        R,          R\         R,          R\         R\         R,          R\        R\         R	\        R
\         R,          R\         R,          R\        R,          R\        R,          R\        R,          R\        R,          R\         R,          R\        R\        /# )r0   r“   NrÂ   r2   rÅ   Úagent_idÚ	user_modeÚcharacter_lengthÚcharacter_moderÞ   rc   Úlimit_uptimeÚlimit_idle_timerÁ   rÃ   r  r1   r”   )r4   rd   r   r   )r6   s   "r7   r8   r8   ž  s  € ÷ h\ñ h\ä�d•
ðh\ä25¸µ*ðh\ô �T�zð	h\ô 36ð	h\ô �D�jðh\ô ðh\ô 69ðh\ô UXðh\ô ��:ðh\ô 47¸µ:ðh\ô [^Ð`dÕZdðh\ô ˜4•Zðh\ô ;>À½*ðh\ô ]`ÐbfÕ\fðh\ô �4�Zðh\ô +7ðh\ô  ñ!h\r9   c           
   ƒ   ó"  a&"  € ^Tu;8:  d   R8:  g   M \        RRR7      h \        WVV4       \	        Yò4      G Rj  x€L
 w  ppTe-   TP
                  e   TTP
                  8w  d   \        RRR7      hT '       d   TP                  \        T 4      G Rj  x€L
 MRpT '       d(   T'       d   TP                  '       g   \        RRR7      hT'       d‚   TP                  ;'       g    TP                  p\        TP                  ;'       g    ^ 4      pTP                  ;'       g    RpTP                  p\        TP                  ;'       g    ^4      pMtT;'       g    R	P!                  4       p\        T;'       g    ^ 4      pT
;'       g    RP!                  4       pTp\#        ^\%        \        T	;'       g    ^4      R
4      4      p\'        TTP(                  4      G Rj  x€L
 pRpT'       d   TP                  \*        T4      G Rj  x€L
 pT;'       gM    R\,        P.                  ! 4       P1                  R4       R\2        P4                  ! ^4      P7                  4        2P!                  4       pT;'       g    RP!                  4       pT'       ge   T'       d]   TP                   RTP8                  ;'       g    R R\,        P.                  ! 4       P1                  R4      P7                  4        RT R2p\;        RA/ RTbRTbRTbRTbRT'       d   TP(                  MRbRTP
                  bRTP(                  bRTP(                  bRTbRRbRT'       d   TP(                  MRbRTbR TbR!TbR"TbR#TbR$Tb pTP=                  T4       TP?                  4       G Rj  x€L
  \,        P.                  ! \@        PB                  4      \E        TR%7      ,           p. p . p!\G        T4       Fh  p \        YVT4      w  o&p"\H        ;QJ d    T&3R' lT! 4       F  '       g   K   R&M	  R(M! T&3R' lT! 4       4      '       d   KR  T!PK                  S&T"34       Kj  	  T! EF	  w  o&p"\M        RA/ R)S&bR*S&bR+TR,8X  d   \O        T"4      MRbR-TbR.TbR$TbRTbRT'       d   TP(                  MRbRTbR/T'       d   R0MR1bRT'       d   TP(                  MRbR2T'       d%   \,        P.                  ! \@        PB                  4      MRbR3TbR TbR!TbRTbRRbR4TP(                  bRTP(                  bRTP
                  bRTP(                  b p#TP=                  T#4       T PK                  T#4       EK  	  TP?                  4       G Rj  x€L
  \Q        T 4       F«  w  p$p#T!T$,          w  o&p"R5TP(                   R6T#PR                   2T'       d   R7TP                   2MR,           p% \T        PV                  ! TPX                  S&T"TTTT%4      G Rj  x€L
  R8T#n-        \,        P.                  ! \@        PB                  4      T#n.        K­  	  R8Tn-        TTn2        TPa                  4       G Rj  x€L
  \g        R=TP(                   R>2R?R@7      #   \         d   p\        R\        T4      R7      ThRp?ii ; i ELd EL ELÅ EL  EL EL9 Lµ  \^         dK   pR9T#n-        R9Tn-        TPa                  4       G Rj  x€L 
  \        R:R;T#Pb                   R<T 2R7      ThRp?ii ; i Lµ5i)Brr   i�  r–   z!Jumlah voucher harus 1 sampai 400r<   Nz(Site tidak cocok dengan perangkat tujuanz0Hotspot Profile tidak aktif atau tidak ditemukanr  r™   r  ÚBz%y%m%d%H%M%SrÝ   rŸ   ÚGENr^   z%d%b%yÚpcsrÁ   rÂ   rÅ   rÞ   r/  r  r2   Ú
created_byrÃ   r  Úpendingr“   rc   r3  r4  r0  r1  r2  )r  Tc              3   ó:   <"  € T F  q^ ,          S8H  x € K  	  R# 5i)r   N© )Ú.0r*  rm   s   & €r7   Ú	<genexpr>Ú$generate_vouchers.<locals>.<genexpr>&  s   øé € Ð@±¨˜A•w !–|³ùs   ƒFrì   rO   rð   ÚseparateÚcredential_modeÚcredential_lengthrÉ   r½   rº   Úsold_atrã   rË   zb:z c:z ag:r  Úfailedr  zGagal push user z ke RouterOS: ú/vouchers?batch=z&generated=1r  ©Úurlr=   r<  )4r
   r&   r'   rd   rK   r  r?   r   r@   r  r¦   r4   rÞ   r	  r
  r  rj   rê   r  rS   rD   r   r   ÚnowrÎ   ÚsecretsÚ	token_hexÚupperÚarear   r  Úflushr   Úutcr   ÚrangeÚanyrÍ   r   r(   Ú	enumeraterì   r  r  Úadd_hotspot_userr  Úsync_updated_atr%   r  rO   Úgenerated_countr   )'r“   rÂ   r2   rÅ   r/  r0  r1  r2  rÞ   rc   r3  r4  rÁ   rÃ   r  r1   r”   r"  rI   r^   Úprofile_rowÚprofile_nameÚresolved_priceÚresolved_uptimeÚresolved_idleÚresolved_daysr   ÚagentÚgenerated_batch_codeÚresolved_commentr’   rã   Úcreated_vouchersÚgenerated_credsr²   rZ   ÚidxÚcomment_textrm   s'   &&&&&&&&&&&&&&&&&                     @r7   Úgenerate_vouchersrb  œ  sË  øé € ð, �Ö˜CÖä¨Ð4WÔXÐXðGä˜Y¸.ÔIô & bÓ4×4�E€BˆàÒ˜rŸz™zÒ5¸'ÀRÇZÁZÔ:Oä¨Ð4^Ô_Ð_÷ ?I˜Ÿ™œ~¨zÓ:×:Ð:Èd€KçŸ;¨k×.C×.CÐ.Cä¨Ð4fÔgÐgçà"×0Ñ0×DÐD°K×4DÑ4Dˆä˜[×.Ñ.×3Ð3°!Ó4ˆà%×5Ñ5×>Ð>¸ˆà#×0Ñ0ˆä˜K×;Ñ;×AÐA¸rÓB‰ð  ×,Ð, 9×3Ñ3Ó5ˆä˜UŸZ˜Z a›ˆà'×0Ð0¨5×7Ñ7Ó9ˆà'ˆä˜Aœs¤3 }×':Ð':¸Ó#;¸SÓAÓBˆô % R¨¯©Ó/×/€Gð €Eçà—f‘fœ\¨8Ó4×4ˆð '×vÐv¨A¬h¯lªl«n×.EÑ.EÀnÓ.UÐ-VÐVWÔX_×XiÒXiÐjkÓXl×XrÑXrÓXtÐWuÐ*v×}Ñ}ÓÐð  Ÿ˜ 2×,Ñ,Ó.Ðç§à#Ÿj™j˜\¨¨5¯:©:×+>Ð+>¸Ð*?¸qÄÇÂÃ×AXÑAXÐYaÓAb×AhÑAhÓAjÐ@kÐklÐmuÐlvÐvyÐzÐô ò á'ðá1=ðáHPðáXfð÷ #�—’¨øð	ð 79·j²jð	ð MOÏEÊEð	ð _d×^fÒ^fð	ñ !ðñ /8ð÷ WbÀKÇNÂNÐgkøðñ $ðñ 3Bðñ Taðñ ðñ /?ðñ P^ð€Eð ‡F�Fˆ5„Mà
�(‰(‹*×Ðô —’œhŸl™lÓ+¬i¸]Ô.KÕK€Jà&(Ðà-/€Oô �8Ž_ˆàä'¨	À^ÓT‰DˆAˆqç“3Ô@±Ó@—3—3’3Ô@±Ó@×@Ô@à×&Ñ&¨¨1 vÔ.áñ ô  ‰ˆˆ1äò *
áð*
áð*
ð 6?À*Ô5L¤¨qÔ 1ÐRVøð	*
ñ &ð*
ñ /ð*
ñ *ð*
ñ !ð*
÷ *5�{—~’~¸$øð*
ñ  !ð!*
÷$ #‘6¨øð%*
÷( "'�U—X’X¨Døð)*
÷, 38”H—L’L¤§¡Ô.¸Tøð-*
ñ0 "ð1*
ñ4 )ð5*
ñ8 *ð9*
ñ< %ð=*
ñ@ "ðA*
ðD —X’XðE*
ðH —e’eðI*
ðL —J’JðM*
ðP —x’xðQ*
ˆðX 	�‰ˆqŒ	à×Ñ ×"ña  ðh �(‰(‹*×Ðô Ð,Ö-‰ˆˆQà˜sÕ#‰ˆˆ1à˜EŸH™H˜: S¨¯©¨Ð1ÏE°t¸E¿J¹J¸<Ñ5HÐWYÕZˆð	uä×#Ò# G×$<Ñ$<¸aÀÀLÐRaÐcpÐr~Ó×Ðà$ˆAŒMä (§¢¬X¯\©\Ó :ˆAÖñ .ð4 !€EÔà$€EÔà
�)‰)‹+×ÐäÐ"2°5·8±8°*¸LÐ IÐWZÔ[Ð[øôY !ô Gä¨´C¸³HÔ=À3ÐFûðGúò 5ò ;ò@ 0ò 5òD ò\ ñ @øô )ô 	uà$ˆAŒMà (ˆEÔà—)‘)“+×Ñä¨CÐ:JÈ1Ï:É:È,ÐVdÐehÐdiÐ8jÔkÐqtÐtûð	uúñ  ùsw  ƒ\£Y7 ¯\½Z!¾>\Á=\ÂZ$Â\Â%\Â-\Â?\Ã\Ã'$\Ä\Ä&&\Å\Å\Å=\ÆA\Ç"Z'Ç#\Ç1\È
Z*È\ÈA#\É<\Ê\Ê\Ê=B\ÍA\ÎZ-Î A:\Ð\Ð=A\Ò\Ò.\Ò;\ÓB%\Õ7Z0Õ8A\×)Z5×=Z3×>4Z5Ø2%\Ù\Ù\Ù7ZÚZÚZÚ\Ú$\Ú'\Ú*\Ú-\Ú0\Ú3Z5Ú5\
Û !\Û![$Û"#\Ü\
Ü
\z/vouchers/batches//printz/vouchers/batches/printc               ƒ   ó$   "  € \        R RR7      # 5i)z/vouchers?notice=select_batchr  rF  )r   r<  r9   r7   Úmissing_batch_printrd  Œ  s   é € ô Ð ?ÈSÔQÐQùs   ‚z"/vouchers/batches/{batch_id}/print)rŽ   r,   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r0   rË   r�   r1   ©r4   r   r   )r6   s   "r7   r8   r8   š  s&   € ÷ qñ q¬ð q´gð qÄ<ñ qr9   c              ƒ   óŠ  "  € VP                  \        V 4      G R j  x€L
 pVf   \        RRR7      hVP                  \	        \
        4      P                  \
        P                  VP                  8H  4      P                  \
        P                  P                  4       4      4      G R j  x€L
 P                  4       P                  4       pRpRpVP                  '       d~   VP                  \        VP                  4      G R j  x€L
 pV'       dM   VP                  '       d;   RVP                  P!                  4       9  d   RVP                   2MVP                  pM°VP"                  '       dŸ   VP                  \$        VP"                  4      G R j  x€L
 pV'       do   VP                  '       d]   VP                  P'                  RR	4      P'                  R
R	4      p	RVP                  P!                  4       9  d   RV	 2MVP                  p. p
\)        V4       EFå  w  r¼R pVP*                  '       d    \-        VP*                  4      pVP0                  R8H  ;'       g`    VP0                  R8H  ;'       gI    VP2                  R8H  ;'       g2    V'       * ;'       g#    YÜP4                  ;'       g    VP6                  8H  p\9        VP:                  ;'       g    VP:                  VP<                  4      pVP>                  e   VP>                  MVP>                  pRVR 2P'                  RR4      pT
PA                  RVP                  RV^,           RVP4                  ;'       g    VP6                  RTRTRVPB                  RTRTRTRVPD                  ;'       g    VPD                  ;'       g    R	RVP4                  ;'       g    VP6                  R\G        VP4                  ;'       g    VP6                  4      /4       EKè  	  \H        PK                  VRRVRVR VR!V
/R"7      #  EL EL~ EL' EL›  \.         d    R p ELöi ; i5i)#Nr;   r—   r<   ú	Munara.Idúhttp://munara.netÚmunaraú
Munara.Id_úMK-SITE-rŸ   úMK-Úlegacy_samer,  rà   ú,.0frá   râ   rD   ÚindexrO   rP   Úis_same_moderÂ   rÞ   rß   ÚvalidityrÃ   Ú
qr_contentÚqr_data_uriúvoucher_batch_print.htmlr’   Ú	site_nameÚ	login_urlrU   r¥   )&r?   r   r
   rA   r   r   rB   rË   rD   rC   rë   rE   rª   r  r   r¦   rk   r2   r   rñ   rQ  rð   r#   Ú	ExceptionrA  r0  rO   rì   rn   r3  rc   rÞ   rÍ   rÂ   rÃ   r�   r¯   r°   )rË   r�   r1   r’   rU   rv  rw  ÚsiteÚdevÚdev_cleanedÚ	printabler`  ÚvoucherrP   rq  rr  Ú	price_valrß   s   &&&               r7   Úprint_voucher_batchr  ˜  s–  é € ð —&‘&œ xÓ0×0€Eà‚}ä¨Ð4SÔTÐTà—j‘j¤¬£×!6Ñ!6´w×7GÑ7GÈ5Ï8É8Ñ7SÓ!T×!]Ñ!]Ô^e×^hÑ^h×^lÑ^lÓ^nÓ!oÓp×p×yÑyÓ{×Ñó  B€Hð €Ià#€Ià‡}‡}€}à—V‘VœD %§-¡-Ó0×0ˆç�D—I—I�Ià4<ÀDÇIÁIÇOÁOÓDUÔ4U˜* T§Y¡Y KÑ0Ð[_×[dÑ[dˆIøà	��ˆà—F‘Fœ>¨5¯?©?Ó;×;ˆç�3—8—8�8àŸ(™(×*Ñ*¨:°rÓ:×BÑBÀ5È"ÓMˆKà6>ÀcÇhÁhÇnÁnÓFVÔ6V˜* [ MÑ2Ð\_×\dÑ\dˆIð €Iä! (×+‰ˆàˆà×&×&Ð&ð ä)¨'×*EÑ*EÓF�ð  ×/Ñ/°=Ñ@÷ Gð Gà×/Ñ/°6Ñ9÷Gð Gð Ÿ™¨6Ñ1÷	Gð Gð %œ÷Gð Gð !×%5Ñ%5×%EÐ%E¸¿¹ÑFð 	ô $ G×$8Ñ$8×$NÐ$N¸E×<NÑ<NÐPU×PcÑPcÓdˆà%,§]¡]Ò%>�G—M’MÀEÇKÁKˆ	à 	¨$Ð/Ð0×8Ñ8¸¸cÓBˆð 	×Ñà�'—*‘*à�S˜1•Wà˜×(Ñ(×8Ð8¨G¯L©Là˜à˜Là�w—‘à�Yà˜à˜à�w—‘×=Ð=¨%¯-©-×=Ð=¸2à˜'×*Ñ*×:Ð:¨g¯l©lØÔ0°×1AÑ1A×1QÐ1QÀWÇ\Á\ÓRð/
÷ 	ñI ,ôB ×%Ñ%¨gÐ<Và�à�Yà�Yà�Ið
aÐ%ó 
ð 
òK 1ò qò 1ò <øô, ô  à“ð üsÓ   ‚QœP#�BQÂ(P&Â)5QÃ#QÄP)ÄQÄQÄ!AQÅ.#QÆP,ÆQÆQÆ0BQÈ4P/É	QÉQÉ6QÊQÊQÊ0&QËBQÍ#5QÎQÎ-QÏ$QÏ(<QÐ&QÐ)QÐ,QÐ/Q Ð<QÐ?Q Ñ Qz!/vouchers/batches/{batch_id}/sellc                óH   € V ^8„  d   QhR\         R\         R\        R\        /# )r0   rË   r/  r1   r”   r·   )r6   s   "r7   r8   r8     s6   € ÷ ,iñ ,iäð,iä ð,iô 	ð	,iô 04ñ	,ir9   c           
   ƒ   óÞ  "  € \         ;_uu_4       GR j  x€L
  VP                  \        V 4      G R j  x€L
 pVP                  \        V4      G R j  x€L
 pV'       d   V'       d   VP                  '       g   \        RRR7      hVP                  \        \        4      P                  \        P                  V 8H  \        P                  R8H  4      4      G R j  x€L
 P                  4       P                  4       pV'       g   \        RRR7      h\        P                  ! \         P"                  4      pV F2  pVP$                  Vn        RVn        Wxn        VP*                  Vn        K4  	  VP$                  Vn        VP/                  4       G R j  x€L
  \1        RV  R	\3        V4       2R
R7      uuR R R 4      GR j  x€L
  #  EL¬ EL‘ ELv Lñ L= L  + GR j  x€L 
 '       g   i     R # ; i5i)Nr;   z+Batch atau agen tidak ditemukan/tidak aktifr<   rº   i™  z/Tidak ada voucher yang tersedia dalam batch inir½   rE  z&sold=r  rF  )Ú_batch_action_lockr?   r   r   r@   r
   rA   r   r   rB   rË   rÉ   rE   rª   r   rH  r   rN  rD   r/  rC  rÞ   Ú
sold_pricer  r   Úlen)	rË   r/  r1   r”   r’   r[  rU   rH  rZ   s	   &&&&     r7   Úsell_voucher_batchr…    se  é € ÷ "×!Ö!à—f‘fœ\¨8Ó4×4ˆà—f‘fœ\¨8Ó4×4ˆçŸE¨¯¯¨ä¨CÐ8eÔfÐfàŸ*™*¤V¬G£_×%:Ñ%:¼7×;KÑ;KÈxÑ;WÔY`×YgÑYgÐkvÑYvÓ%wÓx×x÷  Bñ  Bó  D÷  Hñ  Hó  Jˆçä¨CÐ8iÔjÐjô �lŠlœ8Ÿ<™<Ó(ˆãˆAàŸ™ˆAŒJàˆAŒHàŒIàŸ7™7ˆAŽLñ ð Ÿ™ˆŒà�i‰i‹k×ÐäÐ&6°x°jÀÄsÈ8Ã}ÀoÐ$VÐdgÔh÷I "×!Õ!â4â4ñ yñ0 	÷E "×!×!Ó!üsª   ‚G-•G–G-™G³G´GÁGÁGÁGÁ&GÁ8A GÃG
Ã'GÄBGÆGÆGÆ.G-Æ;GÆ<G-ÇGÇGÇ
GÇGÇG-ÇG*	ÇGÇ
G*	Ç"G*	Ç$	G-z#/vouchers/batches/{batch_id}/deletec                ó<   € V ^8„  d   QhR\         R\        R\        /# )r0   rË   r1   r”   r·   )r6   s   "r7   r8   r8   C  s+   € ÷ !Rñ !RÜð!Räð!Rô ñ!Rr9   c              ƒ   ó  "  € \         ;_uu_4       GR j  x€L
  VP                  \        V 4      G R j  x€L
 pVf   \        RRR7      hVP	                  \        \        4      P                  \        P                  V 8H  4      P                  \        P                  P                  4       4      4      G R j  x€L
 P                  4       P                  4       pV'       dá   \        YP                  ;'       g    V^ ,          P                  4      G R j  x€L
 p. pV Ff  pVP                   ;'       g    VP"                  p \$        P&                  ! VP(                  V4      G R j  x€L
 '       g   VP+                  V4       Kf  Kh  	  V'       d3   \        RR\/        V4       RRP1                  VR,          4       2R7      hV F  pVP3                  V4      G R j  x€L
  K  	  VP3                  V4      G R j  x€L
  VP5                  4       G R j  x€L
  \7        R	R
R7      uuR R R 4      GR j  x€L
  #  EL EL  EL� EL( LÙ  \,         d    TP+                  T4        EKD  i ; i LŠ Lo LY L=  + GR j  x€L 
 '       g   i     R # ; i5i)Nr;   r—   r<   r  z0Batch belum dihapus. Gagal menghapus/verifikasi z user di RouterOS: z, :Né   Nz/vouchers?batch_deleted=1r  rF  )r‚  r?   r   r
   rA   r   r   rB   rË   rC   rD   rë   rE   rª   rS   r2   rO   rì   r  r  Údelete_hotspot_userrÍ   r%   r„  rÊ   Údeleter  r   )	rË   r1   r”   r’   rU   r   rD  r}  rO   s	   &&&      r7   Údelete_voucher_batchr‹  B  s   é € ÷ "×!Ö!Ø—f‘fœ\¨8Ó4×4ˆØŠ=Ü¨CÐ8WÔXÐXØŸ*™*Ü”7‹O×!Ñ!¤'×"2Ñ"2°hÑ">Ó?×HÑHÌÏÉÏÉÓIYÓZó
÷ 
ç‰7‹9—S‘S“Uð 	÷ Ü,¨R·±×1YÐ1YÀHÈQÅK×DYÑDYÓZ×ZˆGØ "ˆFÛ#�Ø"×+Ñ+×;Ð;¨w¯|©|�ð,Ü!(×!2Ò!2°7×3NÑ3NÐPXÓ!Y×YÖYØŸ™ hÖ/ñ Zñ $÷ Ü#Ø #ØMÌcÐRXËkÈ]ÐZmÐnr×nwÑnwÐx~ð  @Bõ  yCó  oDð  nEð  Fôð ó
  ˆGØ—)‘)˜GÓ$×$Ò$ñ  à�i‰i˜Ó×ÐØ�i‰i‹k×ÐÜÐ$?ÈSÔQ÷9 "×!Õ!Ú4ò
ò
 [ñ
 Zøä0ô ,Ø—M‘M (×+Ð+ð,úñ %ÙÙ÷7 "×!×!Ó!üs  ‚J•H0–J™I*³H3´BI*Â5H6Â6'I*ÃI*Ã6I*ÄH9ÄI*Ä0I*Ä>$H>Å"H<
Å#	H>Å-H>Å>I*ÆAI*ÇI"
ÇI*Ç4I$Ç5I*ÈI&ÈI*ÈJÈ*I(È+JÈ3I*È6I*È9I*È<H>È>I	ÉI*ÉI	ÉI*É$I*É&I*É(JÉ*J	É0I3É1
J	É<J	É>	Jz/vouchers/{voucher_id}/deletec                ó<   € V ^8„  d   QhR\         R\        R\        /# )r0   Ú
voucher_idr1   r”   r·   )r6   s   "r7   r8   r8   g  s+   € ÷ Hñ HÜðHäðHô ñHr9   c              ƒ   óø  "  € VP                  \        V 4      G R j  x€L
 pVf   \        RRR7      hVP                  ;'       g    VP                  pV'       dH    \        WP                  4      G R j  x€L
 p\        P                  ! VP                  V4      G R j  x€L
  VP                  V4      G R j  x€L
  VP                  4       G R j  x€L
  \        RRR7      #  LÂ Lm LF  \         d     LQi ; i L@ L*5i)Nr;   úVoucher tidak ditemukanr<   z/vouchers?deleted=1r  rF  )r?   r   r
   rO   rì   rS   r2   r  r  r‰  rx  rŠ  r  r   )r�  r1   r”   r}  rO   r   s   &&&   r7   Údelete_single_voucherr�  f  sÔ   é € ð —F‘Fœ7 JÓ/×/€GØ‚Ü¨Ð4MÔNÐNà×Ñ×/Ð/ 7§<¡<€Hßð	Ü,¨R×1BÑ1BÓC×CˆGÜ×#Ò# G×$?Ñ$?ÀÓJ×JÐJð �)‰)�GÓ
×ÐØ
�)‰)‹+×ÐÜÐ 5À3ÔGÐGñ 0ñ DÙJøÜô 	Ùð	úñ Ùùs{   ‚C:œC�'C:ÁC:ÁC% Á3C!Á4(C% ÂC#ÂC% Â!C:Â5C6Â6C:ÃC8ÃC:Ã!C% Ã#C% Ã%C3Ã0C:Ã2C3Ã3C:Ã8C:z/vouchers/{voucher_id}/printc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r0   r�  r�   r1   rf  )r6   s   "r7   r8   r8   ~  s!   € ÷ 8ñ 8¬3ð 8¼ð 8Älñ 8r9   c              ƒ   ó  "  € VP                  \        V 4      G R j  x€L
 pVf   \        RRR7      hVP                  '       d)   VP                  \        VP                  4      G R j  x€L
 MR pRpRpVP
                  '       d~   VP                  \        VP
                  4      G R j  x€L
 pV'       dM   VP                  '       d;   RVP                  P                  4       9  d   RVP                   2MVP                  pM°VP                  '       dŸ   VP                  \        VP                  4      G R j  x€L
 pV'       do   VP                  '       d]   VP                  P                  RR	4      P                  R
R	4      p	RVP                  P                  4       9  d   RV	 2MVP                  pR p
VP                  '       d    \        VP                  4      p
VP                  R8H  ;'       gj    VP                  R8H  ;'       gS    T;'       d    VP                   R8H  ;'       g2    V
'       * ;'       g#    Y£P"                  ;'       g    VP$                  8H  p\'        VP(                  ;'       g    V'       d   VP(                  MR V'       d   VP*                  MR 4      pVP,                  e   VP,                  MV'       d   VP,                  M^ pRVR 2P                  RR4      pRVP.                  R^RVP"                  ;'       g    VP$                  RT
RTRVP0                  RTRTRTRVP2                  ;'       g    V'       d   VP2                  MR	RVP"                  ;'       g    VP$                  R\5        VP"                  ;'       g    VP$                  4      /.pT;'       g    \	        RVP.                   2R7      p\6        P9                  VRR VR!VR"VR#V/R$7      #  ELÊ EL‚ ELE EL¹  \         d    R p
 EL'i ; i5i)%Nr;   r�  r<   rh  ri  rj  rk  rl  rŸ   rm  rn  r,  rà   ro  rá   râ   rD   rp  rO   rP   rq  rÂ   rÞ   rß   rr  rÃ   rs  rt  zVOUCHER-)rÁ   ru  r’   rv  rw  rU   r¥   )r?   r   r
   rË   r   r  r   r¦   rk   r2   r   rñ   rð   r#   rx  rA  r0  rO   rì   rn   r3  rc   rÞ   rD   rÂ   rÃ   r�   r¯   r°   )r�  r�   r1   r}  r’   rv  rw  ry  rz  r{  rP   rq  rr  r~  rß   r|  Ú
mock_batchs   &&&              r7   Úprint_single_voucherr”  }  ss  é € à—F‘Fœ7 JÓ/×/€GØ‚Ü¨Ð4MÔNÐNØ<C×<L×<LÐ<L�"—&‘&œ w×'7Ñ'7Ó8×8Ð8ÐRV€Eà€IØ#€IØ‡‡€Ø—V‘VœD '§/¡/Ó2×2ˆß�D—I—I�IØ4<ÀDÇIÁIÇOÁOÓDUÔ4U˜* T§Y¡Y KÑ0Ð[_×[dÑ[dˆIøØ	×	×	Ð	Ø—F‘Fœ>¨7×+<Ñ+<Ó=×=ˆß�3—8—8�8ØŸ(™(×*Ñ*¨:°rÓ:×BÑBÀ5È"ÓMˆKØ6>ÀcÇhÁhÇnÁnÓFVÔ6V˜* [ MÑ2Ð\_×\dÑ\dˆIà€HØ×"×"Ð"ð	Ü% g×&AÑ&AÓBˆHð ×+Ñ+¨}Ñ<÷ Cð CØ×+Ñ+¨vÑ5÷Cð Cà×8Ð8˜uŸ™°&Ñ8÷Cð Cð !”L÷Cð Cð ×!1Ñ!1×!AÐ!A°W·\±\ÑBð	 ô   × 4Ñ 4× _Ð _Ïu¸×9KÒ9KÐZ^×x}Ðaf×atÒatð  DHó  I€HØ!(§¡Ò!:�—’×PUÀÇÂÐ[\€IØ˜I dÐ+Ð,×4Ñ4°S¸#Ó>€Oð 	ˆg�j‰jØ�Ø�G×$Ñ$×4Ð4¨¯©Ø�HØ˜Ø�7—?‘?Ø�Ø˜?Ø�HØ�7—?‘?×FÐF¿ u§}¢}À2Ø�g×&Ñ&×6Ð6¨'¯,©,ØÔ,¨W×-=Ñ-=×-MÐ-MÀÇÁÓNðð €Ið ×JÐJœ,°H¸W¿Z¹Z¸LÐ2IÔJ€JÜ×%Ñ%¨gÐ<VØ�Ø�YØ�YØ�Ið	aÐ%ó ð òe 0ò 9ò
 3ò >øô ô 	Ø‹Hð	üsö   ‚PœO&�&PÁ#PÁ'O)Á(PÂ#PÂ'O,Â(PÂ4PÃAPÄ#PÄ6O/Ä7PÅPÅA/PÇO2 ÇPÇ1PÈ	PÈPÈ)PÈ8PÉ&PÉ3PÉ<PÊ3PËAPÌ5PÍPÍ
 PÍ+$PÎPÎ,;PÏ)PÏ,PÏ/PÏ2PÏ?PÐPÐPrY   )Ur   r   r   rI  r‚   r…   r  r  Úfastapir   r   r   r	   r
   Úfastapi.responsesr   r   r   r   Úfastapi.templatingr   Úsqlalchemy.ext.asyncior   Ú
sqlalchemyr   r   r   r   r   Úapp.core.databaser   Úapp.core.securityr   Úapp.models.modelsr   r   r   r   r   r   r   r   r    r!   r"   Úapp.core.device_credentialsr#   Úapp.core.mikrotikr$   r%   Úapp.core.voucher_generationr&   r'   r(   Úosr}   ÚrouterÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRrÊ   r¯   ÚLockr‚  rK   rS   r`   rn   r�   r?   rµ   rÕ   r  Úpostr#  r+  rb  rd  r  r…  r‹  r�  r”  r<  r9   r7   Ú<module>r©     s³  ðß 2Ñ 2ã ã 	ã ã ã ç DÕ Dç ]Ó ]å .å /ç 6Õ 6å $å +÷÷ ÷ ñ õ 7ç Lç Så 6ã 	ã ñ 
¡©°~ÀzÐS`Ó)aÓ!bÐ cÔ	d€à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨2¯7©7¯?©?¸2¿7¹7¿?¹?È8Ó;TÓ+UÓVÓW€á b§g¡g§l¡l°8¸_Ó&MÔN€	à—\’\“^Ð ÷÷<Sõ÷<õ8*ð, ‡�ˆK¨€Ó5ð '+Àà!á˜v“±g¹mÈNÐ\fÐhuÓ>vÓ6wö<ó 6ð<ðD ‡�Ð#Ó$ð "á˜v“á™-¨¸
ÀMÓRÓSö^ ó %ð^ ðH ‡�Ð%Ó&ñ ˜v“á™-¨¸
ÀMÓRÓSöDó 'ðDðT ‡�Ð Ó!ñ �S“	±°S³	ÉÈSË	á˜#“Y©t°C«yÑQUÐV[ÓQ\á˜T›
±$°q³'á˜R›±T¸&³\á˜#“Y±7¸6³?á™-¨Ó6Ó7öGJó "ðGJðZ ‡�Ð7Ó8áBIÈ&Ã/ö :ó 9ð:ð@ ‡�Ð!Ó"ñ " $›Z¹tÀD»zá  ›J¹¸S»	á ›:á˜&“\¹4À»7ÑZ^Ð_lÓZmá˜T›
ÁÀTÃ
ÑgkÐlpÓgqá"& t£*ÁtÈDÃzÑimÐnrÓisá˜t›*¹À»á™-¨¸
ÀMÓRÓSö!h\ó #ðh\ð\ ‡�Ð&°|€ÓDà‡�Ð%°l€ÓCñRó Dó EðRð ‡�Ð0ÀÑ]dÑerð  tBð  DNð  P]ó  f^ó  ^_ð  ]`€ó  aáRYÐZ`ÓRaö qó aðqðn ‡�Ð0Ó1ñ $(¨£9á˜v“±g¹mÈNÐ\fÐhuÓ>vÓ6wö	,ió 2ð,ið^ ‡�Ð2Ó3ñ ˜v“Ù™-¨¸
ÀMÓRÓSö!Ró 4ð!RðF ‡�Ð,Ó-ñ ˜v“Ù™-¨¸
ÀMÓRÓSöHó .ðHð, ‡�Ð*¸<ÑW^Ñ_lÐm{ð  ~Hð  JWó  `Xó  XYð  WZ€ó  [ÙU\Ð]cÓUdö 8ó [ò8r9   