
    ]iU1                        d Z ddlmZ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mZmZmZmZmZmZ 	 	 	 d?ded	ed
edee   dz  deee   ef   f
dZdedededz  fdZdedefdZdededefdZd@dedededdfdZdededee   fdZdedededz  fdZdededefdZdededefdZ d@dedededdfdZ!dededee   fdZ"dedededz  fdZ#dededefdZ$ded edefd!Z%d@ded ededdfd"Z&ded#ededz  fd$Z'dededefd%Z(ded&edefd'Z)d@ded&ededdfd(Z*dededee   fd)Z+ded*ededz  fd+Z,dededefd,Z-ded-edefd.Z.d@ded-ededdfd/Z/ded*ed0ee0   dee   fd1Z1dededee   fd2Z2ded3ededz  fd4Z3dededefd5Z4ded6edefd7Z5d@ded6ededdfd8Z6ded9ededz  fd:Z7ded3edefd;Z8ded<edefd=Z9d@ded<ededdfd>Z:y)Auz   SPBU repository — all DB queries for SPBU and its sub-resources (shifts, islands, nozzles, tangkis, tenants, contracts).    )datetimetimezone)funcselect)AsyncSession)selectinload)IslandKalibrasiTangkiKontrakSewaNozzleShiftSpbuTangkiTenantNdbskiplimitspbu_idsreturnc                   K   t        t              j                  t        j                  j	                  d            j                  t        t        j                              j                  t        j                        }|.|j                  t        j                  j                  |            }| j                  t        t        j                               j                  |j!                                      d{   }|j#                         }| j                  |j%                  |      j'                  |             d{   }t)        |j+                         j-                               |fS 7 t7 /w)z9Fetch paginated SPBUs. Optionally filter to a set of IDs.N)r   r   where
deleted_atis_optionsr   shiftsorder_bynameidin_executer   countselect_fromsubquery
scalar_oneoffsetr   listscalarsall)r   r   r   r   querycount_qtotalresults           B/var/www/html/spbu.com/backend/app/repositories/spbu_repository.pyget_allr.      s      	t	t""4(	)	dkk*	+	$))		 
 DGGKK12JJvdjjl3??@PQRRG E::ell4066u=>>F $$&'.. S>s%   C;E6=E2>AE6E4.E64E6spbu_idc                 B  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                                     d{   }|j                         S 7 w)z?Fetch a single SPBU by primary key, eagerly loading its shifts.N)r    r   r   r   r   r   r   r   r   r   scalar_one_or_noner   r/   r,   s      r-   	get_by_idr3   !   sm     ::t	tww'!4??#6#6t#<	=	dkk*	+ F
 $$&&   BBB	Bc                 h  K   |j                  dg       }t        di |}| j                  |       | j                          d{    |D ](  }| j                  t	        dd|j
                  i|       * | j                          d{    t        | |j
                         d{   S 7 g7 $7 w)uR   Create a new SPBU together with its initial shifts. Flush only — caller commits.r   Nr/    )popr   addflushr   r   r3   )r   kwargsshifts_dataspbu
shift_datas        r-   creater>   +   s     **Xr*K>&>DFF4L
((*!

u3TWW3
34 "
((*2tww'''	  's7   AB2B,AB2	B.
B2'B0(B2.B20B2r<   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    t        | |j                         d{   S 7 "7 w)uH   Update scalar fields on an existing SPBU. Flush only — caller commits.N)itemssetattrr9   r3   r   )r   r<   r:   keyvalues        r-   updaterD   7   sR     lln
Uc5! %
((*2tww''' '!   9A"AA"A A" A"hard_deletec                    K   |r| j                  |       d{    n(t        j                  t        j                        |_        | j                          d{    y7 F7 w)u5   Delete an SPBU record. Flush only — caller commits.Ndeleter   nowr   utcr   r9   )r   r<   rF   s      r-   delete_spburL   ?   sH     iio",,x||4
((* 	 "   A$A A A$A"A$"A$c                 ^  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        j                               d{   }t        |j                         j                               S 7 +w)z:Return all shifts for a given SPBU, ordered by start time.N)r    r   r   r   r/   r   r   r   	jam_mulair&   r'   r(   r2   s      r-   
get_shiftsrP   J   sv     ::u	u}}')9)9)=)=d)C	D	%//	" F
  $$&''s   A=B-?B+ ,B-shift_idc                    K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d                   d{   }|j                         S 7 w)z$Fetch a single shift by primary key.N)r    r   r   r   r   r   r   r1   )r   rQ   r,   s      r-   get_shift_by_idrS   T   s]     ::uEHH0%2B2B2F2Ft2LM F $$&&   A A9"A7#A9c                    K   t        dd|i|}| j                  |       | j                          d{    | j                  |       d{    |S 7 7 w)uE   Create a new shift for the given SPBU. Flush only — caller commits.r/   Nr6   )r   r8   r9   refresh)r   r/   r:   shifts       r-   create_shiftrX   \   sR     ,',V,EFF5M
