HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/buyercall/buyercall/blueprints/leads/__pycache__/views.cpython-310.pyc
o

�we��@s�ddlZddlZddlmZddlmZddlZddlmZmZddlm	Z	ddl
mZddlZddl
Z
ddlmZmZmZmZmZmZmZmZmZddlmZmZmZmZmZmZdd	lm Z m!Z!dd
l"m#Z#m$Z$ddl%m&Z'ddlm(Z(dd
l)m*Z*ddl+m,Z,ddl+m-Z-ddl.m/Z/ddl0m1Z1m2Z2ddl3m4Z4m5Z5ddl6m7Z7ddl8m9Z9ddl:m;Z;ede<dd�Z=e�>e<�Z?dd�Z@dd�ZAdd�ZBe=jCd d!d"gd#�e,jDe#d$d%����ZEe=�Cd&�e#e9d'd(�d)d*����ZFe=jCd+d!d"gd#�e#d,d-���ZGe,jDe=jCd.d"gd#�d/d0���ZHe,jDe=jCd1d"gd#�d2d3���ZIe=�Cd4�e,jDe#d5d6����ZJe=�Cd7�e,jDe#d8d9����ZKe=jCd:d!gd#�e,jDe#d;d<����ZLe=jCd=d!gd#�e#d>d?���ZMe=jCd@d!gd#�e#e,jDdAdB����ZNe=jCd@d"gd#�e,jDdCdD���ZOdEdF�ZPdS)G�N)�closing)�date)�datetime�	timedelta)�StringIO)�unescape)	�	Blueprint�request�flash�jsonify�url_for�current_app�
make_response�redirect�render_template)�extract�or_�and_�desc�func�text)�contains_eager�	load_only)�login_required�current_user)�gettext)�ceil)�
VoiceResponse)�csrf)�db)�account_client�)�LeadForm�LeadNoteForm)�Lead�	LeadNotes��Agent)�
role_required)�format_phone_number�leads�	templates)�template_foldercCs4d}|�dd�}tj��D]
\}}||kr|}q
|S)N��_� )�replacer$�STATUSES�items)�status_value�result�k�v�r7�B/home/arjun/projects/buyercall/buyercall/blueprints/leads/views.py�get_call_status_key,s�r9cCs&t�|d�}t�|d�}t||j�S)N�%m%d%Y)r�strptime�abs�days)�d1�d2r7r7r8�days_between7sr@cCs|dks|dkr
dSdS)N�true�TrueTFr7)�paramr7r7r8�
getboolean=srDz/leads_onboarding�GET�POST)�methodscCsBtjdkr
dt_tj��tjrttd�d�t	t
d��Std�S)NrFTz�Great, you are ready to get started with the My Leads page. Remember to checkout the support section or FAQ if you have any additional leads questions.�success�leads.call_leadszleads/leads_onboarding.jinja2)r	�methodr�
leads_onboardr�session�commitr
r.rrrr7r7r7r8�onboarding_leadsEs

