+
    `Øj¾F  ã                   óN  € R t ^ RIHtHtHtHtHtHt ^ RIt^ RI	t	^ RI
t^ RIHt ^ RIHtHt ^ RI
Ht ]	P$                  ! ]4      t^ RIHt ^ RI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$ ]! 4       t%]! ]4      ]! ]4      3R R llt&]! ]4      ]! ]4      3R R llt']%PQ                  R]PR                  R7      ]! ]4      ]! ]4      3R R ll4       t*]%PQ                  R]PV                  R7      ]! ]4      ]! ]&4      3R R ll4       t,]%PQ                  R]PZ                  R7      ]! ]4      ]! ]&4      3R R ll4       t.]%PQ                  R]]P^                  ,          R7      ]! ]4      ]! ]&4      3R R ll4       t0]%Pc                  R]P^                  ]Pd                  R7      ]! ]4      ]! ]'4      3R R  ll4       t3]%Pi                  R!]P^                  R7      ]! ]4      ]! ]'4      3R" R# ll4       t5]%Pm                  R!]Pn                  R$7      ]! ]4      ]! ]'4      3R% R& ll4       t8]%PQ                  R']P^                  R7      ]! ]4      ]! ]&4      3R( R) ll4       t9]%Pc                  R*]Pt                  ]Pd                  R7      ]! ]4      ]! ]'4      3R+ R, ll4       t;]%Pi                  R-]Pt                  R7      ]! ]4      ]! ]'4      3R. R/ ll4       t<]%Pm                  R-]Pn                  R$7      ]! ]4      ]! ]'4      3R0 R1 ll4       t=]%Pc                  R2]P|                  ]Pd                  R7      ]! ]4      ]! ]'4      3R3 R4 ll4       t?]%Pi                  R5]P|                  R7      ]! ]4      ]! ]'4      3R6 R7 ll4       t@]%Pm                  R5]Pn                  R$7      ]! ]4      ]! ]'4      3R8 R9 ll4       tA]%PQ                  R:]]P„                  ,          R7      ]! ]4      ]! ]&4      3R; R< ll4       tC]%Pc                  R:]P„                  ]Pd                  R7      ]! ]4      ]! ]'4      3R= R> ll4       tD]%Pi                  R?]P„                  R7      ]! ]4      ]! ]'4      3R@ RA ll4       tE]%Pm                  R?]Pn                  R$7      ]! ]4      ]! ]'4      3RB RC ll4       tF]%PQ                  RD]]P„                  ,          R7      ]! ]4      ]! ]&4      3RE RF ll4       tG]%Pc                  RG]P�                  R7      ]! ]4      ]! ]4      3RH RI ll4       tI]%PQ                  RJ]P”                  R7      ]! ]4      ]! ]4      3RK RL ll4       tK]%Pc                  RM4      ]! ]4      ]! ]4      3RN RO ll4       tL]%Pc                  RP]Pš                  R7      ]! ]4      ]! ]4      3RQ RR ll4       tN]%Pc                  RS]Pž                  R7      R]! ]4      ]! ]4      3RT RU ll4       tP]%PQ                  RV]]P¢                  ,          R7      ]! ]4      ]! ]4      3RW RX ll4       tR]%PQ                  RY]]P¦                  ,          R7      ]! ]4      ]! ]4      3RZ R[ ll4       tT]%Pc                  R\]P¦                  ]Pd                  R7      ]! ]4      ]! ]4      3R] R^ ll4       tU]%Pi                  R_]P¦                  R7      ]! ]4      ]! ]4      3R` Ra ll4       tV]%Pi                  Rb]P¦                  R7      ]! ]4      ]! ]4      3Rc Rd ll4       tW]P°                  P³                  ReRf4      tZ0 Rumt[]%Pc                  Rg]P¸                  ]Pd                  R7      ]! Rh4      ]! ]4      ]! ]4      3Ri Rj ll4       t]]%Pm                  Rk]Pn                  R$7      ]! ]4      ]! ]4      3Rl Rm ll4       t^]%Pi                  Rn4      ]! ]4      ]! ]4      3Ro Rp ll4       t_]P°                  P³                  ReRq4      t`0 Rvmta]%Pc                  Rr4      ]! Rh4      ]! ]4      3Rs Rt ll4       tbR# )wz,
QA Checksheet & Station-Gating API routes.
)Ú	APIRouterÚDependsÚstatusÚHTTPExceptionÚ
UploadFileÚFileN©ÚAsyncSession)ÚListÚOptional)ÚUUID)Úget_db)Úget_current_userÚuser_has_permission)Ú
LoginUsers)ÚschemasÚservice)ÚQaChecksheetInstance)ÚQaResponsePhoto)Úensure_station_accessc                ó<   € V ^8„  d   QhR\         R\        R\         /# ©é   ÚuserÚdbÚreturn©r   r	   )Úformats   "Ú7/var/www/html/audi_dev/backend/app/modules/qa/routes.pyÚ__annotate__r      ó&   € ÷ ñ Ü
ðäðô ñó    c              ƒ  óÜ   "  € V P                   ;'       g    RP                  4       pVR9   d   V # \        WRR4      G Rj  x€L
 pV'       d   V # \        \        P
                  RR7      h L)5i)z¡
Allow QA Inspectors, QA Supervisors, and Admins to view QA checksheets.
Explicitly restrict station staff (operators, production staff without QA permissions).
Ú ÚQAÚviewNzyAccess restricted: Station staff are not permitted to view QA checksheets. QA Inspector or Supervisor access is required.©Ústatus_codeÚdetail©ÚADMINÚQA_SUPERVISORÚQA_INSPECTOR©Ú	role_codeÚupperr   r   r   ÚHTTP_403_FORBIDDEN©r   r   ÚroleÚhas_perms   &&  r   Úverify_qa_checksheet_accessr4      sj   é € ð �N‰N× Ð ˜b×'Ñ'Ó)€DØÐ9Ô9ØˆÜ(¨°4¸Ó@×@€HßØˆÜ
Ü×-Ñ-ð Kôð ñ Aùó   ‚>A,Á A*ÁA,ÁA,c                ó<   € V ^8„  d   QhR\         R\        R\         /# r   r   )r   s   "r   r   r   .   r    r!   c              ƒ  óÜ   "  € V P                   ;'       g    RP                  4       pVR9   d   V # \        WRR4      G Rj  x€L
 pV'       d   V # \        \        P
                  RR7      h L)5i)zs
Allow QA Inspectors, QA Supervisors, and Admins to edit/create QA checksheets.
Explicitly restrict station staff.
r#   r$   ÚeditNzmAccess restricted: Station staff cannot modify QA checksheets. QA Inspector or Supervisor access is required.r&   r)   r-   r1   s   &&  r   Úverify_qa_checksheet_editr9   .   sg   é € ð �N‰N× Ð ˜b×'Ñ'Ó)€DØÐ9Ô9ØˆÜ(¨°4¸Ó@×@€HßØˆÜ
Ü×-Ñ-Ø~ôð ñ Aùr5   z
/dashboard)Úresponse_modelc                ó$   € V ^8„  d   QhR\         /# ©r   r   r   )r   s   "r   r   r   D   s   € ÷ .ñ .Üñ.r!   c              ƒ  óJ   "  € \         P                  ! V 4      G Rj  x€L
 #  L5i)zGQA overview: pending/in_progress/passed/failed inspections per station.N)r   Úget_qa_dashboard©r   Ú_s   &&r   Úget_dashboardrA   C   s   é € ô ×)Ò)¨"Ó-×-Ð-Ñ-ùó   ‚#œ!�#z/supervisor-dashboardc                ó$   € V ^8„  d   QhR\         /# r<   r   )r   s   "r   r   r   M   s   € ÷ 6ñ 6Üñ6r!   c              ƒ  óJ   "  € \         P                  ! V 4      G Rj  x€L
 #  L5i)zsComprehensive real-time dashboard for QA Supervisors: chassis QA statuses, defect details, and station allocations.N)r   Úget_supervisor_dashboardr?   s   &&r   rE   rE   L   s   é € ô ×1Ò1°"Ó5×5Ð5Ñ5ùrB   z/analytics/inspectorsc                ó$   € V ^8„  d   QhR\         /# r<   r   )r   s   "r   r   r   V   s   € ÷ 5ñ 5Üñ5r!   c              ƒ  óJ   "  € \         P                  ! V 4      G Rj  x€L
 #  L5i)zgIndividual QA inspector performance analytics: total inspected, pass rates, and defect counts by class.N)r   Úget_inspector_analyticsr?   s   &&r   rH   rH   U   s   é € ô ×0Ò0°Ó4×4Ð4Ñ4ùrB   z
/templatesc                ó$   € V ^8„  d   QhR\         /# r<   r   )r   s   "r   r   r   `   s   € ÷ ,ñ ,Üñ,r!   c              ƒ   óJ   "  € \         P                  ! V 4      G R j  x€L
 #  L5i©N)r   Úlist_templatesr?   s   &&r   rL   rL   _   s   é € ô
 ×'Ò'¨Ó+×+Ð+Ñ+ùrB   )r:   r'   c                óD   € V ^8„  d   QhR\         P                  R\        /# ©r   Úreqr   )r   ÚTemplateCreater	   )r   s   "r   r   r   h   s"   € ÷ 2ñ 2Ü	×	Ñ	ð2äñ2r!   c              ƒ   óJ   "  € \         P                  ! W4      G R j  x€L
 #  L5irK   )r   Úcreate_template©rO   r   r@   s   &&&r   rR   rR   g   s   é € ô ×(Ò(¨Ó1×1Ð1Ñ1ùrB   z/templates/{template_id}c                óP   € V ^8„  d   QhR\         R\        P                  R\        /# ©r   Útemplate_idrO   r   )r   r   ÚTemplateUpdater	   )r   s   "r   r   r   q   s,   € ÷ ?ñ ?Üð?ä	×	Ñ	ð?ô 	ñ?r!   c              ƒ   óL   "  € \         P                  ! W V4      G R j  x€L
 #  L5irK   )r   Úupdate_template©rV   rO   r   r@   s   &&&&r   rY   rY   p   s    é € ô ×(Ò(¨¸#Ó>×>Ð>Ñ>ùó   ‚$�"ž$)r'   c                ó0   € V ^8„  d   QhR\         R\        /# ©r   rV   r   ©r   r	   )r   s   "r   r   r   {   s   € ÷ 3ñ 3Üð3äñ3r!   c              ƒ   óN   "  € \         P                  ! W4      G R j  x€L
  R #  L5irK   )r   Údelete_template©rV   r   r@   s   &&&r   r`   r`   z   s   é € ô ×
