
    ]i,@                        d 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m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mZmZmZmZmZmZm Z  d3ded	ed
e!de!fdZ"deded	ede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dfdZ&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e
fdZ)dede!de!d	eddf
dZ*dede!d	ede+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.dede!de!d	eddf
dZ/dede!de!ded	ede	fdZ0dede!d e!ded	ede	fd!Z1dede!d e!d	eddf
d"Z2dede!d	ede+e   fd#Z3dede!ded	edef
d$Z4dede!d%e!ded	edefd&Z5dede!d%e!d	eddf
d'Z6dede!d%e!d(e+e7   d	ede+fd)Z8dede!d	ede+e   fd*Z9d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;dede!d,e!d	eddf
d.Z<dede!d,e!ded	edefd/Z=dede!d0e!ded	edefd1Z>dede!d0e!d	eddf
d2Z?y)4uN   SPBU service — business logic for SPBU management and all its sub-resources.    )IntegrityErrorSQLAlchemyError)AsyncSession)IslandKontrakSewaNozzleShiftSpbuTangkiTenant)User)spbu_repository)IslandCreateIslandUpdateKontrakSewaCreateKontrakSewaUpdateNozzleCreateNozzleUpdateShiftCreateShiftUpdate
SpbuCreate
SpbuUpdateTangkiCreateTangkiUpdateTenantCreateTenantUpdatedbuserskiplimitc                   K   |j                   rt        j                  | ||       d{   S |j                  D ch c]  }|j                   }}|sg dfS t        j                  | |||       d{   S 7 Nc c}w 7 w)zYReturn paginated SPBU list. Superadmin sees all; others see only their assigned stations.Nr   )spbu_ids)is_superadminr   get_allassignmentsspbu_id)r   r   r   r    aassigned_idss         ;/var/www/html/spbu.com/backend/app/services/spbu_service.py
list_spbusr*      s{     $,,Ru==='+'7'78'7!AII'7L81u ((T5<PPP	 >8 Qs,   'BA8BA:$B3A?4B:Bdatareturnc                   K   |j                   st        d      |j                  D cg c]  }|j                          }}|j                  dh      }	 t	        j
                  | fd|i| d{   }| j                          d{    |S c c}w 7 #7 # t        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)zACreate a new SPBU with initial shifts. Restricted to Super Admin.z.Hanya Super Admin yang dapat membuat SPBU barushifts)excludeN Data SPBU konflik atau sudah ada)r#   PermissionErrorr.   
model_dumpr   createcommitr   rollback
ValueErrorr   )r   r+   r   sr.   	spbu_dataresults          r)   create_spbur:      s     NOO&*kk2kallnkF2
3I	&--bMM9MMiik 3 N =kkm;<< kkmsc   &C+BC+B 0B1B B	B C+B B C(4B75+C( C#!C((C+r&   c                    K   t        j                  | |       d{   }|st        d      |j                  s2|j                  D ch c]  }|j
                   }}||vrt        d      |S 7 Qc c}w w)zAFetch an SPBU, enforcing access control for non-superadmin users.NzSPBU tidak ditemukanzTidak punya akses ke SPBU ini)r   	get_by_idr6   r#   r%   r&   r1   )r   r&   r   spbur'   r(   s         r)   get_spbur>   0   sv      **2w77D/00+/+;+;<+;a		+;<,&!"ABBK 8 =s!   A5A.+A5A0A50A5c                 ~  K   t        | ||       d{   }|j                  d      }	 t        j                  | |fi | d{   }| j	                          d{    |S 7 P7  7 
