
    ]i'                        d Z ddlm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mZ dd
lmZ  eddg      Zde e!z  defdZ"ejG                  de$       e	dd       e	ddd       e	d       e	d       e	dd       ee       ee      fde%de%de%dee   d ee   d!ee&   d"ed#ede$fd$       Z'ejG                  d%e$       e	dd       e	ddd       e	dd       ee       ee      fde%de%de%d!ee&   d"ed#ede$fd&       Z(ejS                  d%e$ejT                  '       ee       ee      fde%d(ed"ed#ede$f
d)       Z+ejG                  d*e$       ee       ee      fde%d+e%d"ed#ede$f
d,       Z,ejS                  d-e$       ee       ee      fde%d+e%d"ed#ede$f
d.       Z-ejS                  d/e$       ee       ee      fde%d+e%d(ed"ed#ede$fd0       Z.ejG                  d1       ee       ee      fde%d+e%d"ed#efd2       Z/ejG                  d3e$       ee       ee      fde%d4ed"ed#ede$f
d5       Z0ejG                  d6e$       ee       ee      fde%d7e%d"ed#ede$f
d8       Z1eje                  d6e$       ee       ee      fde%d7e%d(ed"ed#ede$fd9       Z3ejS                  d:e$       ed;       ee       ee      fde%d7e%d<e
d"ed#ede$fd=       Z4y)>z9Router for penyetoran (per-shift cash deposit) endpoints.    )date)Optional)	APIRouterDependsHTTPExceptionQuery
UploadFileFilestatus)AsyncSession)get_db)get_current_userget_spbu_access)User)BatchReviewRequestDailySummaryPenyetoranBatchCreatePenyetoranBatchResponsePenyetoranResponsePenyetoranUpdate)penyetoran_servicez/spbus/{spbu_id}/penyetoran
penyetoran)prefixtagsereturnc                     t        | t              r$t        t        j                  t        |             S t        t        j                  t        |             S )uE   Convert service-layer ValueError → 400 and PermissionError → 403.)status_codedetail)
isinstancePermissionErrorr   r   HTTP_403_FORBIDDENstrHTTP_400_BAD_REQUEST)r   s    8/var/www/html/spbu.com/backend/app/routers/penyetoran.py_service_errorr&      s:    !_%)B)B3q6RRV%@%@QPP     )response_model)defaultge2         )r*   r+   leN)r*   r   )r*   aliasspbu_idskiplimittanggal_from
tanggal_tostatus_filterdbcurrent_userc           	        K   	 t        j                  || |||||       d{   \  }}	|D cg c]  }|j                          c}|	||z  dz   |ddS 7 2# t        t        f$ r}
t	        |
      d}
~
ww xY wc c}w w)zg
    List penyetoran records for an SPBU (newest first).
    Requires: penyetoran:view permission.
    )r4   r5   r   Nr-   totalpageper_pagedatameta)r   list_penyetoran
ValueErrorr!   r&   
model_dump)r1   r2   r3   r4   r5   r6   r7   r8   rowsr;   r   rs               r%   rA   rA   )   s      .>>u%! 	
 
e *..A.):N 
 (  Q  /sB   A?A AA A?A:A?A A7'A22A77A?z/batchesc                    K   	 t        j                  || |||       d{   \  }}|D 	cg c]  }	|	j                          c}	|||z  dz   |ddS 7 2# t        t        f$ r}t	        |      d}~ww xY wc c}	w w)zg
    List penyetoran batches for an SPBU (newest first).
    Requires: penyetoran:view permission.
    )r   Nr-   r:   r>   )r   list_batchesrB   r!   r&   rC   )
r1   r2   r3   r6   r7   r8   rD   r;   r   rE   s
             r%   rG   rG   G   s      .;;u]
 