!Ò
! "Ó
2×2Ô2ùó   ‚%œ#�%z/templates/{template_id}/fullc                ó0   € V ^8„  d   QhR\         R\        /# r]   r^   )r   s   "r   r   r   „   s   € ÷ <ñ <Üð<äñ<r!   c              ƒ   óJ   "  € \         P                  ! W4      G R j  x€L
 #  L5irK   )r   Úget_template_fullra   s   &&&r   re   re   ƒ   s   é € ô ×*Ò*¨2Ó;×;Ð;Ñ;ùrB   z!/templates/{template_id}/sectionsc                óP   € V ^8„  d   QhR\         R\        P                  R\        /# rU   )r   r   ÚSectionCreater	   )r   s   "r   r   r   Ž   s,   € ÷ ;ñ ;Üð;ä	×	Ñ	ð;ô 	ñ;r!   c              ƒ   óL   "  € \         P                  ! W V4      G R j  x€L
 #  L5irK   )r   Úadd_sectionrZ   s   &&&&r   ri   ri   �   s    é € ô ×$Ò$ R°cÓ:×:Ð:Ñ:ùr[   z./templates/{template_id}/sections/{section_id}c                ó\   € V ^8„  d   QhR\         R\         R\        P                  R\        /# ©r   rV   Ú
