Ë
    ?žj8h  ã                  ó@  — d Z ddlmZ ddlmZ ddlmZmZmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZ ddlmZmZ dd	lmZmZ dd
lmZ ddlZddlmZ ddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 dd„Z5dd„Z6dd„Z7d d„Z8	 	 	 	 	 	 	 	 	 	 	 	 d!d„Z9	 	 d"	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#d„Z:d$d„Z;d%d„Z<	 	 	 	 	 	 	 	 	 	 	 	 d&d„Z=	 d'	 	 	 	 	 	 	 	 	 d(d„Z>	 	 d)	 	 	 	 	 	 	 	 	 	 	 	 	 d*d„Z?	 	 	 d+	 	 	 	 	 	 	 	 	 	 	 	 	 d,d„Z@	 	 	 	 	 	 	 	 	 	 	 	 d-d„ZAy).uA   POS Analytics service â€” upload, compare, anomali, golden-hours.é    )Úannotations)Údefaultdict)ÚdateÚdatetimeÚ	timedeltaÚtimezone)ÚDecimal)ÚdeleteÚfuncÚselect)ÚAsyncSession)ÚPosUploadBatchÚPosTransaksiPertamina)ÚShiftÚNozzle)ÚProdukN)Úsettings)ÚPosUploadResponseÚPosExistingBatchÚPosCompareDayRowÚPosCompareResponseÚPosAnomaliItemÚPosAnomaliResponseÚPosHourlyRowÚPosIslandRowÚPosIslandHourlyRowÚPosGoldenHoursResponseÚPosShiftSummaryRowÚPosGoldenHoursSummaryÚPosBatchListItemÚPosTransaksiItemÚPosBatchTransaksiResponseÚGoldenHoursInsightResponse)Úparse_xlsx_to_rowsÚparse_csv_to_rowsÚvalidate_produk_matchÚ
PRODUK_MAPÚ_normalize_spbu_no)Ú
log_actionc              ƒ  ó²   K  — ddl m} | j                  t        |«      j	                  |j
                  |k(  «      «      ƒ d {  –—† j                  «       S 7 Œ­w)Nr   )ÚSpbu)Úapp.models.spbur+   Úexecuter   ÚwhereÚidÚscalar_one_or_none)ÚdbÚspbu_idr+   s      úD/var/www/html/spbu.com/backend/app/services/pos_analytics_service.pyÚ	_get_spbur4      s?   è ø€ Ý$Ø—*‘*œV D›\×/Ñ/°·±¸7Ñ0BÓCÓD×D×XÑXÓZÐZÐDús   ‚A AÁAÁAc              ƒ  óÔ   K  — | j                  t        t        «      j                  t        j                  |k(  «      «      ƒ d {  –—† j                  «       }|st        d«      ‚|S 7 Œ!­w)NzProduk tidak ditemukan)r-   r   r   r.   r/   r0   Ú
ValueError)r1   Ú	produk_idÚproduks      r3   Ú_get_produkr9   $   sR   è ø€ Ø—J‘Jœv¤f›~×3Ñ3´F·I±IÀÑ4JÓKÓL×L×`Ñ`Ób€FÙÜÐ1Ó2Ð2Ø€Mð Mús   ‚AA(ÁA&Á"A(c              ƒ  ó$  K  — | j                  t        t        «      j                  t        j                  |k(  t        j
                  j                  d «      «      «      ƒ d {  –—† }t        |j                  «       j                  «       «      S 7 Œ+­w©N)
r-   r   r   r.   r2   Ú
deleted_atÚis_ÚlistÚscalarsÚall)r1   r2   Úresults      r3   Ú_get_shiftsrB   +   si   è ø€ Ø—:‘:ÜŒu‹×ÑœEŸM™M¨WÑ4´e×6FÑ6F×6JÑ6JÈ4Ó6PÓQó÷ €Fô �—‘Ó ×$Ñ$Ó&Ó'Ð'ðús   ‚A BÁ"BÁ#,Bc                ó¶   — |D ]T  }|j                   }|j                  }||k\  r|| cxk  r|k  sŒ,n Œ/|j                  c S | |k\  s| |k  sŒH|j                  c S  y)z<Return shift_id for a given time, handling overnight shifts.N)Ú	jam_mulaiÚjam_selesair/   )ÚjamÚshiftsÚshiftÚmulaiÚselesais        r3   Ú_resolve_shiftrK   2   s[   € ãˆØ—‘ˆØ×#Ñ#ˆØ�eÒà˜Ô%˜gÖ%Ø—x‘x’ð �eŠ|˜s W›}Ø—x‘x’ð ð ó    c           	   ƒ  ó&  K  — | j                  t        t        «      j                  t        j                  |k(  t        j
                  |k(  t        j                  |k(  t        j                  |k(  «      «      ƒ d {  –—† }|j                  «       S 7 Œ­wr;   )	r-   r   r   r.   r2   r7   Útanggal_mulaiÚtanggal_selesair0   )r1   r2   r7   rN   rO   rA   s         r3   Úget_existing_batchrP   B   s|   è ø€ ð —:‘:ÜŒ~Ó×$Ñ$Ü×"Ñ" gÑ-Ü×$Ñ$¨	Ñ1Ü×(Ñ(¨MÑ9Ü×*Ñ*¨oÑ=ó		
ó÷ €Fð ×$Ñ$Ó&Ð&ðús   ‚A8BÁ:BÁ;Bc              ƒ  ó"	  K  — t        | |«      ƒ d{  –—† }t        | |«      ƒ d{  –—† }|dk(  rt        |«      }	nt        |«      }	|	d   j	                  di «      }
|
j                  dd«      }|
j                  d«      }|r?|r=t        |«      t        |j                  «      k7  rt        d|› d|j                  › d	�«      ‚|	d   d
   }	 t        ||j                  «       t        d„ |	D «       «      }t        d„ |	D «       «      }t        | ||||«      ƒ d{  –—† }|r\|sZt        d|j                  › d|j                   › d|j"                  › d|j$                  › d|j&                  j)                  «       › �
«      ‚|rh| j+                  t-        t.        «      j1                  t.        j                  |j                  k(  «      «      ƒ d{  –—†  | j3                  «       ƒ d{  –—†  t5        | |«      ƒ d{  –—† }d}g }t7        «       }|	D �]  }t9        j:                  |d   |d   «      j=                  t?        tA        d¬«      «      ¬«      }|||d   f}||v r|dz  }ŒU|jC                  |«       |jE                  tG        d0i d|“dtI        |d   |«      “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “d
|d
   “d|d   “d|d   “d|d   “d |d    “d!|d!   “d"|d"   “d#|d#   “d$|d$   “d%|“d&|d&   “d'|d'   “Ž«       �Œ tK        d(„ |D «       «      }tK        d)„ |D «       «      }t9        jL                  t>        jN                  «      }t/        |||||tQ        |«      |||¬*«	      }| jC                  |«       | j3                  «       ƒ d{  –—†  |D ]  }|j                  |_)        Œ | jU                  |«       tW        | ||d+d,|j                  tQ        |«      ||jX                  d-œ¬.«      ƒ d{  –—†  | j[                  «       ƒ d{  –—†  t]        |j                  tQ        |«      |||j^                  |j`                  ||¬/«      S 7 �Œ@7 �Œ/# t        $ r}t        t        |«      «      ‚d}~ww xY w7 �Œh7 �Œ»7 �Œ¦7 �Œ•7 Œñ7 Œ�7 Œy­w)1z`Parse and store Pertamina POS file (xlsx or csv). Replaces existing batch if force_replace=True.NÚcsvr   Ú_metaÚskipped_invalidÚno_spbu_from_filez-File bukan milik SPBU ini. No SPBU di file: 'z', No SPBU aktif: 'Ú'Ú
