
    ]id                        d Z ddlmZmZ ddl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 ddlmZ 	 	 	 	 	 d$d	ed
ededz  dedz  dededeee   ef   fdZd	eded
ededz  fdZd	ed
ededee   def
dZd	ededee   defdZ	 	 	 	 d%d	ededededz  dedz  dedz  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z  fd!Zd	ededededz  fd"Zd	ed
edee   fd#Z y)&uW   Stock adjustment repository — DB queries for StockAdjustment and StockAdjustmentItem.    )datetimetimezone)deletefuncselect)AsyncSession)selectinload)StockAdjustmentStockAdjustmentItemStockAdjustmentItemFotoStatusLaporan)TangkiNdbspbu_idshift_idstatusskiplimitreturnc           	        K   t        t              j                  t        j                  |k(        j	                  t        t        j                        t        t        j                        t        t        j                        t        t        j                        t        t        j                              j                  t        j                  j                         t        j                  j                               }|"|j                  t        j                  |k(        }|"|j                  t        j                  |k(        }|"|j                  t        j                   |k(        }| j#                  t        t%        j&                               j)                  |j+                                      d{   }|j-                         }	| j#                  |j/                  |      j1                  |             d{   }
t3        |
j5                         j7                         j9                               |	fS 7 7 =w)z;Fetch paginated StockAdjustment rows with shift/user joins.N)r   r
   wherer   optionsr	   shiftsubmitted_byreviewed_byrecalled_byitemsorder_bytanggaldescidr   r   executer   countselect_fromsubquery
scalar_oneoffsetr   listscalarsuniqueall)r   r   r   r   r   r   r   querycount_qtotalresults              C/var/www/html/spbu.com/backend/app/repositories/stock_repository.pyget_allr1      s     		&&'1	2	../556445445../

 
/))..0/2D2D2I2I2K	L 
 O33w>?O44@AO22f<=JJvdjjl3??@PQRRG E::ell4066u=>>F '')--/0%77	 S ?s%   F6H?8H;9AH??H= <H?=H?adj_idc                   K   | j                  t        t              j                  t        j                  |k(  t        j
                  |k(        j                  t        t        j                        t        t        j                        t        t        j                        t        t        j                        t        t        j                        j                  t        t        j                        j                  t        j                         t        t        j"                                           d{   }|j%                         S 7 w)uZ   Fetch a single StockAdjustment by PK and SPBU, eagerly loading items with tangki→produk.N)r"   r   r
   r   r!   r   r   r	   r   r   r   r   r   r   tangkir   produkfotosscalar_one_or_none)r   r2   r   r/   s       r0   	get_by_idr8   1   s      ::	!!V+_-D-D-O	P	../556445445../770778EEfmmT0667	

 F $$&&s   D5E7E8Er   c                 j  K   t        |||t        j                        }| j                  |       | j	                          d{    |D ](  }| j                  t        dd|j                  i|       * | j	                          d{    t        | |j                  |       d{   S 7 h7 %7 w)zSInsert a new StockAdjustment together with its StockAdjustmentItem rows atomically.)r   r   r   r   Nstock_adjustment_id )r
   r   DRAFTaddflushr   r!   r8   )r   r   r   r   r   adjitems          r0   createrA   F   s      ""	C FF3K
