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__/models.cpython-310.pyc
o


�e6C�	@sFddlZddlZddlmZddlmZddlmZddl	m
Z
mZmZm
Z
ddlmZmZddlmZmZmZddlmZmZmZmZdd	lmZdd
lmZmZmZddlmZm Z ddlm!Z!dd
l"m#Z$ddl%Z%ddl	m
Z
m&Z&ddlmZddl'm(Z(ddlmZddlmZm)Z)ddlmZmZmZmZdd	lmZddl*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9Gdd�de9e7j:�Z;Gdd�de9e7j:�Z<Gdd�de9e7j:�Z=Gd d!�d!e9e7j:�Z>Gd"d#�d#e9e7j:�Z?Gd$d%�d%e9e7j:�Z@Gd&d'�d'e9e7j:�ZAGd(d)�d)e9e7j:�ZBGd*d+�d+e9e7j:�ZCGd,d-�d-e9e7j:�ZDGd.d/�d/e9e7j:�ZEGd0d1�d1e7j:�ZFe7�Gd2e7jHd3e7�Id4�d5d6�e7jHd7e7�Id8�d5d6��ZJe7�Gd9e7jHd3e7�Id4�d5d6�e7jHd:e7�Id;�d5d6��ZKGd<d=�d=e9e7j:�ZLGd>d?�d?e9e7j:�ZMGd@dA�dAe9e7j:�ZNGdBdC�dCe9e7j:�ZOdS)D�N)�OrderedDict)�datetime)�
postgresql)�and_�extract�Date�cast)�hybrid_property�
hybrid_method)�	load_only�
joinedload�column_property)�select�func�case�exists)�update)r�date�	timedelta)�	AESCipher�EncryptedValue)�
Comparator)�current_app)r�desc)�UUID)r	)r
�backref)�Appointment)�format_phone_number_bracket)�FormLead)�Lead)�Message)�User)�db)�
ResourceMixinc@s�eZdZdZejejdd�Zejejejddd�dd�Z	eje
d	�dd
d�Zeje�d�dd
d�Z
eje�d�dd
d�Zejejdd
d�Zejejdd
d�Zeje�d	�dd
d�Zejejdd
d�Zeje
d	�dd
d�Zeje�d�dd
d�Zeje�d�dd
d�Zeje�d�dd
d�Zeje�d�dd
d�Zejejdd
d�Zejejdd�Zeje�d�dd
d�Zejejdd
d�Zeje�d	�dd
d�Zeje�d�dd
d�Zedd��Z edd��Z!d
S)�ContactVehicle�contact_vehiclesT��primary_key�contacts.id�contact_vehicles_fkey��nameF��nullable�@��r-�server_default� N���c
Cs�zLtdid|�d|�d|�d|�d|�d|�d|�d|�d	|	�d
|
�d|�d|�d
|
�d|�d|�d|�d|�d|�d|��}tj�|�tj��WdStyg}zt�d�|��WYd}~dSd}~ww)zC
        Create a contact vehicle (and interested vehicle)
        �
contact_id�current_vin�current_make�
current_model�current_year�current_mileage�current_condition�
current_value�interest_vin�
interest_make�interest_model�
interest_year�
interest_trim�interest_stock�interest_price�interest_status�interest_mileage�interest_condition�interest_listing_urlTz)Error creating contact vehicle. Error: {}NF�)	r$r"�session�add�commit�	Exception�log�error�format)�clsr6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrH�contact_vehicle�erIrI�F/home/arjun/projects/buyercall/buyercall/blueprints/contacts/models.py�createNs`��������	�
���
�������
��zContactVehicle.createcCs�d}tj�ttj|k����}|rr|r||_|r||_|r ||_|r%||_	|r*||_
|r/||_|r4||_|	r9|	|_
|
r>|
|_|rC||_|rH||_|rM||_|
rR|
|_|rW||_|r\||_|ra||_|rf||_|rk||_tj��d}|S)zA
        Update a contact vehicle

        :return: bool
        FT)r$�query�filterrr6�firstr7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHr"rJrL)rQr6r7r8r9r:r;r<r=r>r?r@rBrCrArDrErFrGrH�resultrRrIrIrTrts\
�
zContactVehicle.update)"�__name__�
__module__�__qualname__�
__tablename__r"�Column�Integer�id�
ForeignKeyr6rr7�Stringr8r9r:r;r<�Numericr=r>r?r@rBrCrArDrErFrGrH�classmethodrUrrIrIrIrTr$#s4
%r$c@�eZdZdZejejdd�Zeje�d�dd�Z	eje�d�dd�Z
ejde��ddd	�Ze
d
d��Ze
dd
��Ze
dd��Ze
dd��Ze
dd��Ze
dd��Ze
dd��Ze
dd��ZdS)�BdcStatuses�bdc_statusesTr&�Fr,�default�0r0c
C�zatj�t�tj�|��k���}|r=t�|j	|�tj�tj
|j	k��d���}t
|�dkr:d|_tj��WdSWdSt�}|��|_||_d|_tj�|�tj��|j	}t�||�WdSty}}zt�dt|��WYd}~dSd}~ww)z(
        Create new bdc status

        ��TFz Error adding bdc status. Error: N)rfrVrWr�lower�statusrX�BdcStatusPartnershipAccountTie�add_status_tier`�
bdc_status_id�limit�all�lenrir"rJrL�display_namerK�flushrMrNrO�str)rQrv�partnership_account_idr�	tie_count�new_bdc_status�	status_idrSrIrIrT�
add_status��:�
��

 ��zBdcStatuses.add_statuscC�Jtj�tj|k���}|D]
}t�|||�q
|dur#t�|�dSdS)z8
        Add bdc status to partnership account

        N)rprVrWryrXrf�
add_source�add_status_defaults_to_tie�rQ�status_dictry�
ties_exist�sdrIrIrT�add_status_dict����zBdcStatuses.add_status_dictcC�^tj�tj��tjdk���}tj�tj��tj	|k���}|D]}||vr,t�
||�q dS)zA
        Add bdc status to defaults partnership account

        TN)rfrV�
with_entitiesr`rWrirtrprrryrq�rQry�default_statuses�status_ties�dsrIrIrTr��"����z&BdcStatuses.add_status_defaults_to_tiec
C�z<t�||�tj�tj|k���}|dkr4tj�tj|k���}|r7|j	s:t
j�|�t
j�
�WdSWdSWdSWdStyX}zt�dt|��WYd}~dSd}~ww)z$
        Delete bdc status.
        r�&Error removing bdc status tie. Error: N)rp�remove_status_tierVrWrr�countrfr`rXrir"rJ�deleterLrMrNrOrx�rQr|ryrzrrSrIrIrT�
remove_status�,��
� ��zBdcStatuses.remove_statuscCsJtj�t��tj|k���}|rt|�dkr|Stj�tjdk���}|S)z&
        Get bdc status list.
        rT)	rfrV�joinrprWryrtruri)rQry�statuses�sourcesrIrIrT�get_assigned_status_list2���z$BdcStatuses.get_assigned_status_listcC�xi}tj�t��tjtj��tj|k��	�}|rt
|�dkr/tj�tjtj��tjdk��	�}|D]}|j||j<q1|S)z4
        Get bdc status list as dictionary.
        rT)rfrVr�rpr�rorvrWryrtruri�rQryrYr��srIrIrT� get_assigned_status_list_as_dictF�$��z,BdcStatuses.get_assigned_status_list_as_dictcC�4i}tj�tjtj���}|D]}|j||j<q|S)zD
        Get list of all bdc statuses in dictionary format.
        )rfrVr�rorvrt�rQ�status_listr�r�rIrIrT� get_complete_status_list_as_dict`��z,BdcStatuses.get_complete_status_list_as_dictcC�(d}|r|r||vr||}|S|}|S�zg
        Takes in a dictionary of statuses and a value.
        Returns suitable display text.
        r/rI�rQ�list�valuerYrIrIrT�get_formatted_statusp��z BdcStatuses.get_formatted_statusN)rZr[r\r]r"r^r_r`rbrorv�Booleanrirdr}r�r�r�r�r�r�r�rIrIrIrTrf��,
