+
    `Øj(  ã                   ó¬  € R t ^ RIHtHt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 ^RIHtHt ^ R	IHt ]! 4       t]P1                  R
]P2                  R7      ]! ]4      ]! ]4      3R R ll4       t]P7                  R]P8                  R7      ]! ]4      ]! ]4      3R R ll4       t]P7                  R]]P<                  ,          R7      ]! ]4      ]! ]4      3R R ll4       t]P7                  R]]P@                  ,          R7      ]! ]4      ]! ]4      3R R ll4       t!]P1                  R4      ]! ]4      ]! ]4      3R R ll4       t"]P1                  R]PF                  ^ÉR7      ]! ]4      ]! ]4      3R R ll4       t$]PK                  R]PF                  R7      ]! ]4      ]! ]4      3R R  ll4       t&]P7                  R]]PF                  ,          R7      ]! R!R"R#7      ]! ]4      ]! ]4      3R$ R% ll4       t']P7                  R&]PP                  R7      ]! ]4      ]! ]4      3R' R( ll4       t)]P7                  R)]]PT                  ,          R7      ]! ]4      ]! ]4      3R* R+ ll4       t+]P1                  R)]PT                  ^ÉR7      ]! ]4      ]! ]4      3R, R- ll4       t,]PK                  R.]PT                  R7      ]! ]4      ]! ]4      3R/ R0 ll4       t-]P]                  R.^ÌR17      ]! ]4      ]! ]4      3R2 R3 ll4       t/]P7                  R4]]P`                  ,          R7      ]! ]4      ]! ]4      3R5 R6 ll4       t1R!# )7z!
Production Tracking API routes.
)Ú	APIRouterÚDependsÚQuery©ÚAsyncSession)ÚListÚOptional)ÚUUID)Úget_db)Úget_current_user)Ú
LoginUsers)ÚschemasÚservice)Úensure_station_accessz/scan)Úresponse_modelc                óP   € V ^8„  d   QhR\         P                  R\        R\        /# ©é   ÚreqÚdbÚuser)r   ÚScanRequestr   r   )Úformats   "Ú?/var/www/html/audi_dev/backend/app/modules/production/routes.pyÚ__annotate__r      s,   € ÷ =ñ =Ü	×	Ñ	ð=äð=ô ñ=ó    c              ƒ  ó¢   "  € \        WV P                  R4      G Rj  x€L
  \        P                  ! WVP                  4      G Rj  x€L
 #  L- L5i)uD   Scan chassis QR at a station â€” auto-detects ARRIVAL or COMPLETION.ÚOPERATORN)r   Ú
station_idr   Úscan_chassisÚuser_id©r   r   r   s   &&&r   r   r      s@   é € ô   ¨#¯.©.¸*Ó
E×EÐEÜ×%Ò% b¨t¯|©|Ó<×<Ð<ñ FÙ<ùs!   ‚A�Až(AÁAÁAÁAz
/dashboardc                ó$   € V ^8„  d   QhR\         /# ©r   r   r   )r   s   "r   r   r   !   s   € ÷ +ñ +Üñ+r   c              ƒ  óJ   "  € \         P                  ! V 4      G Rj  x€L
 #  L5i)zFProduction manager dashboard with KPIs, station pipeline, live timers.N)r   Úget_dashboard©r   Ú_s   &&r   r%   r%       s   é € ô ×&Ò& rÓ*×*Ð*Ñ*ùó   ‚#œ!�#z/chassis/{chassis_no}/timelinec                ó0   € V ^8„  d   QhR\         R\        /# )r   Ú
chassis_nor   )Ústrr   )r   s   "r   r   r   +   s   € ÷ >ñ >Üð>äñ>r   c              ƒ  óJ   "  € \         P                  ! W4      G Rj  x€L
 #  L5i)z,Full station journey for a specific chassis.N)r   Úget_chassis_timeline)r*   r   r'   s   &&&r   Úget_timeliner.   *   s   é € ô ×-Ò-¨bÓ=×=Ð=Ñ=ùr(   z/overduec                ó$   € V ^8„  d   QhR\         /# r#   r   )r   s   "r   r   r   6   s   € ÷ 1ñ 1Üñ1r   c              ƒ  óJ   "  € \         P                  ! V 4      G Rj  x€L
 #  L5i)z<All chassis currently exceeding cycle time at their station.N)r   Úget_overdue_chassisr&   s   &&r   Úget_overduer2   5   s   é € ô ×,Ò,¨RÓ0×0Ð0Ñ0ùr(   z/delay/{log_id}c                ó\   € V ^8„  d   QhR\         R\        P                  R\        R\        /# )r   Úlog_idr   r   r   )r	   r   ÚDelayLogRequestr   r   )r   s   "r   r   r   @   s<   € ÷ Bñ BÜðBä	×	 Ñ	 ðBô 	ðBô ñ	Br   c              ƒ  ó`   "  € \         P                  ! W WP                  4      G Rj  x€L
 #  L5i)z3Log delay reason on an overdue chassis station log.N)r   Ú	log_delayr    )r4   r   r   r   s   &&&&r   r7   r7   ?   s$   é € ô ×"Ò" 2¨s·L±LÓA×AÐAÑAùó   ‚%.§,¨.z/holds)r   Ústatus_codec                óP   € V ^8„  d   QhR\         P                  R\        R\        /# r   )r   Ú
