
    ]i"                     |   d Z ddlmZ ddlmZmZmZmZ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mZmZmZ dd	lmZ  ed
dg      ZdedefdZej?                  de        ee       ee      fde!dedefd       Z"ejG                  de d       ee       ee      fde!dededefd       Z$ej?                  de        ed       ed       ed       ed       ed       edd       eddd !       ee       ee      f	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defd)       Z%ejG                  de d       ee       ee      fde!dededefd*       Z&ej?                  d+e        ee       ee      fde!d,e!dedefd-       Z'ejQ                  d+e        ee       ee      fde!d,e!dededef
d.       Z)ejU                  d+e        ee       ee      fde!d,e!dedefd/       Z+ejG                  d0e        ee       ee      fde!d,e!dedefd1       Z,ejG                  d2e        ee       ee      fde!d,e!dedefd3       Z-ejG                  d4e        ee       ee      fde!d,e!dededef
d5       Z.ejG                  d6e        ee       ee      fde!d,e!dededef
d7       Z/ejG                  d8e d       ed9       ee       ee      fde!d,e!d:e	dedef
d;       Z0ej?                  d<       ee       ee      fde!d,e!dedefd=       Z1y)>zRouter for expenses endpoints.    )date)	APIRouterDependsFileHTTPExceptionQuery
UploadFilestatus)AsyncSession)get_db)get_current_userget_spbu_access)User)ExpenseCreateExpenseUpdateKategoriCreateReviewRequestUnlockRequest)expense_servicez/spbus/{spbu_id}/expensesexpenses)prefixtagsereturnc                 z    t        | t              rt        dt        |             S t        dt        |             S )Ni  status_codedetail  )
isinstancePermissionErrorr   str)r   s    6/var/www/html/spbu.com/backend/app/routers/expenses.py_errr$      s.    !_%SV<<SQ88    z	/kategori)response_modelspbu_iddbcurrent_userc                    K   t        j                  ||        d {   }d|D cg c]  }|j                          c}iS 7 $c c}w w)Ndata)r   list_kategori
model_dump)r'   r(   r)   rowsrs        r#   r,   r,      sE      !..r7;;DT2TQ\\^T233 <2s   AA	AAAA   )r&   r   bodyc                    K   	 t        j                  || |j                  |j                         d {   }|j                         ddS 7 # t        $ r}t        |      d }~ww xY ww)NzKategori berhasil ditambahkanr+   message)r   create_kategorinamaurutan	Exceptionr$   r-   )r'   r1   r(   r)   katr   s         r#   r5   r5   #   s_     #33BDKKXX NN$1PQQ Y 1gs7   A)/A AA A)A 	A&A!!A&&A) N)default)r;   ge2      d   )r;   r<   letanggaltanggal_from
tanggal_tolaporan_shift_idkategori_idskiplimitc
                    K   t        j                  || |||||||	       d {   \  }
}|
D cg c]  }|j                          c}|||ddS 7 ,c c}w w)N)totalrF   rG   )r+   meta)r   list_expensesr-   )r'   rA   rB   rC   rD   rE   rF   rG   r(   r)   r.   rI   r/   s                r#   rK   rK   3   so      (55
GWlJ8H+W[]b KD% *..A.>  /s    !AAAAAAc                    K   	 t        j                  || |j                  |       d {   }|j                         ddS 7 # t        $ r}t	        |      d }~ww xY ww)NzExpense berhasil disimpanr3   )r   create_expenseidr8   r$   r-   )r'   r1   r(   r)   expenser   s         r#   rM   rM   I   s^     '66r7LOOUYZZ &&(5PQQ [ 1g7   A%A AA AA 	AAAAz/{expense_id}
expense_idc                    K   	 t        j                  || |       d {   }d|j                         iS 7 # t        $ r}t        dt	        |            d }~ww xY ww)N  r   r+   )r   get_expense
ValueErrorr   r"   r-   r'   rQ   r(   r)   rO   r   s         r#   rT   rT   W   s^     <'33BLL G&&()) M <CF;;<s1   A7 57 A7 	A AAAc                    K   	 t        j                  || ||       d {   }|j	                         ddS 7 # t        $ r}t        |      d }~ww xY ww)NzExpense berhasil diupdater3   )r   update_expenser8   r$   r-   r'   rQ   r1   r(   r)   rO   r   s          r#   rX   rX   e   sZ     '66r7JPTUU &&(5PQQ V 1gs1   A9 79 A9 	AAAAc                    K   	 t        j                  || |       d {    ddiS 7 # t        $ r}t        |      d }~ww xY ww)Nr4   zExpense berhasil dihapus)r   delete_expenser8   r$   )r'   rQ   r(   r)   r   s        r#   r[   r[   t   sO     ,,R*EEE 122 	F 1gs.   A) ') A) 	A=AAz/{expense_id}/submitc                    K   	 t        j                  || ||j                         d {   }|j                         ddS 7 # t        $ r}t	        |      d }~ww xY ww)NzExpense berhasil di-submitr3   )r   submit_expenserN   r8   r$   r-   rV   s         r#   r]   r]      `     '66r7JP\P_P_`` &&(5QRR a 1grP   z/{expense_id}/recallc                    K   	 t        j                  || ||j                         d {   }|j                         ddS 7 # t        $ r}t	        |      d }~ww xY ww)NzExpense berhasil di-recallr3   )r   recall_expenserN   r8   r$   r-   rV   s         r#   r`   r`      r^   rP   z/{expense_id}/reviewc                   K   	 t        j                  || |||j                  |j                         d {   }|j                  dk(  rdnd}|j                         d| dS 7 -# t        $ r}t        |      d }~ww xY ww)Napprove	diapproveditolakzExpense berhasil r3   )r   review_expenseactioncatatanr8   r$   r-   )r'   rQ   r1   r(   r)   rO   r   labels           r#   re   re      s     '66r7JP\^b^i^ikokwkwxx  ;;)3KE&&(7H5PQQ	 y 1gs7   B1A% A#A% )B#A% %	A>.A99A>>Bz/{expense_id}/unlockc                    K   	 t        j                  || |||j                         d {   }|j                         ddS 7 # t        $ r}t	        |      d }~ww xY ww)NzExpense berhasil di-unlockr3   )r   unlock_expensealasanr8   r$   r-   rY   s          r#   rj   rj      sc     '66r7JP\^b^i^ijj &&(5QRR k 1gs7   A &A AA A A 	AAAA z/{expense_id}/bukti.filec                 6  K   |j                          d {   }t        |      dkD  rt        dd      	 t        j                  || |||j
                  xs d       d {   }|j                         ddS 7 b7 # t        $ r}t        |      d }~ww xY ww)Ni   r   zFile terlalu besar (max 10 MB)r   buktizBukti berhasil diuploadr3   )	readlenr   r   upload_buktifilenamer8   r$   r-   )r'   rQ   rl   r(   r)   