# t
        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)z"Update scalar settings on an SPBU.NTexclude_noner0   )	r>   r2   r   updater4   r   r5   r6   r   )r   r&   r+   r   r=   update_datar9   s          r)   update_spburD   <   s      "gt,,D//t/4K	&--b$F+FFiik - G =kkm;<< kkmsb   B=A$B=A* A&A* A(A* #B=&A* (A* *B:B	+B:2B53B::B=Nc                 \  K   |j                   st        d      t        j                  | |       d{   }|st	        d      	 t        j
                  | |d       d{    | j                          d{    y7 K7 7 	# t        $ r | j                          d{  7    w xY ww)zSDelete an SPBU. Restricted to Super Admin. Mode depends on environment_mode config.z%Only Super Admin can delete a stationNzStation not foundFhard_delete)	r#   r1   r   r<   r6   delete_spbur4   r   r5   )r   r&   r   r=   s       r)   rH   rH   N   s     EFF **2w77D,--))"dFFFiik 8 	G kkmsW   1B,A?B,B !B"B 9B:B >B,B B B)!B$"B))B,c                 x   K   t        | ||       d{    t        j                  | |       d{   S 7 "7 w)z:Return all shifts for an SPBU, after access control check.N)r>   r   
get_shiftsr   r&   r   s      r)   list_shiftsrL   _   s7     
2w
%%% ++B888 &8   :6:8::c                 v  K   t        | ||       d{    	 t        j                  | |fi |j                          d{   }| j	                          d{    |S 7 L7  7 
# t
        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)z!Create a new shift under an SPBU.N!Data shift konflik atau sudah ada)	r>   r   create_shiftr2   r4   r   r5   r6   r   r   r&   r+   r   r9   s        r)   rP   rP   e   s      2w
%%%	&33BU4??CTUUiik	 &U >kkm<== kkmb   B9A B9(A& A"A& A$A& B9"A& $A& &B6B+B6.B1/B66B9shift_idc                   K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      |j                  d      }	 t        j                  | |fi | d{   }| j                          d{    |S 7 7 n7 "7 # t        $ r% | j                          d{  7   t	        d      t        $ r | j                          d{  7    w xY ww)z7Update a shift, verifying it belongs to the given SPBU.NShift tidak ditemukanTr@   rO   )r>   r   get_shift_by_idr&   r6   r2   update_shiftr4   r   r5   r   )r   r&   rS   r+   r   shiftrC   r9   s           r)   rW   rW   v   s      2w
%%%!11"h??EEMMW,011//t/4K	&33BMMMiik &?
 N >kkm<== kkmss   C9BC9B 2C9%B& ?B" B& B$B& C9 C9"B& $B& &C6C+C6.C1/C66C9c                 z  K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |d       d{    | j                          d{    y7 x7 \7 !7 # t        $ r | j                          d{  7    w xY ww)z7Delete a shift, verifying it belongs to the given SPBU.NrU   FrF   )	r>   r   rV   r&   r6   delete_shiftr4   r   r5   )r   r&   rS   r   rX   s        r)   rZ   rZ      s      2w
%%%!11"h??EEMMW,011**2u%HHHiik &? 	I kkmg   B;BB;B B;B .B/B BB B;B;B B B80B31B88B;c                 x   K   t        | ||       d{    t        j                  | |       d{   S 7 "7 w)z;Return all islands for an SPBU, after access control check.N)r>   r   get_islandsrK   s      r)   list_islandsr^      7     
2w
%%% ,,R999 &9rM   c                 v  K   t        | ||       d{    	 t        j                  | |fi |j                          d{   }| j	                          d{    |S 7 L7  7 
# t
        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)z"Create a new island under an SPBU.N"Data island konflik atau sudah ada)	r>   r   create_islandr2   r4   r   r5   r6   r   rQ   s        r)   rb   rb           
