+
    `Øjñ"  ã                   ó   € R t ^ RIHtHt ^ RIHtHt ^ RIHt ^ RIH	t	 ^ RI
HtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHtHt ^ R
IHt R#tR tR R ltR R ltR R ltR R ltR R ltR R ltR R lt R R lt!R R lt"R R lt#R  R! lt$R"# )$up  
Station-to-station hand-over rules.

1. Operator marks work complete at station S  â†’ a hand-over S â†’ next(S) is created.
   - S has QA checksheets  â†’ AWAITING_QA (chassis stays at S for QA)
   - S has no checksheets  â†’ RELEASED (goes straight to the next station's queue)
2. QA passes every mandatory checksheet at S  â†’ QA_PASSED; QA is asked to release it.
3. QA releases it                              â†’ RELEASED; it appears at next(S).
4. Operator checks it in at next(S)            â†’ RECEIVED.
The next station refuses a check-in until the hand-over to it is RELEASED.

next(S) follows the chassis's production BOM: the next active station (by sequence) at
which its BOM snapshot has parts. With no station data in the BOM it is simply the next
station by sequence. Chassis with no hand-over history (already on the floor before this
existed) are not blocked.
)ÚdatetimeÚtimezone)ÚOptionalÚTuple)ÚUUID)ÚHTTPException)ÚselectÚdesc)ÚAsyncSession)ÚStationMaster)ÚChassisBomSnapshot)ÚQaStationTemplateMapÚQaChecksheetInstance)ÚChassisStationHandoffc                  óJ   € \         P                  ! \        P                  4      # )N)r   Únowr   Úutc© ó    Ú?/var/www/html/audi_dev/backend/app/modules/station_work/flow.pyÚ_nowr   !   s   € Ü�<Š<œŸ™Ó%Ð%r   c                ó<   € V ^8„  d   QhR\         R\        R\        /# ©é   ÚdbÚ
station_idÚreturn)r
   r   Úbool)Úformats   "r   Ú__annotate__r   %   s!   € ÷ ñ œ\ð ´tð Äñ r   c              ƒ   óð   "  € V P                  \        \        P                  4      P	                  \        P
                  V8H  4      P                  ^4      4      G Rj  x€L
 P                  4       pVRJ#  L5i)é   N)Úexecuter   r   Úmap_idÚwherer   ÚlimitÚfirst)r   r   Úfounds   && r   Ústation_has_qar(   %   sg   é € Ø—:‘:ÜÔ#×*Ñ*Ó+×1Ñ1Ô2F×2QÑ2QÐU_Ñ2_Ó`×fÑfÐghÓió÷ ç�uƒwð 
ð ˜ÐÐñùs   ‚AA6ÁA4ÁA6c          	      ó^   € V ^8„  d   QhR\         R\        R\        R\        \        ,          /# ©r   r   Ú
chassis_idÚstationr   )r
   r   r   r   )r   s   "r   r   r   ,   s5   € ÷ Eñ Eœ<ð E´Tð EÄMð EÔV^Ô_lÕVmñ Er   c              ƒ   óÂ  "  € VP                   f   R # \        \        4      P                  \        P                  R8H  \        P                   VP                   8„  4      P                  \        P                   4      pV P                  \        \        P                  4      P                  \        P                  V8H  \        P                  P                  R 4      4      P                  4       4      G R j  x€L
 P                  4       P                  4       pV'       d{   V P                  VP                  \        P                  P                  V4      4      P                  ^4      4      G R j  x€L
 P                  4       P!                  4       pV'       d   V# V P                  VP                  ^4      4      G R j  x€L
 P                  4       P!                  4       #  Læ Lp L$5i)NT)Úsequence_nor   r   r$   Ú	is_activeÚorder_byr"   r   r   r+   ÚisnotÚdistinctÚscalarsÚallÚin_r%   r&   )r   r+   r,   Ú
candidatesÚbom_stationsÚnxts   &&&   r   Únext_stationr9   ,   sb  é € Ø×ÑÒ"ÙÜœÓ&×,Ñ,Ü×Ñ 4Ñ'Ü×!Ñ! G×$7Ñ$7Ñ7ó÷ �hŒ}×(Ñ(Ó)ð ð
 Ÿ*™*ÜÔ!×,Ñ,Ó-×3Ñ3Ü×)Ñ)¨ZÑ7Ô9K×9VÑ9V×9\Ñ9\Ð]aÓ9bó	
