U
    YHg                     @   s   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	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lZG d
d dZd	S )    )datetime	timedelta)appdbdb_model
app_logger)PreCalculatedCampaignService)CallAttemptService)CampaignCreationService)ContentService)ExperienceService)helpersNc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zd.ddZejd ejd ejjjfddZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- ZdS )/MissedCallServicec                 C   s^   |dkr2| d| dt  d| d| d	 n(| d| dt d d| d d S )	Nz*UPDATE engagement SET missed_call_status='z', updated_on='z', campaign_id=z WHERE id=''z%Y-%m-%d %H:%M:%S.%fz' WHERE id=')executer   utcnowstrftime)selfcursormissed_call_idstatusZnew_campaign_id r   G/var/www/dostadmin/dostadmin/services/scheduling/missed_call_service.pyupdate_missed_call_status   s      z+MissedCallService.update_missed_call_statusc                 C   s8   d}| | | }i }|D ]}|d ||d < q|S )Nz-SELECT phone, content_id FROM providernumber;   r   )r   fetchall)r   r   SQLZ
all_introsZintro_content_objZintror   r   r   get_intro_content_for_all!   s    
z+MissedCallService.get_intro_content_for_allc              
   C   s  z| d}| d}| |r>td| d|  W d S | |}| |}| d}t |}|std| d|  | ||\}}|j	|_
tjjj|_||_tj  W d S |jtjjjkr| |}	|	rtjjj|_|	j	|_tj  W d S |jdd  tjd	 kr0| ||}
|
r0W d S tj|}|rRtjj |jnd }|r|jtjjjkrtd
| d tjjj!|_tj  W d S | "|| W nB t#k
r } z"t$d|  t%t&'  W 5 d }~X Y nX d S )NCallSidFromz+Found duplicate missed call log for phone: z and with id: Toz)First time missed call from phone number z with call sid TAF_EXPERIMENT_PROVIDER_NUMBERSz5Previous missed call is not yet processed for number z. Ignoring this missed call.z)Missed Call Service: Exception occurred: )(gethas_duplicate_missedcall_logr   infoprepare_engagement_dictcreate_missed_call_logr   Zcheck_for_existing_experience'handle_experience_creation_for_new_useridexperience_idr   MissedCallLogMissedCallStatus	SCHEDULEDmissed_call_statuscampaign_idr   sessioncommitr   
ExperienceStatusDND_WAIT handle_missed_call_for_DND_usersprovider_numberr   confighandle_taf_user_missed_call'get_latest_missedcalllog_for_experienceCampaignqueryget_campaign_by_idIGNORED"create_campaign_for_existing_users	Exceptionerrordebug	traceback
format_exc)r   datacall_siduser_numberengagement_datamissed_call_logr7   
experiencer0   campaignZis_missed_call_ignoredZprevious_missed_call_logZprevious_campaigner   r   r   handle_missed_call,   s    





 


 
	

z$MissedCallService.handle_missed_callc                 C   sV   |j tjjjkr(t|jt	  ks8|j tjjj
krRtjjj|_tj  dS dS NTF)r   r   r3   r4   PAUSEDr   date
created_onr   get_current_isttime	COMPLETEDr,   r-   r>   r/   r   r1   r2   )r   rJ   rI   r   r   r   r9      s    


z-MissedCallService.handle_taf_user_missed_callc              
   C   s   |j }|j}tjj|j}|j}tjj	|}| 
|}|tjjjks`|jd kr\|jd ks`|rz.t |}t |j }	| |||	}
|
W S  tk
r } z td| d|  W Y d S d }~X Y qX n| ||}
|
S d S )NzTMissed Call Service: Error while creating new experience for DND experience with id z. Error Message )r*   r7   r   Programr<   get_program_details
program_idr   PreCalculatedUserCampaignDataget_data_by_experience_idis_last_call_six_month_agor4   INACTIVEtoday_content_idprevious_content_idr   Z#create_new_experience_for_DND_usersr   add_new_experience get_provider_and_create_campaignr@   r   rA   %handle_campaign_creation_for_dnd_user)r   rJ   r+   r7   program_detailsZprogram_status!pre_calculated_user_campaign_datarY   new_experiencepre_calculated_campaign_datarK   rL   r   r   r   r6      sT    
   z2MissedCallService.handle_missed_call_for_DND_usersc                 C   s4   |  |}|r0t tdd }| | k S dS )N   daysT)get_last_call_deploy_timer   nowr   rP   )r   ra   Zlast_call_deploy_timeZsix_month_agor   r   r   rY      s    z,MissedCallService.is_last_call_six_month_agoc                 C   s.   |j }|j}|d k	r&|d k	r&t||S |p,|S )N)!previous_regular_call_deploy_time previous_missed_call_deploy_timemax)r   ra   Zprevious_regular_callZprevious_missed_callr   r   r   rg      s    
