
    ]iC                     z   d Z ddl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 ddl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mZ ddlmZmZmZmZ ddl m!Z!m"Z" ddl#m$Z$ dede%de%defdZ&dededefdZ'defdZ(dedefdZ)	 	 	 	 d7dede%de%dz  de%de%de*e+e   e%f   fdZ,dede%de%defd Z-dede%d!ed"e%def
d#Z.ded$ed%e+e/   ddfd&Z0dede%de%ddfd'Z1dede%de%d(e%dz  d)e2d*e3d+e2defd,Z4de%de5fd-Z6dede%de%d.e%def
d/Z7dede%de%d0e%def
d1Z8dede%de%d2e2d3e2dz  defd4Z9dede%de%d5e2def
d6Z:y)8u=   Penerimaan service — business logic for BBM receipt module.    )datetimetimezone)Decimal)select)IntegrityErrorSQLAlchemyError)AsyncSession)selectinload)	PenebusanPenebusanItemStatusPenebusan)
PenerimaanStatusPenerimaanTipeFotoEnum)Tangki)penerimaan_repositorypenebusan_repository)PenerimaanCreatePenerimaanFotoResponsePenerimaanItemResponsePenerimaanResponse)save_uploadUploadContext)interpolate_volumedb	tangki_idspbu_idreturnc                   K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d             j                  t        t        j                        t        t        j                                     d {   }|j                         }|t        d| d      |j                  |k7  rt        d| d      |S 7 Ew)Nz
Tangki id= tidak ditemukanz tidak termasuk SPBU ini)executer   r   whereid
deleted_atis_optionsr
   	kalibrasiprodukscalar_one_or_none
ValueErrorr   )r   r   r   resulttangkis        A/var/www/html/spbu.com/backend/app/services/penerimaan_service.py_load_tangkir.      s     ::v	vyyI%v'8'8'<'<T'B	C	))*'

 F &&(F~:i[0@ABB~~ :i[0HIJJMs   BC( C&!AC(r,   	height_mmc                     	 t        || j                        S # t        $ r!}t        d| j                   d|       |d }~ww xY w)NTangki 'z': )r   r'   r*   nama)r,   r/   es      r-   _interpolater4   .   sK    @!)V-=-=>> @8FKK=A378a?@s    	A=Ac                 h   t        | j                  | j                  | j                  | j                  | j
                  r| j
                  j                  nd| j                  | j                  r| j                  j                  nd| j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                   D cg c]D  }t#        |j                  |j                  |j$                  |j&                  |j(                        F c}      S c c}w )N r#   penerimaan_idpenerimaan_item_idtipeurl)r#   r8   penebusan_item_id	produk_idproduk_namar   tangki_namadipstick_sebelum_mmvolume_sebelumdipstick_sesudah_mmvolume_sesudahvolume_diterimaatg_sebelum_mmatg_sesudah_mmfotos)r   r#   r8   r<   r=   r(   r2   r   r,   r@   rA   rB   rC   rD   rE   rF   rG   r   r9   r:   r;   )itemfs     r-   _build_item_responserJ   5   s    !77((00..(,DKK$$..(,DKK$$ 44** 44**,,**** ZZ	
   #44oo#$#7#7VVEE  	
 	
s   A	D/$pc                    | j                   }| j                  xs g D cg c]  }|j                  | }}t        d | j                  xs g D        t        d            }t        d%i d| j                  d| j                  d| j                  d|r|j                  ndd|r|j                  nd d	| j                  d
| j                  d| j                  d| j                  d| j                   d| j"                  d| j$                  d| j&                  d| j(                  d| j*                  d| j,                  d| j.                  d| j0                  d| j                  xs g D cg c]  }t3        |       c}d|D cg c]D  }t5        |j                  |j6                  |j                  |j8                  |j:                        F c}d|d| j<                  r| j<                  j>                  nd d| j@                  dtC        | jD                  tF              r| jD                  n| jD                  jH                  d| jJ                  r| jJ                  j>                  nd d| jL                  d| jN                  r| jN                  j>                  nd d | jP                  d!| jR                  d"| jT                  r| jT                  j>                  nd d#| jV                  d$| jX                  S c c}w c c}w c c}w )&Nc              3   4   K   | ]  }|j                     y wNrD   ).0rH   s     r-   	<genexpr>z"_build_response.<locals>.<genexpr>V   s     :=$		=   0r#   r   penebusan_idpenebusan_booking_coder6   penebusan_no_sotanggaltgl_jam_keluar_terminaljam_tibajam_berangkat	no_polisishipment_nonama_pengemudino_lodensity_obstemp_obsdensity_onstemp_onscatatanitemsrG   r7   total_volume_diterimacreated_by_name
created_atstatussubmitted_by_namesubmitted_atreviewed_by_namereviewed_atcatatan_reviewunlocked_by_nameunlocked_atunlock_reason )-	penebusanrG   r9   sumrd   r   r   r#   r   rT   booking_codeno_sorW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rJ   r   r8   r:   r;   
created_bynamerg   
isinstancerh   strvaluesubmitted_byrj   reviewed_byrl   rm   unlocked_byro   rp   )rK   rr   rI   general_fotostotal_volumerH   s         r-   _build_responser   R   s   I!"BP113G3G3OQMP:177=b=:L  *44*		* ^^* :Cy55	*
 ,5	$* 		* !" 9 9* * oo* ++* MM* ''* gg* MM* *  MM!*" #*$ 		%*& 89ww}"}F}d#D)}F'*8 #	
 # #44oo#$#7#7VVEE #	
)*< +=*> ./\\))t?*@ <<A*B &ahh4qxx!((..C*D 23!..--TE*F ^^G*H 01}}++$I*J MMK*L ''M*N 01}}++$O*P MMQ*R ooS* * Q0 G	
s   K7K7-K<A	LNrT   skiplimitc                    K   t        j                  | |||||       d {   \  }}|D cg c]  }t        |       c}|fS 7 "c c}w w)N)rW   rT   r   r   )r   get_all_penerimaanr   )	r   r   rW   rT   r   r   rowstotalrs	            r-   list_penerimaanr      sZ      .@@
GW<dRW KD% )--1OA-u44 .s   AAAAAAr8   c                    K   t        j                  | ||       d {   }|t        d| d      t        |      S 7  w)NPenerimaan id=r    )r   get_penerimaan_by_idr*   r   )r   r   r8   rK   s       r-   get_penerimaan_detailr      sJ      $88]GTTAy>-8HIJJ1 	Us   A >!A datacurrent_user_idc                 <  K   t        j                  | |j                  |       d {   }|t        d|j                   d      |j                  t
        j                  t
        j                  fv r|j                  st        d      g }|j                  D ]  }t        | |j                  |       d {   }t        ||j                        }t        ||j                        }	|	|z
  }