produk_rawc              3  ó&   K  — | ]	  }|d    –— Œ y­w©ÚtanggalN© ©Ú.0Úrs     r3   Ú	<genexpr>z"upload_pos_xlsx.<locals>.<genexpr>z   s   è ø€ Ð3©d¨˜˜)�©dùó   ‚c              3  ó&   K  — | ]	  }|d    –— Œ y­wrY   r[   r\   s     r3   r_   z"upload_pos_xlsx.<locals>.<genexpr>{   s   è ø€ Ð5±¨1˜!˜I�,±ùr`   zduplicate_batch::ú::rZ   rF   é   )Úhours)ÚtzinfoÚno_dispenseré   r2   Úshift_idÚcode_morÚprovinceÚcityÚno_spbu_pertaminaÚ	no_nozzleÚvolumeÚnilaiÚoperator_nameÚno_hpÚdelivery_typeÚ
plat_nomorÚnikÚinstansiÚ	timestampÚ
island_rawÚ
nozzle_rawc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr;   ©rn   ©r]   Úts     r3   r_   z"upload_pos_xlsx.<locals>.<genexpr>±   s   è ø€ Ð.© A�q—x•x©ùó   ‚c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr;   )ro   r{   s     r3   r_   z"upload_pos_xlsx.<locals>.<genexpr>²   s   è ø€ Ð,¡t !�a—g•g¡tùr}   )	r2   r7   Úuploaded_by_idrN   rO   Ú
total_rowsÚtotal_volumeÚtotal_nilaiÚ
created_atÚimportÚ
pos_upload)ÚinsertedÚskippedr8   )Úuser_idr2   ÚaksiÚmodulÚ	object_idÚdetail)Úbatch_idr€   rN   rO   r�   r‚   r‡   Úsuspicious_countr[   )1r9   r4   r%   r$   ÚpopÚgetr(   Únomor_pertaminar6   r&   ÚkodeÚstrÚminÚmaxrP   r/   r€   rN   rO   rƒ   Ú	isoformatr-   r
   r   r.   ÚflushrB   Úsetr   ÚcombineÚreplacer   r   ÚaddÚappendr   rK   ÚsumÚnowÚutcÚlenr�   Úadd_allr)   ÚnamaÚcommitr   r�   r‚   )r1   r2   r7   Ú
file_bytesrˆ   Úforce_replaceÚfile_extr8   ÚspbuÚrowsÚmetarŽ   rU   Úfirst_produk_rawÚerN   rO   ÚexistingrG   r‡   ÚtxnsÚseenr^   ÚtsÚ	dedup_keyr�   r‚   rž   Úbatchr|   s                                 r3   Úupload_pos_xlsxr²   Q   s)  è ø€ ô ˜r 9Ó-×-€FÜ˜2˜wÓ'×'€Dð �5ÒÜ  Ó,‰ä! *Ó-ˆð �‰7�;‰;�w Ó#€DØ ŸH™HÐ%6¸Ó:ÐØ$(§H¡HÐ-@Ó$AÐñ Ñ!ÜÐ/Ó0Ô4FÀt×G[ÑG[Ó4\Ò\Üð%Ø%6Ð$7ð 8#Ø#'×#7Ñ#7Ð"8¸ð;óð ð ˜A‘w˜|Ñ,Ðð!ÜÐ.°·±Ô<ô
 Ñ3©dÓ3Ó3€MÜÑ5±Ó5Ó5€Oô (¨¨G°YÀÈÓ_×_€HÙ™ÜØ §¡˜}¨B¨x×/BÑ/BÐ.CØ�×'Ñ'Ð(¨¨8×+CÑ+CÐ*DØ�×$Ñ$×.Ñ.Ó0Ð1ð3ó
ð 	
ñ
 Ø�j‰jœ¤Ó/×5Ñ5´n×6GÑ6GÈ8Ï;É;Ñ6VÓWÓX×XÐXØ�h‰h‹j×Ðô ˜r 7Ó+×+€Fð €GØ€DÜ“u€DÜˆÜ×Ñ˜a 	™l¨A¨e©HÓ5×=Ñ=ÄXÌiÐ^_ÔN`ÓEaÐ=ÓbˆØ˜b ! NÑ"3Ð4ˆ	Ø˜ÑØ�q‰LˆGØØ�‰�ÔØ�‰Ô)ò 
Ùð
ä# A e¡H¨fÔ5ð
ð �i’Lð
ð �%’ð	
ð
 �z’]ð
ð �z’]ð
ð �6’ð
ð  Ð 3Ò4ð
ð ˜’nð
ð ˜>Ò*ð
ð ˜’ð
ð �X’;ð
ð �G’*ð
ð ˜OÒ,ð
ð �G’*ð
ð  ˜OÒ,ð!
ð" ˜’ð#
ð$ �%’ð%
ð& �z’]ð'
ñ( ð)
ð* ˜’ð+
ð, ˜’ð-
ö 	ð ôB Ñ.©Ó.Ó.€LÜÑ,¡tÓ,Ó,€Kô �,‰,”x—|‘|Ó
$€CÜØØØØ#Ø'Ü�t“9Ø!ØØô
€Eð ‡F�Fˆ5„MØ
�(‰(‹*×Ðó ˆØ—X‘Xˆ�
ð ð ‡J�JˆtÔä
�R °'Ø"¨,Ø$Ÿx™xÜ),¨T«¸wÐRX×R]ÑR]Ñ^ô`÷ `ð `ð �)‰)‹+×ÐäØ—‘Ü�t“9Ø#Ø'Ø×'Ñ'Ø×%Ñ%ØØ)ô	ð 	ðk .ùØ'úô4 ò !Üœ˜Q›Ó Ð ûð!úð `ùð 	YùØùð ,ùðp øð`øð ús¿   ‚R’Q“R¦Q§B!RÃ	Q Ã6RÄQ=ÄB/RÇR ÇRÇRÇRÇ1RÇ2F%RÎR	ÎA#RÏ;RÏ<RÐRÐ?RÑRÑ	Q:Ñ!Q5Ñ5Q:Ñ:RÒ RÒRÒRÒ	RÒRÒRc              ƒ  óÈ  K  — ddl m} | j                  t        t        «      j                  t        j                  |k(  «      j                  t        j                  j                  «       «      «      ƒ d {  –—† }t        |j                  «       j                  «       «      }t        |D �ch c]  }|j                  ’Œ c}«      }t        |D �ch c]  }|j                  sŒ|j                  ’Œ c}«      }|ry| j                  t        t        «      j                  t        j                   j#                  |«      «      «      ƒ d {  –—† j                  «       D �ci c]  }|j                   |“Œ c}ni }	|rq| j                  t        |«      j                  |j                   j#                  |«      «      «      ƒ d {  –—† j                  «       D �
ci c]  }
|
j                   |
“Œ c}
ni }g }|D ]Ö  }|	j%                  |j                  «      }|j                  r|j%                  |j                  «      nd }|j'                  t)        |j                   |j                  |r|j*                  nd|j,                  |j.                  |j0                  |j2                  |j4                  |j                  |r|j6                  nd ¬«
      «       ŒØ |S 7 �ŒPc c}w c c}w 7 �Œ�c c}w 7 �Œ"c c}
