Ë
    1vÀj*  ã                   óà  — d dl mZmZmZmZ d dlmZmZmZ d dl	m
Z
 d dlmZ d dlmZm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Zd d
lmZmZmZ  e e eddd«      «      g¬«      Zej:                  j=                  ej:                  j=                  ej:                  j=                  ej:                  j?                  e «      «      «      «      Z! e
ej:                  jE                  e!d«      ¬«      Z#ejI                  d«       ed«       ee«      fde%defd„«       Z&ejI                  de¬«       ed	¬«       ed	¬«       edd¬«       ee«       ee«      fdede%d	z  de%d	z  de'def
d„«       Z(y	) é    )Ú	APIRouterÚRequestÚDependsÚQuery)ÚHTMLResponseÚRedirectResponseÚJSONResponse)ÚJinja2Templates)ÚAsyncSession)ÚselectÚfunc)Úget_db)Úrequire_rolesÚget_current_user)ÚCustomerN)ÚdatetimeÚtimezoneÚ	timedeltaÚadmin_csÚteknisiÚagen_voucher)Údependencieszapp/templates)Ú	directoryz/api/customers/liveÚ ÚidsÚdbc           	   ƒ   ó  K  — | st        dg i«      S | j                  d«      D �cg c]:  }|j                  «       j                  «       sŒ"t	        |j                  «       «      ‘Œ< }}|st        dg i«      S |j                  t        t        «      j                  t        j                  j                  |«      «      «      ƒ d {  –—† }|j                  «       j                  «       }g }|D �]  }|j                  dk(  rd}d}	n+|j                  dk(  rd}d}	n|j                  d	v rd
}d}	nd}d}	|j                  dk(  xs |j                  dk(  xr0 |j                   dk(  xs |j"                  dv xs |j$                  dk7  }
|
rdnd}d|› |› d�}|
r6d|j                   xs d› d|j"                  xs d› d|j$                  xs d› d�nd}|j'                  |j                  |j(                  xs d||	|dœ«       �Œ t        d|i«      S c c}w 7 �ŒH­w)NÚ	customersú,Úactivezi<span class="status-icon status-icon-online" title="Pelanggan aktif" aria-label="Pelanggan aktif"></span>u   Hijau â€” pelanggan aktifÚisolirzl<span class="status-icon status-icon-los" title="Pelanggan diisolir" aria-label="Pelanggan diisolir"></span>u   Merah â€” pelanggan diisolir)ÚrequestÚpending_provisioningÚconfiguringzŠ<span class="status-icon status-icon-waiting" title="Status pelanggan masih diproses" aria-label="Status pelanggan masih diproses"></span>u*   Kuning â€” status pelanggan masih diprosesz„<span class="status-icon status-icon-offline" title="Status pelanggan tidak aktif" aria-label="Status pelanggan tidak aktif"></span>u!   Abu-abu â€” pelanggan tidak aktifÚhotspotÚhotspot_voucherÚpending)Úpending_configurationÚwaiting_sessionÚwaiting_internetÚprovisionedz‡<span class="status-icon status-icon-waiting" title="Layanan WiFi/Hotspot masih menunggu konfigurasi" aria-label="WiFi pending"></span>r   z;<div class="inline-flex items-center justify-center gap-2">z</div>u=   Kuning berkedip â€” layanan WiFi/Hotspot masih pending (ACS: ú-z, MikroTik: z, provisioning: ú)u;   Tidak ada indikator tambahan â€” layanan WiFi tidak pendingzN/A)ÚidÚpowerÚ	indicatorÚcustomer_explanationÚwifi_explanation)r	   ÚsplitÚstripÚisdigitÚintÚexecuter   r   Úwherer.   Úin_ÚscalarsÚallÚstatusÚservice_modeÚtypeÚacs_wifi_statusÚmikrotik_provisioning_statusÚprovisioning_statusÚappendÚont_rx_power)r   r   ÚiÚid_listÚresultr   ÚoutÚcÚcustomer_indicatorr1   Úwifi_pendingÚ
wifi_badger0   r2   s                 úapp/routes/list_customers.pyÚget_live_customersrM      s_  è ø€ áÜ˜[¨"Ð-Ó.Ð.Ø'*§y¡y°£~ÖM !¸¿¹»×9JÑ9JÕ9LŒs�1—7‘7“9�~ÐM€GÐMÙÜ˜[¨"Ð-Ó.Ð.à—:‘:œf¤XÓ.×4Ñ4´X·[±[·_±_ÀWÓ5MÓNÓO×O€FØ—‘Ó ×$Ñ$Ó&€Ià
€CØó (ˆà�8‰8�xÒð "MÐØ#>Ñ Ø�X‰X˜Ò!ð "PÐØ#AÑ Ø�X‰XÐKÑKð "nÐØ#OÑ ð "hÐØ#FÐ ð �^‰^˜yÑ(ÒG¨A¯F©FÐ6GÑ,Gò à×!Ñ! YÑ.ò :Ø×1Ñ1Ð5uÐuò:à×(Ñ(¨MÑ9ð 	ñ ñ VØ!#ð 	ð RÐRdÐQeÐfpÐeqÐqwÐxˆ	ñ ðØ×&Ñ&Ò-¨#Ð.¨l¸1×;YÑ;YÒ;`Ð]`Ð:aÐaqÐrs÷  sHñ  sHò  sOð  LOð  rPð  PQñRà!^ð 	ð 	�
‰
Ø—$‘$Ø—^‘^Ò, uØ"Ø$8Ø 0ñ
ö 	ðE(ôR ˜ cÐ*Ó+Ð+ùòc Nð Pûs$   ‚#H¥#HÁ	HÁ$AHÃH
ÃEHz
/customers)Úresponse_class)Údefaulté   )rO   Úger"   r>   r<   Úpagec              ƒ   ó2  K  — |j                   dk(  rt        dd¬«      S 	 d}t        j                  dk(  g}|r"|j	                  t        j
                  |k(  «       |dk(  r/|j	                  t        j                  j                  d«      «       n$|r"|j	                  t        j                  |k(  «       |j                   t        t        j                  t        j                  «      «      j                  |Ž «      ƒ d	{  –—† xs d
}t        d||z   dz
  |z  «      }	t        ||	«      }d
dlm}
 |j%                   t        t        «      j'                   |
t        j(                  «       |
t        j*                  «       |
t        j,                  «      «      j                  |Ž j/                  t        j0                  j3                  «       «      j5                  |dz
  |z  «      j7                  |«      «      ƒ d	{  –—† }|j9                  «       j;                  «       }t<        j?                  | d|||||||	tA        t        d|dz
  «      t        |	|dz   «      dz   «      dœ¬«      S 7 �Œe7 Œm# tB        $ r$ tE        jF                  «        tI        dd¬«      cY S w xY w­w)z<Server-side pagination: safe for large customer populations.r   z/tasksi/  )ÚurlÚstatus_codeé   Fr'   )r"   r#   Nr   rP   )Úselectinloadzcustomers.htmlé   )r   Útype_filterÚstatus_filterrR   Ú	page_sizeÚtotalÚtotal_pagesÚpage_numbers)r"   ÚnameÚcontextzGagal memuat data pelanggan.iô  )ÚcontentrU   )%Úroler   r   Úis_archivedrB   r>   r<   r9   Úscalarr   r   Úcountr.   r8   ÚmaxÚminÚsqlalchemy.ormrW   r7   ÚoptionsÚodpÚservice_packageÚ
olt_deviceÚorder_byÚ
created_atÚdescÚoffsetÚlimitr:   r;   Ú	templatesÚTemplateResponseÚrangeÚ	ExceptionÚ	tracebackÚ	print_excr   )r"   r>   r<   rR   r   Úuserr[   Úfiltersr\   r]   rW   rF   r   s                rL   Úlist_customersrz   H   s¡  è ø€ ð ‡y�y�IÒÜ H¸#Ô>Ð>ðUØˆ	Ü×'Ñ'¨5Ñ0Ð1ˆÙØ�N‰Nœ8Ÿ=™=¨DÑ0Ô1Ø�YÒØ�N‰Nœ8Ÿ?™?×.Ñ.Ð/RÓSÕTÙØ�N‰Nœ8Ÿ?™?¨fÑ4Ô5Ø—i‘iÐ E¤¤t§z¡z´(·+±+Ó'>Ó ?× EÑ EÀwÐ OÓP×PÒUÐTUˆÜ˜!˜e iÑ/°!Ñ3¸	ÑAÓBˆÜ�4˜Ó%ˆÝ/Ø—z‘zð RŒF”8Ó×$Ñ$¡\´(·,±,Ó%?ÁÌh×NfÑNfÓAgÑiuÔv~÷  wJñ  wJó  jKó  L÷  Rñ  Rð  T[ð  \÷  eñ  eô  fn÷  fyñ  fy÷  f~ñ  f~ó  f@ó  A÷  Hñ  Hð  JNð  QRñ  JRð  V_ñ  I_ó  `÷  fñ  fð  gpó  qó
÷ 
ˆð —N‘NÓ$×(Ñ(Ó*ˆ	Ü×)Ñ)ØÐ"2à&°tÈfØ¨9¸uÐU`Ü %¤c¨!¨T°A©XÓ&6¼¸KÈÐPQÉÓ8RÐUVÑ8VÓ Wñð *ó 
ð 	
ð Qùð
ùô ò UÜ×ÑÔÜÐ$BÐPSÔTÒTðUüsO   ‚J CI' Ã=I"Ã>C9I' Ç7I%Ç8A)I' É!JÉ"I' É%I' É'*JÊJÊJÊJ))Úfastapir   r   r   r   Úfastapi.responsesr   r   r	   Úfastapi.templatingr
   Úsqlalchemy.ext.asyncior   Ú
sqlalchemyr   r   Úapp.core.databaser   Úapp.core.securityr   r   Úapp.models.modelsr   Úosrv   r   r   r   ÚrouterÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRÚjoinrr   ÚgetÚstrrM   r6   rz   © ó    rL   ú<module>r�      s^  ðß 6Ó 6ß JÑ JÝ .Ý /ß #Ý $ß =Ý &Û 	Û ß 2Ñ 2á	¡©°zÀ9ÈnÓ)]Ó!^Ð _Ô	`€Ø�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨2¯7©7¯?©?¸2¿7¹7¿?¹?È8Ó;TÓ+UÓVÓW€Ù b§g¡g§l¡l°8¸_Ó&MÔN€	à‡�Ð!Ó"Ù(-¨b«	ÁgÈfÃoñ 4, #ð 4,°|ò 4,ó #ð4,ðl ‡�ˆL¨€Ó6ñ  TÔ*Ù tÔ,Ù˜a AÔ&Ù˜v“ÙÐ#Ó$ñ&UØð&Uà
�‰*ð&Uð �$‰Jð&Uð ð	&Uð
 	ò&Uó 7ñ&UrŽ   