|
t        d      k  rt        d|j                    d|	 d| d      |j#                  |j$                  |j&                  |j                  |j                  ||j                  |	|
|j(                  |j*                  d	
        i d
|d|j                  d|j,                  d|j.                  d|j0                  d|j2                  d|j4                  d|j6                  d|j8                  d|j:                  d|j<                  d|j>                  d|j@                  d|jB                  d|jD                  d|}	 tG        jH                  | ||       d {   }tK        | ||       d {    | jM                          d {    tG        jN                  | |jP                  |       d {   }tS        |      S 7 7 	7 k7 X7 B7 # tT        $ r% | jW                          d {  7   t        d      tX        $ r | jW                          d {  7    w xY ww)NzPenebusan id=r    zqPenerimaan hanya bisa dicatat setelah penebusan memiliki SO (status: submitted/partially_received/fully_received)rS   r1   z': volume sesudah (z+ L) harus lebih besar dari volume sebelum (z L))
r<   r=   r   r@   rA   rB   rC   rD   rE   rF   r   rT   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   created_by_idz;Data penerimaan duplikat atau melanggar constraint database)-r   get_penebusan_by_idrT   r*   rh   r   DRAFT
WAITING_SO	is_manualrd   r.   r   r4   r@   rB   r   r2   appendr<   r=   rE   rF   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   r   create_penerimaan_update_penebusan_after_receiptcommitr   r#   r   r   rollbackr   )r   r   r   r   rr   items_dictsitem_inr,   rA   rC   rD   header_dictrK   s                r-   r   r      sK     +>>r4CTCTV]^^I=):):(;;KLMMO11?3M3MNN""H  !K::#B(9(97CC%fg.I.IJ%fg.I.IJ(>9gcl*6;;-':>:J K((6'7s<  	%,%>%>$..$..'.'B'B"0'.'B'B"0#2")"8"8")"8"8	
 27)) 	4<< 	"4#?#?	
 	DMM 	++ 	T^^ 	t'' 	$-- 	 	t'' 	DMM 	t'' 	DMM 	4<<  	!K&'99"k;WW-b)[IIIiik'<<RwOOq!!{ _ DX XIO XkkmVWW kkms   %LJ;BL5J>6FL;K	 KK	 *K+K	 K(K	 +K,K	 :L>LK	 K	 K	 K	 	L%K(&+LLLLrr   r   c                    K   t        j                  | |j                  |j                         d{   }|y|D ]  }|j	                  d      }|rG|j
                  D ]7  }|j                  |k(  s|j                  xs t        d      |d   z   |_         [ ]|j	                  d      }|sq|j
                  D ]7  }|j                  |k(  s|j                  xs t        d      |d   z   |_           t        d |j
                  D              }t        d |j
                  D              }	d}