section_idrO   r   )r   r   ÚSectionUpdater	   )r   s   "r   r   r   ˜   s<   € ÷ Jñ JÜðJäðJô 
×	Ñ	ðJô 	ñ	Jr!   c              ƒ   óL   "  € \         P                  ! W0W4      G R j  x€L
 #  L5irK   )r   Úupdate_section©rV   rl   rO   r   r@   s   &&&&&r   ro   ro   —   s    é € ô ×'Ò'¨¸ÓI×IÐIÑIùr[   c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   rV   rl   r   r^   )r   s   "r   r   r   £   s&   € ÷ >ñ >Üð>äð>ô 	ñ>r!   c              ƒ   óP   "  € \         P                  ! W V4      G R j  x€L
  R #  L5irK   )r   Údelete_section)rV   rl   r   r@   s   &&&&r   rs   rs   ¢   s   é € ô ×
 Ò
  °*Ó
=×=Ô=ùó   ‚&�$ž&z4/templates/{template_id}/sections/{section_id}/itemsc                ó\   € V ^8„  d   QhR\         R\         R\        P                  R\        /# rk   )r   r   Ú
ItemCreater	   )r   s   "r   r   r   ®   s<   € ÷ Dñ DÜðDäðDô 
×	Ñ	ðDô 	ñ	Dr!   c              ƒ   óL   "  € \         P                  ! W0W4      G R j  x€L
 #  L5irK   )r   Úadd_itemrp   s   &&&&&r   rx   rx   ­   s    é € ô ×!Ò! "°:ÓC×CÐCÑCùr[   z>/templates/{template_id}/sections/{section_id}/items/{item_id}c          
      óh   € V ^8„  d   QhR\         R\         R\         R\        P                  R\        /# )r   rV   rl   Úitem_idrO   r   )r   r   Ú
ItemUpdater	   )r   s   "r   r   r   ¹   sG   € ÷ Pñ PÜðPäðPô ðPô 
×	Ñ	ð	Pô
 	ñPr!   c              ƒ   óN   "  € \         P                  ! W@WV4      G R j  x€L
 #  L5irK   )r   Úupdate_item)rV   rl   rz   rO   r   r@   s   &&&&&&r   r}   r}   ¸   s"   é € ô ×$Ò$ R°jÈ3ÓO×OÐOÑOùs   ‚%ž#Ÿ%c                óH   € V ^8„  d   QhR\         R\         R\         R\        /# )r   rV   rl   rz   r   r^   )r   s   "r   r   r   Å   s6   € ÷ Dñ DÜðDäðDô ðDô 	ñ	Dr!   c              ƒ   óP   "  € \         P                  ! W0W4      G R j  x€L
  R #  L5irK   )r   Údelete_item)rV   rl   rz   r   r@   s   &&&&&r   r€   r€   Ä   s   é € ô ×
