+
    `Øj  ã                   óè  € ^ RI t ^ RIHtHtHt ^ RIHtHtHt ^ RIH	t	 ^ RI
Ht ^ RIHtHtHt ^ RIHt ^ RIHtHtHtHtHt ^ R	IHt ^ R
IHt ^ RIHt ^ RIHt ^ RI H!t! ^ RI"H#t# ^ RI$H%t% ^ RI&H't' ]! 4       t( ! R R]'4      t)](PU                  R4      ]! ]4      3R R ll4       t+](PU                  R4      ]! 4       ]! ]4      3R R ll4       t,](P[                  R4      ]! ]4      ]! ]4      3R R ll4       t.](P[                  R]/]%,          R7      ]! ]4      ]! ]4      3R R ll4       t0](P[                  R 4      ]! ]4      ]! ]! R!R"4      4      3R# R$ ll4       t1](PU                  R%4      ]! ]4      ]! ]! R!R"4      4      3R& R' ll4       t2](P[                  R(4      ]! ]4      ]! ]! R!R"4      4      3R) R* ll4       t3](PU                  R+4      ]! ]4      ]! ]! R!R"4      4      3R, R- ll4       t4R# ).é    N)ÚdatetimeÚ	timedeltaÚtimezone)Ú	APIRouterÚHTTPExceptionÚDepends)ÚOAuth2PasswordRequestForm©ÚAsyncSession)ÚselectÚor_Úfunc)Úget_db)Úcreate_access_tokenÚverify_passwordÚrequire_permissionÚget_current_userÚget_effective_permissions)Ú
LoginUsers)Ú
RoleMaster)ÚVendorMaster)ÚVendorPortalLog)ÚCustomerMaster)ÚDealerPortalLog)ÚMyPermissionOut)Ú	BaseModelc                   ó,   a € ] tR t^t o V 3R ltRtV tR# )ÚLoginRequestc                ó2   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   # )é   ÚusernameÚpassword)Ústr)ÚformatÚ__classdict__s   "€Ú9/var/www/html/audi_dev/backend/app/modules/auth/routes.pyÚ__annotate__ÚLoginRequest.__annotate__   s   ø‡ ‚ Ù�Mñ á�Mò ó    © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__)r%   s   @r&   r   r      s   ø‡ ‡ „ r)   r   z/loginc                ó0   € V ^8„  d   QhR\         R\        /# )r    ÚdataÚdb)r   r   )r$   s   "r&   r'   r'      s   € ÷ wñ w”lð w¬ñ wr)   c           
   ƒ   ó"  "  € V P                   ;'       g    R P                  4       P                  4       pVP                  \	        \
        4      P                  \        \        P                  ! \
        P                  4      V8H  \        P                  ! \
        P                  4      V8H  4      4      4      G Rj  x€L
 pVP                  4       pV'       d'   \        V P                  VP                  4      '       g   \        RRR7      hVP                   '       g   \        RRR7      h\#        RVP                  R\%        VP&                  4      RVP(                  R	VP*                  /R
7      pRVRRRR	VP*                  RVP(                  //#  LÓ5i©Ú Ni‘  zIncorrect username or password©Ústatus_codeÚdetailzUser account is inactiveÚsubÚuser_idÚroleÚname)r3   Úaccess_tokenÚ
token_typeÚbearerÚuser©r!   ÚstripÚlowerÚexecuter   r   Úwherer   r   Úemployee_codeÚemailÚscalar_one_or_noner   r"   Úpassword_hashr   Ú	is_activer   r#   r<   Ú	role_coder>   )r3   r4   ÚqueryÚresultrB   r?   s   &&    r&   ÚloginrP      sV  é € à�]‰]× Ð ˜b×'Ñ'Ó)×/Ñ/Ó1€EØ—:‘:ÜŒzÓ× Ñ ÜÜ—
’
œ:×3Ñ3Ó4¸Ñ=Ü—
’
œ:×+Ñ+Ó,°Ñ5óó	
ó÷ €Fð ×$Ñ$Ó&€Dß” t§}¡}°d×6HÑ6H×IÒIÜ¨Ð4TÔUÐUØ�>�>ˆ>Ü¨Ð4NÔOÐOÜ&¨U°D×4FÑ4FÈ	ÔSVÐW[×WcÑWcÓSdÐflÐnr×n|Ñn|ð  Eð  GK÷  GPñ  GPð  -Qô  R€LØ˜L¨,¸À&È6ÐSW×S\ÑS\Ð^dÐfj×ftÑftÐJuÐvÐvñùó    ‚B7FÂ9FÂ:FÃAFÄA3Fz/tokenc                ó0   € V ^8„  d   QhR\         R\        /# )r    Ú	form_datar4   )r	   r   )r$   s   "r&   r'   r'   -   s   € ÷ wñ wÔ!:ð wÌLñ wr)   c           
   ƒ   ó"  "  € V P                   ;'       g    R P                  4       P                  4       pVP                  \	        \
        4      P                  \        \        P                  ! \
        P                  4      V8H  \        P                  ! \
        P                  4      V8H  4      4      4      G Rj  x€L
 pVP                  4       pV'       d'   \        V P                  VP                  4      '       g   \        RRR7      hVP                   '       g   \        RRR7      h\#        RVP                  R\%        VP&                  4      RVP(                  R	VP*                  /R
7      pRVRRRR	VP*                  RVP(                  //#  LÓ5ir6   rC   )rS   r4   rN   rO   rB   r?   s   &&    r&   Úlogin_oauthrU   ,   sZ  é € à×Ñ×%Ð% 2×,Ñ,Ó.×4Ñ4Ó6€EØ—:‘:ÜŒzÓ× Ñ ÜÜ—
’
œ:×3Ñ3Ó4¸Ñ=Ü—
’
œ:×+Ñ+Ó,°Ñ5óó	
ó÷ €Fð ×$Ñ$Ó&€Dß” y×'9Ñ'9¸4×;MÑ;M×NÒNÜ¨Ð4TÔUÐUØ�>�>ˆ>Ü¨Ð4NÔOÐOÜ&¨U°D×4FÑ4FÈ	ÔSVÐW[×WcÑWcÓSdÐflÐnr×n|Ñn|ð  Eð  GK÷  GPñ  GPð  -Qô  R€LØ˜L¨,¸À&È6ÐSW×S\ÑS\Ð^dÐfj×ftÑftÐJuÐvÐvñùrQ   z/mec                ó0   € V ^8„  d   QhR\         R\        /# ©r    rB   r4   ©r   r   )r$   s   "r&   r'   r'   @   s   € ÷ ñ ”zð Ä<ñ r)   c              ƒ  ó²  "  € VP                  \        \        4      P                  \        P                  V P                  8H  4      4      G Rj  x€L
 P                  4       pR\        V P                  4      RV P                  RV P                  RV P                  RV P                  RV P                  RV'       d   VP                  /# V P                  /#  L†5i)	u  
The logged-in user's own profile â€” who they are (name, employee code, email) and which
role they're on (by role_id/role_code, resolved to its display name). Nothing here is
derived from a username; it's the same login_users row every other endpoint reads.
Nr<   rH   r>   rI   ÚmobilerM   Ú	role_name)rF   r   r   rG   rM   rJ   r#   r<   rH   r>   rI   rZ   r[   )rB   r4   r=   s   && r&   Úget_mer\   ?   s´   é € ð —*‘*ÜŒzÓ× Ñ ¤×!5Ñ!5¸¿¹Ñ!GÓHó÷ çÑÓð 	ð 	”3�t—|‘|Ó$Ø˜×+Ñ+Ø�—	‘	Ø�—‘Ø�$—+‘+Ø�T—^‘^Ø§t�T—^‘^ðð ð 26·±ðð ñùs   ‚ACÁCÁBCz/me/permissions)Úresponse_modelc                ó0   € V ^8„  d   QhR\         R\        /# rW   rX   )r$   s   "r&   r'   r'   U   s   € ÷ 5ñ 5¤:ð 5Ì|ñ 5r)   c              ƒ  ó4   "  € \        W4      G Rj  x€L
 #  L5i)uô   
What the logged-in user is actually permitted to do, module by module â€” the single
source of truth the frontend uses to decide what to show, instead of hardcoding
role-to-page maps that can drift out of sync with the real permission matrix.
N)r   )rB   r4   s   &&r&   Úget_my_permissionsr`   T   s   é € ô +¨2Ó4×4Ð4Ñ4ùs   ‚‘’z/portal-vendorsÚUSER_MANAGEMENTÚviewc                ó$   € V ^8„  d   QhR\         /# ©r    r4   r
   )r$   s   "r&   r'   r'   _   s   € ÷ Yñ YÜñYr)   c              ƒ  ó¶  "  € V P                  \        \        P                  \        P                  4      P                  \        P                  R8H  \        P                  R8H  4      P                  \        P                  4      4      G Rj  x€L
 pVP                  4        Uu. uF&  pR\        VP                  4      RVP                  /NK(  	  up#  LEu upi 5i)z‰
Vendors an ADMIN can 'view as' in the Vendor Portal, for oversight/testing.
Only vendors with the portal actually enabled show up here.
TNÚ	vendor_idr>   )rF   r   r   rf   r>   rG   Úportal_enabledrL   Úorder_byÚallr#   ©r4   Ú_rO   Úrows   &&  r&   Úlist_portal_vendorsrm   ^   s¢   é € ð —:‘:ÜŒ|×%Ñ%¤|×'8Ñ'8Ó9ß	‰Œ|×*Ñ*¨dÑ2´L×4JÑ4JÈdÑ4RÓ	Sß	‰”,×#Ñ#Ó	$ó÷ €Fð
 LRÏ:É:Ì<ÓXÉ<ÀCˆ[œ#˜cŸm™mÓ,¨f°c·h±hÓ?É<ÑXÐXñùò
 Yùs$   ‚B
CÂCÂCÂ#,CÃCÃCz/view-as-vendor/{vendor_id}c                óP   € V ^8„  d   QhR\         P                  R\        R\        /# )r    rf   r4   Úadmin)ÚuuidÚUUIDr   r   )r$   s   "r&   r'   r'   p   s/   € ÷ jñ jÜ�y‰yðjäðjô ñjr)   c              ƒ  óÞ  "  € VP                  \        V 4      G Rj  x€L
 pV'       d   VP                  '       g   \        RRR7      h\	        VP
                  \        \        P                  ! 4       P                  4      RRVP                   2\        P                  ! \        P                  4      \        ^R7      ,           R7      pVP!                  V4       VP#                  4       G Rj  x€L
  VP%                  V4      G Rj  x€L
  \'        R	\        VP
                  4      R
RR\        VP(                  4      /4      pRVR\        VP
                  4      RVP*                  /#  ELJ L| Le5i)z¥
Mints a real vendor-portal session/token for the chosen vendor, so an ADMIN can
view the Vendor Portal exactly as that vendor would see it, without their password.
Né”  z&Vendor not found or portal not enabledr8   úadmin-impersonationúadmin:©Údays)rf   Úsession_tokenÚ
ip_addressÚ
user_agentÚ
expires_atr;   Úsub_typeÚvendorÚ
session_idr?   rf   Úvendor_name)Úgetr   rg   r   r   rf   r#   rp   Úuuid4ÚhexrH   r   Únowr   Úutcr   ÚaddÚcommitÚrefreshr   Úlog_idr>   )rf   r4   ro   r}   Ú	log_entryr?   s   &&&   r&   Úview_as_vendorrŠ   o   s"  é € ð —6‘6œ,¨	Ó2×2€Fß˜×.×.Ð.Ü¨Ð4\Ô]Ð]äØ×"Ñ"Üœ$Ÿ*š*›,×*Ñ*Ó+Ø(Ø˜E×/Ñ/Ð0Ð1Ü—<’<¤§¡Ó-´	¸rÔ0BÕBô€Ið ‡F�Fˆ9ÔØ
�)‰)‹+×ÐØ
�*‰*�YÓ
×Ðä&ØŒs�6×#Ñ#Ó$Ø�HØ”c˜)×*Ñ*Ó+ð(ó €Lð
 ˜L¨+´s¸6×;KÑ;KÓ7LÈmÐ]c×]hÑ]hÐiÐiò) 3ñ Ùùs?   ‚E-œE&�E-©E-»B1E-Ã,E)Ã-E-ÄE+ÄA!E-Å)E-Å+E-z/portal-dealersc                ó$   € V ^8„  d   QhR\         /# rd   r
   )r$   s   "r&   r'   r'   ‘   s   € ÷ Vñ VÜñVr)   c              ƒ  ó¤  "  € V P                  \        \        P                  \        P                  4      P                  \        P                  R8H  \        P                  R8H  4      P                  \        P                  4      4      G Rj  x€L
 pVP                  4        Uu. uF  pRVP                  RVP                  /NK  	  up#  L<u upi 5i)z‰