2w
%%%	&44RVDOODUVViik	 &V ?kkm=>> kkmrR   	island_idc                   K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |fi |j                  d       d{   }| j                          d{    |S 7 7 l7 "7 # t        $ r% | j                          d{  7   t	        d      t        $ r | j                          d{  7    w xY ww)z9Update an island, verifying it belongs to the given SPBU.NIsland tidak ditemukanTr@   ra   )r>   r   get_island_by_idr&   r6   update_islandr2   r4   r   r5   r   r   r&   rd   r+   r   islandr9   s          r)   rh   rh           
2w
%%%"33B	BBFV^^w.122	&44Rf4??`d?Ceffiik &B g ?kkm=>> kkms   C7BC7B C7*B$ =B >B$ B"B$ C7C7 B$ "B$ $C4 C+C4,C/-C44C7c                 z  K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |d       d{    | j                          d{    y7 x7 \7 !7 # t        $ r | j                          d{  7    w xY ww)z9Delete an island, verifying it belongs to the given SPBU.Nrf   FrF   )	r>   r   rg   r&   r6   delete_islandr4   r   r5   )r   r&   rd   r   rj   s        r)   rn   rn           
2w
%%%"33B	BBFV^^w.122++BEJJJiik &B 	K kkmr[   c                   K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |fi |j                          d{   }| j                          d{    |S 7 7 j7 "7 # t        $ r% | j                          d{  7   t	        d      t        $ r | j                          d{  7    w xY ww)zTCreate a new nozzle under an island, verifying the island belongs to the given SPBU.Nrf   "Data nozzle konflik atau sudah ada)r>   r   rg   r&   r6   create_nozzler2   r4   r   r5   r   ri   s          r)   rr   rr      s     
2w
%%%"33B	BBFV^^w.122	&44RXdooFWXXiik &B Y ?kkm=>> kkms   C5BC5B C5(B" ;B<B" B B" C5C5B"  B" "C2>C?+C2*C-+C22C5	nozzle_idc                   K   t        | ||       d{    t        j                  | |       d{   }|st        d      	 t        j                  | |fi |j                  d       d{   }| j                          d{    |S 7 y7 ]7 "7 # t        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)z,Update a nozzle after verifying SPBU access.NNozzle tidak ditemukanTr@   rq   )
r>   r   get_nozzle_by_idr6   update_nozzler2   r4   r   r5   r   )r   r&   rt   r+   r   nozzler9   s          r)   rx   rx      s     
2w
%%%"33B	BBF122	&44Rf4??`d?Ceffiik &B g ?kkm=>> kkms   C(BC(BC(*B .B/B BB C(C(B B C%1B42+C%C C%%C(c                 \  K   t        | ||       d{    t        j                  | |       d{   }|st        d      	 t        j                  | |d       d{    | j                          d{    y7 i7 M7 !7 # t        $ r | j                          d{  7    w xY ww)z,Delete a nozzle after verifying SPBU access.Nrv   FrF   )r>   r   rw   r6   delete_nozzler4   r   r5   )r   r&   rt   r   ry   s        r)   r|   r|      s     
2w
%%%"33B	BBF122++BEJJJiik &B 	K kkmg   B,A=B,A?B,B B B 7B8B <B,?B,B B B)!B$"B))B,c                 x   K   t        | ||       d{    t        j                  | |       d{   S 7 "7 w)zEReturn all underground tanks for an SPBU, after access control check.N)r>   r   get_tangkisrK   s      r)   list_tangkisr     r_   rM   c                 v  K   t        | ||       d{    	 t        j                  | |fi |j                          d{   }| j	                          d{    |S 7 L7  7 
# t
        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)z,Create a new underground tank under an SPBU.N"Data tangki konflik atau sudah ada)	r>   r   create_tangkir2   r4   r   r5   r6   r   rQ   s        r)   r   r     rc   rR   	tangki_idc                   K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |fi |j                  d       d{   }| j                          d{    |S 7 7 l7 "7 # t        $ r% | j                          d{  7   t	        d      t        $ r | j                          d{  7    w xY ww)z8Update a tangki, verifying it belongs to the given SPBU.NTangki tidak ditemukanTr@   r   )r>   r   get_tangki_by_idr&   r6   update_tangkir2   r4   r   r5   r   )r   r&   r   r+   r   tangkir9   s          r)   r   r     rk   rl   c                 z  K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |d       d{    | j                          d{    y7 x7 \7 !7 # t        $ r | j                          d{  7    w xY ww)z8Delete a tangki, verifying it belongs to the given SPBU.Nr   FrF   )	r>   r   r   r&   r6   delete_tangkir4   r   r5   )r   r&   r   r   r   s        r)   r   r   /  ro   r[   rowsc                   K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | ||       d{   }| j                          d{    |S 7 x7 \7 "7 # t        $ r% | j                          d{  7   t	        d      t        $ r | j                          d{  7    w xY ww)zFReplace the calibration table for a tangki (full replace, atomically).Nr   z%Data kalibrasi konflik atau sudah ada)
r>   r   r   r&   r6   replace_kalibrasir4   r   r5   r   )r   r&   r   r   r   r   r9   s          r)   update_kalibrasir   =  s      2w
%%%"33B	BBFV^^w.122	&88YMMiik &B N Bkkm@AA kkmss   C'BC'B C'B -B.B BB C'C'B B C$0B31+C$CC$$C'c                 x   K   t        | ||       d{    t        j                  | |       d{   S 7 "7 w)z;Return all tenants for an SPBU, after access control check.N)r>   r   get_tenantsrK   s      r)   list_tenantsr   S  r_   rM   c                 v  K   t        | ||       d{    	 t        j                  | |fi |j                          d{   }| j	                          d{    |S 7 L7  7 
# t
        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)z"Create a new tenant under an SPBU.N"Data tenant konflik atau sudah ada)	r>   r   create_tenantr2   r4   r   r5   r6   r   rQ   s        r)   r   r   Y  rc   rR   	tenant_idc                   K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |fi |j                  d       d{   }| j                          d{    |S 7 7 l7 "7 # t        $ r% | j                          d{  7   t	        d      t        $ r | j                          d{  7    w xY ww)z8Update a tenant, verifying it belongs to the given SPBU.NTenant tidak ditemukanTr@   r   )r>   r   get_tenant_by_idr&   r6   update_tenantr2   r4   r   r5   r   r   r&   r   r+   r   tenantr9   s          r)   r   r   h  rk   rl   c                 z  K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |d       d{    | j                          d{    y7 x7 \7 !7 # t        $ r | j                          d{  7    w xY ww)z8Delete a tenant, verifying it belongs to the given SPBU.Nr   FrF   )	r>   r   r   r&   r6   delete_tenantr4   r   r5   )r   r&   r   r   r   s        r)   r   r   z  ro   r[   c                   K   t        | ||       d{    t        j                  | |       d{   }|r|j                  |k7  rt	        d      	 t        j
                  | |fi |j                          d{   }| j                          d{    |S 7 7 j7 "7 # t        $ r% | j                          d{  7   t	        d      t        $ r | j                          d{  7    w xY ww)zYCreate a new lease contract for a tenant, verifying the tenant belongs to the given SPBU.Nr   #Data kontrak konflik atau sudah ada)r>   r   r   r&   r6   create_kontrakr2   r4   r   r5   r   r   s          r)   r   r     s      2w
%%%"33B	BBFV^^w.122	&55b)YtGXYYiik &B Z @kkm>?? kkmrs   
kontrak_idc                   K   t        | ||       d{    t        j                  | |       d{   }|st        d      	 t        j                  | |fi |j                  d       d{   }| j                          d{    |S 7 y7 ]7 "7 # t        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)z4Update a lease contract after verifying SPBU access.NKontrak tidak ditemukanTr@   r   )
r>   r   get_kontrak_by_idr6   update_kontrakr2   r4   r   r5   r   )r   r&   r   r+   r   kontrakr9   s          r)   r   r     s      2w
%%%#55b*EEG233	&55b'hT__bf_Eghhiik &E i @kkm>?? kkmrz   c                 \  K   t        | ||       d{    t        j                  | |       d{   }|st        d      	 t        j                  | |d       d{    | j                          d{    y7 i7 M7 !7 # t        $ r | j                          d{  7    w xY ww)z4Delete a lease contract after verifying SPBU access.Nr   FrF   )r>   r   r   r6   delete_kontrakr4   r   r5   )r   r&   r   r   r   s        r)   r   r     s     
2w
%%%#55b*EEG233,,ReLLLiik &E 	M kkmr}   )r   2   )@__doc__sqlalchemy.excr   r   sqlalchemy.ext.asyncior   app.models.spbur   r   r   r	   r
   r   r   app.models.userr   app.repositoriesr   app.schemas.spbur   r   r   r   r   r   r   r   r   r   r   r   r   r   intr*   r:   r>   rD   rH   rL   rP   rW   rZ   listr^   rb   rh   rn   rr   rx   r|   r   r   r   r   dictr   r   r   r   r   r   r   r        r)   <module>r      s   T : / T T T   ,   Q QT Q Q Q, j   $	| 	c 	 	$ 	"*4<@	$,  D T "9, 9 9D 9"*5=A
"".19DLP
*".19=	$:< :# :T :d6l :L 3 l RV [a L 3 3 l bf kq $L 3 3 d W[  L 3 3 l bf kq $L 3 3 l bf kq $L 3 3 d W[  :< :# :T :d6l :L 3 l RV [a L 3 3 l bf kq $L 3 3 d W[ "/2:>t*LP	,:< :# :T :d6l :L 3 l RV [a L 3 3 l bf kq $L 3 3 d W[  "/2:KSW("03;LTX(\ C S PT Y] r   