&





rfc@�XeZdZdZejeje�d�dd�Zejeje�d�dd�Z	e
dd��Ze
dd	��Zd
S)rp�"bdc_status_partnership_account_tiezbdc_statuses.idTr&�partnership_accounts.idc
Cs�z+tj�tj|ktj|k���}|s)t�}||_||_tj�	|�tj�
�WdSWdStyG}zt�
dt|��WYd}~dSd}~ww)z,
        Create new bdc status tie.
        z$Error adding bdc status tie. Error: N)rprVrWrrryrX�marketing_source_idr"rJrKrLrMrNrOrx�rQr|ry�existing_tie�new_status_tierSrIrIrTrq��&
��� ��z-BdcStatusPartnershipAccountTie.add_status_tiec
C�hztj�tj|ktj|k���tj��WdSt	y3}zt
�dt|��WYd}~dSd}~ww)z(
        Delete bdc status tie.
        r�N)
rprVrWrrryr�r"rJrLrMrNrOrx�rQr|ryrSrIrIrT�remove_source_tie��
� ��z0BdcStatusPartnershipAccountTie.remove_source_tieN)
rZr[r\r]r"r^r_rarrryrdrqr�rIrIrIrTrp��
rpc@s�eZdZdZejejdd�Zeje�d�dd�Z	ejde�
�ddd	�Zed
d��Z
edd
��Zedd��Zedd��Zedd��Zedd��Zedd��Zedd��Zedd��Zedd��Zedd��Zd S)!�	Campaigns�	campaignsTr&rhFr,rirjr0cCs$|���dd�}|dkr|rdSdS)N� r/�
nocampaignTF)rn�replace)rQrv�test_display_namerIrIrT�is_not_default_campaign�sz!Campaigns.is_not_default_campaignc
Csd}zdt�|�rdtj�t�tj�|��k���}|rDt�	|j
|�|j
}tj�tj|j
k��d��
�}t|�dkrAd|_tj��|WSt�}||_d|_tj�|�tj��|j
}t�	||�|WSW|Sty�}zt�dt|��WYd}~|Sd}~ww)z*
        Create new add campaign

        ���rlrmTFzError adding campaign. Error: N)r�r�rVrWrrnrvrX�CampaignPartnershipAccountTie�add_campaign_tier`�campaign_idrsrtrurir"rJrLrKrwrMrNrOrx)rQrvryr�rrz�new_campaignrSrIrIrT�add_campaign�sF
�
�
�
�"���zCampaigns.add_campaignc
Cs�z*tj�t��tj|k��tj|k���}|r%|js(||_	t
j��WdSWdSWdSt
yF}zt�dt|��WYd}~dSd}~ww)z+
        Update existing campaign

        Tz Error updating campaign. Error: NF)r�rVr�r�rWryr`rXrirvr"rJrLrMrNrOrx)rQr`rvryrrSrIrIrT�update_campaign�s,�
�
�	���zCampaigns.update_campaigncCsT|jr&tj�tj|k���}|D]
}t�|||�q|dur(t�|�dSdSdS)z;
        Add campaign_dict to partnership account

        N)	r�r�rVrWryrXr�r��add_campaign_defaults_to_tie)rQ�
campaign_dictryr�r�rIrIrT�add_campaign_dicts��	zCampaigns.add_campaign_dictcCr�)z?
        Add campaign to defaults partnership account

        TN)r�rVr�r`rWrirtr�r�ryr�)rQry�default_campaigns�
campaign_tiesr�rIrIrTr�r�z&Campaigns.add_campaign_defaults_to_tiec
Cr�)z"
        Delete campaign.
        r�$Error removing campaign tie. Error: N)r��remove_campaign_tierVrWr�r�r�r`rXrir"rJr�rLrMrNrOrx)rQr�ryrzrrSrIrIrT�remove_campaign+r�zCampaigns.remove_campaigncCsRtj�t��tj|k���}|rt|�dkr|dfStj�tjdk���}|dfS)z$
        Get campaign list.
        rFT)	r�rVr�r�rWryrtruri)rQryr�rIrIrT�get_assigned_campaign_listEs��z$Campaigns.get_assigned_campaign_listcCsni}d}tj�t��tj|k���}|rt|�dkr&tj�tjdk���}nd}|D]}|j	||j
<q*||fS)z2
        Get campaign list as dictionary.
        TrF)r�rVr�r�rWryrtrurirvr`)rQryrY�defaultCampaignsr�r�rIrIrT�"get_assigned_campaign_list_as_dictYs$��z,Campaigns.get_assigned_campaign_list_as_dictcCs0i}tj�tj���}|D]}|j||j<q
|S)z@
        Get list of all campaign in dictionary format.
        )r�rVr�rvrtr`)rQ�
campaign_listr�r�rIrIrT�"get_complete_campaign_list_as_dictts�z,Campaigns.get_complete_campaign_list_as_dictcCr�)zh
        Takes in a dictionary of campaigns and a value.
        Returns suitable display text.
        r/rIr�rIrIrT�get_formatted_campaign�r�z Campaigns.get_formatted_campaigncCs tj�t��tj|k���}dS�N)r�rVr�r�rWryrt)rQr�ryr�rIrIrT�get_campaign_by_name�s�zCampaigns.get_campaign_by_nameN)rZr[r\r]r"r^r_r`rbrvr�rirdr�r�r�r�r�r�r�r�r�r�r�rIrIrIrTr��s6

,







r�c@r�)r�� campaign_partnership_account_tiezcampaigns.idTr&r�c
C�z+tj�tj|ktj|k���}|s)t�}||_||_tj�|�tj�	�WdSWdSt
yG}zt�dt
|��WYd}~dSd}~ww)z*
        Create new campaign tie.
        z"Error adding campaign tie. Error: N)r�rVrWr�ryrXr"rJrKrLrMrNrOrx)rQr�ryr��new_campaign_tierSrIrIrTr��s&
��� ��z.CampaignPartnershipAccountTie.add_campaign_tiec
Cr�)z&
        Delete campaign tie.
        r�N)
r�rVrWr�ryr�r"rJrLrMrNrOrx)rQr�ryrSrIrIrTr��r�z1CampaignPartnershipAccountTie.remove_campaign_tieN)
rZr[r\r]r"r^r_rar�ryrdr�r�rIrIrIrTr��s
r�c@re)�MarketingSources�marketing_sourcesTr&rhFr,rirjr0c
Crk)z.
        Create new marketing source

        rlrmTFz&Error adding marketing source. Error: N)r�rVrWrrn�sourcerX�$MarketingSourcePartnershipAccountTie�add_source_tier`r�rsrtrurir"rJrLrvrKrwrMrNrOrx)rQrvryrrz�new_marketing_source�	source_idrSrIrIrTr��r~zMarketingSources.add_sourcecCr)z>
        Add marketing source to partnership account

        N)r�rVrWryrXr�r��add_source_defaults_to_tie)rQ�source_dictryr�r�rIrIrT�add_source_dict�r�z MarketingSources.add_source_dictcCr�)zG
        Add marketing source to defaults partnership account

        TN)r�rVr�r`rWrirtr�r�ryr�)rQry�default_sources�source_tiesr�rIrIrTr�r�z+MarketingSources.add_source_defaults_to_tiec
Cr�)z*
        Delete marketing source.
        r�,Error removing marketing source tie. Error: N)r�r�rVrWr�r�r�r`rXrir"rJr�rLrMrNrOrx)rQr�ryrzrrSrIrIrT�
remove_sourcer�zMarketingSources.remove_sourcecC�Jtj�t��tj|k���}|rt|�dkr|Stj�tjdk���}|S)z,
        Get marketing source list.
        rT)	r�rVr�r�rWryrtruri)rQryr�rIrIrT�get_assigned_source_list6r�z)MarketingSources.get_assigned_source_listcCr�)z0
        Get source list as dictionary.
        rT)r�rVr�r�r�r�rvrWryrtruri)rQryrYr�r�rIrIrT� get_assigned_source_list_as_dictJr�z1MarketingSources.get_assigned_source_list_as_dictcCr�)zI
        Get list of all marketing sources in dictionary format.
        )r�rVr�r�rvrt)rQ�source_listr�r�rIrIrT� get_complete_source_list_as_dictdr�z1MarketingSources.get_complete_source_list_as_dictcCr�)zf
        Takes in a dictionary of sources and a value.
        Returns suitable display text.
        r/rIr�rIrIrT�get_formatted_sourcetr�z%MarketingSources.get_formatted_sourceN)rZr[r\r]r"r^r_r`rbr�rvr�rirdr�r�r�r�r�r�r�r�rIrIrIrTr��r�r�c@r�)r��(marketing_source_partnership_account_tiezmarketing_sources.idTr&r�c
Cr�)z2
        Create new marketing source tie.
        z*Error adding marketing source tie. Error: N)r�rVrWr�ryrXr"rJrKrLrMrNrOrx)rQr�ryr��new_marketing_tierSrIrIrTr��r�z3MarketingSourcePartnershipAccountTie.add_source_tiec