e *..A.):N 
 (  Q  /sB   A=A AA A=A8A=A A5%A00A55A=)r)   r   r?   c                    K   	 t        j                  || |j                  |       d{   }|j                         ddS 7 # t        t        f$ r}t        |      d}~ww xY ww)z
    Create a batch from selected DRAFT penyetoran IDs.
    Marks included penyetoran as SUBMITTED.
    Requires: penyetoran:create permission.
    NzBatch berhasil dibuatr?   message)r   create_batchidrB   r!   r&   rC   )r1   r?   r7   r8   batchr   s         r%   rK   rK   `   se      (55b'<??TXYY $$&3JKK Z(  Q 7   A%%A AA A%A A"AA""A%z/batches/{batch_id}batch_idc                    K   	 t        j                  || |       d{   }d|j                         iS 7 # t        t        f$ r}t	        |      d}~ww xY ww)zU
    Return detail for a single batch.
    Requires: penyetoran:view permission.
    Nr?   )r   get_batch_detailrB   r!   r&   rC   r1   rO   r7   r8   rM   r   s         r%   rQ   rQ   s   s]      (99"gxPP E$$&'' Q(  Q 1   A7 57 A7 AAAAz/batches/{batch_id}/submitc                    K   	 t        j                  || ||j                         d{   }|j                         ddS 7 # t        t        f$ r}t        |      d}~ww xY ww)zc
    Submit a DRAFT batch to Manager for approval.
    Requires: penyetoran:create permission.
    NzBatch berhasil di-submitrI   )r   submit_batchrL   rB   r!   r&   rC   rR   s         r%   rU   rU      sd      (55b'8\__]] $$&3MNN ^(  Q rN   z/batches/{batch_id}/reviewc                    K   	 t        j                  || ||j                  |       d{   }|j                         ddS 7 # t        t        f$ r}t        |      d}~ww xY ww)zs
    Manager approves a submitted batch (and all its penyetoran).
    Requires: penyetoran:approve permission.
    NzBatch berhasil disetujuirI   )r   review_batchrL   rB   r!   r&   rC   )r1   rO   r?   r7   r8   rM   r   s          r%   rW   rW      sg      (55b'8\__^bcc $$&3MNN d(  Q s7   A&&A AA A&A A#AA##A&z/batches/{batch_id}/bast-pdfc                 `  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|j(                   d|j*                   fdt-        t/        |j0                              fdd|j2                  dfg} |d||t-        |j*                        |j4                  xs d|j6                  |j8                  xs d|j:                  |	      }d|  d|j(                   d|j*                   d} ||ddd| di      S 7 \# t        t        f$ r}t        |      d}~ww xY w7 w)zYDownload BAST PDF for an approved penyetoran batch. Requires: penyetoran:view permission.r   )Response)generate_bastNapprovedi  z3BAST hanya tersedia untuk batch yang sudah Approved)r   )Spbu)selectzSPBU Periodez s/d zJumlah ShiftzTotal AmountzRp z,.0f
