
    iA                     D   d Z ddlmZmZmZmZ ddlmZ ddl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mZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z' d	e(e)z  d
efdZ* e       Z+e+jY                  de-      dd ee	       ee      fde.de.deded
e-f
d       Z/e+ja                  de-ejb                         ee	       ee      fdededed
e-fd       Z2e+jY                  de-       ee	       ee      fde.deded
e-fd       Z3e+ji                  de-       ee	       ee      fde.dededed
e-f
d       Z5e+jm                  dejn                         ee	       ee      fde.deded
dfd       Z8e+jY                  de-       ee	       ee      fde.deded
e-fd       Z9e+ja                  de-ejb                         ee	       ee      fde.dededed
e-f
d        Z:e+ji                  d!e-       ee	       ee      fde.d"e.dededed
e-fd#       Z;e+jm                  d!ejn                         ee	       ee      fde.d"e.deded
df
d$       Z<e+jY                  d%e-       ee	       ee      fde.deded
e-fd&       Z=e+ja                  d%e-ejb                         ee	       ee      fde.dededed
e-f
d'       Z>e+ji                  d(e-       ee	       ee      fde.d)e.dededed
e-fd*       Z?e+jm                  d(ejn                         ee	       ee      fde.d)e.deded
df
d+       Z@e+ja                  d,e-ejb                         ee	       ee      fde.d)e.dededed
e-fd-       ZAe+ji                  d.e-       ee	       ee      fde.d/e.dededed
e-fd0       ZBe+jm                  d.ejn                         ee	       ee      fde.d/e.deded
df
d1       ZCe+jY                  d2e-       ee	       ee      fde.deded
e-fd3       ZDe+ja                  d2e-ejb                         ee	       ee      fde.de deded
e-f
d4       ZEe+ji                  d5e-       ee	       ee      fde.d6e.de"deded
e-fd7       ZFe+jm                  d5ejn                         ee	       ee      fde.d6e.deded
df
d8       ZGe+j                  d9e-       ee	       ee      fde.d6e.deIe   deded
e-fd:       ZJe+jY                  d;e-       ee	       ee      fde.deded
e-fd<       ZKe+ja                  d;e-ejb                         ee	       ee      fde.de#deded
e-f
d=       ZLe+ji                  d>e-       ee	       ee      fde.d?e.de%deded
e-fd@       ZMe+jm                  d>ejn                         ee	       ee      fde.d?e.deded
df
dA       ZNe+ja                  dBe-ejb                         ee	       ee      fde.d?e.dededed
e-fdC       ZOe+ji                  dDe-       ee	       ee      fde.dEe.dededed
e-fdF       ZPe+jm                  dDejn                         ee	       ee      fde.dEe.deded
df
dG       ZQy)HuD   SPBU router — endpoints for SPBU management and all sub-resources.    )	APIRouterDependsHTTPExceptionstatus)AsyncSession)get_db)get_current_user)User)IslandCreateIslandResponseIslandUpdateKalibrasiTangkiItemKalibrasiTangkiResponseKontrakSewaCreateKontrakSewaResponseKontrakSewaUpdateNozzleCreateNozzleResponseNozzleUpdateShiftCreateShiftResponseShiftUpdate
SpbuCreateSpbuResponse
SpbuUpdateTangkiCreateTangkiResponseTangkiUpdateTenantCreateTenantResponseTenantUpdate)spbu_serviceereturnc                     t        | t              r$t        t        j                  t        |             S t        t        j                  t        |             S )uE   Convert service-layer ValueError → 404 and PermissionError → 403.status_codedetail)
isinstancePermissionErrorr   r   HTTP_403_FORBIDDENstrHTTP_404_NOT_FOUND)r#   s    2/var/www/html/spbu.com/backend/app/routers/spbu.py_service_errorr/      s:    !_%)B)B3q6RRV%>%>s1vNN     )response_model2   skiplimitdbcurrent_userc                    K   t        j                  ||| |       d{   \  }}|D cg c]  }t        j                  |       c}|| |z  dz   |ddS 7 7c c}w w)z@Return a paginated list of SPBUs accessible to the current user.N   )totalpageper_page)datameta)r"   
list_spbusr   model_validate)r4   r5   r6   r7   spbusr:   ss          r.   r?   r?       sh      &00\4OOLE59>?A,,Q/?):N  P?s    AAAAAA)r2   r'   r=   c                    K   	 t        j                  || |       d{   }t        j                  |      ddS 7 # t        $ r)}t        t        j
                  t        |            d}~ww xY ww)zACreate a new SPBU with initial shifts. Restricted to Super Admin.Nr&   zSPBU berhasil dibuatr=   message)	r"   create_spbur*   r   r   r+   r,   r   r@   )r=   r6   r7   spbur#   s        r.   rF   rF   /   sj     R!--b$EE !//5BXYY F R(A(A#a&QQRs1   A2= ;= A2= 	A/$A**A//A2z