w ­w)Nr   )ÚUserÚ )
r/   r7   Úproduk_namarN   rO   r€   r�   r‚   rƒ   Úuploaded_by_name)Úapp.models.userr´   r-   r   r   r.   r2   Úorder_byrƒ   Údescr>   r?   r@   r7   r   r   r/   Úin_r�   rœ   r    r¢   rN   rO   r€   r�   r‚   Úname)r1   r2   r´   rA   ÚbatchesÚbÚ
produk_idsÚuser_idsÚpÚ
produk_mapÚuÚuser_mapÚitemsr8   Úuploaders                  r3   Úlist_batchesrÇ   Ü   sT  è ø€ Ý$à—:‘:ÜŒ~Óß	‰Œ~×%Ñ%¨Ñ0Ó	1ß	‰”.×+Ñ+×0Ñ0Ó2Ó	3ó÷ €Fô
 �6—>‘>Ó#×'Ñ'Ó)Ó*€Gä©GÓ4©G q�q—{“{¨GÑ4Ó5€JÜ©wÓK©w¨!¸!×:JÓ:J�Q×%Ó%¨wÑKÓL€Hñ
 
ð —*‘*œV¤F›^×1Ñ1´&·)±)·-±-À
Ó2KÓLÓM×Mß
‰'‹)ðóñ�Aˆ�‰ˆa‰ð òð ð	 ñ 
ð —*‘*œV D›\×/Ñ/°·±·±¸HÓ0EÓFÓG×Gß
‰'‹)ðóñ�Aˆ�‰ˆa‰ð òð ð	 ð €EÛˆØ—‘ §¡Ó,ˆØ56×5EÒ5E�8—<‘< × 0Ñ 0Ô1È4ˆØ�‰Ô%Ø�t‰tØ—k‘kÙ'-˜Ÿš°2ØŸ/™/Ø×-Ñ-Ø—|‘|ØŸ™ØŸ™Ø—|‘|Ù.6˜XŸ]š]¸Dô
õ 	ð ð €LðIûò 5ùÚKð Nûòð Hûòùsu   ‚A3K"Á5KÁ64K"Â*KÂ=K"ÃKÃKÃ-AK"ÅKÅK"ÅKÅ,AK"Æ8KÆ9K"ÇKÇ!C%K"ËK"ËK"ËK"c              ƒ  óð  K  — | j                  t        t        «      j                  t        j                  |k(  t        j
                  |k(  «      «      ƒ d {  –—† j                  «       }|st        d«      ‚| j                  t        t        «      j                  t        j                  |k(  «      «      ƒ d {  –—†  t        | ||dd|¬«      ƒ d {  –—†  | j                  «       ƒ d {  –—†  y 7 Œ—7 Œ87 Œ!7 Œ­w)NúBatch tidak ditemukanr
   r…   )rˆ   r2   r‰   rŠ   r‹   )r-   r   r   r.   r/   r2   r0   r6   r
   r)   r£   )r1   r2   r�   rˆ   r±   s        r3   Údelete_batchrÊ     sÜ   è ø€ Ø—:‘:ÜŒ~Ó×$Ñ$Ü×Ñ Ñ)Ü×"Ñ" gÑ-ó	
ó÷ ÷
 ÑÓð 
ñ ÜÐ0Ó1Ð1Ø
�*‰*”VœNÓ+×1Ñ1´.×2CÑ2CÀxÑ2OÓPÓ
Q×QÐQÜ
�R °'Ø"¨,À(ôL÷ Lð Là
�)‰)‹+×Ñðøð RøðLøàúsI   ‚AC6ÁC.ÁA C6Â7C0Â8C6ÃC2ÃC6Ã(C4Ã)C6Ã0C6Ã2C6Ã4C6c              ƒ  ó	  K  — ddl m}m} t        | |«      ƒ d{  –—† }| j	                  t        t        j                  t        j                  t        j                  «      j                  d«      t        j                  t        j                  «      j                  d«      «      j                  t        j                  |k(  t        j                  |k\  t        j                  |k  «      j                  t        j                  «      j!                  t        j                  «      «      ƒ d{  –—† }|D �	ci c]@  }	|	j                  |	j"                  xs t%        d«      |	j&                  xs t%        d«      dœ“ŒB }
}	| j	                  t        t        j(                  |j                  «      j                  d«      t        j                  |j                  «      j                  d«      «      j+                  ||j,                  |j.                  k(  «      j+                  t0        t0        j.                  |j2                  k(  «      j                  |j                  |k(  |j4                  j7                  g d	¢«      t        j(                  |j                  «      |k\  t        j(                  |j                  «      |k  t0        j8                  |k(  «      j                  t        j(                  |j                  «      «      «      ƒ d{  –—† }|D �	ci c]&  }	|	j                  |	j"                  xs t%        d«      “Œ( }}	t;        t=        t?        |
jA                  «       «      t?        |jA                  «       «      z   «      «      }g }|D ]Ã  }|
jC                  |i «      jC                  dt%        d«      «      }|
jC                  |i «      jC                  dt%        d«      «      }|jC                  |t%        d«      «      }||z
  }|r||z  d