Penyetoran-)	modul	record_id	spbu_nametanggalsubmitter_namesubmitter_atapprover_nameapprover_atdetailszBAST-Penyetoran-z.pdfzapplication/pdfzContent-Dispositionzattachment; filename="")content
media_typeheaders)fastapi.responsesrY   app.utils.bast_pdfrZ   r   rQ   rB   r!   r&   r   r   app.models.spbur\   
sqlalchemyr]   executewhererL   scalar_one_or_nonenamer4   r5   r#   lenitemstotal_amountsubmitted_by_namesubmitted_atreviewed_by_namereviewed_at)r1   rO   r7   r8   FastAPIResponserZ   rM   r   r\   	sa_selectspburc   ri   	pdf_bytesfilenames                  r%   download_bast_batchr      s     >0 (99"gxPP ||z!C(]^^$.**Yt_22477g3EFGG[[]D!		wi'8I	u))*%0@0@/ABC	S-./	3u11$789G
 hS)9)9%:..5#'',,3%%I "'!E,>,>+?qAQAQ@RRVWH99J26LXJVW4XY[ [1 Q(  Q  HsE   F.F	 FF	 AF.F+C8F.F	 	F(F##F((F.z/summary/{tanggal}rd   c                    K   	 t        j                  || |       d{   }d|j                         iS 7 # t        t        f$ r}t	        |      d}~ww xY ww)a  
    Return the daily sales + expenses summary for a given date.
    Used to pre-populate the penyetoran view with suggested amounts.
    Requires: penyetoran:view permission.

    IMPORTANT: Declared before /{penyetoran_id} to avoid FastAPI path conflict.
    Nr?   )r   get_daily_summaryrB   r!   r&   rC   )r1   rd   r7   r8   summaryr   s         r%   r   r      s]      *<<R'RR G&&()) S(  Q rS   z/{penyetoran_id}penyetoran_idc                    K   	 t        j                  || |       d{   }d|j                         iS 7 # t        t        f$ r}t	        |      d}~ww xY ww)za
    Return detail for a single penyetoran record.
    Requires: penyetoran:view permission.
    Nr?   )r   get_penyetoran_detailrB   r!   r&   rC   )r1   r   r7   r8   pr   s         r%   r   r      sZ      $::2wVV ALLN## W(  Q rS   c                    K   	 t        j                  || ||       d{   }|j                         ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)zY
    Update catatan on a DRAFT penyetoran.
    Requires: penyetoran:edit permission.
    NzPenyetoran berhasil diupdaterI   )r   update_penyetoranrB   r!   r&   rC   )r1   r   r?   r7   r8   r   r   s          r%   r   r      s^      $66r7MSWXX LLN/MNN Y(  Q s1   A9 79 A9 AAAAz/{penyetoran_id}/bukti.filec                   K   |j                          d{   }|j                  xs d}	 t        j                  || |||       d{   }|j                         ddS 7 I7 # t        t
        f$ r}t        |      d}~ww xY ww)z
    Upload proof-of-transfer image or PDF for a penyetoran.
    Replaces any previously uploaded file.
    Supported: PDF, JPG, JPEG, PNG. Max size: 10 MB.
    Requires: penyetoran:create permission.
    NbuktizBukti berhasil diuploadrI   )readr   r   upload_buktirB   r!   r&   rC   )	r1   r   r   r7   r8   
file_bytesr   r   r   s	            r%   r   r     s      yy{"J}}'H $11
H
 

 LLN/HII #
 (  Q sD   BA BA$ A"	A$ B"A$ $B3A>>BB)5__doc__datetimer   typingr   fastapir   r   r   r   r	   r
   r   sqlalchemy.ext.asyncior   app.core.databaser   app.dependenciesr   r   app.models.userr   app.schemas.penyetoranr   r   r   r   r   r   app.servicesr   routerrB   r!   r&   getdictintr#   rA   rG   postHTTP_201_CREATEDrK   rQ   rU   rW   r   r   r   patchr   r    r'   r%   <module>r      sr   ?   V V V / $ >    ,	(

Qj?2 Q} Q Bt$ aA&raC0#(#6!&t!4#(X#Fv 1
  4.	
  C= 	  
 %: Jt, aA&raC0#(X#Fv 1
  C=	
 	  
 -0 Z&:Q:QR v 1	LL
L 	L 	L
 
L SL$ !$7 v 1	((( 	( 	(
 
( 8(" )$? v 1	OOO 	O 	O
 
O @O" )$?
 v 1OOO O 		O
 O 
O @O$ *+ v 1	$[$[$[ 	$[ 	$[ ,$[N  6 v 1	*** 	* 	*
 
* 7*( t4 v 1	$$$ 	$ 	$
 
$ 5$"  6
 v 1OOO O 		O
 O 
O 7O$ %d; Cyv 1JJJ J 		J
 J 
J <Jr'   