/{spbu_id}spbu_idc                    K   	 t        j                  || |       d{   }dt        j                  |      iS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z;Return details for a single SPBU, enforcing access control.Nr=   )r"   get_spbu
ValueErrorr*   r/   r   r@   )rH   r6   r7   rG   r#   s        r.   rJ   rJ   =   s_      !**2wEE L//566 F(  Q s1   A< :< A< AAAAc                    K   	 t        j                  || ||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z"Update scalar settings on an SPBU.NzSPBU berhasil diupdaterD   )r"   update_spburK   r*   r/   r   r@   )rH   r=   r6   r7   rG   r#   s         r.   rM   rM   K   sb      !--b'4NN !//5BZ[[ O(  Q 1   A > <> A > AAAA )r'   Nc                    K   	 t        j                  || |       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)z6Permanently delete an SPBU. Restricted to Super Admin.N)r"   delete_spburK   r*   r/   )rH   r6   r7   r#   s       r.   rP   rP   Z   sB      &&r7LAAA(  Q s0   A& $& A& AA  AAz/{spbu_id}/shiftsc                    K   	 t        j                  || |       d{   }d|D cg c]  }t        j                  |       c}iS 7 )# t        t        f$ r}t	        |      d}~ww xY wc c}w w)z)Return all shifts configured for an SPBU.Nr=   )r"   list_shiftsrK   r*   r/   r   r@   )rH   r6   r7   shiftsr#   rB   s         r.   rR   rR   g   sq      #//G\JJ fEf]11!4fEFF K(  Q EB   A1A
 AA
 A1A,A1A
 
A)A$$A))A1c                    K   	 t        j                  || ||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z!Create a new shift under an SPBU.NzShift berhasil dibuatrD   )r"   create_shiftrK   r*   r/   r   r@   )rH   r=   r6   r7   shiftr#   s         r.   rV   rV   u   sb      "//GT<PP "007D[\\ Q(  Q rN   z/{spbu_id}/shifts/{shift_id}shift_idc                    K   	 t        j                  || |||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z+Update a shift belonging to the given SPBU.NzShift berhasil diupdaterD   )r"   update_shiftrK   r*   r/   r   r@   )rH   rX   r=   r6   r7   rW   r#   s          r.   rZ   rZ      sd      "//GXt\ZZ "007D]^^ [(  Q 1   A!? =? A!? AAAA!c                    K   	 t        j                  || ||       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)z+Delete a shift belonging to the given SPBU.N)r"   delete_shiftrK   r*   r/   )rH   rX   r6   r7   r#   s        r.   r]   r]      sD      ''GX|LLL(  Q 0   A	' %' A	' AAAA	z/{spbu_id}/islandsc                   K   	 t        j                  || |       d{   }g }|D ]t  }t        j                  |      j                         }|j                  D cg c]%  }t        j                  |      j                         ' c}|d<   |j                  |       v d|iS 7 # t        t        f$ r}t	        |      d}~ww xY wc c}w w)z:Return all islands for an SPBU, with their nested nozzles.Nnozzlesr=   )r"   list_islandsrK   r*   r/   r   r@   
model_dumpr`   r   from_orm_with_namesappend)	rH   r6   r7   islandsr#   r=   islisl_dictns	            r.   ra   ra      s      $11"g|LL D!005@@B[^[f[fg[fVW~AA!DOOQ[fgH  D> M(  Q 
 hsC   CB$ B"B$ 8C*CC"B$ $C3B>>CCc                    K   	 t        j                  || ||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z"Create a new island under an SPBU.NzIsland berhasil dibuatrD   )r"   create_islandrK   r*   r/   r   r@   )rH   r=   r6   r7   islandr#   s         r.   rj   rj      b      #11"gt\RR #11&9F^__ S(  Q rN   z/{spbu_id}/islands/{island_id}	island_idc                    K   	 t        j                  || |||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z-Update an island belonging to the given SPBU.NzIsland berhasil diupdaterD   )r"   update_islandrK   r*   r/   r   r@   )rH   rm   r=   r6   r7   rk   r#   s          r.   ro   ro      e      #11"gy$P\]] #11&9F`aa ^(  Q r[   c                    K   	 t        j                  || ||       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)z-Delete an island belonging to the given SPBU.N)r"   delete_islandrK   r*   r/   )rH   rm   r6   r7   r#   s        r.   rr   rr      D      ((WiNNN(  Q r^   z&/{spbu_id}/islands/{island_id}/nozzlesc                    K   	 t        j                  || |||       d{   }t        j                  |      j                         ddS 7 *# t        t        f$ r}t	        |      d}~ww xY ww)z$Create a new nozzle under an island.NzNozzle berhasil dibuatrD   )r"   create_nozzlerK   r*   r/   r   rc   rb   )rH   rm   r=   r6   r7   nozzler#   s          r.   ru   ru      sn      #11"gy$P\]] #66v>IIKXpqq ^(  Q 7   A/A AA &A/A A,A''A,,A/z/{spbu_id}/nozzles/{nozzle_id}	nozzle_idc                    K   	 t        j                  || |||       d{   }t        j                  |      j                         ddS 7 *# t        t        f$ r}t	        |      d}~ww xY ww)z,Update a nozzle belonging to the given SPBU.NzNozzle berhasil diupdaterD   )r"   update_nozzlerK   r*   r/   r   rc   rb   )rH   rx   r=   r6   r7   rv   r#   s          r.   rz   rz      n      #11"gy$P\]] #66v>IIKXrss ^(  Q rw   c                    K   	 t        j                  || ||       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)z,Delete a nozzle belonging to the given SPBU.N)r"   delete_nozzlerK   r*   r/   )rH   rx   r6   r7   r#   s        r.   r}   r}     rs   r^   z/{spbu_id}/tangkisc                   K   	 t        j                  || |       d{   }d|D cg c]%  }t        j                  |      j                         ' c}iS 7 7# t        t        f$ r}t	        |      d}~ww xY wc c}w w)z)Return all underground tanks for an SPBU.Nr=   )r"   list_tangkisrK   r*   r/   r   rc   rb   )rH   r6   r7   tangkisr#   ts         r.   r   r     s}      $11"g|LL QXYQXA^77:EEGQXYZZ M(  Q YsB   A?A AA A?*A:A?A A7'A22A77A?c                    K   	 t        j                  || ||       d{   }t        j                  |      j                         ddS 7 *# t        t        f$ r}t	        |      d}~ww xY ww)z,Create a new underground tank under an SPBU.NzTangki berhasil dibuatrD   )r"   create_tangkirK   r*   r/   r   rc   rb   )rH   r=   r6   r7   tangkir#   s         r.   r   r   $  sk      #11"gt\RR #66v>IIKXpqq S(  Q s7   A.A A