((*
**U
L !   2AAAAAArW   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    | j                  |       d{    |S 7 7 w)uI   Update scalar fields on an existing shift. Flush only — caller commits.Nr@   rA   r9   rV   )r   rW   r:   rB   rC   s        r-   update_shiftr\   e   sU     lln
UsE" %
((*
**U
L !   9AAAAAAc                    K   |r| j                  |       d{    n(t        j                  t        j                        |_        | j                          d{    y7 F7 w)u5   Delete a shift record. Flush only — caller commits.NrH   )r   rW   rF   s      r-   delete_shiftr_   n   sJ     ii#<<5
((* 	 rM   c                 N  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                        j                  t        j                        t        t        j                        j                  t        j                              j                  t        j                               d{   }t        |j!                         j#                               S 7 +w)zMReturn all islands for a given SPBU, with nested nozzle relationships loaded.N)r    r   r	   r   r/   r   r   r   r   nozzlesr   produktangkir   urutanr&   r'   r(   r2   s      r-   get_islandsre   y   s     ::v	v~~(&*;*;*?*?*E	F	(55fmmD(55fmmD

 
&--	  F  $$&''s   C5D%7D#8,D%	island_idc                   K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                        j                  t        j                        t        t        j                        j                  t        j                                     d{   }|j                         S 7 w)zGFetch a single island by primary key, with nozzle relationships loaded.N)r    r   r	   r   r   r   r   r   r   ra   r   rb   rc   r1   )r   rf   r,   s      r-   get_island_by_idrh      s     ::v	vyyI%v'8'8'<'<T'B	C	(55fmmD(55fmmD

 F $$&&s   CC1C/C1c                    K   t        dd|i|}| j                  |       | j                          d{    t        | |j                         d{   S 7 "7 w)uF   Create a new island for the given SPBU. Flush only — caller commits.r/   Nr6   )r	   r8   r9   rh   r   )r   r/   r:   islands       r-   create_islandrk      O     .G.v.FFF6N
((*!"fii000 0!   2AAAAAArj   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    t        | |j                         d{   S 7 "7 w)uJ   Update scalar fields on an existing island. Flush only — caller commits.N)r@   rA   r9   rh   r   )r   rj   r:   rB   rC   s        r-   update_islandro      R     lln
UU# %
((*!"fii000 0rE   c                    K   |r| j                  |       d{    n(t        j                  t        j                        |_        | j                          d{    y7 F7 w)u7   Delete an island record. Flush only — caller commits.NrH   )r   rj   rF   s      r-   delete_islandrr      J     ii$LL6
((* 	  rM   	nozzle_idc                 r  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                        t        t        j                                     d{   }|j                         S 7 w)zDFetch a single nozzle by primary key, with produk and tangki loaded.N)r    r   r   r   r   r   r   r   r   rb   rc   r1   )r   rt   r,   s      r-   get_nozzle_by_idrv      sz     ::v	vyyI%v'8'8'<'<T'B	C	fmm,l6==.I	J F
 $$&&   BB7 B5!B7c                    K   t        dd|i|}| j                  |       | j                          d{    t        | |j                         d{   S 7 "7 w)uJ   Create a new nozzle under the given island. Flush only — caller commits.rf   Nr6   )r   r8   r9   rv   r   )r   rf   r:   nozzles       r-   create_nozzlerz      sO     2i262FFF6N
((*!"fii000 0rm   ry   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    t        | |j                         d{   S 7 "7 w)uJ   Update scalar fields on an existing nozzle. Flush only — caller commits.N)r@   rA   r9   rv   r   )r   ry   r:   rB   rC   s        r-   update_nozzler|      rp   rE   c                    K   |r| j                  |       d{    n(t        j                  t        j                        |_        | j                          d{    y7 F7 w)u6   Delete a nozzle record. Flush only — caller commits.NrH   )r   ry   rF   s      r-   delete_nozzler~      rs   rM   c                   K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                        t        t        j                              j                  t        j                               d{   }t        |j                         j                               S 7 +w)zPReturn all underground tanks for a given SPBU, with kalibrasi and produk loaded.N)r    r   r   r   r/   r   r   r   r   	kalibrasirb   r   namar&   r'   r(   r2   s      r-   get_tangkisr      s     ::v	v~~(&*;*;*?*?*E	F	f../fmm1L	M	&++		 F  $$&''s   B;C+=C)>,C+	tangki_idc                 r  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                        t        t        j                                     d{   }|j                         S 7 w)zGFetch a single tangki by primary key, with kalibrasi and produk loaded.N)r    r   r   r   r   r   r   r   r   r   rb   r1   )r   r   r,   s      r-   get_tangki_by_idr      s|     ::v	vyyI%v'8'8'<'<T'B	C	f../fmm1L	M F
 $$&&rw   c                    K   t        dd|i|}| j                  |       | j                          d{    t        | |j                         d{   S 7 "7 w)uP   Create a new underground tank for the given SPBU. Flush only — caller commits.r/   Nr6   )r   r8   r9   r   r   )r   r/   r:   rc   s       r-   create_tangkir      rl   rm   rc   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    t        | |j                         d{   S 7 "7 w)uJ   Update scalar fields on an existing tangki. Flush only — caller commits.N)r@   rA   r9   r   r   )r   rc   r:   rB   rC   s        r-   update_tangkir      rp   rE   c                    K   |r| j                  |       d{    n(t        j                  t        j                        |_        | j                          d{    y7 F7 w)u6   Delete a tangki record. Flush only — caller commits.NrH   )r   rc   rF   s      r-   delete_tangkir      rs   rM   rowsc                   K   | j                  t        t              j                  t        j                  |k(               d{   }|j                         j                         D ]  }| j                  |       d{     |D cg c]  }t        dd|i| }}| j                  |       | j                          d{    |S 7 7 Mc c}w 7 w)uf   Replace all calibration rows for a tangki (delete-all then insert-all). Flush only — caller commits.Nr   r6   )