Ò
˜b¨zÓ
C×CÔCùrt   z/station-mappingsc                ó$   € V ^8„  d   QhR\         /# r<   r   )r   s   "r   r   r   Ñ   s   € ÷ 3ñ 3Üñ3r!   c              ƒ   óJ   "  € \         P                  ! V 4      G R j  x€L
 #  L5irK   )r   Úlist_station_mappingsr?   s   &&r   rƒ   rƒ   Ð   s   é € ô
 ×.Ò.¨rÓ2×2Ð2Ñ2ùrB   c                óD   € V ^8„  d   QhR\         P                  R\        /# rN   )r   ÚStationMappingCreater	   )r   s   "r   r   r   Ù   s"   € ÷ 9ñ 9Ü	×	%Ñ	%ð9äñ9r!   c              ƒ   óJ   "  € \         P                  ! W4      G R j  x€L
 #  L5irK   )r   Úcreate_station_mappingrS   s   &&&r   r‡   r‡   Ø   s   é € ô ×/Ò/°Ó8×8Ð8Ñ8ùrB   z/station-mappings/{map_id}c                óP   € V ^8„  d   QhR\         R\        P                  R\        /# )r   Úmap_idrO   r   )r   r   ÚStationMappingUpdater	   )r   s   "r   r   r   â   s1   € ÷ Añ AÜðAä	×	%Ñ	%ðAô 	ñAr!   c              ƒ   óL   "  € \         P                  ! W V4      G R j  x€L
 #  L5irK   )r   Úupdate_station_mapping)r‰   rO   r   r@   s   &&&&r   rŒ   rŒ   á   s    é € ô ×/Ò/°¸CÓ@×@Ð@Ñ@ùr[   c                ó0   € V ^8„  d   QhR\         R\        /# )r   r‰   r   r^   )r   s   "r   r   r   ì   s   € ÷ 5ñ 5Üð5äñ5r!   c              ƒ   óN   "  € \         P                  ! W4      G R j  x€L
  R #  L5irK   )r   Údelete_station_mapping)r‰   r   r@   s   &&&r   r�   r�   ë   s   é € ô ×
(Ò
(¨Ó
4×4Ô4ùrb   z /stations/{station_id}/templatesc                ó0   € V ^8„  d   QhR\         R\        /# )r   Ú
station_idr   r^   )r   s   "r   r   r   õ   s   € ÷ ?ñ ?Üð?äñ?r!   c              ƒ   óJ   "  € \         P                  ! W4      G R j  x€L
 #  L5irK   )r   Úget_station_templates)r‘   r   r@   s   &&&r   r“   r“   ô   s   é € ô ×.Ò.¨rÓ>×>Ð>Ñ>ùrB   z/inspect/startc                óP   € V ^8„  d   QhR\         P                  R\        R\        /# ©r   rO   r   r   )r   ÚInspectStartRequestr	   r   )r   s   "r   r   r   ÿ   s1   € ÷ 
Añ 
AÜ	×	$Ñ	$ð
Aäð
Aô ñ
Ar!   c              ƒ  óÚ   "  €  \        WV P                  R4      G Rj  x€L
  \        P                  ! YTP
                  4      G Rj  x€L
 #  L-  \         d    \        RR4      hi ; i L!5i)u^   Scan chassis at station â†’ initialize/retrieve all checksheet instances for mapped templates.r$   Né�  z(Chassis has not arrived at your station.)r   r‘   r   r   Ústart_inspectionÚuser_id©rO   r   r   s   &&&r   r™   r™   þ   se   é € ðMÜ# B¨c¯n©n¸dÓC×CÐCô ×)Ò)¨"°4·<±<Ó@×@Ð@ñ 	DøÜô MÜ˜CÐ!KÓLÐLðMúá@ùs7   ‚A+„A žAŸA £$A+ÁA)ÁA+ÁA ÁA&Á&A+z/instances/{instance_id}c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úinstance_idr   r^   )r   s   "r   r   r     s   € ÷ 
ñ 
Üð
äñ
r!   c              ƒ  ó  "  €  \         P                  ! W4      G Rj  x€L
 #  L  \         d    h \         dH   p\        P                  RT  RT 24       \        \        P                  R\        T4       2R7      hRp?ii ; i5i)z?Full instance view with sections, items, and current responses.Nz$Unhandled error loading QA instance z: z&Error loading QA checksheet instance: r&   )	r   Úget_instance_detailr   Ú	ExceptionÚloggerÚ	exceptionr   ÚHTTP_500_INTERNAL_SERVER_ERRORÚstr)r�   r   r@   Úes   &&& r   rŸ   rŸ     s{   é € ð	
Ü×0Ò0°ÓA×AÐAÑAøÜô ØÜô 
Ü×ÑÐ?À¸}ÈBÈqÈcÐRÔSÜÜ×=Ñ=Ø;¼CÀ»F¸8ÐDô
ð 	
ûð
üs6   ‚B„$ �"ž$ ¡B¢$ ¤B¹BºAA<Á<BÂBz'/instances/{instance_id}/responses/bulkc                ó\   € V ^8„  d   QhR\         R\        P                  R\        R\        /# ©r   r�   rO   r   r   )r   r   ÚResponseBulkRequestr	   r   )r   s   "r   r   r      s<   € ÷ Sñ SÜðSä	×	$Ñ	$ðSô 	ðSô ñ	Sr!   c              ƒ  ó`   "  € \         P                  ! W WP                  4      G Rj  x€L
 #  L5i)z7Submit responses for multiple checkpoint items at once.N)r   Úsubmit_responses_bulkrš   ©r�   rO   r   r   s   &&&&r   rª   rª     s$   é € ô ×.Ò.¨rÀÇ\Á\ÓR×RÐRÑRùó   ‚%.§,¨.z /instances/{instance_id}/signoffc                ó\   € V ^8„  d   QhR\         R\        P                  R\        R\        /# r§   )r   r   ÚSignoffRequestr	   r   )r   s   "r   r   r   +  s<   € ÷ Nñ NÜðNä	×	Ñ	ðNô 	ðNô ñ	Nr!   c              ƒ  ó`   "  € \         P                  ! W WP                  4      G Rj  x€L
 #  L5i)z¼
