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/contacts/__pycache__/views.cpython-310.pyc
o


�e�F�@s<ddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
mZddlm
Z
ddlmZddlmZmZddlmZddlmZdd	lmZdd
lmZddlmZmZmZmZmZmZm Z m!Z!m"Z"m#Z$ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+dd
l,m-Z-m.Z.ddl/m0Z0m1Z1ddl2m3Z4ddl5m6Z6ddl5m7Z7ddl8m9Z9m:Z:m;Z;ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFddlGmHZHmIZImJZJddlKmLZLddlMmNZNddlOmPZPddlQmRZRddlSmTZTmUZUmVZVedeWdd�ZXe�YeW�Ze�Zd�Z[e�Zd�Z\d hZ]d!d"�Z^dd#d$�Z_d%d&�Z`d'd(�Zad)d*�Zbd+d,�Zcd-d.�Zdd/d0�Zed1d2�ZfeXjgd3d4gd5�e0e6jhd6d7����ZieXjgd8d4gd5�e0e6jhd9d:����ZjeXjgd8d;gd5�e0e6jhd<d=����ZkeXjgd>d4d;gd5�e0d?d@���ZleXjgdAd4d;gd5�e0dBdC���ZmeXjgdDd4d;gd5�e0eNdEdF����ZneX�gdG�e0dHdI���ZoeX�gdJ�e6jhe0dKdL����ZpeXjgdMd4gd5�e6jhe0dNdO����ZqeXjgdPd;gd5�e6jhe0dQdR����ZreXjgdSd4gd5�e6jhe0dTdU����ZseXjgdSd;gd5�e6jhe0dVdW����ZteXjgdXd;gd5�e0e6jhdYdZ����Zud[d\�Zvd]d^�Zwd_d`�Zxdadb�ZyeXjgdcd4gd5�e6jhe0ddde����ZzeXjgdfd4gd5�e0dgdh���Z{eXjgdid4gd5�e0e6jhdjdk����Z|eXjgdid;gd5�e6jhdldm���Z}dndo�Z~eXjgdpd;d4gd5�e0e6jhdqdr����ZeXjgdsd4d;gd5�e0e6jhdtdu����Z�eXjgdvd4d;gd5�e0dwdx���Z�eXjgdyd4gd5�e0dzd{���Z�eXjgd|d4gd5�e0d}d~���Z�dS)��N)�timezone)�StringIO)�unescape)�closing)�date�	timedelta)�datetime)�rrule)�format_phone_number)�	AESCipher)
�	Blueprint�request�flash�url_for�	send_file�jsonify�redirect�
make_response�render_template�current_app)�extract�or_�and_�desc�func�text)�contains_eager�	load_only)�login_required�current_user)�gettext)�csrf)�db�)�ContactForm�ContactVehicleForm�ContactNoteForm)
�Contact�ContactNotes�Lead�Message�
CreditReports�	Campaigns�BdcStatuses�Status�MarketingSources�ContactVehicle)�FormLead�ExternalForm�
FormLeadField��Agent)�subscription_required)�choices_from_dict)�agent_manual_outbound_call)�ActivityType�ActivityName�ActivityLogs�contacts�	templates)�template_folderz\S+@\S+\.\S+z^\+?[0-9]{10,12}$�csvcCs d|vo|�dd�d��tvS)N�.r#)�rsplit�lower�ALLOWED_EXTENSIONS)�filename�rE�E/home/arjun/projects/buyercall/buyercall/blueprints/contacts/views.py�allowed_file5s�rGcCsFd}|rtj�tj|k���}|r!tj�tj|ktj|kB���}|S)N)r'�query�filter�email�first�
phonenumber_1�
phonenumber_2)rJ�phone�contactrErErF�contact_exists:s rPcC�4d}|�dd�}tj��D]
\}}||kr|}q
|S�N��_� )�replacer'�STATUSES�items)�status_value�result�k�vrErErF�get_call_status_keyE��r]cCrQrR)rVr'�MARKETING_SOURCESrX)�source_valuerZr[r\rErErF�get_marketing_source_keyPr^racCs&t�|d�}t�|d�}t||j�S)N�%m%d%Y)r�strptime�abs�days)�d1�d2rErErF�days_betweenZsrhcCs|dks|dkr
dSdS)N�true�TrueTFrE)�paramrErErF�
getboolean`srlcCsd}|rd|��vrd}|S)NTz
<--invalidF�rB��valuerZrErErF�valid_csv_valuegs
rpcCspd}|r6|��}d|vrd}|Sd|vrd}|Sd|vr d}|Sd|vr(d}|Sd|vr0d}|Sd|vr6d}|S)	NFzdnc list - dont contactTzdont contactzdo not contactz	dont callzdo not callrirmrnrErErF�is_do_not_call_csv_valueqs*�
����rqcCs�g}d}g}|dus|dkr|�d�|�d�n|�|�|dus&|dkr1|�d�|�d�n|�|�|dus>|dkrD|�d�n|�|�|dusU|dksU|dkr`|�d�|�d�n9|�|�|�dd��dd��dd��d	d��d
d�}	t�|	�s�|d|d7}n|	|vs�||vr�|d|d
7}t|�dkr�|d}d}
|D]}|
d7}
||}|
t|�kr�|d7}q�|d7}q�|r�|dur�|�|�|�dt|��|Sd}|S)NrS�	firstname�lastname�+1�phonenumberrU�(�)�-�+zPhonenumber z
 is invalid. z already exists. rzRequired field(s) are missing: r#z; r@)�appendrV�phone_regex�match�len�insert�str)�rowrrrsrurJ�
phone_list�lead_details�
error_message�missing�test_number�count�missrErErF�validate_contact�sX






�



�r�z#/api/contacts/message/<int:lead_id>�GET)�methodsc
CsTddlm}d}d}g}tj}tj}|rtj}tj�tj|ktj	|k��
�}|s*dS|j�t��t
tj|j	ktj|k���tj����
�}|durL|j}|j�t
|j|k|j|jdk����}	g}
|	D]}|jrt|j�dd�rt|
�|�qcdd�|
D�}|r�tj|kr�d	}d
d�tj�tj|ktj�d�����d�D�}t|||||j|jd��S)
a� Return this lead's message 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.
    r��PhonerSFN�configSMSSetupcSs$g|]}d�|j|j�|jd��qS��{} ({}))�friendlyName�number)�format�
friendly_nameru�id��.0�xrErErF�
<listcomp>�����z)get_lead_message_info.<locals>.<listcomp>TcS�g|]}|j|jf�qSrE�r��	full_name�r��grErErFr��rr)�
routingNumber�allRoutingNumbers�	agentView�agentsru�name)�(buyercall.blueprints.phonenumbers.modelsr�r�partnership_account_id�is_viewing_partnership�'get_user_viewing_partnership_account_idr'rHrIr�rK�joinr*r�
contact_id�order_by�
updated_onrru�active�is_deactivated�all�routing_config�getrzr5�is_�distinctrrLr�)
�lead_idr��routing_number�display_agents�
agent_listr��!partnership_account_group_viewingrO�message�routings�processsed_routing_list�route�routing_nosrErErF�get_lead_message_info�sl��
���
��

�
��r�z/contacts/campaignscCs6d}tj}tj}|r
tj}t�|�\}}t||d��S)NF)�default_campaign�	campaigns)rr�r�r�r,�"get_assigned_campaign_list_as_dictr)r�r�r��
campaign_listrErErF�!get_partnership_account_campaignss�r��POSTcCsjd}tj}tj}|r
tj}tj�dd�}tj�dd�}t|�dkr(t�	||�}nt�
|||�}td|i�S)NFr�rSrrrZ)rr�r�r�r
�argsr��intr,�add_campaign�update_campaignr)rZr�r��campaign_id�
campaign_textrErErF�!set_partnership_account_campaigns(s�r�z/contacts/contact/<int:id>cCs�tj}tj}tj}|r|rtj}n
|s|rttd��Stj�	tj
|ktj|k���}|s9td�
|��ttd��St�tj
tjtjt|�ddlm}|j�	|j|k���}td||d�S)N�partnership.company_accounts�Contact with ID {} not found.�contacts.contact_listrr�z!contacts/contact_lead_page.jinja2)rOru)rr��is_admin_user_with_groupsr�r�rrr'rHrIr�rKrr�r;�add_logr9�PAGEr:�VIEWr
r�r�r)r�r��is_admin_in_group�viewing_partnership_accountrOr�rurErErF�contact_lead_pageAs,���r�z/contacts/edit/<int:id>cICsntj}tj}tj}d}d}|r|rtj}n
|s|rttd��Sddlm}|j	�
|j|k���}t
j	�
t
j|kt
j|k���}|rTtj	�
tj|jk���}|jdkrTd}|sctd�|��ttd��Stjd	kr�tj}	|	syt�tjtjtjt|�|jsd
|_|js�d|_t|d�}
t|d�}t |d�}d
d�t!j	�
t!j|kt!j"�#d���$d�D�|
j%_&|j%r�|
j%j&�'d|j%|j%f�|
j%j&�'dd�t(�)|�}
dd�|
D�|
j_&t*�)|�}dd�|D�|
j+_&t,�-|�}dd�|D�|
j_&|j.|
_.gd�|j/_&gd�|j0_&gd�|j1_&|
�2��r�|
�3|�|j.t4d�k�s|j.dk�rd|_.|j5}t!�6||j%�}||_5t�tjtjtj7t|�|�8�|j9d}|�rJ|dk�rJd}|j9d}|�rY|dk�rYd}|j:dk�rC|�r�tj;duid|j�d|j9d�d|j9d�d|j9d�d|�d |j9d �d!|j9d!�d"|j9d"�d#|j9d#�d$|j9d$�d%|j9d%�d|�d&|j9d&�d'|j9d'�d(|j9d(�d)|j9d)�d*|j9d*�d+|j9d+�d,|j9d,��nptj<duid|j�d|j9d�d|j9d�d|j9d�d|�d |j9d �d!|j9d!�d"|j9d"�d#|j9d#�d$|j9d$�d%|j9d%�d|�d&|j9d&�d'|j9d'�d(|j9d(�d)|j9d)�d*|j9d*�d+|j9d+�d,|j9d,��tj=�rTt
�>|jd|
j9d-|d�|j5|k�rddd.l?m@}||�z/tAj	�
tAj|jk��B�}|D]}tCj	�
tDtCjE|jktCjFd/k����}|j%|_GtHjI�J��qsWn tK�y�}ztL�Md0t4tN�O�d��WYd}~nd}~ww|�2��rE|�3|�|jP}d|_P|�8�d}|
jQj9du�r�t4tR|
jQj9��}tHjI�J�tSt4|��dk�r||jtT�U�tT�U�tVtj�dtV|�d1�}tW�<|�}nd}tS|�dk�r1tX�Y|�}|D]}tW�;tV|d2�t4|d3�tT�U�tVtj�tZt4|d4���}�q|�rEtt[d5�d6�ttd7|jd8d9��St\j	�
t\j|kt\j|jk��]t^dd:d;d<d-���$t_d=���`d>��B�} t\j	�
t\j|kt\j|jk��a�}!tbj	�
tbj|ktbj|jk��$t_d?���`d@��B�}"g}#|"D]�}$|$jc�r�|$jcddA�dBk�r�t4|$jc��ddBd��ddCd��ddDd�}%|%�edE�}&|&|$_c|#�f|$��q�|$jc�r�|$jcddA�dFk�r�t4|$jc��ddFd��ddGd��ddDd�}'|'�edE�}(|(|$_c|#�f|$��q�|$jc�r|$jcddA�dHv�rt4|$jc��edE�})g}*|)D]}+|*�f|+��q
|*|$_c|#�f|$��q�|#�f|$��q�tbj	�
tbj|ktbj|jk��a�},tAj	�
tAj|ktAj|jk��$t_dI���`d>��B�}-tAj	�
tAj|ktAj|jk��a�}.tWj	�gt
��
|jtWjk|j|ktWjhdJk��$titWjj���B�}/ddKlmk}0ml}1|0�mtjdL�}2|0j	�
tD|0jtjk|0jn�#d�|0jodMk����}3|3du�r�|3jpdNk�r�|0�mtjdM�}4|4�s�|1�qtjrdM�}4n|3}4ts�t|j|�}5d}6d}7d}8d}9d}:d};|5D]}<|<judOk�r�|<jodLk�r�|<jv�r�|6dA}6n|<judOk�r�|<jodMk�r�|<jv�r�|7dA}7|<judPk�r|<jodLk�r|<jv�r|8dA}8n|<judPk�r'|<jodMk�r'|<jv�r'|9dA}9|<judQk�r=|<jodLk�r=|<jv�r=|:dA}:�q�|<judQk�rQ|<jodMk�rQ|<jv�rQ|;dA};�q�ts�w|j|�}=tj}>|jx�ru|jy�ru|jz�ru|j{�ru|j|�ru|j}�sxd}?nd}?i}@t~j	�
t~j|kt~j"dk��B�}A|AD]}B|Bj}C|Bj|@|C<�q�d}DddRl�m�}E|E�r�|Ej��r�|Ejr}F|F�r�ddSlm�}G|Gj	�
|Gj|Fk���}H|H�r�|Hj:�r�|Hj:}Dn|Ej�dTk�r�d}Dt�dvidVtj=�dW|j:�dX|�dY|/�dZ|2�d[|?�d\|5�d]|=�d^|:�d_|;�d`|
�da|-�db|.�dc|�ddt�|@dde��df|�dg|#�dh|,�di| �dj|!�dk|4�dl|D�dm|!�dn|,�do|.�dp|8�dq|9�dr|>�ds|6�dt|7��S)wNFr����PartnershipAccount�
adf_importTr�r�r��	no source�	no status)�objcS�g|]}|j|jf�qSrE�r�r�rErErFr��r�z contact_edit.<locals>.<listcomp>rrr)rSrScSr�rE��status�display_name�r��srErErFr��r�cSr�rEr�r�rErErFr��r�cSr�rE)�sourcer�)r��msrErErFr��r�)rS�new�used)rS�	excellent�good�fair�poor�unknown���rS�current_year�
interest_year�
automotiver��current_vin�current_make�
current_model�current_mileage�current_condition�
current_value�interest_vin�
interest_make�interest_model�
interest_trim�interest_stock�interest_price�interest_status�interest_mileage�interest_condition�interest_listing_urlr���send_agent_push_notification�repfield�0No form leads available for the contact. Error: �rr��
created_onr��user_id�
is_enabledr�r��newtext�	isenabledz*The contact has been updated successfully.�success�contacts.contact_editri)r�rrs�	starttime�	call_typezstarttime desc�
zmessages.created_on desc�dr#�[�]rU�,�{�})rrzform_leads.created_on desc�t)�PartnershipAccountCreditTie�PartnershipCreditTie�credit�
prequalify�
offerlogix�experian�
transunion�equifax��current_supervisor_user��Partnership�
limitsysadmin�contacts/edit.jinja2�bdc_status_user�
business_typerO�
contact_notes�credit_credentials�credit_pull_able�credit_report_log�credit_report_count�	eq_credit�
eq_prequalify�form�form_log�form_log_count�form_vehicle�forms_choice��
prepend_blank�is_adf�message_log�message_log_count�	phone_log�phone_log_count�prequalify_credentials�supervisor_user_business_type�total_calls�total_messages�total_forms�	tu_credit�
tu_prequalifyr�
xpn_credit�xpn_prequalifyrE)r$)�rr�r�r�r�rr�partnership.modelsr�rHrIr�rKr'r0r��external_source_typerr�r
�methodr�r;r�r9r�r:r��marketing_source�
bdc_statusr$r%r&r5r�r�r��agent_assigned�choicesr~r-�get_assigned_status_listr.r�r/�get_assigned_source_listr�r�r�r��validate_on_submit�populate_objr�agent_id�reverse_agent_id_lookup�EDIT�save�datar&�update�create�is_bdc_user�
update_status�!buyercall.blueprints.mobile.utilsrr1r�r3rr��field_id�field_valuer"�session�commit�	Exception�log�error�sys�exc_info�notes�edited_notes_strrr}r�nowr�r(�json�loadsrlrTr)�optionsrr�limitr�r*�	media_urlrV�splitrzr�rrrrr�)partner_account_seven_hundred_credit_infor��product_type�service_provider�partner_finserv_credit_info�partnership_idr+�contact_credit_score_object�
credit_bureau�
is_successful�contact_credit_report_countrrrs�	address_1�city�state�zipr2r�� buyercall.lib.supervisor_managerr �is_authenticatedr"�rolerr7)Ir�r�r�r��contact_vehicler5r��partnership_accountrOr�r.r1�	form_note�bdc_status_list�status_list�source_list�old_agent_idrN�edit_current_year�edit_interest_yearr�
form_leads�	form_lead�lead_fields�e�contact_form_note�	notequery�noterZ�
noteobject�lpnote�	_lpresult�previous_calls�previous_calls_count�previous_messages_raw�previous_messages�msg�bracket_msg_list�bracket_msg_list_split�replace_msg_str�media_str_links�single_link�single_link_listr��previous_message_count�previous_forms�previous_form_count�all_contact_notesrrr(�account_prequalify_providerr:�credit_reportsrArBr?r@r,r-�reportr+rr)�forms_result�
forms_list�item�form_idr;r �
partner_idr"�supervisor_user_partnershiprErErF�contact_edit^s(���





�
�







�
�
��
�
�
�
�
	�

��
�

�
�
�
�
�
�
�
�
��
�
�
�
�
	�

��
�

�
�
�
�
�
����&��


�	


�
���
��
��"
"

��
��
��
���
���
�� 
  
   � ��
�����������	�
���
������������������r�z/contacts/pdf/<int:id>c
Cs2tj}tj}|rtj}tj�tj|ktj|k���}|s)t	d�
|��ttd��Sddl
m}|j�|j|jk���}ddl}|j��}|�d�}|jr|d}	|jD]}
|	dur_|
jdur_|
}	qQ|
j|	jkrg|
}	qQ|	j}t�d�
|
j��ttd|d��Sd	d
lm}t�tjtjtjt|�||j|j |||j!�S)Nr�r�rr�z	%b, %d %Yz%The contact leads form lead id is {}:zform_leads.leads_pdf)r�r#)�generate_pdf)"rr�r�r�r'rHrIr�rKrr�rr�'buyercall.blueprints.partnership.modelsr�rr�today�strftimer��updated_datetimer]�info�
contact_tasksr�r;r�r9�DATAr:�PDFr
r�r&)
r�r�r�rOr��accountrr��	today_str�	max_field�field�form_lead_idr�rErErF�contact_pdf�s>��


�r�z	/contactscCsddlm}tj}tj}tj}|r|rtj}n
|s!|r!ttd��S|j	�
|j|k���}tj	�
tj|k��
�}tj	�
tj|k��
�}ddlm}|j	�
|j|k���}i}	tj	�
tj|ktjdk���}
|
D]
}|j}|j|	|<qfi}
t�|�}|D]
}|j}|j|
|<qzi}t�|�}|D]
}|j}|j||<q�i}t�|�}|D]
}|j}|j||<q�d}ddlm}|r�|jr�|j }|r�ddlm!}|j	�
|j|k���}|r�|j"r�|j"}n|j#d	kr�d
}t$dt%|	dd�||j"t%|dd�tj&t%|
dd�t%|dd�|||j'|d
�S)Nrr�r�r�r�Frr!r#r�zcontacts/contacts.jinja2r3)r2r;r&�
status_choicer%�bdc_status_choicerFru�total_contacts�import_leads�total_notes)(r�r�rr�r�r�r�rrrHrIrKr'r�r(rCr�r�r2r�r�r�r-rJr�r.r/rKr�rwr rxrnr"r&ryrr7rUr�)r�r�r�r�rur�r�r�r{r�r�r�r��bdc_status_resultr}�	status_id�
status_resultr~�marketing_result�marketing_list�marketing_idr;r r�r"r�rErErF�contact_lists��
��




�




�r�z/contacts/datacds
g}g}g}g}g}g}g}g}tj}tj}	|	rtj}tj�dd��ttj�dd��}
tj�dd�}ttj�dd��}ttj�d	d
��}
ttj�d��}ttj�d��}tj�d
�}ttj�d��}ttj�d��}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�} d}!t
d�}"t
d�}#t
d�}$t
d�}%t
d�}&t
d�}'t
d�}(t
d�})t
d�}*d}+t
d�},t
d�}-t
d�}.t
d�}/t
d�}0t
d�}1t
d�}2t�|d�j
td�d�}3t�|d�j
td�d�}4tt�tj�|3kt�tj�|4k�}5tt�tj�|3kt�tj�|4k�}6tt�tj�|3kt�tj�|4k�}7tt�tj�|3kt�tj�|4k�}8tj|k}9|�r�|dk�r�|d k�r�|�d!�d"k�r�t
d#|d$�},nt
d%|�},tj�tj��tj��ttj��d&d'�ttj��d&d(��� t��!|9��!|,��"d)��#��$�}|d*u�r�ttj%�&|��}0|�r|dk�r|d k�rt
d+�'|��}-tj(|k}.tj�tj��ttj��d&��� t��!|9��!|-��"d,��#��$�}|d*u�rttj%�&|��}1|�r\|dk�r\|d k�r\t
d-�'|��}&t
d.�'|��}/tj�tj)��ttj)��d&��� t��!|9��!|/��"d/��#��$�}|d*u�r\ttj%�&|��}2|dk�r�|�r�|�
d$d0�}:tt
d1|:d$��}%t*j�!tt*j|kt*j+�,|����"d&��-�}+|+d*u�r�tt
d2t|+d���}*|d3k�s�|d4k�r�ttj.dk�} |d3k�s�|d4k�r�ttj/dk�}|d3k�s�|d4k�r�ttj0dk�}|d3k�s�|d4k�r�|d3k�s�|d4k�r�|d3k�s	|d4k�s	|d5k�s�|dk�r|d5k�s�|dk�r|d5k�s	|dk�rd6}!|dk�r|�rtt
d7�'|���}'tj1�r1|dk�r1|�r1tt
d8�'|���}(|dk�r^|�r^|d9k�rT|�
d$d0�};tt2t
d:|;d$�t
d;���})n
tt
d:|d$��})|d3k�sh|d4k�rottj3d<k�}"|d3k�sy|d4k�r�ttj3d=k�}#|d3k�s�|d4k�r�ttj3d>k�}$tj%tj4tj5tj6tj7t8j9tj:g}<tj%tj4tj6tj7tj;tjtjt8j9tj:tj<tj5g}=tj%g}>tj� t8tj9t8j9k��!|9��!|5��!|��!|��!| ��!|'��!|(��!|)��!|%��!|0��!|1��!|2��!|"��!|#��!|$�}?|?}@��r#|?j"|<��$�}A�fd?d@�|AD�}BdAd@�|BD�}Ctj� t8tj9t8j9k��!tj%�&|C��}@|@j"|=�}D|
t=t>|=��v�rC|=|
}E|dBk�r>t?|E�}E|D�@|E�}D|D�A|��B|
�}DdCd@�|D�$�D�}F|FD]"}G|GdDd*u�rstCjDdE}HtE|H�}I|I�F|GdD�|GdD<�qVdF|GdD<�qV|@j"|>�}J|J�$�D]
}K|�G|Kd��q�t>|�}L|d3k�s�|d4k�s�|!�r�tj�tj��tj��ttj��d&d'�ttj��d&d(���!tj|k��!|,��"tjH��!|6��!|*�}M|M��}N|M�#���}O|M�"tj%��$�D]
}P|�G|Pd��q�nd}Nd}O|d3k�s�|d4k�s�|!�r9tj�!tjtjk��!|.��"tjI��!|7�}Q|Qd*u�r4|Q��}R|Q�#���}S|Q�"tj%��$�D]
}T|�G|Td��q(n	d}Rd}Snd}Rd}S|d3k�sJ|d4k�sJ|!�r�tj�!tj|k��!|8��!|&��!tjJdk��"tjK�}U|U��}V|U�"tj%��$�D]
}W|�G|Wd��qotLj�!t2tLjMdGktLjMdHk���!tLjN�&|���"tLjO��#��$�}Xg}Y|XD]}Z|Zd*u�r�tP|Zd�}[|[|Yv�r�|Y�G|[��q�t>|Y�}\nd}Vd}\g}]|dIk�r�t=|4|3jQd4�D]}Z|]�G|3tR|ZdJ��SdK���q�nLdL|k�r�dMk�rnn|3tR|dJ�}^tTjTtTjU|3|^dN�D]}_|]�G|_�SdO���q�n!|dMk�r,|3tR|dJ�}^tTjTtTjV|3|^dN�D]}_|]�G|_�SdP���q tW||3|4||]�}`tX||3|4||]�}atY||3|4||]�}btZ||3|4||]�}ct[daidQtjdQ�dR|L�dS|L�dT|F�dU|`�dV|c�dW|b�dX|a�dY|]�dZ|L�d[|N�d\|O�d]|R�d^|S�d_|V�d`|\��S)bzReturn server side data.�
search[value]rS�order[0][column]�-1�
order[0][dir]�asc�startr�length�c�df�dt�aa�stf�stp�sts�sis�sas�sais�psr��mks�fs�cs�cbsFr�rb�UTC)�tzinfo�null�Nonerx�zwidgets.guid = '�'zphonenumbers.id = r�r�r��leads.contact_idN�phonenumbers.id = {}�messages.contact_idzform_leads.id = {}�external_forms.id = {}�form_leads.contact_idz''�contacts.agent_assigned = 'zleads.agent_assigned_id = �1r#�0Tzcontacts.status = '{}'zcontacts.bdc_status = '{}'�	no_source�contacts.marketing_source = '�contacts.marketing_source = ''�apir��importcs�g|]B}|j��d|j�����ksB|j�����ksB|j�����ksB|j�����ksB|j�ksB|j�����ksB|j�kr|�qS)rU)rrrBrsrJrLr�rHr���searchrErFr�ws 