ç
‰(‹*ó÷ ÷ �wƒy—‘“ð	 ÷
 Ø—Z‘Z 
× 0Ñ 0´×1IÑ1I×1MÑ1MÈlÓ1[Ó \× bÑ bÐcdÓ eÓf×f×oÑoÓq×wÑwÓyˆßØˆJØ—*‘*˜Z×-Ñ-¨aÓ0Ó1×1×:Ñ:Ó<×BÑBÓDÐDññ gñ 2ùsC   ‚C0GÃ2GÃ3'GÄAGÅ*GÅ+'GÆ%GÆ8GÆ9!GÇGÇGc                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# )r   r   r+   r   ©r
   r   r   r   )r   s   "r   r   r   @   s'   € ÷ ñ œ\ð ´tð ÄÔI^Õ@_ñ r   c              ƒ   ó`  "  € V P                  \        \        4      P                  \        P                  V8H  \        P
                  R 8g  4      P                  \        \        P                  4      4      P                  ^4      4      G Rj  x€L
 P                  4       P                  4       #  L 5i)Ú
SUPERSEDEDN)r"   r   r   r$   r+   Ústatusr0   r	   Úcompleted_atr%   r3   r&   )r   r+   s   &&r   Úlatest_handoffr@   @   s   é € Ø—*‘*ÜÔ$Ó%×+Ñ+Ü!×,Ñ,°
Ñ:Ü!×(Ñ(¨LÑ8ó	
÷ ‰(”4Ô-×:Ñ:Ó;Ó
<¿U¹UÀ1»Xó	÷ ÷
 �wƒy—‘“ðñ ùs   ‚B	B.ÂB,Â!B.c                óR   € V ^8„  d   QhR\         R\        \        ,          R\        /# r   )r
   r   r   Ústr)r   s   "r   r   r   I   s%   € ÷ 8ñ 8œ<ð 8´X¼dµ^ð 8Ìñ 8r   c              ƒ   óŠ   "  € V'       g   R # V P                  \        V4      G Rj  x€L
 pV'       d   VP                  # R#  L5i)zend of lineNzanother station)Úgetr   Ústation_name)r   r   Ústs   && r   rE   rE   I   s5   é € ßÙØ�v‰v”m ZÓ0×	0€Bß ˆ2�?‰?Ð7Ð&7Ð7ñ 
1ùs   ‚$A¦A§A³Ac          	      ó^   € V ^8„  d   QhR\         R\        R\        R\        \        ,          /# r*   )r
   r   r   r   r   )r   s   "r   r   r   P   s/   € ÷ ñ œLð ´dð Ä]ð ÔW_Ô`uÕWvñ r   c              ƒ  óB  "  € \        W4      G Rj  x€L
 pVe   VP                  R8X  d   R# VP                  VP                  8X  d   VP                  R9   d   R# VP                  R9   d.   \	        WP                  4      G Rj  x€L
 p\        RRV R24      hV#  L‰ L5i)z]Raise 409 if the chassis may not be checked in at `station`; return the hand-over it fulfils.NÚRECEIVEDi™  z4Not released yet: this chassis is waiting for QA at Ú.)ÚAWAITING_QAÚ	QA_PASSED)r@   r>   Úfrom_station_idr   rE   r   )r   r+   r,   Úhr$   s   &&&  r   Úcheck_arrivalrO   P   s‘   é € ä˜RÓ,×,€AØ‚y�A—H‘H 
Ô*ÙØ×Ñ˜G×.Ñ.Ô.°1·8±8Ð?[Ô3[ÙØ‡x�xÐ/Ô/Ü" 2×'8Ñ'8Ó9×9ˆÜ˜CÐ#WÐX]ÐW^Ð^_Ð!`ÓaÐaà€Hñ 	-ñ :ùs"   ‚B‘B’A2BÂBÂBÂBc                óJ   € V ^8„  d   QhR\         R\        \        ,          RR/# )r   r   Úhandoffr   N)r
   r   r   )r   s   "r   r   r   ^   s(   € ÷ %ñ %œLð %´8Ô<QÕ3Rð %ÐW[ñ %r   c              ƒ   óF   "  € Ve   RVn         \        4       Vn        R # R # 5i)NrI   )r>   r   Úreceived_at)r   rQ   s   &&r   Úmark_receivedrT   ^   s!   é € ØÒØ#ˆŒÜ"›fˆÖñ ùs   ‚!c          
      óT   € V ^8„  d   QhR\         R\        R\        R\        R\        /# )r   r   r+   r,   Úuser_idr   )r
   r   r   r   )r   s   "r   r   r   d   s1   € ÷ ñ œLð ´dð Ä]ð Ô]að Ôf{ñ r   c              ƒ   óº  "  € V P                  \        \        4      P                  \        P                  V8H  \        P
                  VP                  8H  \        P                  P                  \        4      4      4      G R j  x€L
 P                  4       P                  4       pV F
  pRVn        K  	  \        WV4      G R j  x€L
 p\        WP                  4      G R j  x€L
 p\        YP                  V'       d   VP                  MR V'       d   RMRT\        4       V'       d   R M	\        4       V'       d   R MTR7      pV P                  V4       V#  LÒ L” Ly5i)Nr=   rK   ÚRELEASED©r+   rM   Úto_station_idr>   Úcompleted_byr?   Úreleased_atÚreleased_by)r"   r   r   r$   r+   rM   r   r>   r5   ÚOPEN_STATUSESr3   r4   r9   r(   r   Úadd)	r   r+   r,   rV   Ú	open_hererN   r8   Úneeds_qarQ   s	   &&&&     r   Úon_completionrb   d   s  é € à—z‘z¤&Ô)>Ó"?×"EÑ"EÜ×(Ñ(¨JÑ6Ü×-Ñ-°×1CÑ1CÑCÜ×$Ñ$×(Ñ(¬Ó7ó#ó ÷ ÷ 	‰‹	—#‘#“%ð	 ó
 ˆØˆŽñ ô ˜R¨WÓ5×
5€CÜ# B×(:Ñ(:Ó;×;€HÜ#Ø×/AÑ/Aß(+�c—n’n°ß (‰}¨jØ¬4«6ß$‘D¬$«&Çh¹dÐT[ô€Gð ‡F�Fˆ7„OØ€Nñ%ñ 6Ù;ùsB   ‚B EÂEÂ?EÃEÃEÃEÃ 0EÄ'EÄ9EÅEÅEc          	      ó^   € V ^8„  d   QhR\         R\        R\        R\        \        ,          /# ©r   r   r+   r   r   r;   )r   s   "r   r   r   {   s5   € ÷ Vñ V¤ð V¼$ð VÌDð VÔU]Ô^sÕUtñ Vr   c           	   ƒ   óœ  "  € V P                  \        \        4      P                  \        P                  V8H  \        P
                  V8H  \        P                  P                  R4      4      P                  \        \        P                  4      4      P                  ^4      4      G Rj  x€L
 P                  4       P                  4       #  L 5i)rK   N©rK   rL   rX   )r"   r   r   r$   r+   rM   r>   r5   r0   r	   r?   r%   r3   r&   )r   r+   r   s   &&&r   Úopen_handoff_fromrg   {   s™   é € Ø—*‘*œVÔ$9Ó:×@Ñ@Ü×(Ñ(¨JÑ6Ü×-Ñ-°Ñ;Ü×$Ñ$×(Ñ(Ð)QÓRó÷ �hŒtÔ)×6Ñ6Ó7Ó8¿¹¸q»ó	C÷ C÷ ELÁGÃIÏeÉeËgð	Vñ Cùs   ‚B'CÂ)C
Â*!Cc                ój   € V ^8„  d   QhR\         R\        R\        R\        R\        \        ,          /# )r   r   r+   r   Ú
all_passedr   )r
   r   r   r   r   )r   s   "r   r   r   ƒ   s?   € ÷ ñ œ\ð ´tð Ìð Ô[_ð Ôdlô  nCõ  eDñ r   c              ƒ  ón  "  € \        WV4      G Rj  x€L
 pVe   V'       d   RMRVn        V# V'       dx   V P                  \        V4      G Rj  x€L
 pV'       dR   \	        WV4      G Rj  x€L
 p\        TTV'       d   VP                  MRR\        4       R7      pV P                  V4       V#  Lœ La LG5i)zZAfter a QA sign-off: QA_PASSED when everything mandatory passed, else back to AWAITING_QA.NrL   rK   )r+   rM   rZ   r>   r?   )	rg   r>   rD   r   r9   r   r   r   r_   )r   r+   r   ri   rN   rF   r8   s   &&&&   r   Úset_qa_outcomerk   ƒ   s—   é € ä °
