
    f6i-                        d dl mZmZmZmZmZmZ d dlmZ d dl	m
Z
mZ d dlmZmZmZmZ d dlmZ d dlZd dlZd dlmZ d dlmZmZmZmZmZ d d	lmZ d d
lmZ d dl m!Z!  eddg      Z" G d de      Z# G d de      Z$ G d de      Z% G d de      Z& G d de      Z'e"jQ                  dee#          ee       ee      fdedefd       Z)e"jU                  de#       ee       ee      fde$dedefd       Z+e"jQ                  d ee          ee       ee      d d!fd"e,deded#e,d$e,f
d%       Z-e"jU                  d&       ee       ee      fd'e%dedefd(       Z.e"jQ                  d)       ee       ee       ed       ed*d+,      fdeded"ee,   d-e/fd.       Z0e"jU                  d/       ed0       ee       ee      fd1ededefd2       Z1e"jQ                  d3e'       ee       ee      fd4e,dedefd5       Z2y)6    )	APIRouterDependsHTTPExceptionQuery
UploadFileFile)Session)and_or_)ListOptionalDictAny)datetimeN)get_db)UserCustomerSegmentNotificationDelivery)get_current_user)	BaseModel)StreamingResponsez/customer-managementzcustomer-management)prefixtagsc                   ^    e Zd ZU eed<   eed<   dZedz  ed<   eeef   ed<   eed<   e	ed<   y)CustomerSegmentidnameNdescriptionfilter_criteriacustomer_count
created_at)
__name__
__module____qualname__int__annotations__strr    r   r   r        5/var/www/notifications/app/api/customer_management.pyr   r      s4    G
I"Kt"#s(^#r+   r   c                   @    e Zd ZU eed<   dZedz  ed<   eeef   ed<   y)CustomerSegmentCreater   Nr    r!   )r$   r%   r&   r)   r(   r    r   r   r*   r+   r,   r.   r.      s#    
I"Kt"#s(^#r+   r.   c                   <    e Zd ZU eed<   ee   ed<   eeef   ed<   y)CustomerBulkOperation	operationcustomer_idsdataN)	r$   r%   r&   r)   r(   r   r'   r   r   r*   r+   r,   r0   r0       s    Ns)
sCx.r+   r0   c                   f    e Zd ZU eed<   eed<   eed<   eed<   edz  ed<   edz  ed<   edz  ed<   y)	CustomerInteractionnotification_idtemplate_namechannelstatusNsent_at	opened_at
clicked_at)r$   r%   r&   r'   r(   r)   r   r*   r+   r,   r5   r5   &   s6    LK_$4r+   r5   c                       e Zd ZU eed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   ee   ed<   eeef   ed<   e	ed	<   eed
<   eed<   eed<   e	dz  ed<   ee
   ed<   y)CustomerDetailr   Nemailphone
tg_chat_id
vk_user_idr   metar#   total_notificationstotal_openedtotal_clickedlast_interactioninteractions)r$   r%   r&   r'   r(   r)   r   r   r   r   r5   r*   r+   r,   r>   r>   0   st    G::d
d

s)O
sCx.o%*++r+   r>   z	/segments)response_modelcurrent_userdbc                     t        ddddddiidt        j                               t        d	d
ddddiidt        j                               t        ddddddiidt        j                               gS )zList all customer segments   u   VIP клиентыu"   Клиенты с тегом 'vip'r   containsvip   r   r   r    r!   r"   r#      u)   Активные пользователиuL   Клиенты с активностью за последние 30 днейrG   gtez
2024-09-10      u   Email подписчикиu&   Клиенты с email адресомr?   is_not_nullTi,  )r   r   utcnow)rJ   rK   s     r,   list_segmentsrX   @   s     	%<#j%%89(	
 	<f/%1FG(	
 	-@$}d&;<(	
# r+   segment_datac           	          t        d| j                  | j                  | j                  dt	        j
                               S )zCreate a new customer segment   r   rQ   )r   r   r    r!   r   rW   )rY   rJ   rK   s      r,   create_segmentr\   c   s<      ,,$44??$ r+   z /segments/{segment_id}/customersd   
