U
    H|c'                     @   sD   d dl T d dlmZ d dlZd dlT d dlmZ G dd deZdS )    )*)	timedeltaN)CmfGanttTaskc                       s   e Zd Zedd Z fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" fd#d$
Z  ZS )%r   c              	   C   sR   t  }||_|j|_|j|_||_|j|_t  |j	ddd W 5 Q R X |S )NF)emitnotify)
Zmodelsr   parentZprojectZgantt_projecttaskparent_taskcmfutilZdisable_notifysave)clsr   ZbaselineZ
gantt_task r   (./modules/gantt/models/cmf_gantt_task.pycreate_gantt_task	   s    
zCmfGanttTask.create_gantt_taskc                    s   dddddg}t   | S )Nr   r   ztask.logic_prefixztask.parent_task.logic_prefixztask.has_child_tasks)supersave_preload_fields)selfZfields	__class__r   r   r      s    z CmfGanttTask.save_preload_fieldsc                 C   sd   | j r| jjrd S | jr`| jr`| j| j }| d d d }tt|d d}|d d | _d S )N<      着&?      )	const_durationsched_durationis_not_nullsched_start_datesched_finish_datetotal_secondsmaxmathceil)r   ZdeltaZ
delta_days	work_daysr   r   r   _calc_sched_duration   s    z!CmfGanttTask._calc_sched_durationc                 C   s   | j jrd S | jjr | jjr d S | jdkrZ| j d d }t|d }| jt|d | _n8| jdkr| j d d }t|d }| jt|d | _| jdkr| jdkr| j	rt
d d S )N0-constr   r   r   )Zdaysu   Плановый период может не соответствовать плановой длительности, т.к. все переменные зафиксированы)r   is_nullr   r   constrain_finish_typer!   r"   r   constrain_start_typer   	cmf_alert)r   r#   Zcalendar_daysr   r   r   _calc_sched_period,   s    

zCmfGanttTask._calc_sched_periodc                 C   s"   | j | _|   | jr|   d S N)constrain_start_dater   r$   r   r*   r   r   r   r   #_do_constrain_start_date_is_changed?   s    z0CmfGanttTask._do_constrain_start_date_is_changedc                 C   s   | j | _|   d S r+   )constrain_finish_dater   r$   r-   r   r   r   $_do_constrain_finish_date_is_changedF   s    z1CmfGanttTask._do_constrain_finish_date_is_changedc                 C   s,   | j dkr | jdkr tddd |   d S )Nr%   u   Нельзя менять длительность, если зафиксирована дата начала и дата окончанияTabort)r(   r'   r)   r*   r-   r   r   r   _do_sched_duration_is_changedK   s    z*CmfGanttTask._do_sched_duration_is_changedc              	   C   s   | j jrd S | j dk r"tddd | jjrl| jdkrlt| j | j d }t|d}| jjsf|| jkrl|| _| j	j
r| j	jdkr| j jpd| j jpd }t 8 | j	j
j }||   || |jdd W 5 Q R X d S )	Nr   uo   "Фактические трудозатраты" стал ниже нуля, выставляем в ноль.Tr1   d   ztask.gantt_projectF
user_input)actual_workr&   r)   
sched_workr   r!   Zfloorminactual_completer   r	   Zlogic_prefixnewoldr
   Zdisable_aclZop_gantt_taskloadload_fieldsr   from_child_add_workr   )r   Ztmp_complete
work_deltaZparent_gantt_taskr   r   r   _do_actual_work_is_changedP   s     



z'CmfGanttTask._do_actual_work_is_changedc                 C   sD   | j jrd S | jjrd S | j | j d }| jjs:|| jkr@|| _d S )Nr4   )r8   r&   r:   r7   )r   Ztmp_actual_workr   r   r   _do_actual_complete_is_changede   s    z+CmfGanttTask._do_actual_complete_is_changedc                 C   s   | j js| jjrd S | j jdkr$d S | j j}| j| j   }|| d | _| jjrd| j| j d | _| j	jr~| j	| j d | _
| jjr| j| j d | _d S )Nr   r4   )r   r&   r   Zager   perform_completer8   r   perform_work
sched_costperform_costr   perform_duration)r   Zdelta_now_time_secZdelta_finish_time_secr   r   r   _calc_performn   s    zCmfGanttTask._calc_performc                 C   sD   | j jp
d| j jpd }| jjs*| j | _n|  j|7  _|   d S Nr   )actual_myself_workr;   r<   r   has_child_tasksr7   rA   r   r@   r   r   r   !_do_actual_myself_work_is_changed   s
    
z.CmfGanttTask._do_actual_myself_work_is_changedc                 C   s   | j rd| _d S | jjr$|   d S | jjr8|   d S | jjrL|   d S | jjr`| 	  d S | j
jrt|   d S | jjr|   d S d S )Ni  )Zis_newr   rJ   
is_changedrM   r,   r.   r/   r0   r3   r7   rA   r:   rB   r-   r   r   r   _save   s*    zCmfGanttTask._savec                 C   s    |  |   |  j|7  _d S r+   )r>   r   rJ   rL   r   r   r   timetracker_add_work   s    z!CmfGanttTask.timetracker_add_workc                 C   s   |  j |7  _ d S r+   )r7   rL   r   r   r   r?      s    z CmfGanttTask.from_child_add_workc                 C   s    | j jr| jjrtddd d S )Nu   Нельзя менять поле "Фактические трудозатраты" у Summary-задач. Используйте поле "Фактические трудозатраты по собственным ресурсам задачи"Tr1   )r7   rN   r   rK   r)   r-   r   r   r   check_user_input   s    zCmfGanttTask.check_user_inputc                 C   s   | j jrd| _ | jjrd| _| jjr*d| _| jjr8d| _| jjrFd| _| jjrTd| _| jjrbd| _| jjrpd| _| j	jr~d| _	| j
jrd| _
| jjrd| _| jjrd| _| j jrd| _ | jjrd| _| jjrd| _| jjrd| _| jjrd| _| jjrd| _d S rI   )r7   r&   Zagregat_costrE   rF   Zactual_costZagregat_durationr   rG   Zactual_durationZagregat_workr8   rD   rJ   rC   r:   Zconstrain_slackZconstrain_slack_pctr-   r   r   r   fix_null_variables   sH    zCmfGanttTask.fix_null_variablesTr5   c                   s   |r|    |   |   | jjr6| jjr6| j| j_| jjrP| jjrP| j| j_	| j
jrj| j
jrj| j
| j_| jjr| jjdd |   t j||S )NT)Z	only_data)rQ   rO   rH   r   r   rN   r   Zplan_start_dater   Zplan_end_dater8   Ztime_estimater   rR   r   )r   r6   argskwargsr   r   r   r      s    


zCmfGanttTask.save)__name__
__module____qualname__classmethodr   r   r$   r*   r.   r0   r3   rA   rB   rH   rM   rO   rP   r?   rQ   rR   r   __classcell__r   r   r   r   r      s$   

	'r   )Zcmf.includeZdatetimer   r!   Z
cmf.fieldsZ#modules.gantt.fields.cmf_gantt_taskr   r   r   r   r   <module>   s
   