Ó;×;€AØ‚}ß",‘;°-ˆŒð €H÷ 
Ø—6‘6œ-¨Ó4×4ˆßÜ$ R°RÓ8×8ˆCÜ%Ø%Ø *ß03˜cŸnšn¸Ø"Ü!›VôˆAð �F‰F�1ŒIØ€Hñ 	<ñ 5á8ùsD   ‚B5’B/“B5£B5¶B5ÁB1ÁB5ÁB5Á+B3Á,AB5Â1B5Â3B5c                ó˜   € V ^8„  d   QhR\         R\        R\        R\        R\        \        ,          R\        \
        \        3,          /# )r   r   r+   r   rV   Úremarksr   )r
   r   r   rB   r   r   )r   s   "r   r   r   —   s[   € ÷ 6ñ 6”lð 6´ð 6Ä$ð 6ÔQUð 6Ô`hÔilÕ`mð 6Ôrwô  yNô  PSð  ySõ  sTñ 6r   c              ƒ   óæ  "  € \        WV4      G R j  x€L
 pV P                  \        V4      G R j  x€L
 pVfh   V'       d   \        WV4      G R j  x€L
 MR p\	        TTV'       d   VP
                  MR RV\        4       \        4       VR7      pV P                  V4       MRVn        \        4       Vn	        W5n
        V'       d   WEn        T\        WP                  4      G R j  x€L
 3#  LÖ Lº Lœ L5i)NrX   rY   )rg   rD   r   r9   r   r   r   r_   r>   r\   r]   rm   rE   rZ   )r   r+   r   rV   rm   rN   rF   r8   s   &&&&&   r   Úreleasero   —   sÁ   é € Ü °