z+MissedCallService.get_last_call_deploy_timec                 C   sX   t  |}tjd }tjj|}|r<|j}tj	j
|}| ||||tjjj}|S )N%MISSED_CALL_CONFIRMATION_CALL_PSEQ_ID)r   Zget_default_intro_call_contentr   r8   r   ProviderNumberr<   find_provider_number_with_phone
content_id
Programseq!get_programseq_id_with_content_idcreate_confirmation_callr;   ScheduledByCRON_MISSED_CALL)r   r7   rb   rc   callback_content_idZcallback_programseq_idproviderrK   r   r   r   r^      s*    
z2MissedCallService.get_provider_and_create_campaignc              
   C   s  zRi }i }d }t jjd}t jjt jjj}t jj	|}|rP|j
}|j}||d< t jj|}	|	r|	j|d< |	j|d< |	j|d< |	std| d td| d	| d
 t jd|||t jjjjd}
tj|
 tj  | |
j||||}t |j}| |||}|s8td|  |d fW S t  !|||d ||jfW S  t"k
r } ztd|  W 5 d }~X Y nX d S )Ncallin
partner_idstatedistrictblockz1Missedcall Service: Partner not found for the id .zCreating new user entry for  with  as provider number.fnu)namerx   program_orderuser_type_idsignup_statusz=Missed Call Service: Intro call not created for phone number Tz;Error on function handle_experience_creation_for_new_user: )#r   Partnerr<   get_id_with_nameUserTypeget_user_type_id_by_nameTypePARENTrm   rn   rx   language_id	get_by_idry   rz   r{   r   rA   r&   Useruserr4   
INCOMPLETEr   r1   addr2   start_experiencer*   r   r]   r^   r	   attempt_callr@   )r   rG   r7   r   registration_datar   rx   r   rv   partnerr   rJ   rc   rK   rL   r   r   r   r)      s    





      
   z9MissedCallService.handle_experience_creation_for_new_userNc                 C   s  zt   }|tdd }|tjd krDtjj	tjd f}n|dd  tjd krrtjj	tjd f}nr|dd  tjd krtjj	tjd	 f}nD|dd  tjd
 krtjj	tjd f}ntjj	tjd f}t
d| d| d tj|tjjj|dd  |r|n
tjj tjjtjd |t|d|tjjjd	}	t
d| d| d tj||dd  ||d|	j|	jtjjjj|d|d|dd
}
tj |
 tj |	 tj!  |	W S  t"k
r } zt
#d|  W 5 d }~X Y nX d S )Nr   re   ASSAM_PROVIDER_NUMBERASSAM_DEFAULT_PROGRAM_NAMEr"   r#   EXPERIMENT_DEFAULT_PROGRAM_NAMEBIHAR_PROVIDER_NUMBERSBIHAR_DEFAULT_PROGRAM_NAMEMP_PROVIDER_NUMBERSMP_DEFAULT_PROGRAM_NAME DEFAULT_MISSED_CALL_PROGRAM_NAMEzStarting new experience for r}   r~   !DEFAULT_MISSED_CALL_TIME_CATEGORYz%m/%d/%Y)	user_idr   phoner   timecategory_idrV   
start_dater7   typezCreating new registration for rx   rz   ry   r{   )
r   r   r7   rx   rV   time_category_idr   rz   ry   r{   z$Error on function start_experience: )$r   rR   rP   r   r   r8   r   rT   r<   find_program_id_with_namer   r&   r3   r4   PENDINGLanguagefind_language_id_with_nameTimecategoryfind_timecategory_id_with_namer   r   r   SELFPACEDPCRegistrationr$   rV   r   r   r   r   r   r1   r   r2   r@   rA   )r   r   r   r7   r   r   
today_dateZnext_dayrV   rb   registrationrL   r   r   r   r   <  s    





z"MissedCallService.start_experienceCONFIRMATION_CALL_CONTENT_IDCONFIRMATION_CALL_PSEQ_IDc           
      C   s  |j }tjjj||}td|j tj	dt