z  nd}|jD                  }|�tG        |«      |kD  nd}|jI                  tK        |||||||¬«      «       ŒÅ tM        |t        d„ |D «       «      t        d„ |D «       «      ¬«      S 7 �ŒW7 �ŒJc c}	w 7 �Œ~c c}	w ­w)zECompare daily POS totals vs laporan_shift totals for the same produk.r   )ÚLaporanShiftÚPenjualanNozzleNÚvolÚnilÚ0)rÎ   rÏ   rZ   )Ú	submittedÚfor_approvalÚapprovedéd   F)rZ   Ú
volume_posÚ	nilai_posÚvolume_laporanÚselisih_volumeÚselisih_pctÚ
is_flaggedc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr;   )rÕ   r\   s     r3   r_   zget_compare.<locals>.<genexpr>^  s   è ø€ Ð<±8¨a˜QŸ\�\±8ùr}   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr;   )r×   r\   s     r3   r_   zget_compare.<locals>.<genexpr>_  s   è ø€ Ð D¹8°a ×!1Õ!1¹8ùr}   )r¨   Útotal_volume_posÚtotal_volume_laporan)'Úapp.models.operationalrÌ   rÍ   r9   r-   r   r   rZ   r   r�   rn   Úlabelro   r.   r2   Úgroup_byr¹   rÎ   r	   rÏ   r   ÚjoinÚlaporan_shift_idr/   r   Ú	nozzle_idÚstatusr»   r7   Úsortedr˜   r>   Úkeysr�   Úlosses_threshold_penjualan_pctÚabsrœ   r   r   )r1   r2   r7   rN   rO   rÌ   rÍ   r8   Úpos_qÚrowÚ
pos_by_dayÚlap_qÚ
lap_by_dayÚ	all_datesÚrows_outÚdÚvol_posÚnil_posÚvol_lapÚselisihrÙ   Ú	thresholdrÚ   s                          r3   Úget_comparer÷     s±  è ø€ ÷
 Eä˜r 9Ó-×-€Fð —*‘*ÜÜ!×)Ñ)Ü�H‰HÔ*×1Ñ1Ó2×8Ñ8¸Ó?Ü�H‰HÔ*×0Ñ0Ó1×7Ñ7¸Ó>ó	
÷
 
‰Ü!×)Ñ)¨WÑ4Ü!×)Ñ)¨]Ñ:Ü!×)Ñ)¨_Ñ<ó

÷
 
‰Ô'×/Ñ/Ó	0ß	‰Ô'×/Ñ/Ó	0ó÷ €Eñ  ó$áˆCð 	�‰˜SŸW™WÒ4¬°«¸S¿W¹WÒ=TÌÐPSËÑUÑUØð ð $ð —*‘*ÜÜ�I‰I�l×*Ñ*Ó+×1Ñ1°)Ó<Ü�H‰H�_×+Ñ+Ó,×2Ñ2°5Ó9ó	
÷ 
‰ˆo˜×?Ñ?À<Ç?Á?ÑRÓ	Sß	‰Œf”f—i‘i ?×#<Ñ#<Ñ<Ó	=ß	‰Ø× Ñ  GÑ+Ø×Ñ×#Ñ#Ò$MÓNÜ�I‰I�l×*Ñ*Ó+¨}Ñ<Ü�I‰I�l×*Ñ*Ó+¨Ñ>Ü×Ñ 	Ñ)ó

÷ 
‰”$—)‘)˜L×0Ñ0Ó1Ó	2ó÷ €Eñ$ ó'áˆCð 	�‰�S—W‘WÒ,¤¨£Ñ,Øð ð 'ô
 ”sœ4 
§¡Ó 1Ó2´T¸*¿/¹/Ó:KÓ5LÑLÓMÓN€IØ€HÛˆØ—.‘.  BÓ'×+Ñ+¨E´7¸3³<Ó@ˆØ—.‘.  BÓ'×+Ñ+¨E´7¸3³<Ó@ˆØ—.‘. ¤G¨C£LÓ1ˆØ˜GÑ#ˆÙ3:�w Ñ(¨3Ò.ÀˆØ×9Ñ9ˆ	Ø5@Ð5L”S˜Ó%¨	Ò1ÐRWˆ
Ø�‰Ô(ØØØØ"Ø"Ø#Ø!ô
õ 	ð ô$ ØÜÑ<±8Ó<Ó<Ü Ñ D¹8Ó DÓDôð ðA .ùðûò$ðûò 'ùsU   ‚RšQ1›DRÄ*Q4Ä+RÄ3AQ7Å8FRË>Q<Ë?RÌ+Q?Ì2E RÑ4RÑ7RÑ?Rc              ƒ  óÞ  K  — t        t        «      j                  t        j                  |k(  t        j                  |k(  «      }|rxt        | |«      ƒ d{  –—† }t        j                  «       D ��cg c]  \  }}||j                  k(  sŒ|‘Œ }}}|j                  t        j                  j                  |«      «      }| j                  |j                  t        j                  «      «      ƒ d{  –—† }	t        |	j                  «       j!                  «       «      }
g }i }|
D ]K  }|j"                  sŒ|j"                  › d|j                  › �}|j%                  |g «      j'                  |«       ŒM |j                  «       D ]â  \  }}|j)                  d„ ¬«       t+        dt-        |«      «      D ]²  }||   j                  ||dz
     j                  z
  j/                  «       dz  }|dk  sŒ<|j'                  t1        d||   j                  ||   j"                  ||   j2                  ||   j4                  ||   j6                  d||   j"                  › d	|d
›d�¬«      «       Œ´ Œä t9        t        «      }|
D ]@  }|j                  j;                  d«      }||j2                  › d|› �   j'                  |«       ŒB |j                  «       D ]€  \  }}t-        |«      dkD  sŒ|d   }|j'                  t1        d|j                  d|j2                  t=        d„ |D «       «      |j6                  t-        |«      › d|j2                  › �¬«      «       Œ‚ t?        |t-        |«      ¬«      S 7 �Œc c}}w 7 �Œ{­w)zMDetect DOUBLE_ISI (same plate < 60 min) and BURST (>3 txn/min per dispenser).Nrb   c                ó   — | j                   S r;   )rv   )Úxs    r3   Ú<lambda>zget_anomali.<locals>.<lambda>}  s   €  §¢rL   )Úkeyrg   é<   Ú
DOUBLE_ISIzPlat z isi ulang setelah ú.0fz menit)Útiperv   rs   rf   rn   rp   rŒ   z%Y-%m-%d %H:%Mé   r   ÚBURSTc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr;   rz   )r]   rú   s     r3   r_   zget_anomali.<locals>.<genexpr>™  s   è ø€ Ð3©U¨˜1Ÿ8�8©Uùr}   z transaksi dalam 1 menit di )rÅ   Útotal) r   r   r.   r2   rZ   r9   r'   rÅ   r’   rW   r»   r-   r¹   rv   r>   r?   r@   rs   Ú
setdefaultrœ   ÚsortÚranger    Útotal_secondsr   rf   rn   rp   r   Ústrftimer�   r   )r1   r2   rZ   r7   Úqr8   ÚkÚvÚproduk_raw_valuesrA   r­   ÚflaggedÚby_platr|   rü   ÚgroupÚiÚdiffÚ	burst_mapÚ
minute_keys                       r3   Úget_anomalir  c  s  è ø€ ô 	Ô$Ó%×+Ñ+Ü×%Ñ%¨Ñ0Ü×%Ñ%¨Ñ0ó	€Añ Ü" 2 yÓ1×1ˆÜ+5×+;Ñ+;Ô+=ÔRÑ+=¡4 1 aÀÀfÇkÁkÓAQšQÐ+=ÐÑRØ�G‰GÔ)×4Ñ4×8Ñ8Ð9JÓKÓLˆà—:‘:˜aŸj™jÔ)>×)HÑ)HÓIÓJ×J€FÜ�—‘Ó ×$Ñ$Ó&Ó'€Dà$&€Gð  "€GÛˆØ�<‹<Ø—\‘\�N " Q§\¡\ NÐ3ˆCØ×Ñ˜s BÓ'×.Ñ.¨qÕ1ð ð
 —m‘m–o‰