HoldCreater   r   )r   s   "r   r   r   L   s,   € ÷ <ñ <Ü	×	Ñ	ð<äð<ô ñ<r   c              ƒ  ó`   "  € \         P                  ! WVP                  4      G Rj  x€L
 #  L5i)z%Raise a production hold on a chassis.N)r   Úcreate_holdr    r!   s   &&&r   r=   r=   K   s$   é € ô ×$Ò$ R¨d¯l©lÓ;×;Ð;Ñ;ùr8   z/holds/{hold_id}/resolvec                ó\   € V ^8„  d   QhR\         R\        P                  R\        R\        /# )r   Úhold_idr   r   r   )r	   r   ÚHoldResolver   r   )r   s   "r   r   r   V   s<   € ÷ Fñ FÜðFä	×	Ñ	ðFô 	ðFô ñ	Fr   c              ƒ  ó`   "  € \         P                  ! W WP                  4      G Rj  x€L
 #  L5i)zResolve an active hold.N)r   Úresolve_holdr    )r?   r   r   r   s   &&&&r   rB   rB   U   s$   é € ô ×%Ò% b°3¿¹ÓE×EÐEÑEùr8   NzFilter by ACTIVE or RESOLVED)Údescriptionc                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   Ústatusr   )r   r+   r   )r   s   "r   r   r   a   s    € ÷ 0ñ 0Ü”S�Mð0äñ0r   c              ƒ  óJ   "  € \         P                  ! W4      G Rj  x€L
 #  L5i)z5List production holds, optionally filtered by status.N)r   Ú