Sign off on an inspection instance.
If result is PASSED and all mandatory templates for this station are PASSED,
triggers automated inventory deduction for this station's BOM components.
N)r   Úsignoff_instancerš   r«   s   &&&&r   r°   r°   *  s$   é € ô ×)Ò)¨"¸3ÇÁÓM×MÐMÑMùr¬   z5/stations/{station_id}/chassis/{chassis_id}/clear-outc          
      ó~   € V ^8„  d   QhR\         R\         R\        \        P                  ,          R\        R\
        /# )r   r‘   Ú
chassis_idrO   r   r   )r   r   r   ÚClearanceForChassisOutRequestr	   r   )r   s   "r   r   r   :  sL   € ÷ 	oñ 	oÜð	oäð	oô 
”'×7Ñ7Õ	8ð	oô 	ð		oô
 ñ	or!   c              ƒ  óŽ   "  € V'       d   VP                   MRp\        P                  ! W0WP                  V4      G Rj  x€L
 #  L5i)zPGrant QA clearance for Chassis Out after completing all station checklist items.N)Úremarksr   Ú"grant_qa_clearance_for_chassis_outrš   )r‘   r²   rO   r   r   rµ   s   &&&&& r   r¶   r¶   9  s6   é € ÷ !ˆc�kŠk d€GÜ×;Ò;¸BÈJ×XdÑXdÐfmÓn×nÐnÑnùs   ‚<A¾A¿Az/chassis/{chassis_no}/historyc                ó0   € V ^8„  d   QhR\         R\        /# )r   Ú
chassis_nor   )r¤   r	   )r   s   "r   r   r   G  s    € ÷ @ñ @Üð@äñ@r!   c              ƒ  óJ   "  € \         P                  ! W4      G Rj  x€L
 #  L5i)zAFull QA inspection audit trail across all stations for a chassis.N)r   Úget_chassis_qa_history)r¸   r   r@   s   &&&r   Úget_chassis_historyr»   F  s   é € ô ×/Ò/°Ó?×?Ð?Ñ?ùrB   z#/shortage/{chassis_no}/{station_id}c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r¸   r‘   r   )r¤   r   r	   )r   s   "r   r   r   R  s+   € ÷ Cñ CÜðCäðCô 	ñCr!   c              ƒ  óL   "  € \         P                  ! W V4      G Rj  x€L
 #  L5i)z1Get list of shortages for a chassis at a station.N)r   Úget_shortages)r¸   r‘   r   r@   s   &&&&r   r¾   r¾   Q  s    é € ô ×&Ò& r°zÓB×BÐBÑBùr[   z	/shortagec                óP   € V ^8„  d   QhR\         P                  R\        R\        /# r•   )r   ÚShortageCreater	   r   )r   s   "r   r   r   ]  s1   € ÷ @ñ @Ü	×	Ñ	ð@äð@ô ñ@r!   c              ƒ  ó`   "  € \         P                  ! WVP                  4      G Rj  x€L
 #  L5i)zLog a part shortage.N)r   Úcreate_shortagerš   r›   s   &&&r   rÂ   rÂ   \  s$   é € ô ×(Ò(¨°$·,±,Ó?×?Ð?Ñ?ùr¬   z/shortage/{shortage_id}c                óP   € V ^8„  d   QhR\         R\        P                  R\        /# )r   Úshortage_idrO   r   )r   r   ÚShortageUpdater	   )r   s   "r   r   r   g  s,   € ÷ ?ñ ?Üð?ä	×	Ñ	ð?ô 	ñ?r!   c              ƒ  óL   "  € \         P                  ! W V4      G Rj  x€L
 #  L5i)z:Update fitted quantity or remarks on an existing shortage.N)r   Úupdate_shortage)rÄ   rO   r   r@   s   &&&&r   rÇ   rÇ   f  s    é € ô ×(Ò(¨¸#Ó>×>Ð>Ñ>ùr[   z/shortage/{shortage_id}/resolvec                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   rÄ   r   r   ©r   r	   r   )r   s   "r   r   r   r  s+   € ÷ Iñ IÜðIäðIô ñIr!   c              ƒ  ó`   "  € \         P                  ! WVP                  4      G Rj  x€L
 #  L5i)z!Mark a part shortage as resolved.N)r   Úresolve_shortagerš   )rÄ   r   r   s   &&&r   rË   rË   q  s$   é € ô ×)Ò)¨"¸4¿<¹<ÓH×HÐHÑHùr¬   ÚuploadsÚqaz//instances/{instance_id}/items/{item_id}/photos.c          
      óT   € V ^8„  d   QhR\         R\         R\        R\        R\        /# )r   r�   rz   Úfiler   r   )r   r   r	   r   )r   s   "r   r   r   �  sA   € ÷ wñ wÜðwäðwô ðwô 	ð	wô
 ñwr!   c              ƒ  ó  "  € VP                  \        V 4      G Rj  x€L
 pV'       g   \        RR4      h\        W4VP                  R4      G Rj  x€L
  VP
                  \        9  d   \        RR4      hVP                  4       G Rj  x€L
 p\        V4      R8”  d   \        RR4      h\        P                  P                  \        \        V 4      4      p\        P                  ! VRR	7       \        P                  P                  VP                   ;'       g    R
