
    ]i)                     Z   d 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
 ddlmZ ddlmZ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edefdZdefdZde
dedee   fdZ de
dede!dedef
dZ"	 	 	 	 	 	 	 d.de
dededz  dedz  dedz  dedz  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d edef
d"Z'de
dededdfd#Z(de
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d&e!d'e!dz  defd(Z+de
deded)e!def
d*Z,de
deded+e-d,e!defd-Z.y)/zExpense service.    )datedatetimetimezone)Decimal)IntegrityErrorSQLAlchemyError)AsyncSession)StatusExpense)AksiEnum	ModulEnum)expense_repositoryrole_repository)ExpenseCreateExpenseUpdateExpenseResponseExpenseKategoriResponse)save_uploadUploadContextspbu_idreturnc                   K   |j                   ryt        fd|j                  xs g D        d      }|yt        j                  | |j
                  t        j                  t        j                         d{   S 7 w)zBReturn True if user has expenses:approve permission for this SPBU.Tc              3   B   K   | ]  }|j                   k(  s|  y wN)r   ).0ar   s     >/var/www/html/spbu.com/backend/app/services/expense_service.py	<genexpr>z,_user_can_approve_expense.<locals>.<genexpr>   s     S#9Qaii7>Rq#9s   NF)
is_superadminnextassignmentsr   has_permissionrole_idr   expensesr   approve)dbuserr   
assignments     ` r   _user_can_approve_expenser(      su     S4#3#3#9r#9SUYZJ //
J	 2 2H4D4D   s   A5A?8A=9A?c           	         t        di d| j                  d| j                  d| j                  d| j                  d| j
                  d| j                  r| j                  j                  ndd| j                  d	| j                  d
| j                  dt        | j                  t              r| j                  n| j                  j                  d| j                  r| j                  j                   nd d| j"                  r| j"                  j                   nd d| j$                  d| j&                  r| j&                  j                   nd d| j(                  d| j*                  d| j,                  r| j,                  j                   nd d| j.                  d| j0                  r| j0                  j                   nd d| j2                  d| j4                  d| j6                  S )Nidr   laporan_shift_idtanggalkategori_idkategori_nama 
keteranganjumlah	bukti_urlstatuscreated_by_namesubmitted_by_namesubmitted_atreviewed_by_namereviewed_atcatatan_reviewrecalled_by_namerecalled_atunlocked_by_nameunlocked_atunlock_reason
created_at )r   r*   r   r+   r,   r-   kategorinamar0   r1   r2   
isinstancer3   strvalue
created_bynamesubmitted_byr6   reviewed_byr8   r9   recalled_byr;   unlocked_byr=   r>   r?   )expenses    r   _build_responserM   !   s    :: !11 	
 '' 07/?/?g&&++R %% ~~ ## ",GNNC!@w~~gnnFZFZ 4;3E3E**//4 8?7K7K'..33QU )) 6=5H5H,,11d ''  --!" 6=5H5H,,11d#$ ''%& 6=5H5H,,11d'( '')* +++, %%-     r%   c                    K   t        j                  | |       d {   }|D cg c]  }t        j                  |       c}S 7 'c c}w wr   )r   get_kategori_listr   model_validate)r%   r   rowsrs       r   list_kategorirT   <   sE     #55b'BBD?CDt!#2215tDD CDs    AAAAAArB   urutanc                 T  K   	 t        j                  | |||       d {   }| j                          d {    t        j                  |      S 7 17 # t
        $ r% | j                          d {  7   t        d      t        $ r | j                          d {  7    w xY ww)Nz,Duplikat atau constraint error pada kategori)	r   create_kategoricommitr   rQ   r   rollback
ValueErrorr   )r%   r   rB   rU   kats        r   rW   rW   A   s     	&66r7D&QQiik&55c:: R IkkmGHH kkmsT   B(A AA AA B(A A B%1A42+B%B B%%B(Nr,   tanggal_from
tanggal_tor+   r-   skiplimitc	                    K   t        j                  | ||||||||	       d {   \  }	}
|	D cg c]  }t        |       c}|
fS 7 "c c}w wr   )r   get_all_expensesrM   )r%   r   r,   r\   r]   r+   r-   r^   r_   rR   totalrS   s               r   list_expensesrc   P   sb      +;;
GWlJ8H+W[]b KD% )--1OA-u44 .s    !AAAAAA
expense_idc                 |   K   t        j                  | ||       d {   }|t        d      t        |      S 7 w)NExpense tidak ditemukan)r   get_expense_by_idrZ   rM   )r%   r   rd   rL   s       r   get_expenserh   a   s?     &88ZQQG2337## Rs   <:<user_idbodyc                   K   t        j                  | |       d {   }|D ch c]  }|j                   }}|j                  |vrt	        d      |j                         }	 t        j                  | |||       d {   }| j                          d {    t        |      S 7 c c}w 7 .7 # t        $ r% | j                          d {  7   t	        d      t        $ r | j                          d {  7    w xY ww)NzKategori tidak valid+Duplikat atau constraint error pada expense)r   rP   r*   r-   rZ   
model_dumpcreate_expenserX   rM   r   rY   r   )	r%   r   ri   rj   katlistkkat_idsdatarL   s	            r   rn   rn   h   s      '88WEEG$%WqttWG%w&/00??D	*99"gwPTUUiikw'' F%
 V HkkmFGG kkmss   DB'DB)+D$B2 ?B. B2 B0B2 &D)D.B2 0B2 2DC+D:C=;DDc                 ^  K   t        j                  | ||       d {   }|t        d      |j                  t        j
                  k(  rt        d      |j                         j                         D ci c]  \  }}|	|| }}}	 t        j                  | ||       d {   }| j                          d {    t        |      S 7 c c}}w 7 /7 # t        $ r% | j                          d {  7   t        d      t        $ r | j                          d {  7    w xY ww)Nrf   zFExpense yang sudah Approved tidak bisa diedit. Unlock terlebih dahulu.rl   )r   rg   rZ   r3   r
   APPROVEDrm   itemsupdate_expenserX   rM   r   rY   r   )r%   r   rd   rj   rL   rp   vrr   s           r   rv   rv   }   s     '88ZQQG233~~///abb!__.446H6TQ!-AqD6DH	*99"gtLLiikw'' R
 IL HkkmFGG kkms|   D-CAD-8
CCD-C &C'C >C?C D-D-C C D*6C97+D*"D%#D**D-c                   K   ddl m} t        j                  | ||       d {   }|t	        d      |j
                  t        j                  k7  rt	        d      |j                  }	 t        j                  | |       d {    | j                          d {     ||       d {    y 7 7 /7 # t        $ r | j                          d {  7    w xY w7 2w)Nr   delete_filerf   z/Hanya expense berstatus DRAFT yang bisa dihapus)app.utils.file_uploadrz   r   rg   rZ   r3   r
   DRAFTr2   delete_expenserX   r   rY   )r%   r   rd   rz   rL   r2   s         r   r}   r}      s     1&88ZQQG233~~,,,JKK!!I //G<<<iik i
    R 	= kkm !sd   !C B1AC *B7 B3B7 B5B7  C +C,C 3B7 5B7 7CCCC c                   K   t        j                  | ||       d {   }|t        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)Nrf   z'Hanya expense DRAFT yang bisa di-submit)r   rg   rZ   r3   r
   r|   	SUBMITTEDsubmitted_by_idr   nowr   utcr6   rX   r   rY   rM   r%   r   rd   ri   rL   s        r   submit_expenser      s     &88ZQQG233~~,,,BCC&00")'||HLL9iik !3!E!Eb*V]!^^__ R 	 kkm _R   D	C9D	AC  /C0C  4D	D	D	C   D<C?=DD	c                   K   t        j                  | ||       d {   }|t        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)Nrf   z2Recall hanya bisa dilakukan pada expense SUBMITTED)r   rg   rZ   r3   r
   r   r|   recalled_by_idr   r   r   r   r;   rX   r   rY   rM   r   s        r   recall_expenser      s     &88ZQQG233~~000MNN&,,!(&ll8<<8iik !3!E!Eb*V]!^^__ R 	 kkm _r   actioncatatanc                   K   t        j                  | ||       d {   }|t        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)Nrf   z$Tidak ada izin untuk approve expensez+Hanya expense SUBMITTED yang bisa di-reviewr$   )r   rg   rZ   r(   PermissionErrorr3   r
   r   rt   REJECTEDr*   reviewed_by_idr   r   r   r   r8   r9   rX   r   rY   rM   )r%   r   rd   r&   r   r   rL   
new_statuss           r   review_expenser      s$     '88ZQQG233*2tW===DEE~~000FGG+1Y+>''MDZDZJ#!%&ll8<<8!(iik !3!E!Eb*V]!^^__# R > 	 kkm _sd   ED$!ED' AEAD+ 7D)8D+ <EE	E'E)D+ +EE
EEalasanc                   K   t        j                  | ||       d {   }|t        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)Nrf   z#Tidak ada izin untuk unlock expensez*Hanya expense APPROVED yang bisa di-unlockzAlasan unlock wajib diisi)r   rg   rZ   r(   r   r3   r
   rt   stripr|   r*   unlocked_by_idr   r   r   r   r=   r>   rX   r   rY   rM   )r%   r   rd   r&   r   rL   s         r   unlock_expenser      s'     '88ZQQG233*2tW===CDD~~///EFF455&,,!%&ll8<<8 &iik !3!E!Eb*V]!^^__% R > 	 kkm _sd   ED*!ED- AEA(D1 =D/>D1 E!E"	E-E/D1 1EEEE
file_bytesfilenamec                   K   ddl m} t        j                  | ||       d {   }|t	        d      |j
                  t        j                  k(  rt	        d      |j                  }ddl m	}  || |       d {   }	t        |	d|j                        }
t        |||
       d {   }	 t        j                  | ||       d {   }| j                          d {     ||       d {    t%        |      S 7 7 7 [7 =7 '# t        $ r% | j!                          d {  7   t	        d      t"        $ r | j!                          d {  7    w xY w7 lw)Nr   ry   rf   z*Bukti tidak bisa diupload setelah approved)get_spbu_coder#   zDuplikat atau constraint error)r{   rz   r   rg   rZ   r3   r
   rt   r2   r   r   r,   r   update_bukti_urlrX   r   rY   r   rM   )r%   r   rd   r   r   rz   rL   old_bukti_urlr   	spbu_codectxurls               r   upload_buktir      s8     2&88ZQQG233~~///EFF%%M3#B00I
	:w
?CJ#6
6C*;;BMMiik m
$$$7##) R 1
6M ;kkm9:: kkm %s   !EC?AE;D<+E'D(E-D	 DD	 D D	 $E/E0EEED	 D	 	E%D(&+EEEE)NNNNNr   2   )/__doc__r   r   r   decimalr   sqlalchemy.excr   r   sqlalchemy.ext.asyncior	   app.models.expensesr
   app.models.roler   r   app.repositoriesr   r   app.schemas.expensesr   r   r   r   r{   r   r   intboolr(   rM   listrT   rD   rW   tuplerc   rh   rn   rv   r}   r   r   r   r   bytesr   r@   rN   r   <module>r      s    - -  : / - / @  =	s 	t 	 6EL E3 E4@W;X E
"*-7:$   $"#'"555 D[5 +	5
 t5 Dj5 t5 5 5 4 #%&5"$, $ $# $/ $"-08E*"03;H*!\ !C !S !T !"`\ `C `S `SV `[j `"`\ `C `S `SV `[j `"``"`03`CF`QTW[Q[``.``"`03`CF``0$$$ $ 	$
 $ $rN   