�zdata.<locals>.<listcomp>cS�g|]}|j�qSrE�r�r�rErErFr��rcs&g|]��fdd�tt���D��qS)csi|]}|�|�qSrErE)r��i�r�rErF�
<dictcomp>�sz#data.<locals>.<listcomp>.<dictcomp>)�ranger})r�rEr�rFr��s���	�CRYPTO_SECRET_KEY�Unknown�
phonefieldru�)rez%d/%m� �n)�dtstart�untilz%m/%Yz%Y�draw�recordsFiltered�recordsTotalrR�graphLeadPoints�graphFormPoints�graphMessagePoints�graphPhonePoints�graphLabels�
totalLeads�
totalPhone�totalUniquePhone�
totalMessages�totalUniqueMessages�totalFormLeads�totalUniqueFormLeadsrE)\rr�r�r�r
r�r�r�rrhrrrcrVrrrrr'r�r)rr*r1r�rH�	outerjoin�widget�inboundrfrrr�rI�
with_entitiesr�r�r��in_r��
inbound_idr.r5r��likerK�
form_count�	sms_count�phone_countrUrrDrrrsrLrJr.r�rHr��credit_scorer�r}rr��offsetrg�app�configr�decryptrzru�from_r�r�r3rXr�rYr
rerr�r	�MONTHLY�YEARLY�contact_chart_data�phone_chart_data�message_chart_data�form_chart_datar)dr��	lead_list�	form_list�message_list�filtered_contact_list�filtered_phone_list�filtered_message_list�filtered_form_listr�r��order�	directionrrg�	date_from�date_to�assigned_agent�
form_check�phone_check�	sms_check�import_check�	api_check�adf_import_check�phone_source�
sms_sourcerF�form_source�call_status�call_bdc_status�date_difference�filter_by_phone_check�filter_by_sms_check�filter_by_form_check�	all_check�filter_by_api_check�filter_by_adf_import_check�filter_by_import_check�filter_by_assigned_agent�filter_by_form�filter_by_call_status�filter_by_call_bdc_status�filter_by_marketing_source�filter_by_assigned_agent_id�assigned_agent_id�filter_by_phone_source�filter_by_sms_source�filter_by_sms_inbound_source�filter_by_form_source�filter_by_phone_complete_source�filter_by_sms_complete_source�filter_by_form_complete_source�converted_dateFrom�converted_dateTo�filter_by_date�lead_filter_by_date�message_filter_by_date�form_filter_by_date�	filter_by�formatted_assigned_agent�formatted_marketing_source�columns_search�columns_window�
columns_total�total�filtered�
total_list�searched_result_list�searched_result_ids�sorted_�
order_predrR�lp_data�encrypt_key�cipher�filtered_total�c�total_leads�phone_query�total_phone�total_unique_phonerN�messages_queryr=�total_unique_messagesr��
form_query�total_formleadsr.�total_unique_formleads_query�total_unique_formleads_listr��formatted_phonenumber�total_unique_formleads�graph_labels�	daysLaterr��graph_leads_points�graph_phone_points�graph_message_points�graph_form_pointsrEr�rFrRes�
����
��

�����
	���
	�
((
�������


�

������
���


�

��
����
��������	�
���
����rRz/contacts/agentscCsNtj}tj}|rtj}dd�tj�tj|ktj�d���	d�D�}t
d|i�S)NcSr�rEr�r�rErErFr�%r�z"contact_agents.<locals>.<listcomp>Frrr�)rr�r�r�r5rHrIr�r�r�r)r�r�r�rErErF�contact_agentss

���rxz/contacts/details/addc
CsVtj}tj}g}g}g}d}|rtj}t��}|�r�|�d�}|�d�}|�d�}	|�d�}
|�d�}|�d�}|�d�}
|�d	�}|�d
�}|�d�}|�d�}|�d
�}|�d�}|�d�}|�d�}|�d�}|�d�}|�d�}d}d}|s|�d�|s�|�d�|r�|��}t	�
|�s�|�d�|
r�|
dkr�|�d�n=|
�dd��dd��dd��dd�}
tj
�tj|k��ttjt|
�ktj|
k����}|r�|�d�n
t�
|
�s�|�d�|	dkr�|	dkr�|	}	nd}	|
dks�|
dkr�d }
|d!k�r|dk�r|}|}|�r$|dk�r$zt�|d"�Wnt�y#|�d#�Ynw|�s�|�s�|�s�t�}||_|	|_|
|_||_||_t|
�|_||_||_||_||_||_||_ ||_!||_"||_#||_$||_%||_&d$|_'t(j)�*|�t(j)�+�d%d&l,m-}||�|�r�t.�/||j0t�1�t�1�t2tj0�d't2|�d(��d'}nt3�4d)�t5||||d*��S)+NFrrrsr�rF�agent_assigned_id�agent_assigned_textrurJr��address1�address2rtru�countryrv�birthday�	donotcall�unsubscribedzEmail is invalid.rtrUrSrvrwrxzPhonenumber already exists.zPhonenumber is invalid.�Select status...r��Select marketing source...r��Select agent...�%m/%d/%Yz7Birthday is invalid, it should be in mm/dd/yyyy format.r�rrTrz+No request parameters received to add lead.)r��missing_message�invalid_messager)6rr�r�r�r
�get_jsonr�rzrB�email_regexr|rVr'rHrIrrLr
rKr{rrc�
ValueErrorrJr�rFrrrsrHrNrs�	address_2rtrur}rvr~�is_do_not_call�is_unsubscriberDr"rZ�addr[rWrr(rTr�rcr�r]r^r)r�r�r�r�r�rrR�request_firstname�request_lastname�request_status�request_marketing_source�request_agent_assigned_id�request_agent_assigned_text�request_phonenumber�
request_email�request_contact_note�request_address_1�request_address_2�request_city�
request_state�request_country�request_zip�request_birthday�request_do_not_call�request_unsubscribedrHry�phonenumber_exists�new_contactrrErErF�details_add/s�





















����

�

�	�
�r�z"/contacts/details/<int:contact_id>c	Cs&tj}tj}|rtj}tj�tj|ktj|k���}t	j�t	j
|k��tt	j
����}|r>|j}|j}d�|jj|jj�}nd}d}d}dd�tj�tj|ktj�d���d�D�}|rh|rh|�d|j|jf�|sldSt�tjtjtjt|�t ||j|j|j!|j"|j#|j|j$|j%|j&|||d�
�S)	Nz{} {}rScSr�rEr�r�rErErFr��r�z details_view.<locals>.<listcomp>Frrr)
r�rrrsr�rGr��
agentassignedrurJr��notedate�notetext�noteuser)'rr�r�r�r'rHrIr�rKr(r�r�rr�date_editedrr��userrrrsr5r�r�r~rHr;r�r9�MODALr:r�r
rr�rGrFrLrJr�)	r�r�r�rO�latest_contact_note�	note_date�	note_text�	note_userr�rErErF�details_view�s^����
���r�c
Cs�tj}tj}|rtj}�zMt��}|du�rR|du�rR|dk�rRtj�tj|ktj	|k��
�}|s4WdS|�d�}|�d�}|�d�}|�d�}|�d�}	|�d�}
|�d	�}|�d
�}|�d�}
||_||_
|dkry|d
kryt�|j	d||d�|	dkr�|	d
kr�|	|_tjr�|dkr�|d
kr�||_|j}|
dkr�|
d
kr�|
|_t�||
�}||_|d
ks�t|�dkr�d|_n||_||_z)tj�tj|j	k���}|D]}tj�ttj|j	ktjdk���
�}|j|_ q�Wn t!�y}zt"�#dtt$�%�d��WYd}~nd}~wwt&�'tj	t(j)t*j+t|�t,j-�.�||jk�r(ddl/m0}||�|
�rO|
d
k�rOt1|
�dk�rO|
|t2�3�t2�3�t4tj	�t4|�dd�}t5�6|�}WdSt"�#d�WdSt!�yz}zt"�#dtt$�%�d��WYd}~dSd}~ww)Nr�NOKrrrsr�rGr�r�rJr�r�r�rSr�zSelect BDC status...r�r�rrr�T)rr�rr�rr�r�OKz,No request parameters received to edit lead.zError editing lead. Error: )7rr�r�r�r
r�r'rHrIr�rKr�rrrsrVrFrUrGrNrHr5rOrr�rJr1r�r�r3rr�rXrYr\r]r^r_r`r;r�r9r�r:rPr"rZr[rWrr}rrcr�r(rT)r�r�r�rRrOrrrsr�rGrFr�rJr��contact_noter�rFr�r�r�r�rr�rZrErErF�details_save�s���








��
�&��
�
	
��r�z&/api/contacts/message/<int:inbound_id>c