|j ||j|jt tdd tj	jj|j||j|j||jd}tj| tj  t  |_|j|_|j|_|j|_|j|_|j |_!|j |_"|j#|_$|j%|_&|j|j#|j'|j%|j|j |j(d}	t) *|	 |S )Nz7Creating first confirmation call for user with phone %sZW0D0_   )seconds)r   ro   content_version_idrG   deploy_datetimer   r+   scheduled_byr   r7   programseq_idr   )r0   campaign_namer+   r   ro   r   r   )+r   r   content_versionContentVersionr<   .get_content_version_by_content_and_language_idr   r&   r   r;   strr   r*   r   rR   r   r4   r.   r7   r   r   r1   r   r2   rP   call_details_for_date previous_missed_call_campaign_idr   $previous_missed_call_campaign_statusro   r[   r\   r   today_content_version_idprevious_content_version_idr   previous_campaign_namer   rj   r+   r   r   (update_pre_calculated_user_campaign_data)
r   rJ   rc   ro   r   r   r   r   rK   campaign_datar   r   r   rr     sf    
  

	z*MissedCallService.create_confirmation_callc                 C   s  t jj|j}|sHtd|j d|j  t jj	j
|_tj  d S d }|jt jjjt jjjfkrt| ||}np|jt jjjkr| |}nT|jt jjjkr| ||}n6|jt jjjkr| |}n|jt jjjkr| |}|j|_|d kr*td|j d|j  t jj	j
|_tj  |S t  |||d |j|_!t jj	j"|_|jt jjjt jjjt jjjfkr|j#|_$|j%|_&|j'|_(|j|_)|j*|_+|j|_,tj  |S )Nz/PreCalculated data not found for existing user z and experience id zDCampaignCreationService: No campaign was scheduled for phone number z and missed call id T)-r   rW   r<   rX   r*   r   rA   r   r,   r-   r>   r/   r   r1   r2   r   r3   r4   ACTIVEr   "get_campaign_for_active_experienceUNSUBSCRIBE.handle_campaign_creation_for_unsubscribed_userrO   (handle_campaign_creation_for_paused_userrS   +handle_campaign_creation_for_completed_userCHURNED)handle_campaign_creation_for_churned_userr+   warningr	   r   r0   r.   r   r   ro   r\   r   r   r   r   rj   r   )r   rJ   rI   ra   rK   r   r   r   r?     s    
  


   
z4MissedCallService.create_campaign_for_existing_usersc                 C   s  t  |dd}|d}t|}t }| }|j}|j}	|dt	j
jjkr|rt	j
j|d}
t	j
jj|
_t |
_|d|_|
j|_|
j|_nN|d}|r||}nd|j }t	jj||j}|dt	j
jjkrN||	krN|sNt	jj|j }||kr.|!|d|j}n t	j"j#|j$|}|%||j}|sxt&'d|j( d	| d
|j  d S t	j"j#|j$|}t	j
|t |j(|j)t	j
jjt	j
jj||j*|j*|j|j+|j$|r|j*nd d}
t,j-.|
 t,j-/  |
S )NTFdeploy_timer   r0   r   ZW1D1_z?MissedCallService: While handling missed call for phone number z7, the content version couldn't be found for content id z and language_id )r   r   rG   r7   r   r   ro   r   r+   r   r   rV   r   )0r   get_previous_campaign_datar$   r   is_current_date_timestampr
   Zget_special_content_idsr[   r\   r   r;   r4   r.   r<   r=   rs   rt   r   rR   r   r   rj   r   r   Zget_campaign_namer   r   r   r   rS   r3   r   r+   Z!get_campaign_name_for_intro_callsrp   &get_program_seq_by_content_and_programrV   Z3get_campaign_name_from_program_sequence_and_user_idr   rA   r   r7   r*   r   r   r1   r   flush)r   rJ   ra   Zprevious_call_dataZprevious_deploy_timeis_current_date_callZcampaign_creation_serviceZspecial_content_idsro   r\   rK   Zprevious_call_nameZnew_campaign_namer   Zprogram_sequencer   r   r   r      s      



 
    
