
    ]ik                        d Z ddlmZ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 ddlmZ ddlmZmZmZ 	 dd	e
d
ededeee   ef   fdZd	e
dedefdZ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e   fdZy)uV   Product service — business logic for the global product catalogue and price history.    )date	timedelta)Decimal)IntegrityErrorSQLAlchemyError)AsyncSession)ProdukProdukHarga)product_repository)ProdukCreateProdukHargaCreateProdukUpdatedbskiplimitreturnc                 d  K   t        j                  | ||       d{   \  }}t        j                         }t        j                  | |D cg c]  }|j
                   c}|       d{   }|D cg c]  }|j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j
                  |v r||j
                     j                  nd|j
                  |v r||j
                     j                  ndd	 }}||fS 7 c c}w 7 c c}w w)zMList all products with their current price (single bulk price query, no N+1).N)	idnamakodejenis
is_subsidikuota_config	is_activeharga_saat_iniberlaku_sejak)r   get_allr   todayget_current_harga_bulkr   r   r   r   r   r   r   hargaberlaku_mulai)	r   r   r   produk_listtotalr   p	harga_mapresultss	            >/var/www/html/spbu.com/backend/app/services/product_service.pylist_productsr(      s      299"dEJJKJJLE(??
;';aQTT;' I  A $$FFFFWW,,NN78tty7Hio33d>?ddi>OYqtt_::UY
	
    E>) K (s@   D0D!/D0D$
 D0+D),D04B'D+D0$D0+D0datac                 
  K   |j                   }|j                  xs t        j                         }|j	                  ddh      }	 t        j                  | fi | d{   }|*t        j                  | |j                  ||       d{    | j                          d{    |S 7 J7  7 
# t        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)zBCreate a new product, optionally inserting an initial price entry.
harga_awalr!   )excludeN"Data produk konflik atau sudah ada)r+   r!   r   r   
model_dumpr   createcreate_hargar   commitr   rollback
ValueErrorr   )r   r)   r+   r!   produk_dataproduks         r'   create_productr6   )   s     J&&6$**,M//<*I/JK)00C{CC!$11"fii][[[iik	 D[ ?kkm=>> kkmsl   ADB0 B* +B0 B,B0 #B.$B0 )D*B0 ,B0 .B0 0D C+D 8C;9D  D	produk_idc                 h   K   t        j                  | |       d{   }|st        d      |S 7 w)z8Return a product by ID, raising ValueError if not found.NzProduk tidak ditemukan)r   	get_by_idr3   )r   r7   r5   s      r'   get_productr:   <   s4     %//I>>F122M ?s   202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 fields on a product.NT)exclude_noner-   )	r:   r.   r   updater1   r   r2   r3   r   )r   r7   r)   r5   update_dataresults         r'   update_productr@   D   s      r9--F//t/4K	)00VK{KKiik . L ?kkm=>> kkmsb   B<A#B<A) A%A) A'A) "B<%A) 'A) )B9B+B91B42B99B<c                   K   t        | |       d{    |j                  t        d      z
  }	 t        j                  | ||       d{    t        j
                  | ||j                  |j                         d{   }| j                          d{    |S 7 7 T7 "7 # t        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)zAdd a new price entry for a product.

    Atomically closes the current open price (berlaku_sampai = new_date - 1 day via flush),
    then inserts the new price and commits both changes in one transaction.
    N   )daysz!Data harga konflik atau sudah ada)r:   r!   r   r   close_current_hargar0   r    r1   r   r2   r3   r   )r   r7   r)   berlaku_sampair?   s        r'   	add_hargarF   V   s      b)
$$$'')*;;N 44RNSSS)66r9djjRVRdRdeeiik % 	Te >kkm<== kkmst   C9BC9B& B 3B& ?B" B& B$B& C9 B& "B& $B& &C6C+C6.C1/C66C9c                 v   K   t        | |       d{    t        j                  | |       d{   S 7 "7 w)z,Return the full price history for a product.N)r:   r   get_harga_history)r   r7   s     r'   rH   rH   n   s7      b)
$$$#55b)DDD %Ds   959799N)r   2   )__doc__datetimer   r   decimalr   sqlalchemy.excr   r   sqlalchemy.ext.asyncior   app.models.productr	   r
   app.repositoriesr   app.schemas.productr   r   r   inttuplelistdictr(   r6   r:   r@   rF   rH        r'   <module>rX      s    \ $  : / 2 / M M 35,/
4:s?6\  & &, 3 6 !$,8$!$,=0EE!$E	+ErW   