
    ]i                        d Z ddl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 ddlmZ ddlmZmZ ddlmZ  ed	d
g      Zdeez  defdZej3                  de       ed       edd       edd       eddd       ee
       ee      fdededz  dedz  dededed edefd!       Zej=                  deej>                  "       ee
       ee      fded#eded edef
d$       Z ej3                  d%e       ee
       ee      fded&eded edef
d'       Z!ejE                  d(e       ee
       ee      fded&ed#eded edefd)       Z#y)*z/Router for End-to-End reconciliation endpoints.    )	APIRouterDependsHTTPExceptionQuerystatus)AsyncSession)get_db)get_current_userget_spbu_access)User)EndToEndCloseEndToEndCreate)end_to_end_servicez/spbus/{spbu_id}/end-to-endrekonsiliasi)prefixtagsereturnc                     t        | t              r$t        t        j                  t        |             S t        t        j                  t        |             S )uE   Convert service-layer ValueError → 400 and PermissionError → 403.)status_codedetail)
isinstancePermissionErrorr   r   HTTP_403_FORBIDDENstrHTTP_400_BAD_REQUEST)r   s    8/var/www/html/spbu.com/backend/app/routers/end_to_end.py_service_errorr      s:    !_%)B)B3q6RRV%@%@QPP     )response_modelN)defaultr   )r"   alias)r"   ge2         )r"   r$   lespbu_id	tangki_idstatus_filterskiplimitdbcurrent_userc                    K   	 t        j                  || ||||       d{   \  }}|D 
cg c]  }
|
j                          c}
|||z  dz   |ddS 7 2# t        t        f$ r}	t	        |	      d}	~	ww xY wc c}
w w)zFList E2E cycles for an SPBU, optionally filtered by tangki and status.)r*   r   r,   r-   Nr&   )totalpageper_page)datameta)r   list_cycles
ValueErrorr   r   
model_dump)r)   r*   r+   r,   r-   r.   r/   rowsr1   r   rs              r   r6   r6      s      .::9]U
 
e *..A.):N 
 (  Q  /sB   A>A AA A>A9A>A A6&A11A66A>)r!   r   r4   c                    K   	 t        j                  || |j                  |       d{   }|j                         ddS 7 # t        t        f$ r}t        |      d}~ww xY ww)zLStart a new E2E cycle for a tank. Tank must not have an existing open cycle.Nz"Siklus End-to-End berhasil dimulair4   message)r   start_cycleidr7   r   r   r8   )r)   r4   r.   r/   cycler   s         r   r>   r>   1   se      (44R,//SWXX $$&3WXX Y(  Q s7   A%%A AA A%A A"AA""A%z/{cycle_id}cycle_idc                    K   	 t        j                  || |       d{   }d|j                         iS 7 # t        t        f$ r}t	        |      d}~ww xY ww)zDGet detail of an E2E cycle. Open cycles include live running totals.Nr4   )r   get_cycle_detailr7   r   r   r8   )r)   rA   r.   r/   r   r   s         r   rC   rC   @   s]      )::2wQQ F%%'(( R(  Q s1   A7 57 A7 AAAAz/{cycle_id}/closec                    K   	 t        j                  || ||j                  |       d{   }|j                         ddS 7 # t        t        f$ r}t        |      d}~ww xY ww)zEClose an open E2E cycle. Freezes totals and calculates actual losses.Nz"Siklus End-to-End berhasil ditutupr<   )r   close_cycler?   r7   r   r   r8   )r)   rA   r4   r.   r/   r   r   s          r   rE   rE   O   sl      )55<??D
 

 %%'4XYY
 (  Q s7   A&&A AA A&A A#AA##A&)$__doc__fastapir   r   r   r   r   sqlalchemy.ext.asyncior   app.core.databaser	   app.dependenciesr
   r   app.models.userr   app.schemas.end_to_endr   r   app.servicesr   routerr7   r   r   getdictintr   r6   postHTTP_201_CREATEDr>   rC   patchrE    r   r   <module>rV      s?   5 D D / $ >   @ +	(
	
Qj?2 Q} Q Bt$ "$/ %d( CaA&raC0v 1Tz : 	
  	  
 %. R&2I2IJ v 1	YY
Y 	Y 	Y
 
Y KY M$/ v 1	))) 	) 	)
 
) 0) !$7
 v 1ZZZ Z 		Z
 Z 
Z 8Zr   