B
    fH:                 @   s|   d dl Z d dlmZ d dlmZ d dlmZmZ d dl m Z d dlT d dl	m
Z
 d dlmZ d d	lmZ G d
d deZdS )    N)copy)Decimal)
CmfM2MBase
CmfNumeric)datetime)*)	BaseModel)CmfActiveEntity)fieldsc                   s@  e Zd Zejdg Zdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Z fddZ fddZdd Z fddZdd Zdd Zdd Zdd Zed? fd!d"	Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Z fd-d.Zd/d0 Z fd1d2Z fd3d4Zd5d6 Z fd7d8Z ed@ fd9d:	Z! fd;d<Z"d=d> Z#  Z$S )ACmfDealget_commentsc             C   s   | j jrl| j rld }x@| j D ]6}|j r| js8|j| _n| j|_|jrN|  P qW | jsltjdd | _| jr| j r| dg x"| j D ]}|j jr| j|_qW d S )NZperson)typezcontacts.company)	contacts
is_changedcompanyloadsavemodelsZ
CmfCompanyload_fieldsis_null)selfZcontact r   !./modules/sale/models/cmf_deal.py_calc_company   s"    

zCmfDeal._calc_companyc             C   s   | j | j | _d S )N)total_without_discounttotalZtotal_discount)r   r   r   r   _calc_total_discount)   s    zCmfDeal._calc_total_discountc             C   sf   t d}xR| jD ]H}|jsqt |jjjj}|jj}|jjs@d}||d ||jj  7 }qW || _d S )Ng        r   d   )r   
deal_itemsproductvaluetaxprice
item_count	total_tax)r   r$   itemr!   r"   r   r   r   _calc_total_tax,   s    zCmfDeal._calc_total_taxc             C   s2  | j js$| jjs$| jjs$| jjs$d S td}x| jD ]}||j7 }q4W |dkr| jr| jjs| j}| jjr| jjdk	r|| jj7 }|| jj8 }| j jr| j jdk	r| j js| jjs| jjrt	ddd nd S |d krd S | jr|| j8 }| j r|| j td | 8 }|s|dkr|| _| jdk r.d| _d S )Ng        r   .uc   Не возможно вычислить новую скидку, заполните "Товары"T)abortr   )
Zdiscount_pctr   r   Zdiscountr   r   r   oldnew	cmf_alert)r   r   r%   r   r   r   _calc_total8   s6    
zCmfDeal._calc_totalc             C   s@   t d}x,| jD ]"}|jr|js"q||j|j 7 }qW || _d S )Ng        )r   r   r"   r#   r   )r   r   r%   r   r   r   _calc_total_without_discount[   s    z$CmfDeal._calc_total_without_discountc             C   s   d S )Nr   )r   r   r   r   _calc_pipelinec   s    zCmfDeal._calc_pipelinec             C   s0   | j | jjkrd | _ | jr,| j s,| jd | _ d S )Nr   )primary_contactr   r    )r   r   r   r   _calc_primary_contacti   s    zCmfDeal._calc_primary_contactc                s   |  | j d| j |d< | jr<|d  d| jj 7  < d}| jrr| jjpPd d| jjp^d d| jjpld }||d< t j	f |S )Nu   Сделка name  text)
r   Zfull_search_fieldscoder   r0   r.   ZemailZphonesuperfull_search_index)r   kwargsr3   )	__class__r   r   r6   o   s    ,zCmfDeal.full_search_indexc          
      s&   ddddddddd	d
g
}t   | S )Nzdeal_items.*zdeal_items.product.taxr   r   r   currencyr.   zstatus.status_typezstatus.ordernozpipeline.default_deal_workflow)r5   save_preload_fields)r   r
   )r8   r   r   r:   ~   s    
zCmfDeal.save_preload_fieldsc             C   s   d}t | jr| jjd j}n| jr,| jj}| jrtjd| d| j	j
 d| j d| j d| j d	| tj | j| jd	  d S )