4      ^,          P#                  4       ;'       g    RpVP$                  R,           R\&        P(                  ! 4       P$                  R,           V 2p	\+        \        P                  P                  Wy4      R4      ;_uu_ 4       p
V
P-                  V4       RRR4       \/        WRV  RV	 2VP0                  R7      pVP3                  V4       VP5                  4       G Rj  x€L
  VP7                  V4      G Rj  x€L
  \8        P:                  ! VP<                  VP>                  VP@                  R7      #  ELD EL ELÞ  + '       g   i     L°; i Lp LY5i)z2Attach a photo to one checkpoint of an inspection.Né”  úInspection not foundr$   r˜   z5Only photos (JPEG, PNG, WebP or HEIC) can be attachedzPhoto is larger than 15 MBT©Úexist_okr#   ú.jpg:Né   Nr@   Úwbz/uploads/qa/Ú/)r�   rz   Ú	photo_urlÚuploaded_by)Úphoto_idrÙ   Úuploaded_até  ð )!Úgetr   r   r   r‘   Úcontent_typeÚALLOWED_PHOTO_TYPESÚreadÚlenÚosÚpathÚjoinÚQA_UPLOAD_DIRr¤   ÚmakedirsÚsplitextÚfilenameÚlowerÚhexÚuuid_modÚuuid4ÚopenÚwriter   rš   ÚaddÚcommitÚrefreshr   ÚResponsePhotoOutrÛ   rÙ   rÜ   )r�   rz   rÏ   r   r   ÚinstÚcontentsÚfolderÚextÚfnameÚfhÚphotos   &&&&&       r   Úupload_checkpoint_photorû   €  sÙ  é € ð —‘Ô,¨kÓ:×:€DßÜ˜CÐ!7Ó8Ð8Ü
 ¨$¯/©/¸4Ó
@×@Ð@Ø×ÑÔ 3Ô3Ü˜CÐ!XÓYÐYØ—Y‘Y“[× €HÜ
ˆ8ƒ}Ð'Ô'Ü˜CÐ!=Ó>Ð>Ü�W‰W�\‰\œ-¬¨[Ó)9Ó:€FÜ‡K‚K� Õ&Ü
�'‰'×
Ñ
˜4Ÿ=™=×.Ð.¨BÓ
/°Õ
2×
8Ñ
8Ó
:×
DÐ
D¸f€CØ�{‰{˜2�Ð˜q¤§¢Ó!1×!5Ñ!5°bÕ!9Ð :¸3¸%Ð@€EÜ	Œb�g‰g�l‰l˜6Ó)¨4×	0Ô	0°BØ
�‰�Ô÷ 
1ä¨Ø(4°[°MÀÀ5À'Ð&JÐX\×XdÑXdôf€Eà‡F�Fˆ5„MØ
�)‰)‹+×ÐØ
�*‰*�UÓ
×ÐÜ×#Ò#¨U¯^©^ÀuÇÁÐdi×duÑduÔvÐvò) ;ò Aò !÷ 
1×	0úñ
 Ùùs}   ‚J œI �J ©&J ÁI#Á8J ÂI&Â	BJ Ä"J Ä=A2J Æ/I)ÇA
J ÈI<ÈJ È$I>È%<J É#J É&J É)I9	É4	J É>J z/photos/{photo_id}c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   rÛ   r   r   rÉ   )r   s   "r   r   r   ¡  s&   € ÷ ñ Üðäðô ñr!   c              ƒ   ó†  "  € VP                  \        V 4      G R j  x€L
 pV'       g   \        RR4      hVP                  \        VP                  4      G R j  x€L
 pV'       d    \        WVP                  R4      G R j  x€L
  VP                  V4      G R j  x€L
  VP                  4       G R j  x€L
  R #  Lš L` L; L$ L5i)NrÑ   zPhoto not foundr$   )	rÞ   r   r   r   r�   r   r‘   Údeleterñ   )rÛ   r   r   rú   rô   s   &&&  r   Údelete_checkpoint_photorÿ      s“   é € ð —&‘&œ¨(Ó3×3€EßÜ˜CÐ!2Ó3Ð3Ø—‘Ô,¨e×.?Ñ.?Ó@×@€DßÜ# B¨d¯o©o¸tÓD×DÐDØ