r    r   r
   r   r   r'   r(   rI   add_allr9   )r   r   r   existingrowrnew_rowss          r-   replace_kalibrasir     s      ZZ%%o&?&?9&LM H !%%'iin (CGH4a9)9q94HHJJx
((*O 	HsB   ACC
9C>C?
C	C&CCCCCc                   K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                              j                  t        j                               d{   }t        |j                         j                               S 7 +w)zAReturn all tenants for a given SPBU, with their contracts loaded.N)r    r   r   r   r/   r   r   r   r   kontrakr   r   r&   r'   r(   r2   s      r-   get_tenantsr     s     ::v	v~~(&*;*;*?*?*E	F	fnn-	.	&++		 F  $$&''s   B#C%C&,C	tenant_idc                 B  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d            j                  t        t        j                                     d{   }|j                         S 7 w)z<Fetch a single tenant by primary key, with contracts loaded.N)r    r   r   r   r   r   r   r   r   r   r1   )r   r   r,   s      r-   get_tenant_by_idr     so     ::v	vyyI%v'8'8'<'<T'B	C	fnn-	. F
 $$&&r4   c                    K   t        dd|i|}| j                  |       | j                          d{    t        | |j                         d{   S 7 "7 w)uH   Create a new tenant under the given SPBU. Flush only — caller commits.r/   Nr6   )r   r8   r9   r   r   )r   r/   r:   tenants       r-   create_tenantr   (  rl   rm   r   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    t        | |j                         d{   S 7 "7 w)uJ   Update scalar fields on an existing tenant. Flush only — caller commits.N)r@   rA   r9   r   r   )r   r   r:   rB   rC   s        r-   update_tenantr   0  rp   rE   c                    K   |r| j                  |       d{    n(t        j                  t        j                        |_        | j                          d{    y7 F7 w)u6   Delete a tenant record. Flush only — caller commits.NrH   )r   r   rF   s      r-   delete_tenantr   8  rs   rM   
kontrak_idc                    K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d                   d{   }|j                         S 7 w)z-Fetch a single lease contract by primary key.N)r    r   r   r   r   r   r   r1   )r   r   r,   s      r-   get_kontrak_by_idr   A  s_     ::{!!+..J">@V@V@Z@Z[_@`a F $$&&rT   c                    K   t        dd|i|}| j                  |       | j                          d{    | j                  |       d{    |S 7 7 w)uP   Create a new lease contract for the given tenant. Flush only — caller commits.r   Nr6   )r   r8   r9   rV   )r   r   r:   r   s       r-   create_kontrakr   I  sR     8I88GFF7O
((*
**W
N rY   r   c                    K   |j                         D ]  \  }}t        |||        | j                          d{    | j                  |       d{    |S 7 7 w)uR   Update scalar fields on an existing lease contract. Flush only — caller commits.Nr[   )r   r   r:   rB   rC   s        r-   update_kontrakr   R  sU     lln
Ue$ %
((*
**W
N r]   c                    K   |r| j                  |       d{    n(t        j                  t        j                        |_        | j                          d{    y7 F7 w)u>   Delete a lease contract record. Flush only — caller commits.NrH   )r   r   rF   s      r-   delete_kontrakr   [  sJ     ii   %\\(,,7
((* 	! rM   )r   2   N)T);__doc__r   r   
sqlalchemyr   r   sqlalchemy.ext.asyncior   sqlalchemy.ormr   app.models.spbur	   r
   r   r   r   r   r   r   intsettupler&   r.   r3   r>   rD   boolrL   rP   rS   rX   r\   r_   re   rh   rk   ro   rr   rv   rz   r|   r~   r   r   r   r   r   dictr   r   r   r   r   r   r   r   r   r   r6       r-   <module>r      s@   A ' # / ' e e e
  $	//
/ / #ho	/
 4:s?/*' 's 'td{ '	(\ 	( 	((\ ( (D (, d  QU ( ( (U ('l 'c 'edl '< # E <  E <  D TX (, ( (f (
'| 
' 
' 
'1L 13 1V 11L 1& 1v 1L & t W[ '| ' ' '1L 1S 1v 11L 1& 1v 1L & t W[ (, ( (f ('| ' ' '1L 13 1V 11L 1& 1v 1L & t W[ !$,0J	/"(, ( (f ('| ' ' '1L 13 1V 11L 1& 1v 1L & t W[ ' '# '+PTBT '\ c  \ K k \ K d ^b r   