|	|k\  rt        j                  }
n|	t        d      kD  rt        j                  }
|
r&|j                  t        j                  fvr|
|_        yyy7 Zw)zKUpdate penebusan item volume_diterima and auto-transition penebusan status.Nr<   rS   rD   r=   c              3   4   K   | ]  }|j                     y wrN   )volume_pesanrP   is     r-   rQ   z2_update_penebusan_after_receipt.<locals>.<genexpr>
  s     :kannkrR   c              3   4   K   | ]  }|j                     y wrN   rO   r   s     r-   rQ   z2_update_penebusan_after_receipt.<locals>.<genexpr>  s     @Kq**KrR   )r   r   r#   r   getrd   rD   r   r=   rs   r   FULLY_RECEIVEDPARTIALLY_RECEIVEDrh   )r   rr   r   fresh	item_dict
pb_item_idpb_itemr=   total_pesantotal_diterima
new_statuss              r-   r   r      sk     '::2y||YM^M^__E} !	]]#67
 ;;::+/6/F/F/V'RU,ZcduZv.vG+ ' "k2I${{G((I53:3J3J3ZgVYl^ghy^z2z/  + !" :ekk::K@EKK@@NJ$$33
	'#,	&$77
ell?+I+I*KK! Lz? `s"   /FF=F0;F,FCFc                 r  K   ddl m} t        j                  | ||       d {   }|t	        d| d      |j
                  t        j                  k7  rt	        d      |j                  xs g D cg c]  }|j                   }}	 t        j                  | |       d {    | j                          d {    |D ]  } ||       d {     y 7 c c}w 7 ;7 %# t        $ r% | j                          d {  7   t	        d      t        $ r | j                          d {  7    w xY w7 ew)Nr   delete_filer   r    z2Penerimaan yang sudah di-submit tidak bisa dihapusz>Tidak dapat menghapus penerimaan karena masih ada data terkait)app.utils.file_uploadr   r   r   r*   rh   r   r   rG   r;   delete_penerimaanr   r   r   r   )r   r   r8   r   rK   rI   	foto_urlsr;   s           r-   r   r     s     2#88]GTTAy>-8HIJJxx#)))MNN!"B01I0#55b!<<<iik #  	U
 1< [kkmYZZ kkm 	s   !D7CAD73CD7	C" "C#C" :C ;C" ?D7D5D7D7C"  C" "D2>D?+D2*D-+D22D7item_idr:   
file_bytesfilenamec                 6  K   t        j                  | ||       d {   }|t        d| d      |j                  t        j
                  k7  rt        d      t        D ch c]  }|j                   }	}||	vrt        d| d|	       ddlm	}
  |
| |       d {   }t        |d|j                        }t        |||       d {   }	 t        j                  | ||||       d {    | j                          d {    t        j                  | ||       d {   }t%        |      S 7 c c}w 7 7 r7 R7 <# t        $ r% | j!                          d {  7   t        d	      t"        $ r | j!                          d {  7    w xY w7 rw)
Nr   r    1Penerimaan yang sudah di-submit tidak bisa dieditzTipe foto tidak valid: z. Pilihan: r   )get_spbu_code
penerimaanzGagal menyimpan foto penerimaan)r   r   r*   rh   r   r   r   rz   r   r   r   rW   r   add_fotor   r   r   r   r   )r   r   r8   r   r:   r   r   rK   r3   valid_tipesr   	spbu_codectxr;   s                 r-   r   r   /  s     $88]GTTAy>-8HIJJxx#)))LMM %11Lq177LK1;24&K=QRR3#B00I
	<
;CJ#6
6C#,,RsSSSiik $88]GTTA17 	U 2
 1
6 	T <kkm:;; kkm 	Us   FD4AF#D76)FD< +FD>FE -E .E EE 
F$F%F7F>F E E F E#!+FFFFc                   K   |j                   ryt        fd|j                  xs g D        d      }|yddlm}m} ddlm} |j                  | |j                  |j                  |j                         d{   S 7 w)zDReturn True if user has penerimaan:approve permission for this SPBU.Tc              3   B   K   | ]  }|j                   k(  s|  y wrN   )r   )rP   ar   s     r-   rQ   z/_user_can_approve_penerimaan.<locals>.<genexpr>Z  s     S#9Qaii7>Rq#9s   NFr   )AksiEnum	ModulEnum)role_repository)is_superadminnextassignmentsapp.models.roler   r   app.repositoriesr   has_permissionrole_idr   approve)r   userr   
assignmentr   r   r   s     `    r-   _user_can_approve_penerimaanr   V  ss     S4#3#3#9r#9SUYZJ30 //J4F4F	H\H\^f^n^noooos   A7B:A?;Bfoto_idc                 d  K   t        j                  | ||       d {   }|t        d| d      |j                  t        j
                  k7  rt        d      ddlm} 	 t        j                  | ||       d {   }| j                          d {     ||       d {    t        j                  | ||       d {   }t        |      S 7 7 X7 B# t        $ r% | j                          d {  7   t        d      t        $ r | j                          d {  7    w xY w7 7 jw)Nr   r    r   r   r   zGagal menghapus foto penerimaan)r   r   r*   rh   r   r   r   r   delete_fotor   r   r   r   r   )r   r   r8   r   rK   r   foto_urls          r-   r   r   b  s     $88]GTTAy>-8HIJJxx#)))LMM1.::2wVViik h
#88]GTTA1% 	U W <kkm:;; kkm  Ts   D0CAD0"C <C=C CC D0$D,%D0D.D0C C D)5C86+D)!D$"D))D0.D0user_idc                   K   t        j                  | ||       d {   }|t        d| d      |j                  t        j
                  k7  rt        d      	 t        j                  |_        ||_        t        j                  t        j                        |_        | j                          d {    t!        t        j                  | ||       d {         S 7 7 .# t        $ r | j                          d {  7    w xY w7 3w)Nr   r    z*Hanya penerimaan DRAFT yang bisa di-submit)r   r   r*   rh   r   r   	SUBMITTEDsubmitted_by_idr   nowr   utcrj   r   r   r   r   )r   r   r8   r   rK   s        r-   submit_penerimaanr   }  s      $88]GTTAy>-8HIJJxx#)))EFF#--#!hll3iik !6!K!KBP]_f!gghh 	U 	 kkm hsR   DC =DAC$ 3C"4C$ 8DD	D"C$ $D DDDactionrc   c                   K   t        j                  | ||       d {   }|t        d| d      t        | ||       d {   st	        d      |j
                  t        j                  k7  rt        d      |dk(  rt        j                  nt        j                  }	 ||_        |j                  |_        t        j                  t        j                        |_        ||_        | j%                          d {    t+        t        j                  | ||       d {         S 7 7 7 1# t&        $ r | j)                          d {  7    w xY w7 6w)Nr   r    z'Tidak ada izin untuk approve penerimaanz.Hanya penerimaan SUBMITTED yang bisa di-reviewr   )r   r   r*   r   PermissionErrorrh   r   r   APPROVEDREJECTEDr#   reviewed_by_idr   r   r   r   rl   rm   r   r   r   r   )r   r   r8   r   r   rc   rK   r   s           r-   review_penerimaanr     s1     $88]GTTAy>-8HIJJ-b$@@@GHHxx#---IJJ.4	.A!**GWG`G`J77 X\\2"iik !6!K!KBP]_f!gghh# 	U A 	 kkm hse   ED(%ED+AE!AD/ ;D-<D/  EE 	E+E-D/ /EEEEalasanc                   K   t        j                  | ||       d {   }|t        d| d      t        | ||       d {   st	        d      |j
                  t        j                  k7  rt        d      |r|j                         st        d      	 t        j                  |_        |j                  |_        t        j                  t        j                        |_        ||_        | j%                          d {    t+        t        j                  | ||       d {         S 7 7 7 1# t&        $ r | j)                          d {  7    w xY w7 6w)Nr   r    z&Tidak ada izin untuk unlock penerimaanz-Hanya penerimaan APPROVED yang bisa di-unlockzAlasan unlock wajib diisi)r   r   r*   r   r   rh   r   r   stripr   r#   unlocked_by_idr   r   r   r   ro   rp   r   r   r   r   )r   r   r8   r   r   rK   s         r-   unlock_penerimaanr     s1     $88]GTTAy>-8HIJJ-b$@@@FGGxx#,,,HII455#))77 X\\2 iik !6!K!KBP]_f!gghh% 	U A 	 kkm hse   ED.%ED1AEA(D5 D3D5 E%E&	E1E3D5 5EEEE)NNr      );__doc__r   r   decimalr   
sqlalchemyr   sqlalchemy.excr   r   sqlalchemy.ext.asyncior	   sqlalchemy.ormr
   app.models.penebusanr   r   r   app.models.penerimaanr   r   r   app.models.spbur   r   r   r   app.schemas.penerimaanr   r   r   r   r   r   r   app.utils.kalibrasir   intr.   r4   rJ   r   tuplelistr   r   r   dictr   r   ry   bytesr   boolr   r   r   r   r   rq       r-   <module>r      s   C '   : / ' J J L L " H  = 2< C # & "@ @G @ @"8 :1z 1&8 1v #555 *	5
 5 5 4"#S()5"36JJJ J 	J
 JZ&"&"&" d&" 
	&"T"36	.$$$ $ 4Z	$
 $ $ $ $N	p# 	p$ 	p  	
 6ii"i36iADii&ii"i36iFIiTWZ^T^ii.ii"i36iFIiir   