�)‰)�EÓ
×ÐØ
�)‰)‹+×Òñ 4ñ AáDÙÙùsb   ‚CœB7�C©/CÁB9ÁCÁ%CÁ?B;Â CÂB=ÂCÂ0B?Â1CÂ9CÂ;CÂ=CÂ?Cz /instances/{instance_id}/remarksc                ó\   € V ^8„  d   QhR\         R\        P                  R\        R\        /# r§   )r   r   ÚInstanceRemarksInr	   r   )r   s   "r   r   r   ±  s<   € ÷ Sñ SÜðSä	×	"Ñ	"ðSô 	ðSô ñ	Sr!   c              ƒ  ó
  "  € VP                  \        V 4      G Rj  x€L
 pV'       g   \        RR4      h\        W#VP                  R4      G Rj  x€L
  \
        P                  ! W WP                  4      G Rj  x€L
 #  L` L/ L5i)z4Remarks on the whole checksheet and on each section.NrÑ   rÒ   r$   )rÞ   r   r   r   r‘   r   Úsave_instance_remarksrš   )r�   rO   r   r   rô   s   &&&& r   r  r  °  sj   é € ð —‘Ô,¨kÓ:×:€DßÜ˜CÐ!7Ó8Ð8Ü
 ¨$¯/©/¸4Ó
@×@Ð@Ü×.Ò.¨rÀÇ\Á\ÓR×RÐRñ	 ;ñ AÙRùs8   ‚BœA=�B©&BÁA?Á(BÁ8BÁ9BÁ?BÂBÚqa_diagramsz/diagrams/uploadc                ó0   € V ^8„  d   QhR\         R\        /# )r   rÏ   r   )r   r   )r   s   "r   r   r   Ä  s    € ÷ Oñ OÜ
ðOä
ñOr!   c              ƒ  óp  "  € \         P                  ! \        RR7       \         P                  P	                  V P
                  ;'       g    R4      ^,          P                  4       pV\        9  d   \        RR4      hV P                  4       G Rj  x€L
 p\        V4      R8”  d   \        RR4      hRP                  R \         P                  P	                  V P
                  ;'       g    R	4      ^ ,           4       4      P                  4       ;'       g    R	pV R
\        P                  ! 4       P                  R,           V 2p\!        \         P                  P                  \        V4      R4      ;_uu_ 4       pVP#                  V4       RRR4       RRV 2RV/#  EL  + '       g   i     L; i5i)z8Upload a reference schematic or diagram for checkpoints.TrÓ   r#   r˜   zEOnly images or SVGs (PNG, JPG, WebP, SVG) can be attached as diagramsNzDiagram exceeds 15 MBc              3   ób   "  € T F%  qP                  4       '       g
   VR9   g   K!  Vx € K'  	  R# 5i)Ú-N)r  r@   )Úisalnum)Ú.0Úcs   & r   Ú	<genexpr>Ú$upload_qa_diagram.<locals>.<genexpr>Ñ  s)   é € ÐvÑ$S˜q×W`ÑW`×WbÒWbÐfgÐkuÑfuŸšÓ$Sùs   ‚/¥
/Údiagramr@   :Né   Nr×   Údiagram_urlz/uploads/qa_diagrams/ré   rÝ   )rã   rç   ÚDIAGRAM_UPLOAD_DIRrä   rè   ré   rê   ÚALLOWED_DIAGRAM_EXTSr   rá   râ   rå   Ústriprì   rí   rë   rî   rï   )rÏ   r   r÷   rõ   Ú
clean_baserø   rù   s   &&     r   Úupload_qa_diagramr  Ã  sR  é € ô ‡K‚KÔ"¨TÕ2Ü
�'‰'×
Ñ
˜4Ÿ=™=×.Ð.¨BÓ
/°Õ
2×
8Ñ
8Ó
:€CØ
Ô&Ô&Ü˜CÐ!hÓiÐiØ—Y‘Y“[× €HÜ
ˆ8ƒ}Ð'Ô'Ü˜CÐ!8Ó9Ð9à—‘Ñv¤B§G¡G×$4Ñ$4°T·]±]×5OÐ5OÀiÓ$PÐQRÖ$SÓvÓv×|Ñ|Ó~÷  Lð  Lð  CL€JØˆl˜!œHŸNšNÓ,×0Ñ0°Õ4Ð5°c°UÐ;€EÜ	Œb�g‰g�l‰lÔ-¨uÓ5°t×	<Ô	<ÀØ
�‰�Ô÷ 
=ð Ð2°5°'Ð:¸JÈÐNÐNò !÷ 
=×	<üs8   ‚BF6ÂF ÂAF6Ã++F6ÄA&F6Å=F#ÆF6Æ#F3	Æ.F6>   ú	image/pngú
image/heicú
image/heifú
image/jpegú
image/webp>   rÕ   ú.pngú.svgú.jpegú.webp)cÚ__doc__Úfastapir   r   r   r   r   r   rã   ÚloggingÚuuidrì   Úsqlalchemy.ext.asyncior	   Útypingr
   r   r   Ú	getLoggerÚ__name__r¡   Úapp.core.databaser   Úapp.core.securityr   r   Úapp.models.core_modelsr   r#   r   r   Úapp.models.qa_modelsr   Úapp.models.station_work_modelsr   Úapp.modules.station_work.routesr   Úrouterr4   r9   rÞ   ÚQADashboardResponserA   ÚSupervisorDashboardResponserE   ÚInspectorAnalyticsResponserH   ÚTemplateOutrL   ÚpostÚHTTP_201_CREATEDrR   ÚputrY   rþ   ÚHTTP_204_NO_CONTENTr`   re   Ú