A &A.
A A+A&&A++A.z/{spbu_id}/tangkis/{tangki_id}	tangki_idc                    K   	 t        j                  || |||       d{   }t        j                  |      j                         ddS 7 *# t        t        f$ r}t	        |      d}~ww xY ww)z,Update a tangki belonging to the given SPBU.NzTangki berhasil diupdaterD   )r"   update_tangkirK   r*   r/   r   rc   rb   )rH   r   r=   r6   r7   r   r#   s          r.   r   r   3  r{   rw   c                    K   	 t        j                  || ||       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)z,Delete a tangki belonging to the given SPBU.N)r"   delete_tangkirK   r*   r/   )rH   r   r6   r7   r#   s        r.   r   r   C  rs   r^   z(/{spbu_id}/tangkis/{tangki_id}/kalibrasic           
      .  K   	 t        j                  || ||D cg c]  }|j                          c}|       d{   }|D cg c]  }t        j                  |       c}ddS c c}w 7 /# t        t        f$ r}t        |      d}~ww xY wc c}w w)zMReplace the full calibration table for a tangki (delete-all then insert-all).NzKalibrasi berhasil disimpanrD   )r"   update_kalibrasirb   rK   r*   r/   r   r@   )rH   r   r=   r6   r7   rrowsr#   s           r.   r   r   Q  s      !22T$BTQ\\^T$BL
 

 IMM1,;;A>MZwxx	 %C
 (  Q MsN   BA. A'A. A,A. BB!B'A. .B=BBBz/{spbu_id}/tenantsc                    K   	 t        j                  || |       d{   }d|D cg c]  }t        j                  |       c}iS 7 )# t        t        f$ r}t	        |      d}~ww xY wc c}w w)z:Return all tenants for an SPBU with their lease contracts.Nr=   )r"   list_tenantsrK   r*   r/   r    r@   )rH   r6   r7   tenantsr#   r   s         r.   r   r   e  sq      $11"g|LL wGw!^2215wGHH M(  Q GrT   c                    K   	 t        j                  || ||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z"Create a new tenant under an SPBU.NzTenant berhasil dibuatrD   )r"   create_tenantrK   r*   r/   r    r@   )rH   r=   r6   r7   tenantr#   s         r.   r   r   s  rl   rN   z/{spbu_id}/tenants/{tenant_id}	tenant_idc                    K   	 t        j                  || |||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z,Update a tenant belonging to the given SPBU.NzTenant berhasil diupdaterD   )r"   update_tenantrK   r*   r/   r    r@   )rH   r   r=   r6   r7   r   r#   s          r.   r   r     rp   r[   c                    K   	 t        j                  || ||       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)z,Delete a tenant belonging to the given SPBU.N)r"   delete_tenantrK   r*   r/   )rH   r   r6   r7   r#   s        r.   r   r     rs   r^   z&/{spbu_id}/tenants/{tenant_id}/kontrakc                    K   	 t        j                  || |||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z)Create a new lease contract for a tenant.NzKontrak berhasil dibuatrD   )r"   create_kontrakrK   r*   r/   r   r@   )rH   r   r=   r6   r7   kontrakr#   s          r.   r   r     se      $33BDR^__ (66w?Leff `(  Q r[   z/{spbu_id}/kontrak/{kontrak_id}