��rNz/leads�admin�agentcCs�tjrtjjnd}tj�d�|��tj}tj}tj	}|r#|r#tj
}n
|s-|r-ttd��Sddl
m}|j�|j|k���}tjdkrT|tjk|tjkBtjtjkB}nttj|ktjdk�}t��}|j}|j}	tj�t|����}
tj�t|���tdtj�|k��tdtj�|	k���}tjd	ur�ttd
��St dd�}||}
t�!|
d
�}t�!|d
�}t"d||d|
||dddddddd�S)N�The agent id is {}�partnership.company_accountsr��PhonerPrO�year�monthFzleads.onboarding_leads�)r=z%m/%d/%Yzleads/leads.jinja2)
�	date_from�date_to�calls�total_calls�
monthly_calls�phonenumber�unique_calls�answered_calls�percentage_answered�percentage_missed�call_duration_min�avg_call_duration_min�avg_call_duration_sec)#rrP�idr
�logger�debug�format�partnership_account_id�is_admin_user_with_groups�is_viewing_partnership�'get_user_viewing_partnership_account_idrr�(buyercall.blueprints.phonenumbers.modelsrT�query�filter�first�roler$�agent_id�agent_assigned_idrr�nowrUrVr�countr�
created_onrKr�strftimer)rrri�is_admin_in_group�viewing_partnership_accountrTr]�	filter_byrtrUrVr[r\�	day_delta�then�date_from_value�
date_to_valuer7r7r8�
call_leadsYsd

����

�rz/leads/edit/<int:id>cCs�tj}tj}tj}|r|rtj}n
|s|rttd��Stj�	tj
|ktj|k���}|s9td�
|��ttd��St|d�}t|d�}tj�	|jtj
k���}|rT|jnd}dd�tj�	tjtjktj�d���d	�D�|j_|jj�d
d�d
dlm}	|	�|�}
d
d�|
D�|j_tj�d�|_|j dur�t!|j d�}t!|j d�}nd
}d
}d}
|j"dur�t!t#t$|j"�d��}
|
dkr�d}nd}|�%�r�|�&|�d
dlm'}|�(|j)d|j*d|d�|�+�|�%��r�|�&|�|j,}d|_,|�+�d}|j-j*du�r
t.t/|j-j*��}tj�	|j0tj0k|jtjk��1�}|D]}|j|_�qt2j3�4�t5t.|��d
k�rJ||j
t6�7�t6�7�t!tj
�dd�}t8�9|�}nd}t5|�d
k�rzt:�;|�}|D]}t8�<t!|d�t.|d�t6�7�t!tj
�t=t.|d���}�qZ|�r�tt>d�d�ttd|j
d��Stj�	tj|ktj0|j0k��?t@d	ddd d!���tAd"���Bd#��1�}tj�	tj|ktj0|j0k��C�}t8j�Dt��	|j0tj0kt8jE��tFt8jG���1�}tHd$||
||||||jI|jJ|jK|||d%�S)&NrRzLead with ID {} not found.rI)�objr-cS�g|]}|j|jf�qSr7)re�	full_name)�.0�gr7r7r8�
<listcomp>��zlead_edit.<locals>.<listcomp>F�	firstnamer)rr-��StatuscSr�r7)�status�display_name)r��sr7r7r8r��r�rs�<r!�minutes�minute��Contact�progress_statusT)r�lead_idrv�
updated_on�user_id�
is_enabledre�newtext�	isenabledz'The lead has been updated successfully.rHzleads.lead_edit�re�lastname�	starttime�	call_typer�zstarttime desc�
zleads/edit.jinja2)
�lead�duration_minute�form�response_time_min�response_time_sec�
agent_namer��lead_source�question�my_phone�
number_log�number_log_count�number_notes)Lrrirjrkrlrrr$rnrorerpr
rhr"r#r'rrr��is_deactivated�is_�order_byrs�choices�insert�$buyercall.blueprints.contacts.modelsr��get_assigned_status_listr�r	r��get�response_time_seconds�int�durationr�float�validate_on_submit�populate_objr��
update_status�
contact_id�data�save�notes�edited_notes_str�strrr]�allrrLrM�lenrrtr%�create�json�loads�updaterDr.�optionsrr�limitru�joinr�rrvr�sourcer�r�)rerirxryr�r��	form_noterPr�r��status_listr�r�r�r�r��lead_form_note�	notequeryrZ�	each_call�noter4�
noteobject�lpnote�lpresult�previous_calls�previous_calls_count�all_lead_notesr7r7r8�	lead_edit�s���



�
�







��
�


�
���
��
���r�z/callc
Cs�tj�dd�}d}ddlm}m}|j�|j|k��	�}|j�|j|j
k��	�}zt|j�}WntyL}zd�
|�}td|i�WYd}~Sd}~wwz|jjtjd|tdd	d
d�d�}	Wn ty�}ztj�|�tdt|�i�WYd}~Sd}~wwtj�ttjt|�ktjtjk���tj����	�}
|
dur�|
j }nd
}t||	j!tj�dd�tj�dd�tj�dd�||	j"|	j#|	j$|	j%|d�}t&j'�(|�t&j'�)�tj�|j�}
t�*|
�tddi�S)N�phoneNumber�qr)�Partnership�PartnershipAccountz#Missing configuration variable: {0}�error�TWILIO_CALLER_IDzleads.outboundT�https)�	_external�_scheme)�from_�to�urlz	no status�	firstName�lastName�email)rir�r�r�r�r]r�r��endtime�call_sidr��messagezCall incoming!)+r	r�r��'buyercall.blueprints.partnership.modelsr�r�rnrorerp�partnership_idr �	ExceptionrhrrZr�r
�configrrfr�r�r$rr]r)rirr�rvrr�r�r��
start_time�end_time�sidrrL�addrM�update_lead_twilio)�phone_number�
account_idr�r��partner_account�partner�
twilio_client�e�msg�call�
existing_leadr�r�r�r7r7r8r�>sh�
���
���
���

r�z	/outboundcCst�}|jddd�	t|�S)Nz�Thank you for contacting our sales department. If this click to call application was in production, we would dial out to your sales team with the Dial verb.�alice)�voice)r�sayr�)�responser7r7r8�outbound�s�r�z/presigned_audio_urlc
Cs�z9ttj�d��}|r5ddlm}||�}|r4|dr4|dr4ddlm}||d|dd�}|r4|WSnWdSWntyT}zt�	d	�
|��WYd}~dSd}~wwt�	d
�dS)Nr�r)�get_recording_url_details�key�bucket)�generate_presigned_aws_urlTr-z)Error retrieving presigned url. Error: {}z!Unable to retrieve presigned url.)r�r	�argsr��buyercall.lib.util_boto3_s3r�rr��logr�rh)r�r��detailsrr4r�r7r7r8�get_presigned_audio_url�s(����
rz/datac]sXtj�dd��ttj�dd��}tj�dd�}ttj�dd��}ttj�d	d
��}tjr0tjjnd}ttj�d��}ttj�d
��}ttj�d��}ttj�d��}ttj�d��}	ttj�d��}
ttj�d��}ttj�d��}ttj�d��}
ttj�d��}t||�}t	d�}t	d�}t	d�}t	d�}t	d�}t	d�}t	d�}t	d�}tj
}tj}|r�tj}t
�|d���}t
�|d���}tt�tj�|kt�tj�|k�}tjdkr�|tjk|tjkBtj
|kB}nttj
|ktjdk�}ddlm}tjtjtjtjtjtjtjtj|jtj g
}tjtjtjtjtjtjtjtj|jtj!t"j#tjtj t"jtj$tjg} |�rU|dk�rU|dk�rU|�%d�dk�rNt	d�&|��}nt	d�&|��}|dk�rx|�rx|�'�d k�rktt	d!��}n
|�'�d"k�rxtt	d#��}|dk�r�|�r�tt	d$�&|���}|	dk�r�|	�r�tt	d%�&|	���}|
dk�r�|
�r�tt	d&�&|
���}|dk�r�|�r�tt	d'�&t(|����}|dk�r�|�r�|�%d�dk�r�tt	d(�&|���}n	tt	d)�&|���}|
dk�r�|
�r�d*}!|
d+k�r�d,}!tt	d-�&|!���}tjg}"tj)�*tj��*tj+��,|tj-|jk��*tj.��/t0tj��1d.d/�t0tj+��1d0d1�t0tj.��1d0d2���2|��2|��2|��2|��2|��2|��2|��2|��2|��2|�}#|#}$��r�|#j3|��4�}%�fd3d4�|%D�}&d5d4�|&D�}'tj)�*tj��*tj+��,|tj-|jk��*tj.��/t0tj��1d.d/�t0tj+��1d0d1�t0tj.��1d0d2���2tj�5|'��}$|$j3| �}(|t6t7| ��v�r�| |})|d6k�r�t8|)�})|(�9|)�}(|(�:|��;|�}(d7d4�|(�4�D�}*|$j3|"�}+t<�},|+�4�D]
}-|,�=|-d��q�t7|,�}.dd8l>m?}/|*D]#}0|0d9du�rz
|/jd:v�r
d;|0d9<W�q�t@�yY�q�w�q�tAd<t�tj��}1tAd=t�tj��}2d>}3d?}4|d@k�rHtAd<t�tj��}1tAd=t�tj��}2nCdA|k�rTdBk�rrnntAd=t�tj��}1tAdCt�tj��}2|jB|jBk�rqdD}4n|dBk�r�tAdCt�tj��}1tAdCt�tj��}2dE}3tCjD�)|1�Ed?�|2�EdD�t�%tj��EdF���2|��2|��2tj�5|,���Fd?dD��9|4�}5t<�}6t<�}7t<�}8|5D]=}9t|9jG��HdG�}:t|9jI��HdG�};|9jG|8v�r�|8�=|9jG�|3�r�|7�=|:d�n
|7�=dH�&|:d|;d��|6�=|9jJ��q�|5�2|tjdIk�}<t<�}=g}>|<D]}?|=�=|?jG�|>�=|?jJ��q
g}@d}A|8D]!}B|B|=v�r>|At7|>�k�r<|@�=|>|A�|AdJ}A�q#|@�=d��q#|5�2|tjdKk�}Cg}Dg}E|CD]}?|D�=|?jG�|E�=|?jJ��qTg}Fd}G|8D]}B|B|Dv�r~|F�=|E|G�|GdJ}G�qj|F�=d��qjg}H|FD]}I|H�=|I��q�g}J|@D]}I|J�=|I��q�g}K|6D]}I|K�=|I��q�g}L|7D]
}I|L�=t|I���q�|$�%�}M|$�2tK|���Ltj��%�}N|$�2tKtjdIk�|��%�}O|M�r�ttM|O�dLtM|M��nd}P|$�2tKtjdKk�|��%�}Q|M�rttM|Q�dLtM|M��nd}R|$�3tjN��2tK|���4�}S|Sdu�rd}Tn1dMd4�|SD�}Ug}V|UD]}W|W�s8tMd�}X|V�=|X��q(tO�PtM|W�dN�}Y|V�=|Y��q(ttQ|V��}T|$�3t�RtjN��EdO���S�}Z|Zdu�rdd}Zn	t|ZdP�}[t|ZdP�}\tTdbidQtjdQ�dR|.�dS|.�dT|*�dU|H�dV|J�dW|K�dX|L�dY|M�dZ|N�d[|O�d\|P�d]|Q�d^|R�d_|T�d`|[�da|\��S)czReturn server side data.�
search[value]r-zorder[0][column]z-1z
order[0][dir]�asc�startr�length�cN�df�dt�ad�ab�aa�ps�so�st�tp�pnr:rPrOr��null�None�-��widgets.guid = '{}'�phonenumbers.id = {}rA�leads.recording_url != ''�false�leads.recording_url = ''�leads.agent_id = {}�leads.agent_assigned_id = {}�leads.progress_status = '{}'�leads.status = '{}'�leads.widget_guid = '{}'�leads.inbound_id = '{}'�inbound�inr��leads.call_type = '{}'r�r�re�name�
friendly_namec�Pg|]�}|j��d|j�����ks�|j�����ks�|j�����ks�|j�����ks�|j�dd��dd��dd��dd��dd���dd��dd��dd��dd��dd�ks�|j�dd��dd��dd��dd��dd���dd��dd��dd��dd��dd�ks�|j�����ks�|j�����ks�|j	�����kr|�qS�r/z+1r-�(�)r�
r��lowerr��	caller_idr]r0r�r�r�r��r��x��searchr7r8r�V�$ $"�$"��
zdata.<locals>.<listcomp>cS�g|]}|j�qSr7r�r2r7r7r8r�d�rcs&g|]��fdd�tt���D��qS)csi|]}|�|�qSr7r7�r��i��rowr7r8�
<dictcomp>wsz#data.<locals>.<listcomp>.<dictcomp>)�ranger�)r�r7r;r8r�vs��)�current_supervisor_user�	)�
limitsysadminr��
Restricted�dayrVF�parentrW� inrU�childT�total�.z{}/{}�	completedr!�missed�dcSr7r7)r�r9r7r7r8r�r8gN@�averager��draw�recordsFiltered�recordsTotalr��graphMissed�
graphAnswered�
graphTotal�graphPointsrZr^r_r`�missed_callsrarbrcrdr7)Ur	rr�r�rrPrer�r@rrirkrlrr;rrrr$rvrqrrrsr�r�r�r�r1r]r�r�r�r��
recording_urlr'r�r�rurhr0r9rn�	outerjoin�widgetr�r�r&r�rrro�
with_entitiesr��in_r>r�rr��offsetr��list�append� buyercall.lib.supervisor_managerr?�AttributeErrorrrUrrL�label�group_byrD�splitrFrGr�distinctr�r��mathr�sum�avg�scalarr)]�order�	directionrZr�rrrXrY�audio�answered_agent�assigned_agentr��call_source�call_status�type_directionr��date_difference�filter_by_type�filter_by_audio�filter_by_assigned_agent�filter_by_answered_agent�filter_by_progress_status�filter_by_call_status�filter_by_call_source�filter_by_type_directionriry�converted_dateFrom�converted_dateTo�filter_by_daterzr��columns_search�columns_window�call_type_direction�
columns_totalrG�filtered�
total_list�searched_result_list�searched_result_ids�sorted_�
order_predr��filtered_total�lead_id_listr��total_call_leadsr?�lp_data�parent_type_filter�child_type_filter�
year_selector�
order_by_year�labels�filter_data_points�
filter_labels�filter_dater_�split_filter_date�split_filter_child�complete_totals�
complete_date�complete_valuer<�answered_data_points�complete_pointrC�
missed_totals�missed_date�missed_value�missed_data_points�missed_pointrJr:�answered�totals�pointsr[�total_unique_calls�total_answered_calls�total_percentage_answered�total_missed_calls�total_percentage_missed�total_call_duration�total_call_duration_min�new_call_duration�call_duration_listr��
duration_zero�float_duration�total_avg_call_duration�total_avg_call_duration_min�total_avg_call_duration_secr7r4r8r��sX
�
�����
�
��
��


�
���
�
��

�
""


��������	�
���
�����r�z/leads/filteroptionsc	CsJtjrtjjnd}i}i}i}i}i}i}tj}tj}|r tj}|tjkttj|ktj	dk�B}	tj
�tj��
ttj���dddddd��|	���}
tj
�tj��
ttj���dd	d
d��|	���}tj
�ttjtjk��|	����tj�}tj
�ttjtjk��tj|k����tj�}
|
�ttd�td�td
�|������}|�ttd
�td�|������}ddlm}|�|�}tj}|
D]&}|r�|dr�|dr�t|d�}t|d�}t|d�}d�||�||<q�|D]}|�r
|d�r
|d�r
t|d�}t|d�}|||<q�|D]}|�rt|j�}|j }|||<�q
|
D]}|�r3t|j�}|j }|||<�q"|D]}|j!}|j"||<�q7|D]}|�ra||�rat|��#dd�}t||�}|||<�qE|D]}|�r}t|d��r}t|d�|t|d�<�qe|D]}|�r�t|d��r�t|d�|t|d�<�q�t$||||||d�S)NrOzphonenumbers.idzphonenumbers.friendly_namezphonenumbers.phonenumberzphonenumbers.is_activezphonenumbers.is_deactivatedz#phonenumbers.partnership_account_idzwidgets.guidzwidgets.namezwidgets.enabledzwidgets.partnership_account_idz#phonenumbers.is_deactivated = falsez(phonenumbers.partnership_account_id = {}z#widgets.partnership_account_id = {}rr��r!�{} ({})r/r.)�phonenumber_data�answered_agent_data�assigned_agent_data�
progress_data�status_data�source_data)%rrPrerirkrlr$rrrrqrnrVr&r�rrXrorbrWr'r�r�r�rsrrhr�r�r�r�r1r�r�r�r�r0r)rr�phonenumber_result�answered_agent_result�assigned_agent_result�
status_result�progress_result�
source_resultriryrz�inbound_data�
outbound_data�answered_agent_data_list�assigned_agent_data_list�source_data_list_phones�source_data_list_widgetsr��progress_status_listr�r:rer)r*�itemrr7r7r8�
filteroptions;s�
�������������
��
�
�
����r�z
/leads/csvc+s"ttj�dd��}ttj�d��}ttj�d��}ttj�d��}ttj�d��}ttj�d��}ttj�d��}ttj�d	��}ttj�d
��}ttj�d��}	td�}
td�}td�}td�}
td�}td�}td�}td�}tj}tj}|r|tj}t	�
|d���}t	�
|d���}tjr�tjj
nd}tj�d
d��gd�}tj�d�|��tjdkr�|tjk|tjkBtj|kB}nttj|ktjdk�}tt�tj�|kt�tj�|k�}|r�|dkr�|dkr�|�d�dkr�td�|��}
ntd�|��}
|dk�r|�r|��dk�rttd��}n
|��dk�rttd��}|dk�r.|�r.ttd�|���}
|dk�r?|�r?ttd�|���}|dk�rP|�rPttd�|���}|dk�rc|�rcttd�t|����}|dk�r�|�r�|�d�dk�r}ttd �|���}n	ttd!�|���}|	dk�r�|	�r�d"}|	d#k�r�d$}ttd%�|���}d&d'lm}tj�tj��tj ��tj!��"|tj#|j$k��%t&tj��'d(d)�t&tj ��'d*d+�t&tj!��'d*d,���(|��(|��(|
��(|��(|��(|
��(|��(|��(|��(|�}|}tj
tj)tj*tj+tj,tj-tj$tj.|j$tj/g
}��r_|j0|��1�}�fd-d.�|D�} d/d.�| D�}!tj�tj��tj ��"|tj#|j$k��tj!��%t&tj��'d(d)�t&tj ��'d*d+�t&tj!��'d*d,���(tj
�2|!��}|�3tj
�}"|�4�}#d&}$t5t6����}%t7�8|%�}&|&�9|�|"�1�D]`}'|$d07}$|$|'j)|'j*|'j+|'j:|'j,|'j-|'j;|'j<t=|'j>�t=|'j?�|'j|'j.|'j$|�@|#|'j#�|'jA|'jB|'j�r�|'jCnd|'j�r�|'jjDnd|'j �o�|'j jE�p�|'j!�o�|'j!jF�p�dg}(|&�9d1d.�|(D���qd2�t�G��Hd3��})tI|%�J��}*d4|*jKd5<d6�|)�|*jKd7<|*Wd�S1�s
wYdS)8Nrr-r
rrrrrrrrr:r)�Noz
First Namez	Last Namez	Caller Id�EmailzPhone NumberzMy Phone�QuestionzDuration (secs)z
Start TimezEnd Timez
Created Onz	Call TypezCall StatuszProgress Statusz
Recording URL�NoteszAssigned TozAnswered Byz
Friendly NamerQrPrOrrrrrrrArrrr r!r"r#r$r%r&r'r�r(rr�r�r�rer)r*cr+r,r/r2r4r7r8r�Cr6zdata_csv.<locals>.<listcomp>cSr7r7r�r2r7r7r8r�Qr8r!cSsg|]}|�qSr7r7r2r7r7r8r�~szBuyercall Leads - {}.csvz%Y-%m-%dztext/csvzContent-Typezattachment; filename="{}"zContent-Disposition)Lr�r	rr�rrrirkrlrr;rrPrer
rfrgrhrqr$rrrsrrrvrur0r9r�r�rnrVrWr&r�r�r�r�rrror�r�r1r]r�r�r�rXr�rYr�� get_complete_status_list_as_dictrr�csv�writer�writerowr�r�r��format_dater�r��get_formatted_statusrUr��assigned_full_namer�r)r*�todayrwr�getvalue�headers)+r�rXrYrirjrkr�rlrmrnrprqrrrsrtrurvrwriryrxryrr�headerrzrzr}r�rGrr{r�r�r�rnr��row_no�outr�r��csv_row�filename�respr7r4r8�data_csv�s:
����
���

��

����
�&�r�z/api/leads/call/<int:lead_id>c
Cs�ddlm}tj}tj}|rtj}tj�tj|ktj	|k��
�}|s$dSg}tjdkr8tj�tj
tj	k���}ntj�tjtjktj�d����}|D]P}|jr_|�d�|j|j�|jd��|jrz|j|jksk|jsz|�d�|j|j�|jd��|jr�|j|jks�|j|jks�|js�|�d	�|j|j�|jd��qK|j�t|j|k|jd
k|jdk����}dd�|D�}	t|jo�|jj||j|	d
��S)a� Return this lead's call information in JSON format, with the following
    fields:

    - agentNumber: The phone number of the agent used to call the lead.
    - routingNumber: The routing number used to call the lead.
    - allAgentNumbers: An array of all agent numbers for this user.
    - allRoutingNumbers: An array of all routing numbers for this user.

    The numbers should be returned in E.123 format.
    rrSr-rPFz{}, Phone ({}))rP�numberz{}, Mobile ({})z{}, App ({})TcSs$g|]}d�|j|j�|jd��qS)r�)�friendlyNamer�)rhr*r]r2r7r7r8r��s���z&get_lead_call_info.<locals>.<listcomp>)�agentNumber�allAgentNumbers�
routingNumber�allRoutingNumbers)rmrTrrirkrlr$rnrorerprqr'r�r�r�r�r]r\rhr��mobile�
app_numberr�activerrPr�)
r�rTriryr��	agent_nos�agentsrP�routings�routing_nosr7r7r8�get_lead_call_info�s���

��
�������������r�cCs�ddlm}ddlm}ddlm}tj}tj}|rtj	}t
��}|�d�|�d�}}|j
�|j|k|j|k��td����}	|	sDdS|j
�|j|kt|j|k|j|k|j|k���|jd	k��td����}
|
sld
Stj
�tj|ktj|k���}|s�d�|�dfSdd
lm}|j
�|j|k|j|jk���}
t||
j|
j|
j|
j t!�"�d||	j|
j|
j#d|
j|dd�}|�$�|
j|kr�d}n
|
j|kr�d}nd}d|
j|d�gi}|	j%dkr�ddl&m'}|||�dS|�(|j|
j|�dS)NrrSr&)�connect_lead_to_agentr�r�re)z Cannot find routing phone number��0)zCannot find agentr�zLead with ID {} not foundr�r�r��ringingzAgent Outbound Call)rir�r�r]r�r�r�r��
inbound_idrrr�r�r��originating_numberrlr��app�phoner�)re�contactUsing�tracking)�agent_manual_outbound_callr-))rmrT�"buyercall.blueprints.agents.modelsr'�'buyercall.blueprints.phonenumbers.tasksr�rrirkrlr	�get_jsonr�rnror]r�rrprr�r�r�r$rerhr�r�r�r�r��
phonenumber_1r�r�utcnowr�r��type�(buyercall.blueprints.widgets.bw_outboundr��delay)r�rTr'r�riryr��agent_number�routing_number�routingrP�old_leadr��contactr��
contact_using�
call_settingsr�r7r7r8�call_lead_again�s����
�����
���

�

�rcCs|sdS|�d�S)z2 Format a local date for consumption by Excel
    r-z%Y-%m-%d %H:%M:%S)rw)�date_objr7r7r8r�3s
r�)Qr�r��
contextlibrrrrcr�ior�htmlr�logging�boto3�flaskrr	r
rrr
rrr�
sqlalchemyrrrrrr�sqlalchemy.ormrr�flask_loginrr�flask_babelrr.r�twilio.twiml.voice_responser�buyercall.extensionsrr�buyercall.lib.util_twilior �formsr"r#�modelsr$r%r�r'�$buyercall.blueprints.user.decoratorsr(�buyercall.blueprints.filtersr)�__name__r*�	getLoggerrr9r@rD�route�exemptrNrr�r�r�rr�r�r�r�rr�r7r7r7r8�<module>s�, 

?"AzRPS