Cr�)z.
        Delete marketing source tie.
        r�N)
r�rVrWr�ryr�r"rJrLrMrNrOrx)rQr�ryrSrIrIrTr��r�z6MarketingSourcePartnershipAccountTie.remove_source_tieN)
rZr[r\r]r"r^r_rar�ryrdr�r�rIrIrIrTr��r�r�c@re)�Statusr�Tr&rhFr,rirjr0cCr)z6
        Add statuses to partnership account

        N)�StatusPartnershipAccountTierVrWryrXr�r}r�r�rIrIrTr��r�zStatus.add_status_dictc
Crk)z$
        Create new status

        rlrmTFzError adding status. Error: N)r�rVrWrrnrorXr�rqr`r|rsrtrurir"rJrLrvrKrwrMrNrOrx)rQrvryrrz�
new_statusr|rSrIrIrTr}�r~zStatus.add_statuscCr�)z=
        Add status to defaults partnership account

        TN)r�rVr�r`rWrirtr�r|ryrqr�rIrIrTr��r�z!Status.add_status_defaults_to_tiec
Cr�)z 
        Delete status.
        r�"Error removing status tie. Error: N)r�r�rVrWr|r�r�r`rXrir"rJr�rLrMrNrOrxr�rIrIrTr�r�zStatus.remove_statuscCr�)z"
        Get status list.
        rT)	r�rVr�r�rWryrtruri)rQryr�rIrIrTr� r�zStatus.get_assigned_status_listcCr�)z0
        Get status list as dictionary.
        rT)r�rVr�r�r�rorvrWryrtrurir�rIrIrTr�4r�z'Status.get_assigned_status_list_as_dictcCr�)z@
        Get list of all statuses in dictionary format.
        )r�rVr�rorvrtr�rIrIrTr�Ns
z'Status.get_complete_status_list_as_dictcCr�r�rIr�rIrIrTr�[r�zStatus.get_formatted_statusN)rZr[r\r]r"r^r_r`rbrorvr�rirdr�r}r�r�r�r�r�r�rIrIrIrTr��s,

&




r�c@r�)r��status_partnership_account_tiezstatuses.idTr&r�c
Cr�)z(
        Create new status tie.
        z Error adding status tie. Error: N)r�rVrWr|ryrXr"rJrKrLrMrNrOrxr�rIrIrTrqqr�z*StatusPartnershipAccountTie.add_status_tiec
Cr�)z$
        Delete status tie.
        r�N)
r�rVrWr|ryr�r"rJrLrMrNrOrxr�rIrIrTr��r�z-StatusPartnershipAccountTie.remove_status_tieN)
rZr[r\r]r"r^r_rar|ryrdrqr�rIrIrIrTr�lr�r�c@s�eZdZdZejejdd�Zeje�d�dddd�Z	eje�d�dddd�Z
eje�d	�dddd�Zeje�d
�dddd�Zeje�d�dddd�Z
eje�d�dddd�Zeje�d�dddd�Zeje�d�dddd�Zejde��dd
d�Zejde��dd
d�Zejejddd�Zejejejdddd�ddd�Zejejejdddd�ddd�Zedd��Zedd��Zedd��Zedd��Zedd��Z ed d!��Z!ed"d#��Z"ed$d%��Z#d&S)'�
CreditReports�credit_reportsTr&rhFr/��indexr-r1ir3r.r5�
is_successfulrjr0�is_approvedz{}r(�CASCADE��onupdate�ondelete�r�r-r�cCs(|j}t�d�}|�|�}|�d�}|S)z; Return the date/time this credit report was added
        z
US/Eastern�%Y-%m-%d %H:%M:%S)�
created_on�pytz�timezone�
astimezone�strftime)�selfr�tz�local_dt�est_timerIrIrT�created_datetime�s



zCreditReports.created_datetimecCs4tj�|��|j|k|j|k���}|dur|SdS)�Z
        Find and return the a partnership account's contact credit score object.
        N)r"rJrVrWryr6rt)rQ�cid�paid�credit_score_objectrIrIrT�contact_credit_score_object�s

��z)CreditReports.contact_credit_score_objectcCs4tj�|��|j|k|j|k���}|dur|SdS)rNr)r"rJrVrWryr6r�)rQrr�credit_report_countrIrIrT�contact_credit_report_count�s

��z)CreditReports.contact_credit_report_countc	Csft��j}t��j}|j�t|j|k|jdkt	d|j
�|kt	d|j
�|k���|j��
�}|r1|SdS)�F
        Get equifax lead count for current month per account
        �
Offerlogix�year�monthr�r�nowrrrVrWrry�service_providerrr�distinctr6r��rQrr:�
current_monthr�rIrIrT�$current_month_eq_credit_report_count�s

��z2CreditReports.current_month_eq_credit_report_countc	C�jt��j}t��jd}|j�t|j|k|jdkt	d|j
�|kt	d|j
�|k���|j��
�}|r3|SdS)zG
        Get equifax lead count for previous month per account
        rmrrrrr�rQrr:�
last_monthr�rIrIrT�!last_month_eq_credit_report_count��
��z/CreditReports.last_month_eq_credit_report_countc	Cr )zI
        Get equifax lead count for previous 2 month per account
        rlrrrrrr!rIrIrT�%last_two_month_eq_credit_report_countr$z3CreditReports.last_two_month_eq_credit_report_countcCsH|j�t|j|k|jdkt|jt�t�	�k���
|j���}|r"|SdS)rrr)
rVrWrryrrrrr�todayrr6r��rQrr�rIrIrT�today_eq_credit_report_counts��z*CreditReports.today_eq_credit_report_countc
CsR|j�t|j|k|jdkt|jt�t�	�t
dd�k���|j��
�}|r'|SdS)z6
        Get equifax lead count for yesterday
        rrm��daysr)rVrWrryrrrrrr&rrr6r�r'rIrIrT� yesterday_eq_credit_report_count"s��z.CreditReports.yesterday_eq_credit_report_countN)$rZr[r\r]r"r^r_r`rbr�
iframe_url�transaction_id�credit_score�score_card_name�
credit_bureau�product_type�descriptionr�r�r��pg�JSON�tradesrar6ry�propertyr
rdrrrr#r%r(r+rIrIrIrTr��sT����
	





r�c@s�eZdZdZejejdd�Zeje�d�ddd�Z	eje�d�ddd�Z
eje�d�ddd�Zeje�d�ddd�Zeje�d�ddd�Z
ejd	e��dd
�Zejejejddd
�ddd�Zejejejddd
�ddd�ZdS)�CreditReportsReporting�credit_reports_reportingTr&rhFrr3r5r�r,r(�(credit_reports_reporting_contact_id_fkeyr*r��1credit_reports_reporting_partnership_account_fkeyN)rZr[r\r]r"r^r_r`rbrr-r0r1r2r�r�rar6ryrIrIrIrTr71s"��
�r7c@sBeZdZdZejejdd�Zejedd�de	j
dd�Zeje��dd�Z
eje��dd�Zejeje�d�dd�Zejejdd�Zeje��dd	d
�Zejddd�Zejejejd
dddd�ddd�Zejejejddddd�ddd�Zedd��Zedd��Zedd��Zedd��Zedd��Ze dd��Z!e!j"d d��Z!d!S)"�ContactNotes�
contact_notesTr&��as_uuid��uniquerir�Fr,r(r/r0r!�rzusers.id�contact_notes_user_id_fkeyr��r+rrrr��%contact_note_partnership_account_fkeycCs(|}tj�tdi|���tj��dS)zk
        Return whether or not the agent schedule was created successfully.

        :return: bool
        TNrI)r"rJrKr;rL)rQ�note�contactnoterIrIrTrUks
zContactNotes.createcCsf|rtj�t�j|d��||||d��tj��dStj�t�j|d��|||d��tj��dS)z]
        Return whether the contact was updated successfully.

        :return: bool
        �r`)�
updated_on�text�
is_enabled�user_id)rHrJrKT)r"rJrVr;�	filter_byrrL)rQ�contact_note_id�contact_note_text�contact_note_updated_date�contact_note_user_id�contact_note_enabledrIrIrTrxs$��

���
zContactNotes.updatecCs>ztj�t�j|d���}tj��WdStyYdSw)zSReturn whether the contact was deleted successfully.
        :return: bool
        rGTF)r"rJrVr;rLr�rLrM)rQrM�_deletedrIrIrTr��s
�zContactNotes.deletecC�|j�d�S)z. Return the date the note was created
        r�rHr�r	rIrIrT�date_edited��zContactNotes.date_editedcCs|jjd|jjS�z@ Return the full name of the user that created the note
        r���user�	firstname�lastnamerUrIrIrT�
user_fullname�szContactNotes.user_fullnamecCs|jj�d|jj��S)Nr�rYrUrIrIrTr+�szContactNotes.namecCs2tt�tjdtj��d�g��tj|j	k��d�S)Nr�r+rZ)
rr�concatr!r[r\�label�wherer`rK�rQrIrIrTr+�s
��N)#rZr[r\r]r"r^r_r`r�uuid�uuid4�sid�DateTimerrHrar6r�rJ�TextrI�relationshiprZrKryrdrUrr�r6rVr]r	r+�
expressionrIrIrIrTr;CsX����





r;�contact_agent_associationr6r(Tr&�agent_idz	agents.id�contact_tag_association�tag_idzcontact_tag.idc@sLeZdZdZejejdd�Zejedd�de	j
dd�Zejed�ddd	�Z
ejed�ddd	�Zejed�ddd	�Zejed
�ddd	�Zejed
�ddd	�Zejed�ddd	�Zejed�ddd	�Zejed�ddd	�Zeje�d
�ddd	�Zeje�d
�ddd	�Zejed
�ddd	�Zeje�d
�ddd	�Zeje�d�ddd	�Zeje�d�ddd	�Zejejejdd
ddd�ddd�Zejde��ddd	�Zejde��ddd	�Z eje�d�dd�Z!eje�d�dddd�Z"eje�d�dddd�Z#eje�d�dddd�Z$ejejdd�Z%ejejdd�Z&ejed
�ddd	�Z'eje�d�ddd	�Z(eje�d�ddd	�Z)eje��dddd�Z*ejejdd�Z+eje�,�dd�Z-eje��dddd�Z.ejde��ddd	�Z/ej0e1dd�Z2ej0e3ddd�Z4ej0e5dddd�Z6ej0e7ddd�Z8ej0e9dd�Z:ej0e;ddd�Z<ej0de=e>dd d!�d d"�Z?e@eAeB�Ce1j�D��g��EeFe1jGeke1jek���Hd#�dd$�ZIe@eAeB�Ce7j�D��g��EeFe7jGeke7jek���Hd%�dd$�ZJe@eAeB�Ce3j�D��g��EeFe3jGeke3jek���Hd&�dd$�ZKe@eAeB�Ce1j�D��g��EeFe1jGeke1jek���Hd'�dd$�ZLe@eAe3j�D�g��EeFe3jGeke3jek���Md(��Hd)�dd$�ZNe@ejB�OePeB�Qe�d*kd+fgdd,�ePeB�Qe�d-kd.fgdd,�ePeB�Qe�d/kd0fgdd,�ePeB�Qe�d1kd2fgdd,�ePe/d3kd4fgdd,�ePeIjRd5kd6fgdd,�ePeKjRd5kd7fgdd,�ePeJjRd5kd8fgdd,���ZSe@eAeTjUg��EeFeTjGekeTjekeTjV�Wd����XeTjY�Z���Md(��Hd9��ZUejejddd5d�Z[e\d:d;��Z]e^d<d=��Z_e]jRd>d;��Z]e`d�d@dA��Zae`dBdC��Zbe\dDdE��Zce^dFdG��Zde^dHdI��Zee^dJdK��Zfe^dLdM��Zge^dNdO��Zhe^dPdQ��Zie^dRdS��Zje^dTdU��Zke^dVdW��Zle`dXdY��Zme`dZd[��Zne`d\d]��Zoe`d^d_��Zpe`d`da��Zqe`dbdc��Zre`ddde��Zse`dfdg��Zte`dhdi��Zue`djdk��Zve`dldm��Zwe`dndo��Zxe`dpdq��Zydrds�Zzdtdu�Z{dvdw�Z|dxdy�Z}dzd{�Z~e`d|d}��Ze`d~d��Z�e`d�d���Z�e`d�d���Z�d�d��Z�d?S)��Contact�contactsTr&r=r?rhFr/r0r.r2r�� contact_partnership_account_fkeyr�rCr�is_do_not_callrj�is_unsubscriber,�	no statusr��	no sourcer5�r-r1ri�
is_eq_lead�contactrA)r�passive_deletes)r�uselistrw�Agent�dynamic��lazy)�	secondaryrr|�	sms_count)�deferred�
form_count�phone_count�
sms_sourcerm�phone_source�apizapi-)�else_�importzimport-�mobilezmobile-�
adf_importzadf-�1zcredit-rzsms-zphone-�formr.cC�Vd}|jr|jrd�|j|j�}|S|jr|js|j}|S|js)|js)|jr)|j}|S�N�Unknownz{} {})r[r\rP�	caller_id�r	rYrIrIrTr+S���zContact.namecCs |jdkrdS|jdkrdSdS)N��cold�<�warm�hot)�intent_scorerUrIrIrT�get_intent_state^s


zContact.get_intent_statecCsJ|jr|jr|jd|jS|jr|js|jS|js#|js#|jr#|jSdS)Nr�r�)r[r\r�rarIrIrTr+gsNcCsR|r|j�|j|k���}|r|S|r'|j�|j|k|j|kB���}|r'|SdSr�)rVrW�emailrX�
phonenumber_1�
phonenumber_2)rQr��phonervrIrIrT�findqs zContact.findcCs:|�}||_d|_d|_||_|�d�d|_|��|S)N�new�lead�@r)r�ro�
bdc_statusry�splitr[�save)rQr�rrvrIrIrT�create_from_mail}szContact.create_from_mailcCr�r�)r[r\rPr�r�rIrIrT�message_name�r�zContact.message_namecCs|jd|jSrX)r[r\rUrIrIrTr]�szContact.user_fullnamecCs.tt�tj�g��ttj|jktj|jk��Sr�)	rrr�rr`r`rr6ryrUrIrIrT�total_calls�s�zContact.total_callscCs*tj�t��|jtjktjdk���}|S)z4 Return the number of notes for this number
        T)	r;rVr�rmrWr`r6rJr�)r	�count_resultrIrIrT�
note_count�s
��zContact.note_countcCrS)z7 Return the date/time this contact was created
        r)rrrUrIrIrTr
�rWzContact.created_datetimecCrS)z7 Return the date/time this contact was updated
        rrTrUrIrIrT�updated_datetime�rWzContact.updated_datetimecCs|jr	|j�d�SdS)z? Return the date/time this contact was deactivated on.
        rr/)�deactivated_onrrUrIrIrT�deactivated_on_datetime�szContact.deactivated_on_datetimecCs$|jrt|j�S|jrt|j�SdS)z,Return formatted phonenumber for the contact�unavailable)r�rr�rUrIrIrT�phonenumber�s


zContact.phonenumbercC�|jrt|j�SdS�z.Return formatted phonenumber_1 for the contactr/)r�rrUrIrIrT�formatted_phonenumber_1��
zContact.formatted_phonenumber_1cCr�r�)r�rrUrIrIrT�formatted_phonenumber_2�r�zContact.formatted_phonenumber_2c	Cs`t��j}t��j}|j�t|j|k|j�	d�t
d|j�|kt
d|j�|k����}|r.|SdS)�:
        Get equifax lead count for current month
        Trrr�
rrrrrVrWrryru�is_rrr�rrIrIrT� current_month_equifax_lead_count�s


��z(Contact.current_month_equifax_lead_countc	Cs|t��j}t��jd}|dkrd|}|d}|j�t|j|k|j�	d�t
d|j�|kt
d|j�|k����}|r<|SdS)�;
        Get equifax lead count for previous month
        rmr�Trrr��rQrrr"r�rIrIrT�last_month_equifax_lead_count��

��z%Contact.last_month_equifax_lead_countc	C�|t��j}t��jd}|dkrd|}|d}|j�t|j|k|j�	d�t
d|j�|kt
d|j�|k����}|r<|SdS)r�rlrr�rmTrrr�r�rIrIrT�!last_two_month_equifax_lead_count�r�z)Contact.last_two_month_equifax_lead_countc	Cr�)r��rr�rmTrrr�r�rIrIrT�#last_three_month_equifax_lead_countr�z+Contact.last_three_month_equifax_lead_countcCsB|j�t|j|k|j�d�t|jt�t	�
�k����}|r|SdS)r�Tr)rVrWrryrur�rrrrr&r�r'rIrIrT�today_equifax_lead_counts
��z Contact.today_equifax_lead_countc
C�T|j�t|j|k|j�d�t|jt�t	�
�tdd�k����}t
|�|r(|SdS)r�Trmr)r�rVrWrryrur�rrrrr&rr��printr'rIrIrT�yesterday_equifax_lead_count,�
��z$Contact.yesterday_equifax_lead_countc
Cr�)zC
        Get equifax lead count for 2 days back from today
        Trlr)rr�r'rIrIrT�day_before_equifax_lead_count:r�z%Contact.day_before_equifax_lead_countc
Cs|d}z tdi|��}d|_tj�|�tj��|j}tj��W|Sty=}zt	�
d�|��WYd}~dSd}~ww)zD
        Create contacts via the API.

        :return: int
        r�Tz!Error creating contact. Error: {}NrI)rm�
api_sourcer"rJrKrwr`rLrMrNrOrP)rQ�paramsr6rvrSrIrIrT�
api_createHs
���zContact.api_createcCs|d}tj�ttj|ktj|k����}|dur�d|_|dur%|dur%||_|dur0|dur0||_	|dur;|dur;||_
|durB||_|durI||_|	durP|	|_
|
durW|
|_|dur^||_|dure||_|
durl|
|_|durs||_|durz||_|dur�||_|dur�||_|dur�||_|dur�||_|dur�||_|dur�||_|dur�||_|dur�||_||_tj��d}|S)zE
        Update contacts via the API.

        :return: bool
        FNTr/) rmrVrWrryr`rXr�r[r\r�rj�birthday�avatar�large_avatarr��	address_1�	address_2�city�state�country�zip�ip�is_deactivatedrorprqr��api_token_idr"rJrL)rQryr�r6r[r\r�rjr�r�r�r�r�r�r�r�r�r�r�r�rorprqr�rYrvrIrIrT�
api_update_sh�
zContact.api_updatec
Csxz$|j�|j�|����}|D]
}||_tjtj	d�|_
qtj�
�WdSty;}zt|�WYd}~dSd}~ww)N)r
FT)rVrWrd�in_rtrorrr�utcrHr"rJrLrMr�)rQr��contact_sids�leadsr�rSrIrIrT�update_manual_status�s���zContact.update_manual_statuscCsLtj�ttj|ktj|k����}|dur$d|_t�	�|_
tj�
�dSdS)ze
        Deactivate contact. The is_active flag will be set to false.

        :return: bool
        NTF)rmrVrWrr`ryrXr�rrr�r"rJrL)rQr`ryrvrIrIrT�api_deactivate�s�

zContact.api_deactivatec	
Ks�tj�ttj|ktj|k����}|rbz7dD]}||��vr(t||d�||=qt||d�q|�	�D]
\}}t|||�q3t
��|_t
j��WdStya}zt|�WYd}~dSd}~wwdS)zL
        Update contacts via the mobile API.

        :return: bool
        )rqrpTFN)rmrVrWrr`ryrX�keys�setattr�itemsrrr�r"rJrLrMr�)	rQr`ry�kwargsrv�arg�keyr�rSrIrIrT�mobile_api_update�s0��

��zContact.mobile_api_updatec	Cstj�ttj|ktj|k����}|r�|r tj�tj|k���}|r/tj�tj|�	�k���}|r�|r>|j|_t
j��dS|dur^t
t��tj|k�j|jd�}t
j�|�t
j��dS|dur�|j|_t
j��t
t��tj|k�j|jd�}t
j�|�t
j��dSdSdSdS)zB
        Update the contact status in contacts and leads.
        F)�progress_statusN)rmrVrWrr`ryrXr�rornr"rJrLrrr`r6�values�execute)	rQr`r|�status_textry�
on_contactrvro�update_stmtrIrIrT�
update_status�sH����
�zContact.update_statuscC�dd�|jD�S)NcS�g|]
}|jdkr|j�qS)�primary��tag_typer+��.0�tagrIrIrT�
<listcomp>�z,Contact.get_primary_tags.<locals>.<listcomp>��contact_tagsrUrIrIrT�get_primary_tags�zContact.get_primary_tagscCr�)NcSr��r}r�r�rIrIrTr� r�z3Contact.get_secondary_tag_names.<locals>.<listcomp>r�rUrIrIrT�get_secondary_tag_namesr�zContact.get_secondary_tag_namescCr�)NcSsg|]	}|jdkr|�qSr�)r�r�rIrIrTr�#sz5Contact.get_secondary_tag_objects.<locals>.<listcomp>r�rUrIrIrT�get_secondary_tag_objects"r�z!Contact.get_secondary_tag_objectscCr�)NcSr�r�)r�rdr�rIrIrTr�&r�z.Contact.get_secondary_tags.<locals>.<listcomp>r�rUrIrIrT�get_secondary_tags%r�zContact.get_secondary_tagscCr�)NcSr�)�customr�r�rIrIrTr�)r�z+Contact.get_custom_tags.<locals>.<listcomp>r�rUrIrIrT�get_custom_tags(r�zContact.get_custom_tagscCs|j�|j�|��Sr�)rVrWr`r�)rQ�contact_idsrIrIrT�get_by_id_list+szContact.get_by_id_listcCs|j�|j|��k���Sr�)rVrWrornrt)rQrorIrIrT�
get_by_status/szContact.get_by_statuscCsz|�|�\}}|j�|j�|��}|r|�|j|k�}|r%|�|j|k�}|r3|�|j|k|j|k�}|�t	|j
����Sr�)�_get_intent_scores_from_staterVrWr`r�r�ror��order_byrrHrt)rQ�_type�idsro�intent_state�intent_score_min�intent_score_maxrVrIrIrT�	get_leads3szContact.get_leadscCs(|dkrdS|dkrdS|dkrdSdS)Nr�)rr�r�)r�r�r�)r��e)rrrI)rQrrIrIrTr?sz%Contact._get_intent_scores_from_statecCs.ddlm}|�|�}|j�|�|��|S)Nr)ry)�"buyercall.blueprints.agents.modelsry�
get_from_sids�assigned_agents�extendr�)r	�
agent_sidsry�agentsrIrIrT�
assign_agentsJs

zContact.assign_agents)NN)�rZr[r\r]r"r^r_r`rrbrcrdrr[r\r�r�r�r�r�r�rbr�r�r�r�r��external_source_typeraryr�rprq�agent_assignedror��marketing_sourcer�rjr�r�r�r�r�rer�r�rurgr �messagesrr�r$�vehicler�
form_leadsr;�	note_listr�appointments�
contact_agentrrr
rrr�rr`rr6r_r~r�r�r�rsr�r^rrnrhr�r�r.r�r�rrrr�r	r+r6r�rdr�r�r�r]r�r�r
r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrIrIrIrTrm�sl'������
���������������

���



	






















W



%




rmc@s�eZdZdZejejdd�Zejedd�de	j
dd�Zejejejdddd�dd	d
�Z
ejddd
�Zejejejdddd�ddd
�Zejejejdddd�ddd
�Zejddd
�Zejejejdddd�ddd
�Zejddd
�Zejejejdddd�ddd
�Zejejejdddd�ddd
�Zejejejdddd�ddd
�Zejejd	d	dd�Zeje�d�dd�Zdd�Zedd��Zedd��Z d S)!�ContactChannelTie�contact_channels_tieTr&r=r?r(r�r�Frrm�contact_channel_tiesrAz
channel.idzleads.idrzmessages.idr zchat.idzemail.idz
form_leads.id�false)r-rir1�dr,cCst|jj�pdS)Nr/)rx�contact_objrdrUrIrIrT�__str__�r�zContactChannelTie.__str__cC�|jSr�)�	is_bannedrUrIrIrTro�szContactChannelTie.statuscCs|j�t��tj|k���Sr�)rVr�rmrWryrt)rQrrIrIrT�get_by_partnership_account�sz,ContactChannelTie.get_by_partnership_accountN)!rZr[r\r]r"r^r_r`rrbrcrdrarvrgr�
channel_id�call�call_obj�message�message_obj�chatr��web_formr�r"rb�
banned_reasonr r6rordr#rIrIrIrTrRst�������
�
rc@s�eZdZegd��ZdZejejdd�Z	eje
dd�dejdd�Z
eje�d�dd	�Zejejed
di�dddd
�Zeje��dddd�Zejdedejddd�d�Zdd�Zeddd��Zeddd��Zeddd��ZdS)�ContactTags))r��Primary)r}�	Secondary)r��Custom�contact_tagTr&r=r?rhFr,r+�	tag_typesr�r�r�rtrm�subqueryr�r{)r}r|rcCr!r�r*rUrIrIrTr �szContactTags.__str__NcC�:|rz
|j�|j�|����WStygYSwgSr�)rVrWrdr�rtrM)rQ�sidsrIrIrT�get_by_sids���zContactTags.get_by_sidscCs6|rz|j�|j|k���WStyYdSwdSr�)rVrWr+rXrM)rQr+rIrIrT�get_by_name�s�zContactTags.get_by_namecCr3r�)rVrWr+�anyrtrM)rQ�namesrIrIrT�get_by_names�r6zContactTags.get_by_namesr�)rZr[r\r�	TAG_TYPESr]r"r^r_r`rrbrcrdrbr+�Enumr�r��	is_activerg�
contacts_tagsrrnr rdr5r7r:rIrIrIrTr,�s(�
�		r,c@sveZdZdZejejdd�Zeje�d�ddd�Z	eje�d�ddd�Z
ejed�ddd�Zeje�d�ddd�Z
ejejejd	d
d�ddd�Zejd
e��ddd�Zejde��ddd�Zeje�d�dd�Zeje�d�ddd�Zeje�d�dddd�Zeje�d�dddd�Zejejdd�Zejejdd�Zeje��dddd�Zejejdd�Zejde��ddd�ZdS)�ContactReporting�contacts_reportingTr&r.Fr/r0r2r��*contact_reporting_partnership_account_fkeyr*rrprjrqrhr,rrr�rsrtruN)rZr[r\r]r"r^r_r`rbr�r�rr�rraryr�rprqrror�rr�rjr�r�rurIrIrIrTr?�s2���r?)P�loggingrNrb�collectionsrr�sqlalchemy.dialectsrr3�
sqlalchemyrrrr�sqlalchemy.ext.hybridr	r
�sqlalchemy.ormrrr
�sqlalchemy.sqlrrrr�sqlalchemy.sql.expressionrrr�buyercall.lib.util_cryptorrr�flaskr�apprr�sqlalchemy.dialects.postgresqlrr�(buyercall.blueprints.appointments.modelsr�buyercall.blueprints.filtersr�&buyercall.blueprints.form_leads.modelsr�!buyercall.blueprints.leads.modelsr�buyercall.blueprints.sms.modelsr � buyercall.blueprints.user.modelsr!�buyercall.extensionsr"�buyercall.lib.util_sqlalchemyr#�Modelr$rfrpr�r�r�r�r�r�r�r7r;�Tabler^rarr>rmrr,r?rIrIrIrT�<module>s�!?,q*?,<,t��Q9