Nu   клиентомr   u   Связаться с u%   Сделка: <a href="/crm/Pipeline/z?crm=true&model=z&id=z">z</a>)r0   r3   parent
alarm_dateresponsibler   )lenr   r)   Z	full_namer   r0   is_newr   CmfTaskpipeliner4   
class_nameidr   Znowr=   r   )r   Zclient_namer   r   r   create_new_deal_task   s    
&zCmfDeal.create_new_deal_taskc                sd   |    |   |   |   |   |   |   |   |   | j	rV| 
  t j||S )N)_calc_responsibler   _calc_currencyr,   r+   r&   r   r/   r-   r?   rD   r5   r   )r   argsr7   )r8   r   r   r      s    zCmfDeal.savec             C   sX   | j js| j jrT| j js8| j jr8| j jdkr8tddd tjjdddgdgdd| _ d S )	NZsalesu_   У сделки может быть вид деятельности только ПродажиT)r'   r4   z==r   )filterr
   Zcache_inmemory)Zactivityr   r   r4   r*   r   ZCmfActivityget)r   r   r   r   _calc_activity   s    zCmfDeal._calc_activityc             C   s   | j sd| _ d S )Nu   Новая сделка)r0   )r   r   r   r   
_calc_name   s    zCmfDeal._calc_namec             C   s    | j stjjdddgd| _ d S )Nmainz==T)rH   )r9   r   ZCmfCurrencyrI   )r   r   r   r   rF      s    zCmfDeal._calc_currencyc             C   s   | j jr| j js| j| _ d S )N)r=   r   r   	cmf_owner)r   r   r   r   rE      s    zCmfDeal._calc_responsibleNc                s   |d krg }|dkrp|sg }|s$g }| d |r<|dnd }|rR|dd|gg}| ddddgddd gg n:|dkr|dd	ddgd	dd ggg}n|d
kr|dddgg}t j|f|||d|S )N)r   r.   Z	CmfPerson
company_idz==ORZ
user_localFr   Zis_internalrA   cache_status_typez!=CLOSED)object_fieldsmodels_listrH   )appendrI   r5   field_options_list)clsZrelation_field_namerR   rS   rH   r7   rN   )r8   r   r   rU      s&    
zCmfDeal.field_options_listc             C   sV   | j r| j  | jjrR| jjjr*d | _n(| j  | j jtj	| jjjd7  _d S )N)Zseconds)
r?   r<   Zset_nowstatusr   Z
next_alarmr   r    r   Z	timedelta)r   r   r   r   _calc_alarm_date   s    


zCmfDeal._calc_alarm_datec             O   s(   || _ |   tj| |d}|  |S )N)r;   r3   )r<   r   r   
CmfComment)r   r<   reasonrG   r7   commentr   r   r   shift_alarm   s
    zCmfDeal.shift_alarmc             C   s   dS )u=   
        Для сделок проверок нет
        Nr   )r   r   r   r   _check_alarm_date_valid   s    zCmfDeal._check_alarm_date_validc             C   s   dS )u   
        Общая функция вычисления диапазона плана и будильника
        :return:
        Nr   )r   r   r   r   
_calc_plan   s    zCmfDeal._calc_planc             C   s   | j jsB| jsB| jjsB| jjsB| jjsB| jjsB| jjsB| jjsBdS | jdkrPdS | j pZ| j| _| j rr| jrr| j | _| jjs| j js| jjs| jjr| j p| j| _dS )u   
        Вычисляем человека от которого требуются действия по задаче
        :return:
        NrQ   )	r=   r   rM   r;   rW   waiting_forr   r<   rP   )r   r   r   r   _calc_waiting_for   s&    