((*
"FsvvFFG 
((*2svvw///	  /s7   AB3B-AB3	B/
B3(B1)B3/B31B3r?   c                   K   | j                  t        t              j                  t        j                  |j
                  k(               d{    |D ](  }| j                  t        dd|j
                  i|       * | j                          d{    t        | |j
                  |j                         d{   S 7 r7 /7 w)zWReplace all StockAdjustmentItem rows for an adjustment atomically (delete-then-insert).Nr:   r;   )
r"   r   r   r   r:   r!   r=   r>   r8   r   )r   r?   r   r@   s       r0   update_itemsrC   \   s      **"#))*=*Q*QUXU[U[*[\   
"FsvvFFG 
((*2svvs{{333
 3s7   ACCACC(C<C=CCCuser_idcatatanunlock_reasonrecallc                 X  K   t        j                  t        j                        }||_        |t
        j                  k(  r|||_        ||_        ny|t
        j                  t
        j                  fv r|||_        ||_        |E||_        n=|t
        j                  k(  r*|r|||_        ||_        d|_        d|_        n	|||_        | j%                          d{    | j'                  |       d{    t)        | |j*                  |j,                         d{   S 7 F7 /7 w)zJTransition the status of a StockAdjustment, setting relevant audit fields.N)r   nowr   utcr   r   	SUBMITTEDsubmitted_by_idsubmitted_atAPPROVEDREJECTEDreviewed_by_idreviewed_atcatatan_reviewr<   recalled_by_idrecalled_atrF   r>   refreshr8   r!   r   )r   r?   r   rD   rE   rF   rG   rI   s           r0   update_statusrV   i   s	     ,,x||
$CCJ(((W-@%	M**M,B,BC	CH[$!(C	=&&	&g)!(C!CO"&C#C& -C
((*
**S/2svvs{{333 3s6   CD*D$D*6D&7(D*D( D*&D*(D*item_idtipeurlc                    K   t        |||      }| j                  |       | j                          d{    | j                  |       d{    |S 7 7 w)z(Attach a photo to a StockAdjustmentItem.)stock_adjustment_item_idrX   rY   N)r   r=   r>   rU   )r   rW   rX   rY   fotos        r0   add_item_fotor]      sW      #!(D
 FF4L
((*
**T
K s!   3AAAAAAfoto_idc                 R  K   | j                  t        t              j                  t        j                  |k(  t        j
                  |k(               d{   }|j                         }|y| j                  |       d{    | j                          d{    |S 7 J7  7 
w)z[Delete a photo by PK, verifying it belongs to the given item. Returns deleted foto or None.N)	r"   r   r   r   r!   r[   r7   r   r>   )r   r^   rW   r/   r\   s        r0   delete_item_fotor`      s      ::&'--#&&'1#<<G	
 F $$&D|
))D/
((*K s6   AB'B!+B'B#B'B%B'#B'%B'c                 *  K   | j                  t        t              j                  t        j                  |k(  t        j
                  |k(        j                  t        t        j                                     d{   }|j                         S 7 w)zWFetch a single StockAdjustmentItem by PK, verifying it belongs to the given adjustment.N)
r"   r   r   r   r!   r:   r   r	   r6   r7   )r   rW   r2   r/   s       r0   get_item_by_idrb      sx      ::"#	""g-33v=

 
1778	9 F $$&&s   A:B<B=Bc                 @  K   | j                  t        t              j                  t        j                  |k(  t        j
                  j                  d      t        j                  j                  d            j                  t        t        j                              j                  t        j                               d{   }t        |j                         j                               }g }|D ]  }| j                  t        t               j#                  t$        t         j&                  t$        j(                  k(        j                  t         j*                  |j(                  k(  t$        j,                  j/                  t0        j2                  t0        j4                  g            j                  t$        j6                  j9                         t$        j(                  j9                               j;                  d             d{   }|j=                         }|j?                  |j(                  |j                  |j                  r|j                  j                  nd|j@                  |r|jB                  nd|r|jD                  nd|du d        |S 7 7 w)z
    Return last known StockAdjustmentItem per active tank in an SPBU.
    Used to pre-fill the sounding form with last known readings.
    TN    )	tangki_idtangki_namaproduk_namakapasitas_literlast_volume_finallast_dipstick_digital_mmis_first_time)#r"   r   r   r   r   	is_activeis_
deleted_atr   r	   r5   r   namar(   r)   r+   r   joinr
   r:   r!   rf   r   in_r   rN   LOCKEDr   r    r   r7   appendri   volume_final_literdipstick_digital_mm)r   r   tanks_resulttanksrowsr4   item_result	last_items           r0   get_stock_initr|      s     v	NNg%  &!!$'


 
fmm,	-	&++		 	L %%'++-.EDJJ&'T/#6#J#JoN`N`#`aU#--:&&**M,B,BMDXDX+YZ Xo--224o6H6H6M6M6OPU1X	
 	
  224	!;;176==--B%55AJ!=!=PTIR	(E(EX\&$.
 	 . KI		
s&   CJJEJJ	BJJ)NNNr      )NNNF)!__doc__r   r   
sqlalchemyr   r   r   sqlalchemy.ext.asyncior   sqlalchemy.ormr	   app.models.operationalr
   r   r   r   app.models.spbur   inttupler(   r1   r8   dictrA   rC   strboolrV   r]   r`   rb   r|   r;       r0   <module>r      s4   ] ' + + / ' o o " #'!8!8!8 Dj	!8
 D !8 !8 !8 4 #%&!8H''!',/'t'*000 0
 :0 0,
4
4*
437:
4
4"  $ 4 4	 4  4 4Z	 4
 4Z 4 : 4  4  4F  
	
 $  t#	(''' ' 4	'"*\ *C *DJ *r   