segment_idskiplimitc           	      r   |j                  t              j                  t        j                  |j                  k(        j	                  |      j                  |      j                         }|D cg c]<  }|j                  |j                  |j                  |j                  |j                  d> c}S c c}w )z#Get customers in a specific segment)r   r?   r@   r   r#   )queryr   filter	tenant_idoffsetr`   allr   r?   r@   r   r#   )r^   rJ   rK   r_   r`   	customerscs          r,   get_segment_customersri   u   s     		""l&<&<<	=		u	   	  $$WWWWFF,,	
	 	 	s   0AB4z/bulk-operationr1   c                 R   | j                   dk(  r| j                  j                  dg       }|j                  t              j                  t        t        j                  |j                  k(  t        j                  j                  | j                                    j                         }|D ]C  }t        |j                  xs g       }t        |j                  t        |                  |_        E |j!                          dt#        |       dddS | j                   dk(  r| j                  j                  dg       }|j                  t              j                  t        t        j                  |j                  k(  t        j                  j                  | j                                    j                         }|D ]7  }t        |j                  xs g       }t        |t        |      z
        |_        9 |j!                          dt#        |       dddS t%        d	d
      )z$Perform bulk operations on customersadd_tagsr   zTags added to 
 customerssuccess)messager9   remove_tagszTags removed from   zUnknown operationstatus_codedetail)r1   r3   getrb   r   rc   r
   rd   r   in_r2   rf   setr   listunioncommitlenr   )r1   rJ   rK   new_tagsrg   customerexisting_tagstags_to_removes           r,   bulk_operationr      s    j(>>%%fb1HHXV&&,*@*@@KKOOI$:$:; SU 	 " 	EH 34M !4!4S]!CDHM	E 			+C	N+;:FR[\\				-"++FB7HHXV&&,*@*@@KKOOI$:$:; SU 	 " 	FH 34M ^1D!DEHM	F 			/I/?zJV_`` 4GHHr+   z/exportcsvz^(csv|json)$)regexformatc                 v   |j                  t              j                  t        j                  | j                  k(        j	                         }|dk(  r]t        j                         }t        j                  |      }|j                  g d       |D ]  }|j                  |j                  |j                  xs d|j                  xs d|j                  xs d|j                  xs d|j                  rdj!                  |j                        nd|j"                  rt%        |j"                        nd|j&                  r|j&                  j)                         ndg        |j+                  d       t-        t        j.                  |j1                         j3                  d            ddd	i
      S |D cg c]y  }|j                  |j                  |j                  |j                  |j                  |j                  |j"                  |j&                  r|j&                  j)                         ndd{ c}S c c}w )zExport customers datar   )IDEmailPhoneTelegram IDVK IDTagsMetaz
Created At ,r   utf-8ztext/csvzContent-Dispositionz"attachment; filename=customers.csv)
media_typeheadersN)r   r?   r@   rA   rB   r   rC   r#   )rb   r   rc   rd   rf   ioStringIOr   writerwriterowr   r?   r@   rA   rB   r   joinrC   r)   r#   	isoformatseekr   BytesIOgetvalueencode)	rJ   rK   r^   r   rg   outputr   r|   rh   s	            r,   export_customersr      s    		""l&<&<<	=	  F# 	 
 	 " 
	HOO$"$"##)r##)r+3=='b&.mmHMM"3;3F3F##--/B	 	
	 	A JJv(//89!*,PQ
 	
$ 
  ddllll:;,,all446D	
 	
 
s   5A>H6z/import.filec           
        K   | j                   j                  d      st        dd      | j                          d{   }|j	                  d      }t        j                  t        j                  |            }d}g }t        |d	      D ]  \  }}		 g }