z4MissedCallService.get_campaign_for_active_experiencec                 C   s   z|j tjd krW d S tjd }|j}tjjj||}tj	dt
|j ||jt tj	jj|jtj	jj|j|j |jd |jd}tj| tj  |W S  tk
r } z"td|j d|  W Y d S d }~X Y nX d S )Nr   UNSUBSCRIBE_CALLBACK_CONTENT_IDRESUB_r   ro   r   r   r   r+   r   r   r7   rG   r   r   IError occurred while creating campaign for unsubscribed user with number . Error Message: )r7   r   r8   r   r   r   r   r<   r   r;   r   r   r*   r   rR   r4   r.   rs   rt   r   r   r   r1   r   r   r@   r   rA   r   rJ   ru   r   r   new_campaignrL   r   r   r   r     s>    

 
z@MissedCallService.handle_campaign_creation_for_unsubscribed_userc                 C   s   zt jd }|j}tjjj||}tjdt	|j
 ||jt tjjj|jtjjj|j
|j|jd |jd}tj| tj  |W S  tk
r } z"td|j d|  W Y d S d }~X Y nX d S )N CHURNED_USER_CALLBACK_CONTENT_IDr   r   zDError occurred while creating campaign for churned user with number r   )r   r8   r   r   r   r   r<   r   r;   r   r   r*   r   rR   r4   r.   rs   rt   r7   r   r   r   r1   r   r   r@   r   rA   r   r   r   r   r     s:    

 
z;MissedCallService.handle_campaign_creation_for_churned_userc                 C   s   z|j tjd krW d S tjd }tjjj||j}tj	dt
|j ||jt tj	jj|jtj	jj|j|j |jd |jd}tj| tj  |W S  tk
r } z"td|j d|  W Y d S d }~X Y nX d S )Nr   'COMPLETED_USER_PROGRAM_OPTIN_CONTENT_IDZALUMNI_r   zFError occurred while creating campaign for completed user with number r   )r7   r   r8   r   r   r   r<   r   r   r;   r   r   r*   r   rR   r4   r.   rs   rt   r   r   r   r1   r   r   r@   r   rA   )r   rJ   ro   r   r   rL   r   r   r   r     s<    

 
z=MissedCallService.handle_campaign_creation_for_completed_userc              
   C   sh   z"t jjj|_d|_tj  W d S  t	k
rb } z"t
d|j d|  W Y d S d }~X Y nX d S NTr   r   r   r3   r4   r   r   is_eligible_to_callr   r1   r2   r@   r   rA   r   r   rJ   ra   rL   r   r   r   r_     s    
z7MissedCallService.handle_campaign_creation_for_dnd_userc              
   C   sh   z"t jjj|_d|_tj  W d S  t	k
rb } z"t
d|j d|  W Y d S d }~X Y nX d S r   r   r   r   r   r   r     s    
z:MissedCallService.handle_campaign_creation_for_paused_userc              
   C   sd   t j|d|d|d|d|d|dt jjj|dd}tj| tj  |S )	Nexotelnumberr+   r   r*   
start_timer/   r0   )r   r+   r   r*   r   r/   r0   )	r   r,   r$   r-   TO_SCHEDULEr   r1   r   r2   )r   rE   rI   r   r   r   r(     s    
z(MissedCallService.create_missed_call_logc                 C   sv   | d}|dd  }i }| d|d< | d|d< ||d< | drXt|d d	nt |d
< | d|d< |S )Nr    r   r   r*   r!   r   r   	StartTimez%Y-%m-%d %H:%M:%Sr   r0   )r$   r   strptimerh   )r   rE   rG   rH   r   r   r   r'     s    
z)MissedCallService.prepare_engagement_dictc                 C   s   t jj|rdS dS rN   )r   r,   r<   r   )r   rF   r   r   r   r%   &  s    z.MissedCallService.has_duplicate_missedcall_log)N)__name__
__module____qualname__r   r   rM   r9   r6   rY   rg   r^   r)   r   r   r8   r   r;   rs   CRON_REGULARrr   r?   r   r   r   r   r_   r   r(   r'   r%   r   r   r   r   r      s2   Z0	F 
S
CRc# !r   )r   r   	dostadminr   r   r   r   =dostadmin.services.scheduling.pre_calculated_campaign_servicer   Z2dostadmin.services.scheduling.call_attempt_servicer	   7dostadmin.services.scheduling.campaign_creation_servicer
   Z*dostadmin.services.content.content_servicer   Z0dostadmin.services.experience.experience_servicer   Zutils.helpersr   rC   r   r   r   r   r   <module>   s   