list_holds)rE   r   r'   s   &&&r   rG   rG   `   s   é € ô ×#Ò# BÓ/×/Ð/Ñ/ùr(   z/station/{station_id}/livec                ó0   € V ^8„  d   QhR\         R\        /# )r   r   r   ©r	   r   )r   s   "r   r   r   l   s   € ÷ :ñ :Üð:äñ:r   c              ƒ  óJ   "  € \         P                  ! W4      G Rj  x€L
 #  L5i)uC   Live view of a specific station â€” chassis at station with timers.N)r   Úget_station_live)r   r   r'   s   &&&r   Ústation_liverL   k   s   é € ô ×)Ò)¨"Ó9×9Ð9Ñ9ùr(   z/reason-codesc                ó$   € V ^8„  d   QhR\         /# r#   r   )r   s   "r   r   r   w   s   € ÷ /ñ /Üñ/r   c              ƒ   óJ   "  € \         P                  ! V 4      G R j  x€L
 #  L5i©N)r   Úlist_reason_codesr&   s   &&r   rP   rP   v   s   é € ô
 ×*Ò*¨2Ó.×.Ð.Ñ.ùr(   c                óD   € V ^8„  d   QhR\         P                  R\        /# )r   r   r   )r   ÚDelayReasonCreater   )r   s   "r   r   r      s"   € ÷ 5ñ 5Ü	×	"Ñ	"ð5äñ5r   c              ƒ   óJ   "  € \         P                  ! W4      G R j  x€L
 #  L5irO   )r   Úcreate_reason_code)r   r   r'   s   &&&r   rT   rT   ~   s   é € ô ×+Ò+¨BÓ4×4Ð4Ñ4ùr(   z/reason-codes/{reason_id}c                óP   € V ^8„  d   QhR\         R\        P                  R\        /# )r   Ú	reason_idr   r   )r	   r   ÚDelayReasonUpdater   )r   s   "r   r   r   ˆ   s1   € ÷ @ñ @Üð@ä	×	"Ñ	"ð@ô 	ñ@r   c              ƒ   óL   "  € \         P                  ! W V4      G R j  x€L
 #  L5irO   )r   Úupdate_reason_code)rV   r   r   r'   s   &&&&r   rY   rY   ‡   s    é € ô ×+Ò+¨B¸3Ó?×?Ð?Ñ?ùs   ‚$�"ž$)r9   c                ó0   € V ^8„  d   QhR\         R\        /# )r   rV   r   rI   )r   s   "r   r   r   ’   s   € ÷ 4ñ 4Üð4äñ4r   c              ƒ   óN   "  € \         P                  ! W4      G R j  x€L
  R #  L5irO   )r   Údelete_reason_code)rV   r   r'   s   &&&r   r\   r\   ‘   s   é € ô ×
$Ò
$ RÓ
3×3Ô3ùs   ‚%œ#�%z/analytics/bottleneckc                ó$   € V ^8„  d   QhR\         /# r#   r   )r   s   "r   r   r   œ   s   € ÷ 6ñ 6Üñ6r   c              ƒ  óJ   "  € \         P                  ! V 4      G Rj  x€L
 #  L5i)z0Average time per station, most delayed stations.N)r   Úget_bottleneck_analyticsr&   s   &&r   Úbottleneck_analyticsr`   ›   s   é € ô ×1Ò1°"Ó5×5Ð5Ñ5ùr(   )2Ú__doc__Úfastapir   r   r   Úsqlalchemy.ext.asyncior   Útypingr   r   Úuuidr	   Úapp.core.databaser
   Úapp.core.securityr   Úapp.models.core_modelsr   Ú r   r   Úapp.modules.station_work.routesr   ÚrouterÚpostÚScanResponser   ÚgetÚDashboardResponser%   ÚTimelineEntryr.   ÚOverdueEntryr2   r7   ÚHoldOutr=   ÚputrB   rG   ÚStationLiveViewrL   ÚDelayReasonOutrP   rT   rY   Údeleter\   ÚStationBottleneckr`   © r   r   Ú<module>ry      so  ðñ÷ .Ñ -Ý /ß !Ý å $Ý .Ý -ß å Aá	‹€ð ‡�ˆW W×%9Ñ%9€Ó:ñ ˜v“ÙÐ/Ó0ö=ó ;ð=ð ‡�ˆL¨×)BÑ)B€ÓCá˜v“ÙÐÓö+ó Dð+ð ‡�Ð,¸TÀ'×BWÑBWÕ=X€ÓYñ ˜v“ÙÐÓö>ó Zð>ð ‡�ˆJ t¨G×,@Ñ,@Õ'A€ÓBá˜v“ÙÐÓö1ó Cð1ð ‡�ÐÓñ ˜v“ÙÐ/Ó0ö	Bó  ðBð ‡�ˆX g§o¡oÀ3€ÓGñ ˜v“ÙÐ/Ó0ö<ó Hð<ð ‡�Ð&°w·±€ÓGñ ˜v“ÙÐ/Ó0ö	Fó HðFð ‡�ˆH T¨'¯/©/Õ%:€Ó;á! $Ð4RÔSÙ˜v“ÙÐÓö0ó <ð0ð ‡�Ð(¸×9PÑ9P€ÓQñ ˜v“ÙÐÓö:ó Rð:ð ‡�ˆO¨D°×1GÑ1GÕ,H€ÓIá˜v“ÙÐÓö/ó Jð/ð ‡�ˆ_¨W×-CÑ-CÐQT€ÓUñ ˜v“ÙÐÓö5ó Vð5ð ‡�Ð'¸×8NÑ8N€ÓOñ ˜v“ÙÐÓö	@ó Pð@ð ‡�Ð*¸€Ó<ñ ˜v“ÙÐÓö4ó =ð4ð ‡�Ð#°D¸×9RÑ9RÕ4S€ÓTá˜v“ÙÐÓö6ó Uò6r   