U
    -c5                     @   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   s8   t jj r| jjsd S tjjddt jjj	gd| _d S )N	parent_id==filter)
gZcurrent_personZdefault_projectr   pipeliner   r   ZCmfPipelinegetidr   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_contacte   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   currencyr9   zstatus.status_typezstatus.ordernozpipeline.default_deal_workflow)supersave_preload_fields)r   r
   	__class__r   r   r=   k   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_taskr<   _audit_changes)r   kwargsr>   r   r   rF   u   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   Связаться с )namerA   
alarm_dateresponsibler   )lenr   r,   Z	full_namer   rH   rC   r   CmfTaskr   ZnowrJ   r   )r   Zclient_namer   r   r   rE   |   s    
zCmfDeal.create_new_deal_taskc                    sV   |    |   |   |   |   |   |   |   |   t	 j
||S r   )_calc_responsibler   _calc_currencyr/   r.   r(   r   r:   r8   r<   r   )r   argsrG   r>   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)   coder1   r   )r3   r
   )Zactivityr   r   rP   r-   r   ZCmfActivityr6   r   r   r   r   _calc_activity   s    zCmfDeal._calc_activityc                 C   s   | j sd| _ d S )Nu   Новая сделка)rH   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mainr1   Tr2   )r;   r   ZCmfCurrencyr6   r   r   r   r   rN      s    zCmfDeal._calc_currencyc                 C   s   | j jr| j js| j| _ d S r   )rJ   r   r   	cmf_ownerr   r   r   r   rM      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   r9   Z	CmfPerson
company_idr1   ORZ
user_localFr   Zis_internalr5   cache_status_typez!=CLOSED)object_fieldsmodels_listr3   )appendr6   r<   field_options_list)clsZrelation_field_namerY   rZ   r3   rG   rU   r>   r   r   r\      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)
rC   rI   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)rA   rB   )rI   r   r   rD   )r   rI   reasonrO   rG   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:
        NrX   )	rJ   r   rT   rA   r^   waiting_forr   rI   rW   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_namer9   tags
is_checkedpipeline_idr   r7   rH   rP   rJ   c                 S   s   g | ]}| d ddgqS )r7   rH   rP   )to_json).0ir   r   r   
<listcomp>  s     z1CmfDeal.get_cache_fields_json.<locals>.<listcomp>Zstatus_colorrU   Z
short_namer;   )r   r<   get_cache_fields_jsonr   rJ   ri   rf   rg   rh   r"   r^   Zcolorr   rU   r;   r9   )r   resr>   r   r   rm     s.        


zCmfDeal.get_cache_fields_jsonc                 C   s,   t jjdd| jgd }r(dd |D  dS )u@   
        Удаляем связанные задачи
        r0   r1   r2   c                 S   s   g | ]}|  qS r   delete)rj   Ztaskr   r   r   rl     s     z(CmfDeal._clean_tasks.<locals>.<listcomp>N)r   rL   listr7   )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 )Nr5   r   r    c                 S   s   g | ]}|  qS r   ro   )rj   objr   r   r   rl   "  s     z"CmfDeal.delete.<locals>.<listcomp>)r   r    rr   r<   rp   r5   emit)r   rO   rG   retr>   r   r   rp      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   rd   rJ   u   <b>Сделка ""z c z</b></span><br>rB   )r   rH   r   r"   r<   all_place_notify)r   rB   rG   r>   r   r   rw   )  s
    zCmfDeal.all_place_notifyc                O   s:   t jj|||d}t jj| j||d}t|| dd dS )N)r3   r
   slice)Zdeal_idr
   rx   c                 S   s   | j S r   )Zcmf_modified_at)rs   r   r   r   <lambda>5      z&CmfDeal.get_comments.<locals>.<lambda>)key)r   rD   Zslistr7   sorted)r   r
   Z_filterrx   rO   rG   ZcommentsZchat_commentsr   r   r   get_comments0  s    zCmfDeal.get_commentsc                    sF   |  dg | jr| j  | jjr8| jjr8| jj  t   d S )Nr5   )r   r5   rt   r   r+   r<   r   r>   r   r   rt   7  s    
zCmfDeal.emitc                    s.   t  |}|D ]}|d dkrd|d< q|S )NZ
field_name)rH   r5   Trequired)r<   import_shop_fields)r]   Zfields_namern   Zsettingsr>   r   r   r   B  s
    
zCmfDeal.import_shop_fieldsc                    s(   | j js| jjr| jj| _ t   d S r   )Zworkflowr   r5   r   Zdefault_deal_workflowr<   _calc_workflowr   r>   r   r   r   J  s    
zCmfDeal._calc_workflow)NNN)N)"__name__
__module____qualname__r   r   r(   r.   r/   r8   r:   r=   rF   rE   r   rQ   rR   rN   rM   classmethodr\   r_   ra   rb   rc   re   rm   rr   rp   rw   r}   rt   r   r   __classcell__r   r   r>   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   