zCmfDeal._calc_waiting_forc                s   |  ddddddg t  }| j|d< | jdd	d
g|d< dd | jD |d< | j|d< | jj	|d< | j
jj	|d< | jr| jdd	d
g|d< | jj	|d< | jr| jdd	d
dg|d< | jr| jdd	d
g|d< |S )Nr   zcurrency.short_namer.   tags
is_checkedpipeline_idr   rC   r0   r4   r=   c             S   s   g | ]}| d ddgqS )rC   r0   r4   )to_json).0ir   r   r   
<listcomp>  s    z1CmfDeal.get_cache_fields_json.<locals>.<listcomp>Zstatus_colorrN   Z
short_namer9   )r   r5   get_cache_fields_jsonr   r=   rd   ra   rb   rc   r    rW   Zcolorr   rN   r9   r.   )r   res)r8   r   r   rh     s$    



zCmfDeal.get_cache_fields_jsonc             C   s,   t jjdd| jgd}|r(dd |D  dS )u@   
        Удаляем связанные задачи
        Z	parent_idz==)rH   c             S   s   g | ]}|  qS r   )delete)re   Ztaskr   r   r   rg   /  s    z(CmfDeal._clean_tasks.<locals>.<listcomp>N)r   r@   listrC   )r   Ztasksr   r   r   _clean_tasks)  s    zCmfDeal._clean_tasksc                sD   |  dddg dd | jD  |   t j||}| j  |S )NrA   r   r   c             S   s   g | ]}|  qS r   )rj   )re   objr   r   r   rg   3  s    z"CmfDeal.delete.<locals>.<listcomp>)r   r   rl   r5   rj   rA   emit)r   rG   r7   ret)r8   r   r   rj   1  s    
zCmfDeal.deletec                s   d S t jf d|i| d S )	Nr   r_   r=   u   <b>Сделка ""z c z</b></span><br>r3   )r   r0   r   r    r5   all_place_notify)r   r3   r7   )r8   r   r   rq   :  s        zCmfDeal.all_place_notifyc            O   s:   t jj|||d}t jj| j||d}t|| dd dS )N)rH   r
   slice)Zdeal_idr
   rr   c             S   s   | j S )N)Zcmf_modified_at)rm   r   r   r   <lambda>H      z&CmfDeal.get_comments.<locals>.<lambda>)key)r   rY   ZslistrC   sorted)r   r
   Z_filterrr   rG   r7   ZcommentsZchat_commentsr   r   r   r   C  s    zCmfDeal.get_commentsc                sF   |  dg | jr| j  | jjr8| jjr8| jj  t   d S )NrA   )r   rA   rn   r   r(   r5   )r   )r8   r   r   rn   J  s    
zCmfDeal.emitc                s2   t  |}x |D ]}|d dkrd|d< qW |S )NZ
field_name)r0   rA   Trequired)r5   import_shop_fields)rV   Zfields_nameri   Zsettings)r8   r   r   rx   U  s
    
zCmfDeal.import_shop_fieldsc                s(   | j js| jjr| jj| _ t   d S )N)Zworkflowr   rA   r   Zdefault_deal_workflowr5   _calc_workflow)r   )r8   r   r   ry   ]  s    
zCmfDeal._calc_workflowc             O   s   t j gS )N)r   ZCmfPersonGroupZ
user_group)r   rG   r7   r   r   r   
get_ownersb  s    zCmfDeal.get_owners)NNN)N)%__name__
__module____qualname__r	   Zapi_methodsr   r   r&   r+   r,   r-   r/   r6   r:   rD   r   rJ   rK   rF   rE   classmethodrU   rX   r\   r]   r^   r`   rh   rl   rj   rq   r   rn   rx   ry   rz   __classcell__r   r   )r8   r   r      sD   #
$		r   )r   r   decimalr   Zcmf.fields.base_fieldsr   r   ZdtZcmf.includeZcmf.models.base_modelr   Zcommon.models.cmf_active_entityr	   Zcmfr
   r   r   r   r   r   <module>   s   