ˆˆUØ�
‰
Ñ,ˆ
Ô-Ü�qœ#˜e›*Ö%ˆAØ˜!‘H×&Ñ&¨¨q°1©u©×)?Ñ)?Ñ?×NÑNÓPÐSUÑUˆDØ�b‹yØ—‘œ~Ø%Ø# A™h×0Ñ0Ø$ Q™x×2Ñ2Ø!& q¡×!6Ñ!6Ø  ™8Ÿ?™?Ø"'¨¡(×"8Ñ"8Ø" 5¨¡8×#6Ñ#6Ð"7Ð7JÈ4ÐPSÈ*ÐTZÐ[ô õ ñ &ð &ô  "-¬TÓ!2€IÛˆØ—[‘[×)Ñ)Ð*:Ó;ˆ
Ø�Q—^‘^Ð$ B z lÐ3Ñ4×;Ñ;¸AÕ>ð ð  —o‘oÖ'‰
ˆˆUÜˆu‹:˜‹>Ø�a‘ˆAØ�N‰Nœ>ØØŸ+™+ØØŸ^™^ÜÑ3©UÓ3Ó3ØŸo™oÜ˜e›*˜Ð%AÀ!Ç.Á.ÐAQÐRôõ ð (ô  G´3°w³<Ô@Ð@ðe 2ûÛRð KûsM   ‚AM-ÁM!ÁM-Á1M$Â	M$ÂA"M-Ã/M*Ã0A M-Ä1B7M-Ç)C3M-ËBM-Í$M-c              ƒ  óê  K  — t         j                  |k(  t         j                  |k\  t         j                  |k  g}|rxt        | |«      ƒ d{  –—† }t	        j
                  «       D ��	cg c]  \  }}	|	|j                  k(  sŒ|‘Œ }
}}	|j                  t         j                  j                  |
«      «       |r"|j                  t         j                  |k(  «       | j                   t        t        j                  t         j                  «      j!                  d«      t        j"                  t         j$                  «      j!                  d«      «      j&                  |Ž «      ƒ d{  –—† }|j)                  «       }| j                   t        t         j                  t*        j,                  j!                  d«      t*        j.                  j!                  d«      t        j                  t         j                  «      j!                  d«      t        j"                  t         j$                  «      j!                  d«      «      j1                  t*        t*        j                  t         j                  k(  «      j&                  |Ž j3                  t         j                  t*        j,                  t*        j.                  «      j5                  t*        j.                  j7                  «       j9                  «       «      «      ƒ d{  –—† }|D �cg c]S  }t;        |j                  |j<                  xs dt?        |j@                  «      |jB                  xs tE        d«      ¬«      ‘ŒU }}tG        t?        |j@                  xs d	«      |jB                  xs tE        d«      |¬
«      }| j                   t        t        jH                  dt         jJ                  «      j!                  d«      t        j"                  t         j$                  «      j!                  d«      t        j                  t         j                  «      j!                  d«      «      j&                  |Ž j3                  t        jH                  dt         jJ                  «      «      j5                  t        jH                  dt         jJ                  «      «      «      ƒ d{  –—† }|D �cg c]M  }tM        t?        |jN                  «      |jB                  xs tE        d«      t?        |j@                  «      ¬«      ‘ŒO }}| j                   t        t         jP                  t         jR                  t        jH                  dt         jJ                  «      j!                  d«      t        j"                  t         j$                  «      j!                  d«      t        j                  t         j                  «      j!                  d«      «      j&                  |Ž j3                  t         jP                  t         jR                  t        jH                  dt         jJ                  «      «      j5                  t         jP                  t         jR                  t        jH                  dt         jJ                  «      «      «      ƒ d{  –—† }tU        tV        «      }|D ]{  }|jP                  xs d|jR                  f}||   j                  tY        t?        |jN                  «      |jB                  xs tE        d«      t?        |j@                  «      ¬«      «       Œ} | j                   t        t         jP                  t         jR                  t        j"                  t         j$                  «      j!                  d«      t        j                  t         j                  «      j!                  d«      «      j&                  |Ž j3                  t         jP                  t         jR                  «      j5                  t        j"                  t         j$                  «      j[                  «       «      «      ƒ d{  –—† }|D �cg c]~  }t]        |jP                  xs d|jR                  |jB                  xs tE        d«      t?        |j@                  «      |j_                  |jP                  xs d|jR                  fg «      ¬«      ‘Œ€ }}ta        |||¬«      S 7 �Œ�c c}	}w 7 �Œr7 �Œãc c}w 7 �Œ-c c}w 7 �Œ_7 Œºc c}w ­w)zQVolume per hour (0-23), per shift, and per island/nozzle (with hourly breakdown).NÚcntrÎ   Ú
shift_namarD   zTidak diketahuirÐ   )rh   r  Útransaksi_countrn   r   )Útotal_transaksir�   Úby_shiftÚhourrF   )rF   rn   r  ÚUnknown)rw   rx   rn   r  Úhourly)Úsummaryr  Ú	by_island)1r   r2   rZ   r9   r'   rÅ   r’   rœ   rW   r»   rh   r-   r   r   Úcountr/   rà   r�   rn   r.   Úoner   r¢   rD   Ú	outerjoinrá   r¹   ÚascÚ
nulls_lastr   r  Úintr  rÎ   r	   r   Úextractrv   r   rF   rw   rx   r   r>   r   rº   r   r�   r   )r1   r2   rN   rO   r7   rh   Ú
base_wherer8   r  r  r  Ú	summary_qÚsummary_rowÚshift_qrë   r  r  Úhourly_qr  Úisland_hourly_qÚisland_hourlyrü   Úisland_qr   s                           r3   Úget_golden_hoursr0  ¡  s¯  è ø€ ô 	×%Ñ%¨Ñ0Ü×%Ñ%¨Ñ6Ü×%Ñ%¨Ñ8ð€Jñ
 Ü" 2 yÓ1×1ˆÜ+5×+;Ñ+;Ô+=ÔRÑ+=¡4 1 aÀÀfÇkÁkÓAQšQÐ+=ÐÑRØ×ÑÔ/×:Ñ:×>Ñ>Ð?PÓQÔRÙØ×ÑÔ/×8Ñ8¸HÑDÔEð —j‘jð	ŒÜ�J‰JÔ,×/Ñ/Ó0×6Ñ6°uÓ=Ü�H‰HÔ*×1Ñ1Ó2×8Ñ8¸Ó?ó	