Ó;×;€AØ�v‰v”m ZÓ0×	0€BØ‚yß8:”L °Ó4×4Ð4ÀˆÜ!Ø!Ø&ß,/˜#Ÿ.š.°TØØ Ü›Ü›Øô	
ˆð 	�‰ˆq�	àˆŒÜ›ˆŒØŒßØŒ	Ø”L §_¡_Ó5×5Ð5Ð5ñ+ 	<Ù	0á4ñ$ 6ùsP   ‚C1’C)“C1°C+±C1ÁC1ÁC-ÁA2C1ÃC1Ã#C/Ã$C1Ã+C1Ã-C1Ã/C1c          
      ój   € V ^8„  d   QhR\         R\        R\        R\        \        \        3,          /# rd   )r
   r   r   r   rB   )r   s   "r   r   r   °   s<   € ÷ añ a¤|ð aÄð aÔSWð aÔ\aÔbfÔhkÐbkÕ\lñ ar   c              ƒ  óÞ  "  € V P                  \        V4      G Rj  x€L
 pV'       d   VP                  '       g   R# \        W4      G Rj  x€L
 pV'       g   R# \	        WV4      G Rj  x€L
 pV'       d   VP
                  R	9   d   R
# V P                  \        \        4      P                  \        P                  V8H  \        P                  V8H  4      4      G Rj  x€L
 P                  4       P                  4       pV'       g   RRVP                   23# \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   R# RRVP                   23#  ELG EL Lÿ LŽ5i)z�
Check if a station requires QA clearance before 'Chassis Out' or downstream 'Chassis In'.
Returns (cleared: bool, reason: str).
NTFz(QA inspection has not been completed at c              3   ól   "  € T F*  qP                   R 8H  ;'       g    VP                  R 8H  x € K,  	  R# 5i)ÚPASSEDN)Úoverall_resultÚstation_qa_status)Ú.0Úinsts   & r   Ú	<genexpr>Ú+is_qa_cleared_at_station.<locals>.<genexpr>Ì   s2   é € Ð
gÑ]fÐUY×Ñ (Ñ*×PÐP¨d×.DÑ.DÈÑ.PÔPÓ]fùs   ‚4œ4z5QA clearance for Chassis Out has not been granted at )TzStation does not require QA)Tz#No QA checksheets mapped to station)rL   rX   )TzQA clearance granted)TzAll QA checksheets passed)rD   r   Úrequires_qar(   rg   r>   r"   r   r   r$   r+   r   r3   r4   rE   )r   r+   r   r,   Úhas_qarN   Ú	instancess   &&&    r   Úis_qa_cleared_at_stationr}   °   s7  é € ð
 —F‘Fœ=¨*Ó5×5€Gß˜'×-×-Ð-Ø2Ð2ä! "Ó1×1€FßØ:Ð:ô   °
Ó;×;€AßˆQ�X‰XÐ2Ô2Ø+Ð+ð —z‘zÜÔ#Ó$×*Ñ*Ü ×+Ñ+¨zÑ9Ü ×+Ñ+¨zÑ9ó	
ó÷ ÷
 �wƒy—‘“ð ÷ ØÐ@À×AUÑAUÐ@VÐWÐWÐWç
ƒsÑ
gÑ]fÓ
g‡s‡s‚sÑ
gÑ]fÓ
g×gÒgØ0Ð0àÐIÈ'×J^ÑJ^ÐI_Ð`Ð`Ð`ò5 6ò 2ñ
 	<ñ
ùst   ‚E-œE#�E-©E-»E-ÁE&ÁE-ÁE-Á)E)Á*E-Á6A&E-ÃE+Ã'E-ÄE-Ä!E-Ä5E-ÅE-Å&E-Å)E-Å+E-Nrf   )%Ú__doc__r   r   Útypingr   r   Úuuidr   Úfastapir   Ú
sqlalchemyr   r	   Úsqlalchemy.ext.asyncior
   Úapp.models.rm_modelsr   Úapp.models.procurement_modelsr   Úapp.models.qa_modelsr   r   Úapp.models.station_work_modelsr   r^   r   r(   r9   r@   rE   rO   rT   rb   rg   rk   ro   r}   r   r   r   Ú<module>rˆ      sn   ðñ÷  (ß "Ý å !ß #Ý /å .Ý <ß KÝ @à8€ò&õõEõ(õ8õõ%õõ.Võõ(6÷2ar   