file_bytesrO   r   s           r#   rq   rq      s      yy{"J
:))4TUU'44Z1I'
 

 &&(5NOO #
  1gsD   BA9B*A= !A;"A= &B;A= =	BBBBz/{expense_id}/bast-pdfc                 H  K   ddl m} ddlm} 	 t	        j
                  || |       d{   }|j                  dk7  rt        dd	
      ddl
m} ddlm}	 |j                   |	|      j                  |j                   | k(               d{   j#                         }
|
r|
j$                  nd|  }dt        |j&                        fd|j(                  fd|j*                  xs dfdd|j,                  dfg} |d||t        |j&                        |j.                  xs d|j0                  |j2                  xs d|j4                  |	      }d|  d|j&                   d| d} ||ddd| di      S 7 K# t        $ r}t        dt        |            d}~ww xY w7 w)zNDownload BAST PDF for an approved expense. Requires: expenses:view permission.r   )Response)generate_bastNrS   r   approvedr   z5BAST hanya tersedia untuk expense yang sudah Approved)r   )Spbu)selectzSPBU TanggalKategori
Keterangan-JumlahzRp z,.0fExpenses)	modul	record_id	spbu_namerA   submitter_namesubmitter_atapprover_nameapprover_atdetailszBAST-Expense-z.pdfzapplication/pdfzContent-Dispositionzattachment; filename="")content
media_typeheaders)fastapi.responsesru   app.utils.bast_pdfrv   r   rT   rU   r   r"   r
   app.models.spburx   
sqlalchemyry   executewhererN   scalar_one_or_nonenamerA   kategori_nama
keteranganjumlahsubmitted_by_namesubmitted_atreviewed_by_namereviewed_at)r'   rQ   r(   r)   FastAPIResponserv   rO   r   rx   	sa_selectspbur   r   	pdf_bytesrr   s                  r#   download_bast_expenser      s     >0<'33BLL ~~#C(_``$.**Yt_22477g3EFGG[[]D!		wi'8I	C()	W**+	w))0S1	S-./	G JS%9007C))..5#''I wiq(9:,dKH99J26LXJVW4XY[ [3 M <CF;;< HsE   F"E8 E5E8 AF"FC'F"5E8 8	FFFF")2__doc__datetimer   fastapir   r   r   r   r   r	   r
   sqlalchemy.ext.asyncior   app.core.databaser   app.dependenciesr   r   app.models.userr   app.schemas.expensesr   r   r   r   r   app.servicesr   routerr8   r$   getdictintr,   postr5   rK   rM   rT   patchrX   deleter[   r]   r`   re   rj   rq   r    r%   r#   <module>r      s   $  V V V / $ >   k k (	5ZL	I9I 9- 9 K- v 1444 4 .4 [3? v 1	
R
R

R 	
R 	
R @
R Bt$ !. %d 3#D1#(#6#D1aA&raC0v 1D[ + t	
 Dj t   	  %* R#6 v 1	
R
R

R 	
R 	
R 7
R OD1 v 1	
*
*
* 	
* 	
* 2
* od3
 v 1RRR R 		R
 R 4R t4 v 1	
3
3
3 	
3 	
3 5
3 #D9 v 1	S	S!	S	S 	S :	S #D9 v 1	S	S!	S	S 	S :	S #D9 v 1
R
R!
R)6
R
R 
R :
R #D9 v 1	S	S!	S)6	S	S 	S :	S "4SI Cyv 1PPP P 		P
 P JP& $% v 1	%[%[%[ 	%[ 	%[ &%[r%   