÷ ‰%�ð	ó÷ €Ið —-‘-“/€Kð —J‘Jð	ŒÜ!×*Ñ*Ü�J‰J×Ñ˜\Ó*Ü�O‰O×!Ñ! +Ó.Ü�J‰JÔ,×/Ñ/Ó0×6Ñ6°uÓ=Ü�H‰HÔ*×1Ñ1Ó2×8Ñ8¸Ó?ó	
÷ 
‰”5œ%Ÿ(™(Ô&;×&DÑ&DÑDÓ	Eß	‰�
ð	÷ 
‰Ô'×0Ñ0´%·*±*¼e¿o¹oÓ	Nß	‰”%—/‘/×%Ñ%Ó'×2Ñ2Ó4Ó	5ó÷ €Gñ( óñ ˆCô 	Ø—\‘\Ø—~‘~Ò:Ð):Ü §¡›LØ—7‘7Ò*œg c›lö		
ð ð ð ô $Ü˜KŸO™OÒ0¨qÓ1Ø —_‘_Ò4¬°«Øô€Gð —Z‘Zð	ŒÜ�L‰L˜Ô!6×!@Ñ!@ÓA×GÑGÈÓNÜ�H‰HÔ*×1Ñ1Ó2×8Ñ8¸Ó?Ü�J‰JÔ,×/Ñ/Ó0×6Ñ6°uÓ=ó	
÷
 
‰�
ð	÷ 
‰”$—,‘,˜vÔ'<×'FÑ'FÓGÓ	Hß	‰”$—,‘,˜vÔ'<×'FÑ'FÓGÓ	Hó	÷ 	€Hñ óáˆCô 	œ˜SŸW™W›¨c¯g©gÒ.E¼À»ÔWZÐ[^×[bÑ[bÓWcÖdØð ð ð ŸJ™Jð	ŒÜ!×,Ñ,Ü!×,Ñ,Ü�L‰L˜Ô!6×!@Ñ!@ÓA×GÑGÈÓNÜ�H‰HÔ*×1Ñ1Ó2×8Ñ8¸Ó?Ü�J‰JÔ,×/Ñ/Ó0×6Ñ6°uÓ=ó	
÷ 
‰�
ð	÷ 
‰Ü!×,Ñ,Ü!×,Ñ,Ü�L‰L˜Ô!6×!@Ñ!@ÓAó

÷
 
‰Ü!×,Ñ,Ü!×,Ñ,Ü�L‰L˜Ô!6×!@Ñ!@ÓAó

ó÷ €Oô( <GÄtÓ;L€MÛˆØ�~‰~Ò* ¨C¯N©NÐ;ˆØ�cÑ×!Ñ!Ü¤3 s§w¡w£<¸¿¹Ò8OÄ7È3Ã<ÔadÐeh×elÑelÓamÔnõ	
ð ð —Z‘Zð	ŒÜ!×,Ñ,Ü!×,Ñ,Ü�H‰HÔ*×1Ñ1Ó2×8Ñ8¸Ó?Ü�J‰JÔ,×/Ñ/Ó0×6Ñ6°uÓ=ó		
÷ 
‰�
ð	÷ 
‰Ô'×2Ñ2Ô4I×4TÑ4TÓ	Uß	‰”$—(‘(Ô0×7Ñ7Ó8×=Ñ=Ó?Ó	@ó
÷ 
€Hñ& ó	ñ ˆCô 	Ø—~‘~Ò2¨Ø—~‘~Ø—7‘7Ò*œg c›lÜ §¡›LØ ×$Ñ$ c§n¡nÒ&A¸	À3Ç>Á>Ð%RÐTVÓWö	
ð ð ð 	ô "¨'¸&ÈIÔVÐVða 2ûÛRðùðûòð"	ûòðùð8
úò	ùs°   ‚A
c3ÁcÁc3Á(cÂ cÂC c3Å$cÅ%Fc3Ë6cË7c3Ë?AcÍEc3Ò4c!Ò5c3Ò=Ac$ÔE;c3Ú
c)ÚF&c3à1c,à2c3à:Bc.â=c3ãc3ãc3ãc3ã$c3ã,c3ã.c3c              ƒ  ó  K  — | j                  t        t        «      j                  t        j                  |k(  t        j
                  |k(  «      «      ƒ d{  –—† j                  «       }|st        d«      ‚t        j                  |k(  g}|r2|j                  t        j                  j                  d|› d�«      «       | j                   t        t        j                  t        j                  «      «      j                  |Ž «      ƒ d{  –—† j                  «       }| j                   t        t        «      j                  |Ž j!                  t        j"                  «      j%                  |dz
  |z  «      j'                  |«      «      ƒ d{  –—† }	t)        |	j+                  «       j-                  «       «      }
t/        |
D �cg c]§  }t1        |j                  |j"                  |j2                  |j                  |j4                  |j6                  |j8                  |j:                  |j<                  |j>                  |j@                  |jB                  |jD                  |jF                  ¬«      ‘Œ© c}|||¬«      S 7 �Œ!7 �Œq7 Œñc c}w ­w)zGList transactions for a specific batch with optional plat_nomor search.NrÉ   Ú%rg   )r/   rv   rZ   rs   rf   rw   rx   rn   ro   rp   rq   rt   ru   rr   )rÅ   r  ÚpageÚper_page)$r-   r   r   r.   r/   r2   r0   r6   r   r�   rœ   rs   Úiliker   r!  Ú
scalar_oner¹   rv   ÚoffsetÚlimitr>   r?   r@   r"   r!   rZ   rf   rw   rx   rn   ro   rp   rq   rt   ru   rr   )r1   r2   r�   r3  r4  Úsearchr±   r(  r  rA   r­   r|   s               r3   Úget_batch_transactionsr:  !  s  è ø€ ð —:‘:ÜŒ~Ó×$Ñ$Ü×Ñ Ñ)Ü×"Ñ" gÑ-ó	
ó÷ ÷
 ÑÓð 
ñ ÜÐ0Ó1Ð1ä'×0Ñ0°HÑ<Ð=€JÙØ×ÑÔ/×:Ñ:×@Ñ@À1ÀVÀHÈAÀÓOÔPà—:‘:Ø:ŒŒt�z‰zÔ/×2Ñ2Ó3Ó4×:Ñ:¸JÐGó÷ ç�zƒ|ð 
ð —:‘:ð	ŒÔ$Ó%ß	‰�
ð	ç	‰Ô'×1Ñ1Ó	2ß	‰�˜‘˜XÑ%Ó	&ß	‰ˆx‹ó÷ €Fô �—‘Ó ×$Ñ$Ó&Ó'€Dä$ñ$ ó#
ñ" �ô! Ø—4‘4ØŸ+™+ØŸ	™	ØŸ<™<ØŸ^™^ØŸ<™<ØŸ<™<Ø—x‘xØ—g‘gØŸo™oØ—g‘gØ—E‘EØŸ™ØŸo™oöð  ñ#
ð& ØØô-ð ð5ùðùðúò
ùsK   ‚AJÁI7ÁB2JÄ	I:Ä
BJÆI=Æ4JÇ B,I?É,JÉ:JÉ=JÉ?Jc              ƒ  óà  ‡K  — t         j                  }t         j                  }|st        d«      ‚t	        | |«      ƒ d{  –—† }|j
                  }t        | ||||«      ƒ d{  –—† }	|› d|› �}
t        |	j                  j                  «      Š|	j                  j                  }|r‰|z  nd}t        |	j                  d„ d¬«      }|dd }t        |«      dk\  r|d	d ng }d
j                  ˆfd„|	j                  j                  D «       «      }d
j                  d„ |D «       «      }d
j                  d„ |	j                   dd D «       «      }d|› d|
› d|› d‰d›d|d›d|› d|› d|› d
�}d}d|› d|› �}dd|igidd|igdœgd d!d"œd#œ}	 t#        j$                  d$¬%«      4 ƒd{  –—† }|j'                  ||¬&«      ƒ d{  –—† }|j)                  «        |j+                  «       }ddd«      ƒd{  –—†  j5                  d*g «      }|st        d+«      ‚|d   j5                  d,i «      j5                  dg «      }d-j                  d.„ |D «       «      j7                  «       }|st        d/«      ‚t9        |¬0«      S 7 �Œ57 �Œ7 ŒØ7 Œ¿7 Œ‘# 1 ƒd{  –—†7  sw Y   Œ¡xY w# t"        j,                  $ rB}t        d'|j.                  j0                  › d(|j.                  j2                  dd) › �«      |‚d}~ww xY w­w)1z:Generate AI sales analysis & recommendations using Gemini.zGEMINI_API_KEY not configuredNz s/d r   c                ó,   — t        | j                  «      S r;   ©Úfloatrn   ©Úhs    r3   rû   z*get_golden_hours_insight.<locals>.<lambda>t  ó   € ´e¸A¿H¹H´orL   T©rü   Úreverser  éýÿÿÿÚ
c              3  óÈ   •K  — | ]Y  }‰rQd |j                   › d|j                  › dt        |j                  «      d›dt        |j                  «      ‰z  dz  d›d�	nd–— Œ[ y	­w)
ú  - ú: z txn | rÿ   z L (rÔ   ú.1fz% dari total)rµ   N)r  r  r>  rn   )r]   ÚsÚ	total_vols     €r3   r_   z+get_golden_hours_insight.<locals>.<genexpr>x  sx   øè ø€ ð ñ 'ˆAñ AJð ˆq�|‰|ˆn˜B˜q×0Ñ0Ð1°¼¸q¿x¹x»ÈÐ8Mð NÜ�!—(‘(‹O˜IÑ% cÑ)¨#Ð.¨mñ	=ØOQó	Rá&ùs   ƒAA"c              3  ó^  K  — | ]¥  }|j                   rmd |j                  d›d|j                  dz   dz  d›dt        |j                  «      d›d|j                   › dt        |j                  «      |j                   z  d	›d
�n'd |j                  d›dt        |j                  «      d›d�–— Œ§ y­w)rG  Ú02du   :00â€“rg   é   z:00: rÿ   ú L | z txn | avg rI  z L/txnz LN)r  rF   r>  rn   ©r]   r@  s     r3   r_   z+get_golden_hours_insight.<locals>.<genexpr>}  s¶   è ø€ ð ñ ˆAð ×Òð ˆq�u‰u�Sˆk˜ §¡ q¡¨"¡¨SÐ1°´u¸Q¿X¹X³ÀsÐ6KÈ5ÐQR×QbÑQbÐPcð dÜ�Q—X‘X‹˜q×0Ñ0Ñ0°Ð5°Vñ	=à$(¨¯©¨s¨°5¼¸q¿x¹x»ÈÐ8MÈRÐ"Pó	Qñ ùs   ‚B+B-c           
   3  ó$  K  — | ]ˆ  }d |j                   › |j                  rd|j                  z   nd› dt        |j                  «      d›d|j                  › d�dj                  d„ t        |j                  d	„ d
