U
    {yd5                     @   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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.d/ Z fd0d1Z fd2d3Zd4d5 Z fd6d7Zed= fd8d9	Z fd:d;Z   Z!S )>CmfDealc                 C   s   | j jrj| j rjd }| j D ]8}|j r| js6|j| _n| j|_|jrL|   qRq| jsjtjdd | _| jr| j r| dg | j D ]}|j jr| j|_qd 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   sb   t d}| jD ]H}|jsqt |jjjj}|jj}|jjs>d}||d ||jj  7 }q|| _d S )N        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   s.  | j js$| jjs$| jjs$| jjs$d S td}| jD ]}||j7 }q2|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 )Nr   r   .uc   Не возможно вычислить новую скидку, заполните "Товары"Tabortr   )
Zdiscount_pctr   r   Zdiscountr   r   r    oldnew	cmf_alert)r   r   r'   r   r   r   _calc_total5   s>    

zCmfDeal._calc_totalc                 C   s<   t d}| jD ]"}|jr|js q||j|j 7 }q|| _d S )Nr   )r   r    r$   r%   r   )r   r   r'   r   r   r   _calc_total_without_discountX   s    
z$CmfDeal._calc_total_without_discountc                 C   s   d S r   r   r   r   r   r   _calc_pipeline`   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_contactf   s    zCmfDeal._calc_primary_contactc              
      s&   ddddddddd	d
g
}t   | S )Nzdeal_items.*zdeal_items.product.taxr   r   r   currencyr1   zstatus.status_typezstatus.ordernozpipeline.default_deal_workflow)supersave_preload_fields)r   r
   	__class__r   r   r5   l   s         zCmfDeal.save_preload_fieldsc                    s0   | j r"tj| ddd  |   t jf |S )Nu   Создано   )parenttextZ	log_level)is_newr   
CmfCommentr   create_new_deal_taskr4   _audit_changes)r   kwargsr6   r   r   r>   v   s    zCmfDeal._audit_changesc                 C   s^   d}t | jr| jjd j}n| jr,| jj}| jrZtjd| | t	j	
 | j| jd  d S )Nu   клиентомr   u   Связаться с )namer9   
alarm_dateresponsibler   )lenr   r,   Z	full_namer   r@   r;   r   CmfTaskr   ZnowrB   r   )r   Zclient_namer   r   r   r=   }   s    
zCmfDeal.create_new_deal_taskc                    sV   |    |   |   |   |   |   |   |   |   t	 j
||S r   )_calc_responsibler   _calc_currencyr/   r.   r(   r   r2   r0   r4   r   )r   argsr?   r6   r   r   r      s    zCmfDeal.savec                 C   sV   | j js| j jrR| 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 S )	NZsalesu_   У сделки может быть вид деятельности только ПродажиTr)   code==r   )filterr
   )Zactivityr   r   rH   r-   r   ZCmfActivitygetr   r   r   r   _calc_activity   s    zCmfDeal._calc_activityc                 C   s   | j sd| _ d S )Nu   Новая сделка)r@   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mainrI   TrJ   )r3   r   ZCmfCurrencyrK   r   r   r   r   rF      s    zCmfDeal._calc_currencyc                 C   s   | j jr| j js| j| _ d S r   )rB   r   r   	cmf_ownerr   r   r   r   rE      s    zCmfDeal._calc_responsibleNc                    s   |d krg }|dkrl|sg }|s$g }| d |rN|d }rN|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   r1   Z	CmfPerson
company_idrI   ORZ
user_localFr   Zis_internalpipelinecache_status_typez!=CLOSED)object_fieldsmodels_listrJ   )appendrK   r4   field_options_list)clsZrelation_field_namerV   rW   rJ   r?   rQ   r6   r   r   rY      s0    
  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;   rA   Zset_nowstatusr   Z
next_alarmr   r"   r   Z	timedeltar   r   r   r   _calc_alarm_date   s    


zCmfDeal._calc_alarm_datec                 O   s(   || _ |   tj| |d}|  |S )N)r9   r:   )rA   r   r   r<   )r   rA   reasonrG   r?   Z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:
        NrU   )	rB   r   rP   r9   r[   waiting_forr   rA   rT   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_namer1   tags
is_checkedpipeline_idr   idr@   rH   rB   c                 S   s   g | ]}| d ddgqS )rf   r@   rH   )to_json).0ir   r   r   
<listcomp>  s     z1CmfDeal.get_cache_fields_json.<locals>.<listcomp>Zstatus_colorrQ   Z
short_namer3   )r   r4   get_cache_fields_jsonr   rB   rg   rc   rd   re   r"   r[   Zcolorr   rQ   r3   r1   )r   resr6   r   r   rk     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_idrI   rO   c                 S   s   g | ]}|  qS r   delete)rh   Ztaskr   r   r   rj     s     z(CmfDeal._clean_tasks.<locals>.<listcomp>N)r   rD   listrf   )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 )NrS   r   r    c                 S   s   g | ]}|  qS r   rm   )rh   objr   r   r   rj   #  s     z"CmfDeal.delete.<locals>.<listcomp>)r   r    rp   r4   rn   rS   emit)r   rG   r?   retr6   r   r   rn   !  s    
zCmfDeal.deletec                    sX   |  dddg d| j d}| jr>| d| jjj d| }t jf d|i| d S )	Nr   ra   rB   u   <b>Сделка ""z c z</b></span><br>r:   )r   r@   r   r"   r4   all_place_notify)r   r:   r?   r6   r   r   ru   *  s
    zCmfDeal.all_place_notifyc                O   s:   t jj|||d}t jj| j||d}t|| dd dS )N)rJ   r
   slice)Zdeal_idr
   rv   c                 S   s   | j S r   )Zcmf_modified_at)rq   r   r   r   <lambda>6      z&CmfDeal.get_comments.<locals>.<lambda>)key)r   r<   Zslistrf   sorted)r   r
   Z_filterrv   rG   r?   ZcommentsZchat_commentsr   r   r   get_comments1  s    zCmfDeal.get_commentsc                    sF   |  dg | jr| j  | jjr8| jjr8| jj  t   d S )NrS   )r   rS   rr   r   r+   r4   r   r6   r   r   rr   8  s    
zCmfDeal.emitc                    s.   t  |}|D ]}|d dkrd|d< q|S )NZ
field_name)r@   rS   Trequired)r4   import_shop_fields)rZ   Zfields_namerl   Zsettingsr6   r   r   r}   C  s
    
zCmfDeal.import_shop_fieldsc                    s(   | j js| jjr| jj| _ t   d S r   )Zworkflowr   rS   r   Zdefault_deal_workflowr4   _calc_workflowr   r6   r   r   r~   K  s    
zCmfDeal._calc_workflow)NNN)N)"__name__
__module____qualname__r   r   r(   r.   r/   r0   r2   r5   r>   r=   r   rL   rM   rF   rE   classmethodrY   r\   r^   r_   r`   rb   rk   rp   rn   ru   r{   rr   r}   r~   __classcell__r   r   r6   r   r      s>   #
$	r   )r   r   Z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   