Csddlm}d}z]tj}|dur^|dur^|dkr^|d}|d}|d}|d}|d}|rS|dkrS|rSzt|�}|dkr?d}WntyRt�d	t�	��Ynw||||||�Wd
St�d�WdSty�}	zt�d
t
t��d��WYd}	~	dSd}	~	ww)Nr)�send_text_message�tor�mediarN�agents_visibleTz/Error retrieving agent ID for send SMS. Error: r�z+No request parameters received for SMS API.r�z+Error sending text message via API. Error: )
�buyercall.blueprints.sms.viewsr�r
rdr�r\r]r^�	traceback�
format_excrr_r`)
rr�rNrZ�param_to�
param_text�param_media�param_agent_id�param_agents_visibler�rErErFr�Ns8��
��r�cCs�tt�tj�|kt�tj�|k�}tj}tj}|rtj}t	dt�tj��}t	dt�tj��}	d}
d}|dkrIt	dt�tj��}t	dt�tj��}	n?d|krSdkrpnnt	dt�tj��}t	dt�tj��}	|j
|j
krod	}n|dkr�t	dt�tj��}t	dt�tj��}	d
}
tj�
|�d�|	�d	�t�tj��d���|��tj|k��tj�|���dd	��|�}g}
g}g}|D]]}t|j��d�}t|j��d�}|j|vr�|�|j�|
r�|�|d
�n0t|d
�dkr�d�|d
�|d
<t|d
�dk�rd�|d
�|d
<|�d�|d
|d
��|
�|j�q�|}g}g}|D]}|�|j�|�|j��q"g}d
}|D]!}||v�rS|t|�k�rQ|�||�|d}�q8|�d
��q8g}|D]}|�|��q^g}|D]W}||v�r�|�|�}|du�r�|d
k�r�|t|�k�r�t�d�t�d�|��t�d�|��t�d�|��|�d
��qk|�||��qk|�d
��qk|�d
��qk|S)N�day�monthF�parentr�r�r��year�childTrZr@rr#�0{}�{}/{}z8Error drawing lead charts (contact). Point out of range.z	Index: {}zFilter labels: {}zGraph points: {}) rrrr'r�rr�r�r�rr�r"rZrH�labelr�r�rIr�group_byr�rr�rir�rzr}r�rZ�indexr]r^)r8rNrOr�rrrPr�r��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�totalsrror��data_points�pointr��graph_pointsr�rZr��	index_posrErErFrss�����


�


rcCs�tt�tj�|kt�tj�|k�}tj}tj}|rtj}t	dt�tj��}t	dt�tj��}	d}
d}|dkrIt	dt�tj��}t	dt�tj��}	n?d|krSdkrpnnt	dt�tj��}t	dt�tj��}	|j
|j
krod	}n|dkr�t	dt�tj��}t	dt�tj��}	d
}
tj�
|�d�|	�d	�t�tj��d���|��tj|k��tj�|���dd	��|�}g}
g}g}|D][}t|j��d�}t|j��d�}|j|vr�|�|j�|
r�|�|d
�n.t|d
�dkr�d|d
|d
<t|d
�dk�rd|d
|d
<|�|d
d|d
�|
�|j�q�g}g}|D]}|�|j�|�|j��qg}d
}|D]!}||v�rO|t|�k�rM|�||�|d}�q4|�d
��q4g}|D]}|�|��qZg}|D]Z}||v�r�|�|�}|du�r�|d
k�r�|t|�k�r�t�d�t�dt|��t�dt|��t�dt|��|�d
��qg|�||��qg|�d
��qg|�d
��qg|S)Nr�r�Fr�r�r�r�r�r�TrZr@rr#r��/z6Error drawing lead charts (phone). Point out of range.�Index: �Filter labels: �Graph points: )rrrr)rrr�r�r�rr�r"rZrHr�r�r�rIrr�r�rr�rir�rzr}rZr�r]r^)r8rNrOr�rrrPr�r�r�r�r�r�r�r�r�r�r�r�r��	date_listror�r�r�r�r�r�rZr�r�rErErFr�s�����


�


rcCs�tt�tj�|kt�tj�|k�}tj}tj}|rtj}t	dt�tj��}t	dt�tj��}	d}
d}|dkrIt	dt�tj��}t	dt�tj��}	n?d|krSdkrpnnt	dt�tj��}t	dt�tj��}	|j
|j
krod	}n|dkr�t	dt�tj��}t	dt�tj��}	d
}
tj�
|�d�|	�d	�t�tj��d���|��tj|k��tj�|���dd	��|�}g}
g}g}|D]]}t|j��d�}t|j��d�}|j|vr�|�|j�|
r�|�|d
�n0t|d
�dkr�d�|d
�|d
<t|d
�dk�rd�|d
�|d
<|�|d
d|d
�|
�|j�q�g}g}|D]}|�|j�|�|j��q g}d
}|D]!}||v�rQ|t|�k�rO|�||�|d}�q6|�d
��q6g}|D]}|�|��q\g}|D]Z}||v�r�|�|�}|du�r�|d
k�r�|t|�k�r�t�d�t�dt|��t�dt|��t�dt|��|�d
��qi|�||��qi|�d
��qi|�d
��qi|S)Nr�r�Fr�r�r�r�r�r�TrZr@rr#r�r�z8Error drawing lead charts (message). Point out of range.r�r�r�) rrrr*rrr�r�r�rr�r"rZrHr�r�r�rIrr�r�rr�rir�rzr}r�rZr�r]r^)r8rNrOr#rrrPr�r�r�r�r�r�r�r�r�r�r�r�r�r�ror�r�r�r�r�r�rZr�r�rErErFrF�����


�


rcCs�tt�tj�|kt�tj�|k�}tj}tj}|rtj}t	dt�tj��}t	dt�tj��}	d}
d}|dkrIt	dt�tj��}t	dt�tj��}	n?d|krSdkrpnnt	dt�tj��}t	dt�tj��}	|j
|j
krod	}n|dkr�t	dt�tj��}t	dt�tj��}	d
}
tj�
|�d�|	�d	�t�tj��d���|��tj|k��tj�|���dd	��|�}g}
g}g}|D]]}t|j��d�}t|j��d�}|j|vr�|�|j�|
r�|�|d
�n0t|d
�dkr�d�|d
�|d
<t|d
�dk�rd�|d
�|d
<|�d�|d
|d
��|
�|j�q�g}g}|D]}|�|j�|�|j��q g}d
}|D]!}||v�rQ|t|�k�rO|�||�|d}�q6|�d
��q6g}|D]}|�|��q\g}|D]Z}||v�r�|�|�}|du�r�|d
k�r�|t|�k�r�t�d�t�dt|��t�dt|��t�dt|��|�d
��qi|�||��qi|�d
��qi|�d
��qi|S)Nr�r�Fr�r�r�r�r�r�TrZr@rr#r�r�z5Error drawing lead charts (form). Point out of range.r�r�r�) rrrr1rrr�r�r�rr�r"rZrHr�r�r�rIrr�r�rr�rir�rzr}r�rZr�r]r^)r8rNrOr"rrrPr�r�r�r�r�r�r�r�r�r�r�r�r�r�ror�r�r�r�r�r�rZr�r�rErErFr �r�r z/contacts/filteroptionsc	Csxi}i}i}i}i}i}i}tj}tj}|rtj}ttj|ktjtjktj|k�}	tt	j|kt	jtjktj|k�}
tt
j|kt
jtjktj|k�}ttj|ktjdk�}tj�
d��|���}
|
D]}|ru|dru|d}|d}|||<qatj�tj��tj��ttj���
ddd��|	���}tj�tj��tj��ttj���
dd��|	���}|D]&}|r�|dr�|d	r�t|d�}t|d	�}t|d
�}d�||�||<q�|D]}|r�|dr�|d
r�t|d�}t|d
�}|||<q�t	j�t	j��t	j��tt	j���
ddd��|
���}|D]*}|�r9|d�r9|d	�r9t|d�}t|d	�}t|d
�}d�||�||<�qt
j�t
j��t
j��tt
j���
dd
��|���}|D] }|�rv|d�rv|d
�rvt|d�}t|d
�}|||<�qWt�|�}|D]}|j}|j||<�qt�|�}|D]}|j}|j||<�q�t� |�}|D]}|j!}|j||<�q�t"|||||||d�S)zReturn server side filter data.rSzcontacts.agent_assignedrzphonenumbers.idzphonenumbers.friendly_namezphonenumbers.phonenumberzwidgets.guidzwidgets.namer�r#r�zexternal_forms.idzexternal_forms.display_name)�phone_source_data�message_source_data�form_source_data�assigned_agent_data�bdc_status_data�status_data�marketing_data)#rr�r�r�rr)r�r'r�r*r1rHrHrrIr�r�rOrr
rfrrrr�r.r-rJr�r�r.r/rKr�r)�phone_source_result�message_source_result�form_source_resultr�r�r��assigned_agent_resultr�r��filter_by_lead�
filter_by_smsrA�filter_by_partnership_account�
agent_datar�r�r��inbound_data�
outbound_datar��message_data�	form_datar}r�r~r�rErErF�
filteroptionss�
�
�
���
��
�
����
��
��
���


�r�z
/contacts/csvcNs�g}g}g}g}g}g}g}g}tj}tj}	|	rtj}ddlm}
|
j�|
j|k��	�}t
j�dd��t
t
j�dd��}t
j�dd�}
t
t
j�d	d
��}t
t
j�dd��}tt
j�d
��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}tt
j�d��}t||�}t�|d���} t�|d���}!tt�tj�| kt�tj�|!k�}"td�}#td�}$td�}%td�}&td�}'td�}(td�})td�}*td�}+td�},td�}-td�}.d}/td�}0td�}1td�}2td�}3td�}4td�}5tj|k}6|�r�|dk�r�|dk�r�|�d �d!k�r]d"�|�}0ntd#�|��}0tj�tj��tj��ttj�� d$d%�ttj�� d$d&���!t��|6��|0��"d'��#��$�}|du�r�ttj�%|��}3|�r�|dk�r�|dk�r�d#�|�}1t&j�t&j��tt&j�� d$���!t��|6��|1��"d(��#��$�}|du�r�ttj�%|��}4|�r|dk�r|dk�rtd)�|��}2t'j�t'j(��tt'j(�� d$���!t��|6��|2��"d*��#��$�}|du�rttj�%|��}5|dk�r2|�r2ttd+t|�d,��})|d-k�s<|d.k�rCttj)d
k�}%|d-k�sM|d.k�rTttj*d
k�}$|d-k�s^|d.k�rettj+d
k�}#|d-k�so|d.k�rvttj,d/k�}&|d-k�s�|d.k�r�ttj,d0k�}'|d-k�s�|d.k�r�ttj,d1k�}(|dk�r�|�r�ttd2|d,��}+tj-�r�|dk�r�|�r�ttd3|d,��},|dk�r�|�r�|d4k�r�tt.td5|d,�td6���}-n
ttd5|d,��}-t
j�dd��gd7�}7|j/d8k�r�|7d9=tj�!t0tj1t0j1k��|6��|"��|%��|$��|#��|)��|+��|,��|-��|3��|4��|5��|&��|'��|(�}8|8}9tjtj2tj3tj4tj5tj6t0j1tj7g}:��rs|8j"|:��$�};�fd:d;�|;D�}<d<d;�|<D�}=tj�!t0tj1t0j1k��tj�%|=��}9|9�8tj�}>t9�:�}?t0�:�}@t;�<�}Ad
}Bt=t>����}Ct?�@|C�}D|D�A|7�|>�$�D]{}E|Bd.7}Bd}F|EjB�r�d=nd>}G|EjC�r�d=nd>}H|j/d8k�r�tDjEd?}ItF|I�}J|EjG�r�|J�H|EjG�}F|B|EjI|EjJ|Ej3|Ej4|F|EjK|Ej5|EjL|Ej6|EjM|EjN|EjO|EjP|EjQ|EjR|H|G|Ej7t0�S|@|Ej1�t9�S|?|EjT�t;�U|A|EjV�g}K|j/d8k�r|Kd9=|D�Ad@d;�|KD���q�dA�t�W��XdB��}LtY|C�Z��}MdC|Mj[dD<dE�|L�|Mj[dF<t\�]tjt^j_t`jat
ddG�|MWd�S1�sNwYdS)HNr�r�r�rSr�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rbr�r�r�rxr�zwidgets.guid = '{}'r�r�r�r�r�r�r�r�r�r�r�r#r�r�r�zcontacts.status = 'zcontacts.bdc_status = 'r�r�r�)�Noz
Created Onz
Updated On�
First Name�	Last NamezCredit Scorez	Caller Id�
Phonenumber_1�
Phonenumber_2�Email�	Address_1�	Address_2�City�State�Zip�CountryzDo Not CallzSMS UnsubscribezAgent Assignedr.z
BDC StatuszMarketing Sourcer��csVg|]'}|j�ks'|j�ks'|j�ks'|j�ks'|j�ks'|j�ks'|j�kr|�qSrE)r�rJrrrsrLr�rHr�r�rErFr��	s