¬«      dd D «       «      z   –— ŒŠ y­w)rG  u    â€“ rµ   rH  rÿ   rO  z txn | peak: z, c              3  ój   K  — | ]+  }|j                   d ›dt        |j                  «      d›d�–— Œ- y­w)rM  z:00 (rÿ   zL)N)rF   r>  rn   rP  s     r3   r_   z5get_golden_hours_insight.<locals>.<genexpr>.<genexpr>†  s6   è ø€ ð 
áX�ð �u‰u�Sˆk˜œu Q§X¡X›¨sÐ3°2Ô6ÙXùs   ‚13c                ó,   — t        | j                  «      S r;   r=  r?  s    r3   rû   z4get_golden_hours_insight.<locals>.<genexpr>.<lambda>ˆ  rA  rL   TrB  Nr  )rw   rx   r>  rn   r  râ   ræ   r  )r]   rë   s     r3   r_   z+get_golden_hours_insight.<locals>.<genexpr>ƒ  s›   è ø€ ð ñ 'ˆCð ˆs�~‰~Ð¸3¿>º>˜w¨¯©Ò7ÈrÐRÐRTÜ�—‘Ó˜SÐ
!  s×':Ñ':Ð&;ð <ð	à—I‘Iñ 
ä˜CŸJ™JÑ,EÈtÔTÐUWÐVWÑXó
ó 
õ	
ñ 'ùs   ‚BBé   u   DATA PENJUALAN SPBU â€” z | z 

RINGKASAN:
- Total transaksi: z | Total volume: rÿ   z L
- Rata-rata per transaksi: rI  z L

BREAKDOWN PER SHIFT:
z-

VOLUME PER JAM (semua jam, urut terbesar):
z

VOLUME PER ISLAND/NOZZLE:
uÂ  Kamu adalah konsultan operasional SPBU senior dengan pengalaman 15 tahun di lapangan.

Tugasmu: analisis data penjualan BBM dan berikan rekomendasi operasional yang SANGAT SPESIFIK dan bisa langsung dieksekusi manajer SPBU hari ini.

ATURAN KETAT:
1. JANGAN rangkum ulang angka â€” manajer sudah baca tabelnya
2. INTERPRETASIKAN pola: apa artinya puncak di jam X? kenapa island Y sepi?
3. Setiap rekomendasi HARUS menyebut: jam konkret, nama island/nozzle, jumlah orang, atau tindakan spesifik
4. Gunakan Bahasa Indonesia, nada tegas seperti briefing operasional

FORMAT OUTPUT WAJIB (lengkap semua section):

## Temuan Utama
- [3-4 poin insight kunci: pola waktu, ketimpangan antar island, efisiensi per txn]

## Rekomendasi Penjadwalan Shift
- Shift mana yang perlu tambah/kurang operator dan berapa jumlahnya
- Jam berapa harus ada supervisor di lapangan
- Apakah jam kerja shift perlu disesuaikan dengan pola puncak

## Rekomendasi per Island & Nozzle
- Island/nozzle mana yang perlu prioritas (selalu ada petugas, tidak tutup)
- Island/nozzle mana yang bisa dikurangi operatornya di jam sepi
- Apakah ada nozzle yang underperform dan perlu investigasi

## Strategi Jam Sepi
- Jam-jam mana yang volume rendah dan apa yang bisa dilakukan (maintenance, training, restocking)
- Apakah layak menutup sebagian nozzle di jam tertentu untuk efisiensi