kontrak_idc                    K   	 t        j                  || |||       d{   }t        j                  |      ddS 7 # t        t        f$ r}t	        |      d}~ww xY ww)z4Update a lease contract belonging to the given SPBU.NzKontrak berhasil diupdaterD   )r"   update_kontrakrK   r*   r/   r   r@   )rH   r   r=   r6   r7   r   r#   s          r.   r   r     se      $33BTS_`` (66w?Lghh a(  Q r[   c                    K   	 t        j                  || ||       d{    y7 # t        t        f$ r}t	        |      d}~ww xY ww)z4Delete a lease contract belonging to the given SPBU.N)r"   delete_kontrakrK   r*   r/   )rH   r   r6   r7   r#   s        r.   r   r     sD      ))"gz<PPP(  Q r^   )R__doc__fastapir   r   r   r   sqlalchemy.ext.asyncior   app.core.databaser   app.dependenciesr	   app.models.userr
   app.schemas.spbur   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   app.servicesr"   rK   r*   r/   routergetdictintr?   postHTTP_201_CREATEDrF   rJ   patchrM   deleteHTTP_204_NO_CONTENTrP   rR   rV   rZ   r]   ra   rj   ro   rr   ru   rz   r}   r   r   r   r   putlistr   r   r   r   r   r   r   r    r0   r.   <module>r      s3   J = = / $ -  	 	 	 	 	 	 	 &Oj?2 O} O 
 Bt$v !12	
 	 	
 
 % R&2I2IJ v !12
Z

Z
Z 
Z 
	
Z K
Z L. v !12
7
7
7 
7 
	
7 /
7 l40 v !12	\\
\ 	\ 	\
 
\ 1\ |)C)CD v !12	 	 	  	  
		  E	  5 v !12
G
G
G 
G 
	
G 6
G  6CZCZ[ v !12	]]
] 	] 	]
 
] \] ,TB
 v !12___ _ 		_
 _ 
_ C_ -6;U;UV v !12	
 
 
  	
  	
 
 

  W
   6 v !12  
	 7$ !$FD[D[\ v !12	``
` 	` 	`
 
` ]` .tD
 v !12bbb b 		b
 b 
b Eb /V=W=WX v !12	
 
 
  	
  	
 
 

  Y
  5dX^XoXop
 v !12rrr r 		r
 r 
r qr .tD
 v !12ttt t 		t
 t 
t Et /V=W=WX v !12	
 
 
  	
  	
 
 

  Y
   6 v !12
[
[
[ 
[ 
	
[ 7
[ !$FD[D[\ v !12	rr
r 	r 	r
 
r ]r .tD
 v !12ttt t 		t
 t 
t Et /V=W=WX v !12	
 
 
  	
  	
 
 

  Y
  6tL
 v !12yyy "
#y 		y
 y 
y My&  6 v !12
I
I
I 
I 
	
I 7
I !$FD[D[\ v !12	``
` 	` 	`
 
` ]` .tD
 v !12bbb b 		b
 b 
b Eb /V=W=WX v !12	
 
 
  	
  	
 
 

  Y
  5dX^XoXop
 v !12ggg g 		g
 g 
g qg /E
 v !12iii i 		i
 i 
i Fi 0f>X>XY v !12	
 
 
  	
  	
 
 

  Z
 r0   