SectionOutri   ro   rs   ÚItemOutrx   r}   r€   ÚStationMappingOutrƒ   r‡   rŒ   r�   r“   ÚInspectStartResponser™   ÚInstanceDetailOutrŸ   rª   ÚSignoffResponser°   ÚClearanceForChassisOutResponser¶   ÚChassisQAHistoryItemr»   ÚShortageOutr¾   rÂ   rÇ   rË   rä   rå   ræ   rà   ró   rû   rÿ   r  r  r  r  © r!   r   Ú<module>r@     s²  ðñ÷ P× OÛ 	Û Û Ý /ß !Ý à	×	Ò	˜8Ó	$€å $ß CÝ -ß å 5Ý :Ý Aá	‹€ñ Ð/Ó0Ù˜v“÷ñ* Ð/Ó0Ù˜v“÷ð* ‡�ˆL¨×)DÑ)D€ÓEá˜v“ÙÐÓö.ó Fð.ð ‡�Ð#°G×4WÑ4W€ÓXá˜v“ÙÐ)Ó*ö6ó Yð6ð ‡�Ð#°G×4VÑ4V€ÓWá˜v“ÙÐ)Ó*ö5ó Xð5ð ‡�ˆL¨¨g×.AÑ.AÕ)B€ÓCá˜v“ÙÐ)Ó*ö,ó Dð,ð ‡�ˆ\¨'×*=Ñ*=È6×KbÑKb€Ócñ ˜v“ÙÐ'Ó(ö2ó dð2ð ‡�Ð&°w×7JÑ7J€ÓKñ ˜v“ÙÐ'Ó(ö	?ó Lð?ð ‡�Ð)°v×7QÑ7Q€ÓRñ ˜v“ÙÐ'Ó(ö3ó Sð3ð ‡�Ð+¸G×<OÑ<O€ÓPñ ˜v“ÙÐ)Ó*ö<ó Qð<ð ‡�Ð0À×ASÑASÐag×axÑax€Óyñ ˜v“ÙÐ'Ó(ö	;ó zð;ð ‡�Ð<ÈW×M_ÑM_€Ó`ñ
 ˜v“ÙÐ'Ó(öJó aðJð ‡�Ð?ÈV×MgÑMg€Óhñ ˜v“ÙÐ'Ó(ö	>ó ið>ð ‡�ÐCÐT[×TcÑTcÐqw÷  rIñ  rI€ó  Jñ
 ˜v“ÙÐ'Ó(öDó JðDð ‡�ÐLÐ]d×]lÑ]l€Ómñ ˜v“ÙÐ'Ó(öPó nðPð ‡�ÐOÐ]c×]wÑ]w€Óxñ
 ˜v“ÙÐ'Ó(öDó yðDð ‡�Ð°°W×5NÑ5NÕ0O€ÓPá˜v“ÙÐ)Ó*ö3ó Qð3ð ‡�Ð °×1JÑ1JÐX^×XoÑXo€Ópñ ˜v“ÙÐ'Ó(ö9ó qð9ð ‡�Ð(¸×9RÑ9R€ÓSñ ˜v“ÙÐ'Ó(ö	Aó TðAð ‡�Ð+¸×9SÑ9S€ÓTñ ˜v“ÙÐ'Ó(ö5ó Uð5ð ‡�Ð.¸tÀG×D]ÑD]Õ?^€Ó_ñ ˜v“ÙÐ)Ó*ö?ó `ð?ð ‡�Ð¨g×.JÑ.J€ÓKñ ˜v“ÙÐ/Ó0ö
Aó Lð
Að ‡�Ð&°w×7PÑ7P€ÓQñ ˜v“ÙÐÓö
ó Rð
ð$ ‡�Ð6Ó7ñ ˜v“ÙÐ/Ó0ö	Só 8ðSð ‡�Ð/À×@WÑ@W€ÓXñ ˜v“ÙÐ/Ó0ö	Nó YðNð ‡�ÐDÐU\×U{ÑU{€Ó|ð <@Ù˜v“ÙÐ/Ó0ö	oó }ð	oð ‡�Ð+¸DÀ×A]ÑA]Õ<^€Ó_ñ ˜v“ÙÐÓö@ó `ð@ð ‡�Ð1À$Àw×GZÑGZÕB[€Ó\ñ ˜v“ÙÐÓö	Có ]ðCð ‡�ˆ[¨×)<Ñ)<È&×JaÑJa€Óbñ ˜v“ÙÐ/Ó0ö@ó cð@ð ‡�Ð%°g×6IÑ6I€ÓJñ ˜v“ÙÐÓö	?ó Kð?ð ‡�Ð-¸g×>QÑ>Q€ÓRñ ˜v“ÙÐ/Ó0öIó SðIð —‘—‘˜Y¨Ó-€Ú[Ð ð ‡�Ð>Èw×OgÑOgÐu{÷  vMñ  vM€ó  Nñ ˜C“yÙ˜v“ÙÐ/Ó0öwó Nðwð> ‡�Ð#°×1KÑ1K€ÓLñ ˜v“ÙÐ/Ó0öó Mðð ‡�Ð.Ó/ñ ˜v“ÙÐ/Ó0ö	Só 0ðSð —W‘W—\‘\ )¨]Ó;Ð ÚAÐ à‡�ÐÓ á˜C“yÙÐ/Ó0öOó !òOr!   