|	j                  d
      r@|	d
   j                  d      D cg c]#  }|j                         s|j                         % }
}t        |j                  |	j                  d      xs d|	j                  d      xs d|	j                  d      xs d|	j                  d      xs d|
i       }|j                  |       |dz  } |dkD  r|j'                          d| d||dS 7 Hc c}w # t         $ r+}|j#                  d| dt%        |              Y d}~0d}~ww xY ww)zImport customers from CSV filez.csvrp   zOnly CSV files are supportedrq   Nr   r   rR   )startr   r   r   r   r   r   )rd   r?   r@   rA   rB   r   rC   rM   zRow z: z	Imported rl   )rn   imported_counterrors)filenameendswithr   readdecoder   
DictReaderr   r   	enumeratert   splitstripr   rd   add	Exceptionappendr)   ry   )r   rJ   rK   contentcsv_content
csv_readerr   r   row_numrowr   tagr|   es                 r,   import_customersr     s     ==!!&)4RSSIIKG..)KK 89JNF!*A6 6	6Dwwv/26{/@/@/EU		UU&00ggg&.$ggg&.$77=19T777+3tH FF8aN%6. 
		 ~.j9( E   V  	6MMD	CF8455	6sS   <GFAG)F=F	F	%B F%"G	F	G F=7G=GGz/{customer_id}/detailcustomer_idc                 Z   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        dd      |j                  t        t        t              j                  t        t        j                  t        j                  k(        j                  t        t        j                  t        j                  k(        j                  t        t        j                  | k(  t        j                  |j                  k(              j                  t        j                  j                               j!                  d      j#                         }t%        |      }t'        d |D              }t'        d |D              }d}|r|d   d   j                  }g }	|D ]p  \  }
}}|	j)                  t+        |
j                  d	|
j,                   |j.                  |j0                  |j2                  |j4                  |j6                  
             r t9        |j                  |j:                  |j<                  |j>                  |j@                  |jB                  xs g |jD                  xs i |j                  |||||	      S )z:Get detailed customer information with interaction historyi  zCustomer not foundrq   2   c              3   B   K   | ]  \  }}}|j                   sd   ywrM   N)r;   .0_deliverys      r,   	<genexpr>z&get_customer_detail.<locals>.<genexpr>Z  s     R^Q!x?Q?QqR   c              3   B   K   | ]  \  }}}|j                   sd   ywr   )r<   r   s      r,   r   z&get_customer_detail.<locals>.<genexpr>[  s     Tna1@S@STr   Nr   z	Template )r6   r7   r8   r9   r:   r;   r<   )r   r?   r@   rA   rB   r   rC   r#   rD   rE   rF   rG   rH   )#rb   r   rc   r   rd   firstr   r   r   r   r6   r   r
   order_byr#   descr`   rf   rz   sumr   r5   template_idr8   r9   r:   r;   r<   r>   r?   r@   rA   rB   r   rC   )r   rJ   rK   r|   rH   rD   rE   rF   rG   interaction_listnotificationr   r   s                r,   get_customer_detailr   8  s'    		{*H,>,>,BXBX,X	Y	  4HII 	x2	h8+C+CC	D	h00HKK?	@	{*""l&<&<<

 
,))..0	1	r	   l+R|RRLTTTM'?1-88 %1 	!h 3(OO%l&>&>%?@$$??$$((**!
 		 ;;nnnn&&&&]] b]] b&&/!#)% r+   )3fastapir   r   r   r   r   r   sqlalchemy.ormr	   
sqlalchemyr
   r   typingr   r   r   r   r   r   r   app.db.sessionr   app.db.modelsr   r   r   r   r   app.api.depsr   pydanticr   fastapi.responsesr   routerr   r.   r0   r5   r>   rt   rX   postr\   r'   ri   r   r)   r   r   r   r*   r+   r,   <module>r      s   N N "   , ,  
 	 ! I I )  /	08M7N	Oi $I $I  )  ,Y ,  K_(=> !12&/ ?D [9 !!12&/' 	 :" .tDzJ !!12&/ 	 	
  K:  !!12&/1I$1I1I 	1I  1Ih I !12&/ %d^4	9
9
9
 9
 	9
 9
x YCy !12&//
// 	/ /d #NC !!12&/CCC 	C DCr+   