## Estimasi Dampak
- Jika rekomendasi dijalankan, kira-kira berapa persen peningkatan efisiensi atau volume yang bisa dicapaiz8https://generativelanguage.googleapis.com/v1beta/models/z:generateContent?key=ÚpartsÚtextÚuser)ÚrolerU  g      à?i    )ÚtemperatureÚmaxOutputTokens)ÚsystemInstructionÚcontentsÚgenerationConfigéZ   )Útimeout)ÚjsonzGemini API error rH  éÈ   Ú
candidateszGemini returned no candidatesÚcontentrµ   c              3  óJ   K  — | ]  }d |v sŒ|j                  d d«      –— Œ y­w)rV  rµ   N)r�   )r]   rÁ   s     r3   r_   z+get_golden_hours_insight.<locals>.<genexpr>Ñ  s"   è ø€ ÐF±¨A¸&ÀAº+�a—e‘e˜F B×'±ùs   ‚	#Œ#zGemini returned empty insight)Úinsight)r   ÚGEMINI_API_KEYÚGEMINI_MODELr6   r9   r¢   r0  r>  r  r�   r  ræ   r  r    râ   r  r   ÚhttpxÚAsyncClientÚpostÚraise_for_statusr`  ÚHTTPStatusErrorÚresponseÚstatus_coderV  r�   Ústripr#   )r1   r2   rN   rO   r7   Úapi_keyÚmodelr8   r¶   ÚdataÚperiodeÚ	total_txnÚavg_vol_per_txnÚsorted_hourlyÚtop3_jamÚbottom3_jamÚshift_linesÚhourly_linesÚisland_linesÚ	data_textÚsystem_promptÚurlÚbodyÚclientÚresprA   r«   rb  rU  re  rK  s                                 @r3   Úget_golden_hours_insightr‚  ^  s>  øè ø€ ô ×%Ñ%€GÜ×!Ñ!€EÙÜÐ8Ó9Ð9ô ˜r 9Ó-×-€FØ—+‘+€KÜ! " g¨}¸oÈyÓY×Y€Dà�˜u _Ð$5Ð6€GÜ�d—l‘l×/Ñ/Ó0€IØ—‘×,Ñ,€Iñ 09�i )Ò+¸a€OÜ˜4Ÿ;™;Ñ,EÈtÔT€MØ˜R˜aÐ €HÜ(+¨MÓ(:¸aÒ(?�-  Ñ$ÀR€Kà—)‘)ó ð —‘×&Ò&óó €Kð
 —9‘9ñ ñ ó	ó €Lð —9‘9ñ ð —>‘> # 2Ñ&óó €Lð -¨[¨M¸¸W¸Ið Fð �;Ð/°	¸#¨ð ?Ø+¨CÐ0ð 1ð €ð ð €ð ð €ð ð€Ið n€Mð@ EÀUÀGÐK`ÐahÐ`iÐ
j€Cà%¨°Ð(?Ð'@ÐAØ$°¸Ð0CÐ/DÑEÐFØ,/ÀDÑIñ€DðgÜ×$Ñ$¨R×0Õ0°FØŸ™ S¨t˜Ó4×4ˆDØ×!Ñ!Ô#Ø—Y‘Y“[ˆF÷ 1×0ð —‘˜L¨"Ó-€JÙÜÐ8Ó9Ð9à�q‰M×Ñ˜i¨Ó,×0Ñ0°¸"Ó=€EØ�g‰gÑF±ÓFÓF×LÑLÓN€GÙÜÐ8Ó9Ð9ä%¨gÔ6Ð6ðW .ùàYùðr 1øØ4øð 1ø×0×0Ñ0ûô × Ñ ò gÜÐ,¨Q¯Z©Z×-CÑ-CÐ,DÀBÀqÇzÁzÇÁÐW[ÐX[ÐG\ÐF]Ð^Ó_ÐefÐfûðgüs£   ƒ=K.Á I5Á"K.Á#I8Á$D#K.ÆJ Æ"I;Æ#J Æ&JÆ=I=Æ>$JÇ"J Ç-I?Ç.J Ç2BK.É8K.É;J É=JÉ?J ÊJÊJ
ÊJÊJ ÊK+Ê)=K&Ë&K+Ë+K.)r1   r   r2   r&  )r1   r   r7   r&  Úreturnr   )r1   r   r2   r&  rƒ  úlist[Shift])rG   r„  rƒ  ú
int | None)r1   r   r2   r&  r7   r&  rN   r   rO   r   rƒ  zPosUploadBatch | None)FÚxlsx)r1   r   r2   r&  r7   r&  r¤   Úbytesrˆ   r&  r¥   Úboolr¦   r“   rƒ  r   )r1   r   r2   r&  rƒ  zlist[PosBatchListItem])
r1   r   r2   r&  r�   r&  rˆ   r&  rƒ  ÚNone)r1   r   r2   r&  r7   r&  rN   r   rO   r   rƒ  r   r;   )
r1   r   r2   r&  rZ   r   r7   r…  rƒ  r   )NN)r1   r   r2   r&  rN   r   rO   r   r7   r…  rh   r…  rƒ  r   )rg   é2   N)r1   r   r2   r&  r�   r&  r3  r&  r4  r&  r9  z
str | Nonerƒ  r"   )r1   r   r2   r&  rN   r   rO   r   r7   r&  rƒ  r#   )BÚ__doc__Ú
__future__r   Úcollectionsr   r   r   r   r   Údecimalr	   Ú
sqlalchemyr
   r   r   Úsqlalchemy.ext.asyncior   Úapp.models.pos_analyticsr   r   r,   r   r   Úapp.models.productr   rh  Úapp.core.configr   Úapp.schemas.pos_analyticsr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   Úapp.utils.pos_excel_parserr$   r%   r&   r'   r(   Úapp.utils.auditr)   r4   r9   rB   rK   rP   r²   rÇ   rÊ   r÷   r  r0  r:  r‚  r[   rL   r3   Ú<module>r—     sz  ðÙ Gå "å #ß 8Ó 8Ý ç +Ñ +Ý /ç Jß )Ý %Û å $÷÷ ÷ ÷ ó ÷ Dõ  DÝ &ó[ó
ó(óð 'Øð'Ø"ð'Ø/2ð'àð'à*.ð'ð ó'ð*  ØðHØðHàðHð ðHð ð	Hð
 ðHð ðHð ðHð óHóV'óTðKØðKØ"ðKØ/2ðKàðKà*.ðKð óKð^ LPð;AØð;AØ"ð;AØ-1ð;AØ>Hð;Aàó;AðB !Øð	}WØð}WØ"ð}Wàð}Wà*.ð}Wð ð}Wð ð	}Wð
 ó}WðH ØØð:Øð:àð:ð ð:ð ð	:ð
 ð:ð ð:ð ó:ðzw7Øðw7Ø"ðw7àðw7à*.ðw7ð ðw7ð  ô	w7rL   