
    4?i                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJr  S SKJr  S\	S\S\\   4S jrS\	S\S\S\4S jrS\	S\S\SS4S jrS\	S\S\S\4S jrS\	S\\   4S jrg)    )Optional)selectinload)func)select)AsyncSession)AgentAgentAssignmentHistory)Visitor)Client)VisitorSummary)datetimetimezone)ZoneInfodb
visitor_idreturnc                    #    U R                  [        [        5      R                  [        R                  U:H  [        R
                  R                  S 5      5      5      I S h  vN nUR                  5       $  N7fN)executer   r	   wherer   ended_atis_scalar_one_or_none)r   r   results      9/var/www/html/livechat/backend/app/services/assignment.pyget_current_assignmentr      sb     ::%&	%00J>@V@_@_@c@cdh@i	j F $$&&	s   A A9"A7#A9agent_idc                    #    [        X5      I S h  vN nU(       a  UR                  U:X  a  U$ [        S5      e[        UUS9nU R	                  U5        U R                  5       I S h  vN   U R                  U5      I S h  vN   U$  Nv N! N
7f)Nz)Visitor already assigned to another agent)r   r   )r   r   
ValueErrorr	   addcommitrefresh)r   r   r   existing
assignments        r   assign_agent_to_visitorr%      s     +B;;H(ODEE'J FF:
))+
**Z
    <  s4   BBAB(B
)BBB
BBNc                   #    [        X5      I S h  vN nU(       d  g UR                  U:w  a  [        S5      e[        R                  " [
        R                  5      Ul        U R                  5       I S h  vN   g  Ni N7f)Nz$You are not assigned to this visitor)	r   r   r   r   nowr   utcr   r!   )r   r   r   currents       r   release_assignmentr*   +   s`     *2::G8#?@@||HLL1G
))+ ; s"   A?A;A#A?5A=6A?=A?c                 b   #    [        X5      I Sh  vN nU(       d  gUR                  U:H  $  N7f)u}   
Rule: if visitor has an active assignment → ONLY that agent can send.
      if no assignment → agent must first assign.
NF)r   r   )r   r   r   r$   s       r   is_agent_allowed_to_sendr,   :   s0     
 .b==J(** >s   /-/c                 ,  #    U R                  [        [        5      R                  [	        [        R
                  5      [	        [        R                  5      5      R                  [        R                  R                  5       5      5      I Sh  vN nUR                  5       R                  5       n/ nU GHQ  nSnUR                  (       a  [        UR                  S S9n[        XR                  5      I Sh  vN nSnSnU(       a  U R                  [        [        5      R!                  [        R                  UR"                  :H  5      5      I Sh  vN n	U	R%                  5       n
U
(       a  U
R                  nU
R&                  nUR)                  [+        UR                  UR,                  UR.                  [1        UR
                  SS5      [1        UR
                  SS5      [1        USS5      [1        USS5      UUS9	5        GMT     U$  GN GN N7f)	z;
Returns all visitors + last message + current assignment.
Nc                 R    U R                   =(       d    [        R                  " 5       $ r   )
created_atr   r'   )ms    r   <lambda>(get_dashboard_visitors.<locals>.<lambda>[   s    Q\\5OTXXZ5O    )keyclient_namewebsite_urltextr/   )	r   visitor_uid	client_idr5   r6   last_message_textlast_message_atassigned_agent_idassigned_agent_name)r   r   r
   optionsr   clientmessagesorder_byr/   descscalarsallmaxr   idr   r   r   r   nameappendr   r   r9   getattr)r   r   visitors	summariesvlast_msgcurrent_assignmentr<   r=   agent_resultags              r   get_dashboard_visitorsrQ   E   s     ::w	())*

 
'$$))+	, F ~~##%H&(I::1::+OPH $:"dd#CC "!#u##EHH0B0K0K$KL" L 002B$&EE!&(gg#44LL++#AHHmTB#AHHmTB")(FD"A ', E"3$7
	
' B [& Ds9   BHHA*H8H9AHHB9HHH)typingr   sqlalchemy.ormr   sqlalchemy.sqlr   
sqlalchemyr   sqlalchemy.ext.asyncior   app.models.agentr   r	   app.models.visitorr
   app.models.clientr   app.schemas.agentr   r   r   zoneinfor   intr   r%   r*   boolr,   listrQ    r3   r   <module>r`      s     '   / ; & $ , ' 'l ' 'RhIi '| s PS Yo (  # RV + + +QT +Z^ +3l 3^8L 3r3   