Dealers an ADMIN can 'view as' in the Dealer Portal, for oversight/testing.
Only dealers with the portal actually enabled show up here.
TNÚ	dealer_idr>   )
rF   r   r   Úcustomer_idr>   rG   rg   rL   rh   ri   rj   s   &&  r&   Úlist_portal_dealersr�   �   sž   é € ð —:‘:ÜŒ~×)Ñ)¬>×+>Ñ+>Ó?ß	‰Œ~×,Ñ,°Ñ4´n×6NÑ6NÐRVÑ6VÓ	Wß	‰”.×%Ñ%Ó	&ó÷ €Fð
 IOÏ
É
ÌÓUÉÀˆ[˜#Ÿ/™/¨6°3·8±8Ó<ÉÑUÐUñùò
 Vùs$   ‚B
CÂC	ÂCÂ##CÃCÃCz/view-as-dealer/{dealer_id}c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r    r�   r4   ro   )r#   r   r   )r$   s   "r&   r'   r'   ¢   s+   € ÷ gñ gÜðgäðgô ñgr)   c              ƒ  óº  "  € VP                  \        V 4      G Rj  x€L
 pV'       d   VP                  '       g   \        RRR7      h\	        VP
                  \        \        P                  ! 4       P                  4      RRVP                   2\        P                  ! \        P                  4      \        ^R7      ,           R7      pVP!                  V4       VP#                  4       G Rj  x€L
  VP%                  V4      G Rj  x€L
  \'        R	VP
                  R
RR\        VP(                  4      /4      pRVRVP
                  RVP*                  /#  EL8 Lj LS5i)z¥
Mints a real dealer-portal session/token for the chosen dealer, so an ADMIN can
view the Dealer Portal exactly as that dealer would see it, without their password.
Nrs   z&Dealer not found or portal not enabledr8   rt   ru   rv   )r�   rx   ry   rz   r{   r;   r|   Údealerr~   r?   r�   Údealer_name)r€   r   rg   r   r   rŽ   r#   rp   r�   r‚   rH   r   rƒ   r   r„   r   r…   r†   r‡   r   rˆ   r>   )r�   r4   ro   r’   r‰   r?   s   &&&   r&   Úview_as_dealerr”   ¡   s  é € ð —6‘6œ.¨)Ó4×4€Fß˜×.×.Ð.Ü¨Ð4\Ô]Ð]äØ×$Ñ$Üœ$Ÿ*š*›,×*Ñ*Ó+Ø(Ø˜E×/Ñ/Ð0Ð1Ü—<’<¤§¡Ó-´	¸rÔ0BÕBô€Ið ‡F�Fˆ9ÔØ
�)‰)‹+×ÐØ
�*‰*�YÓ
×Ðä&Øˆv×!Ñ!Ø�HØ”c˜)×*Ñ*Ó+ð(ó €Lð
 ˜L¨+°v×7IÑ7IÈ=ÐZ`×ZeÑZeÐfÐfò) 5ñ Ùùs?   ‚EœE�E©E»B1EÃ,EÃ-EÄEÄAEÅEÅE)5rp   r   r   r   Úfastapir   r   r   Úfastapi.securityr	   Úsqlalchemy.ext.asyncior   Ú
sqlalchemyr   r   r   Úapp.core.databaser   Úapp.core.securityr   r   r   r   r   Úapp.models.core_modelsr   Úapp.models.access_modelsr   Úapp.models.rm_modelsr   Úapp.models.vendor_portalr   Úapp.models.sales_modelsr   Úapp.models.dealer_modelsr   Ú"app.modules.access_control.schemasr   Úpydanticr   Úrouterr   ÚpostrP   rU   r€   r\   Úlistr`   rm   rŠ   r�   r”   r*   r)   r&   Ú<module>r¦      sû  ðã ß 2Ñ 2ß 5Ñ 5Ý 6Ý /ß (Ñ (Ý $÷ Dõ  DÝ -Ý /Ý -Ý 4Ý 2Ý 4Ý >Ý á	‹€ô�9ô ð ‡�ˆXÓÙ7>¸v³ö wó ðwð$ ‡�ˆXÓÙ=D»YÑ[bÐciÓ[jö wó ðwð$ ‡�ˆEÓÙ$+Ð,<Ó$=ÑRYÐZ`ÓRaö ó ðð( ‡�Ð¨d°?Õ.C€ÓDÙ07Ð8HÓ0IÑ^eÐflÓ^mö 5ó Eð5ð ‡�ÐÓá˜v“ÙÑ Ð!2°FÓ;Ó<öYó ðYð  ‡�Ð*Ó+ñ ˜v“ÙÑ 2Ð3DÀfÓ MÓNöjó ,ðjð@ ‡�ÐÓá˜v“ÙÑ Ð!2°FÓ;Ó<öVó ðVð  ‡�Ð*Ó+ñ ˜v“ÙÑ 2Ð3DÀfÓ MÓNögó ,ògr)   