�zdata_csv.<locals>.<listcomp>cSr�rEr�r�rErErFr��	r��Yesr�r�cS�g|]}|�qSrErEr�rErErFr�	
�zBuyercall Leads - {}.csvz%Y-%m-%dztext/csvzContent-Typezattachment; filename="{}"zContent-Dispositionr?)brr�r�r�rCr�rHrIr�rKr
r�r�r�rrhrrcrrrr'r�rr�r�r)rrr
rfrrr�rr�r�rr*r1r.rrrrDrUrr&r.r�r�rrrsrLrJrHr�r-� get_complete_status_list_as_dictr/� get_complete_source_list_as_dictrrr?�writer�writerowr�r�rrrrr�created_datetimer��	caller_idrMrsr�rtrurvr}�get_formatted_statusrG�get_formatted_sourcerFr�r�r�getvalue�headersr;r�r9r�r:�DOWNLOAD)Nr�r!r"r#r$r%r&r'r�r�r�r{r(r)rrgr*r+r,r-r.r/r0r1r2r3r4r5r6r7rFr8rNrOrPr9r:r;r=r>r?r@rArBrCrDrErFrGrHrJrKrLrMrT�headerrZr[rWr\r]r^rHr}r~�marketing_source_list�row_no�outrrO�decrypted_credit_score�sms_unsubscribe�do_not_callrbrc�csv_rowrD�resprEr�rF�data_csv�s��
�
�
��


���
	���
	
�����


��
�&�rz/contacts/call/<int:contact_id>cCs>ddlm}tj}tj}|rtj}d}d}tj�tj|ktj	|k��
�}g}tjdkr?tj�t
tjtjktj�d�����}ntj�t
tj|ktj�d�����}|D]P}	|	jrg|�d�|	j|	j�|	jd��|	jr�|	j|	jkss|	js�|�d�|	j|	j�|	jd��|	jr�|	j|	jks�|	j|	jks�|	js�|�d	�|	j|	j�|	jd��qS|j�t
|j|k|jd
k|jdk����}
dd�|
D�}|r�|jo�|jj}|j}nItj�tjtjktj|k��
�}|�r|j�t
|jtjk|j|jdk���
�}
tj�t
tj|jktjtjk���
�}|
�r
|
j}|�r|�o|j}t||||d
��S)a� Return this contact 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.
    rr�rS�agentFz{}, Phone ({}))rr�z{}, Mobile ({})z{}, App ({})TcSs$g|]}d�|j|j�|jd��qSr�)r�r�rur�rErErFr�\
r�z)get_contact_call_info.<locals>.<listcomp>)�agentNumber�allAgentNumbersr�r�)r�r�rr�r�r�r)rHrIr�rKryr5rrr�r�r�r�rurzr�r��mobile�
app_numberr�r�my_phoner'rHr)r�r�r�r��result_agent_number�result_my_phone�lead�	agent_nosr�rr�r��contact_details�route_numberr,rErErF�get_contact_call_info
s���


��
����������������
����r$cCs�ddlm}ddlm}ddlm}tj}tj}tj	}|r tj
}t��}|�
d�|�
d�}}	|j�|j|k|j|	k��td����}
|
sGdS|j�|j|kt|j|k|j|k|j|k���td����}|sid	Stj�tj|ktj|k���}|r~|j}
nd
}
tj�tj|k���}|j}|s�d�|�dfSt||j|j|j|j t!�"�d
|	|
j|j|
d||	dd�}|�#�|j|kr�d}n
|j|kr�d}nd}d|j|d�gi}|
j$dkr�t%||�dS|�&|j|j|�dS)Nrr�r4)�connect_lead_to_agentrr�r�)z Cannot find routing phone number�)zCannot find agentr&znew leadz!Contact lead with ID {} not foundr&�outbound�ringingzAgent Outbound Call)r�rrrsrurJr
rrrrN�progress_statusr�r��originating_number�call_sourcerrrNr�)r��contactUsing�trackingrS)'r�r��"buyercall.blueprints.agents.modelsr5�'buyercall.blueprints.phonenumbers.tasksr%rr�rnr�r�r
r�r�rHrIrurfrrKrrrr)r�r)r'r�r�rrrsrLrJr�utcnowrQ�typer8�delay)r�r�r5r%r�rnr�rR�agent_numberr��routingr�old_leadr)�contact_lead�contact_lead_idr �
contact_using�
call_settingsrErErF�call_contact�
s����
������

�

�r:cCs|sdS|�d�S)z2 Format a local date for consumption by Excel
    rSz%Y-%m-%d %H:%M:%S)r�)rrErErF�format_date�
s
r;zS/contacts/credit_report/<bureau>/<product_type>/<int:contact_id>/<service_provider>cKCs^ddlm}m}m}ddlm}m}m}	m}
m	}m
}m}
m}m
}m}m}m}m}m}m}tjd}t|�}tj�tj|k���}d}d}d}d}tj�tj|k���}tj�ttj|ktj|jktj |ktj!|ktj"�#d�����}|r�|j$r�|j%r�|�&|j$��'d�}t(|�|d} |d}!dd	l)m*}"|"|!| �}n	|�&|j$�}nd}|j+r�|�&|j,�}|j-}t.�/|�&|j+��}�n]d}d}d}�nU|	|j0|j1�}	|	s�d
}#|�2d�}$|||j|#|||$|�t3t4d��5|#�d
�t6t7d|d�d�S|
|j8�}%|%�s d}#|�2d�}$|||j|#|||$|�t3t4d��5|#�d
�t6t7d|d�d�S||j9�}&|&�sNd}#|�2d�}$|||j|#|||$|�t3t4d��5|#�d
�t6t7d|d�d�S|
|j:�}'|'�s|d}#|�2d�}$|||j|#|||$|�t3t4d��5|#�d
�t6t7d|d�d�S||j;�}(|(�s�d}#|�2d�}$|||j|#|||$|�t3t4d��5|#�d
�t6t7d|d�d�S||j;|j9|j:�})|)�s�d}#|�2d�}$|||j|#|||$|�t3t4d��5|#�d
�t6t7d|d�d�S�z|dk�r�d}*n|dk�r�d}*n
|dk�r�d }*nd}*||j<�}+||j8�},||j9�}-||j:�}.||j;�}/d!}0|j}1d}2d}3d}4|d"k�r�||j|�}5t=j�t=j|k���}6|6�r�t>j�t>j?|6jk��t@t>jAd#kt>jAd$kt>jAd%k����}7|7jB�r�|�&|7jB�}8tC|8�tDk�re|8}4ntD|8�}4|4�r�||4�}9|9�s�d&}#|�2d�}$|||j|#|||$|�t3t4d'��5|#�d
�t6t7d|d�d�WS|d(k�r�|4�s�d)}#|�2d�}$|||j|#|||$|�t3t4d*��5|#�d
�t6t7d|d�d�WS|5jE�F|*|+|4|,|-|.|/|0|1�	}:n|5jE�G|*|+|,|-|.|/|4|0|1�	}:tH�Id+�5|:��|d,k�rj|�2|:d-d.d/�}$|:d-d.d0d1};|;du�r7|:d-d.d0d2}#|||j|#|||$|�t3t4d3�5|#��d
�t6t7d|d�d�WS|�2|:d-d.d0d1�}3|:d-d.d0d4}2|:d-d5}<tJ�Kd6|<�}=t.�L|=d�}|�2|�}>d7}#�n|�2|:d-d8d/�}$|dk�r�z-|�2|:d-d9d:d;d<d=dd>d?�}3|:d-d9d:d;d<d=dd@d?}2Wn�dA}#|||j|#|||$|�t3t4dB��5|#�d
�t6t7d|d�d�YWS|dk�s�|dk�r]z+|�2|:d-d9dCd;dDdEdd>�}3|:d-d9dCd;dDdEdd@d?}2WnXtM�y\}?zKtH�IdF�5|?��tH�IdG�5|$��z|:d-d9dCdHd?}#WndA}#Y|||j|#|||$|�t3t4dB��5|#�d
�t6t7d|d�d�WYd}?~?WSd}?~?ww|:d-dIdJdK}|�2|�}>dL}#|||j|$|3|#||||>|2�
}@tH�IdM�5|@���nb|dNk�r�||jd,�}5d}A|jNdu�r�t=j�tt=j|kt=j|jk����}6|6du�r�t>j�tt>j?|6jkt@t>jAdOkt>jAdPk�����}B|Bdu�s�|BjBdu�r�|�&|BjB�}An|jN}A|�2tO�P�jQ�}$z�||A�}A|A�sdQ}#|||j|#|||$|�t3t4dR��5|#�d
�t6t7d|d�d�WWS|5jR�S�}Ct.�/|C�}DdStD|DdT�}Ei}F|j0|FdU<|j1|FdV<|A|FdW<||,�|FdX<||/�|FdY<||-�|FdZ<||.�|Fd[<|5jRjT|Efi|F��}G|�2tD|Gd>��}3|Gd\}H|�2t.�Ld]|Gd]i��}Id7}#|||j|$|3|#||||H|I�
}@tH�IdM�5|@��tj�tj|@k���}J|�&|Jj,�}|Jj-}t.�/|�&|Jj+��}WnDtM�y�}?z7tH�UtV�W��tD|?�}#tH�Ud^�5|?|��|||j|#|||$|�t3t4d_�d
�t6t7d|d�d�WYd}?~?WSd}?~?wwWn.tM�y}?z!tH�UtV�W��t3t4d`�5|?��d
�t6t7d|d�d�WYd}?~?Sd}?~?wwtX�YtZjt[j\t]j^t_|�t`da||||||db�S)cNr#)�%successful_credit_check_seven_hundred�unsuccessful_credit_check�successful_credit_check_finservr)�seven_hundred_credit_client�validate_ssn�
validate_name�validate_address_street�
format_street�validate_address_city�validate_address_state�format_city�format_state�validate_address_zip�format_full_name�validate_city_state_zip_combo�
format_zip�format_dob_year�finserv_credit_clientr�rSTz::)�generate_presigned_aws_urlz<This lead does not have a valid first name and/or last name.�Unavailablez:{} Please update the lead with a valid name and try again.�dangerrr�z#creditz/This lead does not have a valid street address.z={} Please update the lead with a valid address and try again.z%This lead does not have a valid city.z:{} Please update the lead with a valid city and try again.z&This lead does not have a valid state.z;{} Please update the lead with a valid state and try again.z)This lead does not have a valid zip code.z>{} Please update the lead with a valid zip code and try again.zeThis lead zip code, city and state does not seem to match as a valid zip, city and state combination.zF{} Please review the zip code, city, state for the lead and try again.r�XPNr�TUr�EFX�	buyercall�	700Credit�
cumemberfield�ssnfield�ssnz=This lead does not have a valid Social Security Number (SSN).z9{} Please update the lead with a valid SSN and try again.rz7This lead does not have a Social Security Number (SSN).zU {} Please update the lead with a valid SSN and try generating a Credit Report again.z*The response return by the credit POST: {}r�Results�
XML_Report�Transid�Prescreen_Report�Score�ResultDescriptionz=Error Description: {}. Please contact Support for assistance.�
ScorecardName�
custom_reportzMHTTPS?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\), ]|(?:%[0-9a-fA-F][0-9a-fA-F]))+zSuccessful soft credit pull.�Transaction_Information�bureau_xml_data�
XPN_Report�subject_segments�risk_models�
risk_model�scorez#text�ModelIndicatorzConsumer file not found.z){} Please contact Support for assistance.�	TU_Report�scoring_segments�scoringzThe exception is: {}zThe trans id is {}�Error�custom_report_url�iframez@srczSuccessful hard credit pull.zThe credit report id is: {}�Finservr~�
datepickerz+This lead does not have a valid birth year.zC{} Please update the lead with a valid Year of Birth and try again.zBearer �access_token�	FirstName�LastName�YearOfBirth�Addressr�r�r��approved�tradesz+The finserv exception is: {} for contact {}zqWe were unable to run the soft pull for this lead. Please make sure all the lead fields are complete and correct.zHAn unexpected error occurred: {}. Please contact Support for assistance.zcontacts/credit_report.jinja2)r �urlr��finserv_credit_score�finserv_credit_approve�finserv_credit_trade_lines)ar�r<r=r>�!buyercall.lib.util_credit_reportsr?r@rArBrCrDrErFrGrHrIrJrKrLrMrrrr'rHrIr�rKr+rr�r�rprkrqr��
iframe_url�
is_eq_leadrri�print�buyercall.lib.util_boto3_s3rNrwr�is_approvedrdrerrrs�encryptrrTr�rrrsrtrurv�
user_fullnamer1r3r�rrXrYr1r�
credit_report�get_full_credit_report�get_prequalify_credit_reportr]r��re�findall�dumpsr\r~�uuid�uuid4�hex�credit_prequalify�	get_token�	soft_pullr^r�r�r;r�rr9�CREDITr:r�r
r)K�bureaurkr�rlr<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrbrcr rxryrzr{rO�existing_report�decrypt_url_field�
url_bucket�url_keyrN�description�trans_id�validate_street�
validate_city�validate_state�validate_zip�validate_combo�
bureau_abvr��addressrtru�zip_code�
a_username�	a_user_id�score_card_namerrX�clientr��	ssn_field�
decrypted_ssn�	valid_ssn�credit_pull�credit_score_rawrn�extract_url�
encrypted_urlr��credit_entry�contact_birthday�form_lead_field�r�	r_content�token�kwargs�finserv_responservrw�finserv_credit_reportrErErF�contact_credit_report�
s�D


��
�

�

�

�

�
��









���
��

����

���

&�������
������������
�"��

�

��

������




���"���	 ��
�r�z/contacts/import/leadsc2
Csxg}g}d}d}d}d}d}g}d}d}	tj}
tj}gd�}tjdk�r�|r)tj}
t��}
dtjvr8d}d}�nz?tjd}t	j
�tj
��tj|
k���}|D]&}|j
ru|j
|vru|j
�d	d��d
d��dd��dd��d
d�}|�|�qOWnty�}zd}d}t�t���WYd}~nd}~ww|�s;t|j��r;t|j���d�dd�}t�|�}dd�|jD�|_dd�|D�}t �!tj�}i}t"�#tj�}i}|D�]#}|	d7}	d}d|vr�t$|d�r�|d}d}d|vr�t$|d�r�|d}d}d|v�r
t$|d��r
|d}d}d|v�rt$|d��r|d}d}d|v�r/t$|d��r/|d}n!d|v�r@t$|d��r@|d}nd|v�rPt$|d��rP|d}d}d|v�rbt$|d��rb|d}d} d|v�rtt$|d��rt|d} d}!d}"d}#d|v�r�t$|d��r�|d}!d}"nKd|v�r�t$|d��r�|d}!d}"n8d |v�r�t$|d ��r�|d }!d}"n%d!|v�r�t$|d!��r�|d!}!d}"nd"|v�r�t$|d"��r�|d"}!d}"|!du�s�|!dk�r6d#|v�r�t$|d#��r�|d#}!nCd$|v�rt$|d$��r|d$}!n2d%|v�rt$|d%��r|d%}!n!d&|v�r&t$|d&��r&|d&}!nd'|v�r6t$|d'��r6|d'}!|!du�s@|!dk�rrd(|v�rQt$|d(��rQ|d(}!n!d)|v�rbt$|d)��rb|d)}!nd*|v�rrt$|d*��rr|d*}!|!�r*|"�r�d#|v�r�t$|d#��r�|d#}#nTd$|v�r�t$|d$��r�|d$}#nCd%|v�r�t$|d%��r�|d%}#n2d&|v�r�t$|d&��r�|d&}#n!d'|v�r�t$|d'��r�|d'}#nd+|v�r�t$|d+��r�|d+}#|#du�s�|#dk�r*d(|v�r�t$|d(��r�|d(}#n2d+|v�r	t$|d+��r	|d+}#n!d)|v�rt$|d)��r|d)}#nd*|v�r*t$|d*��r*|d*}#|!�r4t%|!��s4|!}!|#�r>t%|#��s>|#}#d}$d,|v�rLt%|d,�}$nd-|v�rXt%|d-�}$nd.|v�rct%|d.�}$d}%d/|v�rvt$|d/��rv|d/}%nd0|v�r�t$|d0��r�|d0}%d}&d1|v�r�t$|d1��r�|d1}&n!d2|v�r�t$|d2��r�|d2}&nd3|v�r�t$|d3��r�|d3}&t&|&�d4k�r�|&dd4�}&zt�'|&d5�Wnt(�y�d}&Ynwd}'d6|v�r�t$|d6��r�|d6}'nd7|v�r�t$|d7��r�|d7}'|'�r|'�)�}(|(|v�r|'||(<|(}'nd8}'d})d9|v�r&t$|d9��r&|d9})|)�r8|)�)�}*|*|v�r6|)||*<|*})d}+d:|v�rKt$|d:��rK|d:}+n2d;|v�r\t$|d;��r\|d;}+n!d<|v�rmt$|d<��rm|d<}+nd=|v�r}t$|d=��r}|d=}+t*|	|||!|%|�},|,du�r�t�}-||-_+||-_,t-|!�|-_
t-|#�|-_.|%|-_/|$|-_0||-_1| |-_2||-_3||-_4||-_5|&|-_6|'|-_7|)|-_8|
|-_d>|-_9|+�r�|+dk�r�t:�}.|
|._;|
|._<|
|._tj=|._>|+|._?d|._@|-jA�|.�|�|-�|d7}q�|�|,�q�z&t&|�dk�r|�rt �B||
�|�rt"�C||
�t	j
�D|�t	j
�E�Wn"t�y:}zd}d}t�t���WYd}~n	d}~wwd?}d}|�ret&|�dk�red}|�Fd|�d@}/|D]}|�rc||/�G|�dA7}�qU|�rptHd|dB�dCfS|�s�|dk�r�|	dk�r�tI|�dDtI|	�dE}0d}1n ||	k�r�dFtI|�dG}0d}1ndHtI|�dItI|	�dJ}0d}1tH|1|0||||	dK�dLfSdSdS)MNrSFr)r�r�r�r�zPhone Numberrlr��filezNo file found.TrUrvrwrxryz,An error occurred while processing the file.�UTF8)�newlinecSs,g|]}|���dd��dd��dd��qS)rUrSrTrx)rBrV)r��fnrErErFr�Ws��z$import_lead_file.<locals>.<listcomp>cSrrErE)r�r�rErErFr�[rr#rrrsrtrurv�
postalcode�zipcoder{r|zhome/mainnumberru�phonenumber1�
mainnumberrN�mobilenumber�mobilephonenumber�	cellphone�cellphonenumber�cell�
worknumber�workphonenumber�work�phonenumber2�nevercontacttype�isdonotcallrrJ�emailaddressr~�	birthdate�dateofbirthrr�r��individualtyper��marketingsourcer�ra�specialnote�specialnotesr�zOnly CSV files allowed.r�
)rr���z leads out of z were imported.zAll z lead(s) successfully imported.zOnly z lead(s) out of z were successfully imported.)rr��csv_download�csv_error_listr��total_count��)Jrr�r�r
rEr�rrc�filesr"rZrHr'rLrIr�rVrzr\r]r^r�r�rGrDr�stream�read�decoder?�
DictReader�
fieldnamesr.� get_assigned_status_list_as_dictr/� get_assigned_source_list_as_dictrprqr}rcr�rBr�rrrsr
rMrJr�rsr�rurvrtr~r�rFrDr(rr�r�rrr�	note_list�add_status_dict�add_source_dict�add_allr[r~r�rr)2�error_resultr<�csvfiler��
csv_errors�error_statusr��contact_phone_list�
contact_count�contact_total_countr�r�r�current_datetimer�rO�formated_phonenumber�exr��readerrRr~�new_status_dictr�new_marketing_source_dictr��contact_firstname�contact_lastname�contact_city�
contact_state�contact_zip�contact_address_1�contact_address_2�contact_phonenumber_1�phone_found_on_main�contact_phonenumber_2�contact_is_do_not_call�
contact_emailr��contact_status�contact_status_lower_case�contact_marketing_source�#contact_marketing_source_lower_caser��
valid_messager��new_contact_note�joiner�success_message�success_statusrErErF�import_lead_filesB

��
����
��
























�





�





����
�����+rz/contacts/import/leads/examplecCstddd�S)Nz2blueprints/contacts/templates/contacts/example.csvT)�
as_attachment)rrErErErF�downloadi
srz/contacts-managementcC�td�S)Nzcontacts/new-contacts.jinja2�rrErErErF�contactsManagemento
�rz/credit-report/<uuid:sid>cCr)Nzcontacts/new-credit.jinja2r)�sidrErErF�creditReportu
r	r)NN)��loggingr]r?rdr�r�r_r��pytzr�ior�htmlr�
contextlibrrrr�dateutilr	�buyercall.blueprints.filtersr
�buyercall.lib.util_cryptor�flaskrr
rrrrrrrrr�
sqlalchemyrrrrrr�sqlalchemy.ormrr�flask_loginrr�flask_babelr rT�buyercall.extensionsr!r"�formsr$r%r&�modelsr'r(r)r*r+r,r-r.r/r0�&buyercall.blueprints.form_leads.modelsr1r2r3r.r5�'buyercall.blueprints.billing.decoratorsr6�buyercall.lib.util_wtformsr7�(buyercall.blueprints.widgets.bw_outboundr8�$buyercall.blueprints.activity.modelsr9r:r;�__name__r<�	getLogger�compiler�r{rCrGrPr]rarhrlrprqr�r��exemptr�r�r�r�r�r�r�rRrxr�r�r�r�rrrr r�rr$r:r;r�rrrrrErErErF�<module>s 0 0





>L*S56Z"jiijvgX9K