B
    eb|l                 @   sl   d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZ d dlZd dlmZ G dd deZdS )    )ladonize)request_validdatetime2stampstamp2datetimeinterface_responseonline_employee_newsave_notificationMESSAGE_CODESUCCESS_CODESYSTEM_EXCEPTIONDATA_EXCEPTION
user_photopagingN)gettext_lazyc               @   s  e Zd ZdZeeeeeeeeeddd Zeeeeeeeddd Z	eeeeeeeeeeed	dd Z
eeeeeeeeedd	d
 Zeeeeeeeeeeddd Zeeeeeeeeeeddd Zeeeeeeeeeddd ZdS )BioTimeAppScheduleu   
    【Schedule】
    )Zrtypec             C   sd  ddl m} ddlm}m}	 ddlm}
m} ddl}|j	 }t
|}t
|}t|}|jjj}||jg||j|j|j||d |jj|||ddd	d
ddddddddddddd	}|jj|jdjddd}|	jj|dd}d}i }|rx|D ]}|d dkr:| r0|d d nd|d
< n|d d krPd!|d
< |d	 }|d"}||krd#|d$|d% d& d#|d
  |d' d& d#|d  |d( d& d#|d  |d d& d#|d  |d d& d#|d  |d d#|d  rd)pd|d d#|d  r0d)p2d|d d#|d  rPd)pRd|d d#|d  rpd)prd|d* d#t|d |d |d frd)pd rd)pdd+||< nd#|d$d#|d
 d#|d d#|d d#|d d#|d d#|d rd)pdd#|d r2d)p4dd#|d rJd)pLdd#|d rbd)pddd#t|d |d |d frd)pdd+||< |d	 }|| }qW g }|}x||krN|d"}||d#|d$d,d,d,d,d,d-d-d-d-d-d+}||kr0d-|d< d-|d< d-|d< d-|d< d-|d*< || ||jd)d.7 }qW tt t!"|d,d/S )0z#
        get schedule info
        r   )att_calculate)PayloadBaseHoliday)LocationEmployeeN)
company_id)Zemp_idZatt_date__gteZatt_date__lteZ	timetableatt_dateZtimetable__aliascheck_in	check_outZclock_inZ	clock_outlateearly_leaveabsentleaveZovertime__normal_otZovertime__weekend_otZovertime__holiday_otZday_off)idlocation_idT)flat)r   aliasZ19000101   Zholiday   ZWeekendz%Y%m%dz{0}z%Y-%m-%dshift&set_inset_out   overtime)dater$   r&   r'   r   r   r   r   r   r   r)    0)Zdays
successful)#Zmysite.att.calc.viewsr   mysite.att.modelsr   r   Zmysite.personnel.modelsr   r   datetimenowr   r   
departmentcompanyr   ZyearZmonthdayobjectsfilterZselect_relatedvaluesorder_byvalues_listexistsstrftimeformatanygetappend	timedeltar   r
   jsondumps)selfZ
start_dateZend_datesourcedevice_tokenlanguagetokenr   r   r   r   r   r/   r0   startendempr   rowsZemp_holidayZemp_holiday_nameZpre_datevalsrr   keyZpre_valsitemsZ	loop_dater3   item rP   <G:\easytimepro\master/mysite/mobile\services\app_schedule.pypull_schedule   s    

$ 

    "



z BioTimeAppSchedule.pull_schedulec          
      s   ddl m} ddl yXt|}|jjj}|jj|d	d
dddd	} fd
d|D }	ttt|	ddS  tk
r }
 z ddl}|  ttdd|
tS d}
~
X Y nX dS )u~  
        get shift info
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:         Token for push message
        @param language:
        @param token:
        @rtype:
        {
            "code": 1, "error": "", "describe":"", "message":"",
            "data": [{"code": 1, "name": "DubaiOffice(08:00-18:00)"},]
        }
        r   )TimeIntervalN)r2   Zuse_moder   r!   in_timedurationc                s^   g | ]V}|d  d |d |d d jdj |d dd j|d d	 dd
qS )r   z{0}({1}-{2})r!   rT   z%H:%Mz2000-01-01 {time})timez%Y-%m-%d %H:%M:%SrU   )Zminutes)codename)r;   r:   r/   strptimer?   ).0obj)r/   rP   rQ   
<listcomp>   s   	z1BioTimeAppSchedule.pull_shift.<locals>.<listcomp>r+   r-   )Z$mysite.att.models.model_timeintervalrS   r/   r   r1   r2   r   r4   r5   r7   r6   r   r
   r@   rA   	Exception	traceback	print_excr   )rB   rC   rD   rE   rF   rS   rI   r   ZobjsrK   er^   rP   )r/   rQ   
pull_shiftk   s    

	zBioTimeAppSchedule.pull_shiftc	          
   C   s  ddl m}	 ddl m}
 ddlm} ddlm}m}m}m} |rt	|}t
|}y^|
jj|d}|std}ttdd|tS |	jj||jd	}|rt| d
 pt| d }|d j}||j|jgkrtd}dtdd|i }|}ttd|||S ||d jdd}|||d jd d }|	 }|j|_||_t||_||_||_ |!||d j|_"|!|| |_#|$  ddtdi}tt%t&'|ddS  t(k
r } z ddl)}|*  ttdd|t+S d}~X Y nX ntd}ttdd|tS dS )u  
        applye change schedule
        @param att_date:            change schedule date
        @param previous_shift:      current schedule
        @param adjust_shift:        new schedule
        @param remark:
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:        push message Token
        @param language:
        @param token:
        @rtype:  return result
        r   )ChangeSchedule)rS   )models_choices)r*   r/   rV   r?   )pkZadjust_shift_not_foundr+   )r   Zemployeer(   Zapp_manuallog_wrong_dataz{0}z4mobile_scheduleApply_employeeScheduleOverlap_%(emp)srI   z%H:%M:%S<   )ZhoursmessageZrequest_already_processingr-   Nobject_not_found),r.   rb   rS   
mysite.attrc   r/   r*   rV   r?   r   r   r4   r5   _r   r	   r   r   strsplitaudit_statusAUDIT_SUCCESSAPPLICATIONr;   rY   rT   r:   rU   Zemployee_idr   previous_timeintervalZtimeinterval_idapply_reasonZcombineZ
start_timeZend_timesaver
   r@   rA   r]   r^   r_   r   )rB   r   previous_shiftZadjust_shiftremarkrC   rD   rE   rF   rb   rS   rc   r*   r/   rV   r?   applierZ	currentlydescribetmprl   errorrf   Zdtime_conversionZdtime_conversion1r[   datar`   r^   rP   rP   rQ   apply   sV    


 zBioTimeAppSchedule.applyc          
      sb  ddl m}m} ddlm}	 ddlm}
 |dkrDt|}|sDd}n&||	jfkrbd|	j|	j	f }nd| }d	|j
|d
 }d}|dkrd}|pd}yn|dddd|id}t|||}||}|
g d}|rt|	j  fdd|D }||d< ttt|ddS  tk
r@ } z ddl}|  ttdd|tS d}~X Y nX nd|}ttdd|tS dS )u  
        get self schedule apply data
        @param approve_status:      0:approved&reject, 1:apply, 2:approved，3：rejected
        @param page_num:            paging（15pic/page）
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:        push message Token
        @param language:
        @param token:
        @rtype:
        r   )get_sqlp_query)rc   )CATEGORY_SCHEDULE)r   r(   r#   r"   z audit_status in (2, 3) z audit_status in (%s, %s) z audit_status in (%s) z. u.userid = %(applier)s and %(audit_status)s  )rt   rl   
audit_time)r(   
apply_timer(   sqlZschedule_applicationmobilewhere)ZsqlidZappZparams)categoryrN   c                s   g | ]}|d  |d |d t |d |d p.d|d d|d |d d	t|d
 |d d |d |d d|d t|d dqS )r   r(   r#   r"   None   z{0}      z%Y-%m-%d      
      )rW   pinrX   photorr   currently_shiftrs   r   r~   approve_statusapprove_describeapproved_remarkapproved_time)r   r;   r:   r   r=   )rZ   rL   )statusrP   rQ   r\      s   z5BioTimeAppSchedule.my_application.<locals>.<listcomp>rN   r+   r-   Nz"parameter approve_status={0} error)Zmysite.sql_utilsrz   r{   rh   rc   Zmysite.mobile.choicesr|   r   rn   AUDITINGrd   r   dictALL_AUDIT_STATUSr   r
   r@   rA   r]   r^   r_   r	   r   r;   r   )rB   r   page_numrC   rD   rE   rF   rz   r{   rc   r|   rI   _approve_statusr   Z	sort_namer   rJ   rx   rN   r`   r^   ru   rP   )r   rQ   my_application   sD    


 
z!BioTimeAppSchedule.my_applicationc              C   s  ddl m} ddlm}	 ddlm}
 ddlm} ddlm	} |dkrt
|
j}|s^dd	g}n ||
jfkrx|
j|
jg}n|g}t|}|j }g }y |rf|jd
d}|dgkr|	jj|j||d|jd}n|	jj|j||ddd}|	jj|jdd||ddd}|	jj|jd|j||ddd}|	j||jdddd||jddddB ||jddddB dddddd j|jd}|rfg }x|D ]}|d }|jj|dddddd d!d"d#}|r|d }|d |d$ |d% t|d$ |d& |d d'|d( |d d)t|d	 |d d'||d |d d'|d	 t|d* d+}|| qW g }|d&krt|d,d- dd.}n|dkrt|d/d- dd.}t t!t"#|d0d1S  t$k
r } z ddl%}|&  t t'd0d0t(|S d}~X Y nX nt)d2}t t'd0d0|t*S dS )3u	  
        get approve list
        @param approve_status:      0:approved&rejected, 1:pending, 2:approved，3：rejected
        @param page_num:            （paging（15pic/page））
        @param order_by:            order(1: apply_time，２：audit_time), apply page default value１，audit page default
        value２
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:        push message Token
        @param language:
        @param token:
        @rtype:
            {"code":1,"error":"","describe":"","message":"","data":[{"code": ID,"pin":"emp_code","name":"emp name",
            "photo":"emp photo address",
            "previous_shift":"previous_timetable","currently_shift":"new_timetabel","remark":"apply remark",
            "category":"apply category",
            "apply_time":"",
            "approve_status":"approve status value","approve_describe":"apprvoe status name","approved_remark":"apply remark",
            "approved_time":"audit time"},]}
        r   )ContentType)NodeInstance)rc   )rb   )Q)r   r(   r#   r"   r   r   r   r#   r"   ZattZchangescheduleN)0workflow_instance__workflow_engine__content_typenode_engine__approver__in	state__inapprover_admin_idZapprover_employee_idT)r   r   r   r   is_next_node)r   Z node_engine__approver_by_overallZdepartmentsr   r   r   r   Fr   )r    )Zid__inZworkflow_instance__exception_idZworkflow_instance__employeestaters   r~   is_last_node)Zworkflow_instance__employee_id)r   r   ro   Ztimeinterval__aliasrp   Zemployee__emp_codeZemployee__first_namer}   r   r   r(   z{0}r   z%Y-%m-%dr   )rW   r   rX   r   rr   r   rs   r   r~   r   r   r   r   c             S   s   | d S )Nr   rP   )krP   rP   rQ   <lambda>      z2BioTimeAppSchedule.approval_list.<locals>.<lambda>)rM   reversec             S   s   | d S )Nr~   rP   )r   rP   rP   rQ   r     r   r+   r-   zapprove_status_not_in (0,1,2,3))+Z"django.contrib.contenttypes.modelsr   mysite.workflow.modelsr   rh   rc   r.   rb   Zdjango.db.modelsr   r   r   rn   r   r   Z	flow_roleallr4   Zget_by_natural_keyr5   r   r1   r8   ZdistinctZexcluder   r;   r:   r   r=   r>   sortedr   r
   r@   rA   r]   r^   r_   r	   r   ri   r   ) rB   r   r7   r   rC   rD   rE   rF   r   r   rc   rb   r   r   r   rI   Z	emp_rolesrx   Zct_otZNodeInstance_objZNodeInstance_obj_without_departZNodeInstance_obj_with_departZapprove_nodesZprv_exceptionrL   Zexception_idZ	apply_objZres_dataZdata_filtered_listr`   r^   ru   rP   rP   rQ   approval_list  s    




&






 z BioTimeAppSchedule.approval_listc          
   C   sl  ddl m} ddlm}	 ddlm}
 ddlm} ||	j|	j	fkrXt
d}ttdd|tS |jj|d }|rPyt|}||	jkr@||_t| d	 |_|  |j|| |
jj|d
 d}|rxHt|D ]<\}}|}d}|j}|j}|rP |rd|_|  d}P qW |r||d	  }d|_|  n||	j	kr||_t| d	 |_|  |j||j d}|jj|jd }|j  d}xB|D ]:}|j!dkr|j!}|dkr|
jj|j"dj#|d qW dd$t
di}tt%t&'|ddS  t(k
rL } z ddl)}|*  ttddt+|S d}~X Y nX nt
d}tt%dd|tS dS )u{  
        change schedule approve
        @param code:                object ID
        @param approve_status:      audit status(approved/rejected)
        @param remark:              audit reason
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:        push message Token
        @param language:
        @param token:
        @rtype:
            success
                {"code":1,"error":"","describe":"","message":"","data":{"message":"pop info"}}
            fail
                {"code": -10001, "error": "", "describe": "error describe", "message": "pop info", "data":""}
        r   )rb   )rc   )r   )WorkflowInstanceZ!param_approve_status_out_of_ranger+   )abstractexception_ptr_idr(   )Zworkflow_instance__exceptionorderFT)Z	exceptionr"   )r   )r   rf   z{0}OKr-   Nrg   ),r.   rb   rh   rc   r   r   Z(mysite.workflow.models.workflow_instancer   rm   ZREFUSEri   r   r	   r   r4   r5   firstr   audit_reasonrj   rk   approverrq   ZworkflowinstanceZapprove_current_node_byr   r7   	enumerater   r   Zreject_current_node_byr   Znodeinstance_setr   r   updater;   r
   r@   rA   r]   r^   r_   r   )rB   rW   r   rs   rC   rD   rE   rF   rb   rc   r   r   ru   r[   r   ZnodesiZnodeindexZset_next_nodeZcurrent_noder   Z	next_nodeZstate_Zworkflow_instanceZnode_setrx   r`   r^   rP   rP   rQ   approve  sp    


 zBioTimeAppSchedule.approvec             C   s   ddl }ddlm} ddlm}	m}
 |jj|d }|r|j	|	krt
|}d|j||_|
|_	|j|_|j  |_||_|  ddtd	i}td
}ttt|dd|S td}ntd}|rttddt|S dS )u*  
        revoke approve
        @param code:            Obj ID
        @param remark:          audit_reason
        @param source:          data source (1: IOS， 2：Android)
        @param device_token:    Push message Token
        @param language:
        @param token:
        @rtype:
        r   N)rb   )rm   CANCEL_AUDIT_SUCCESS)r   zRevoke by {0} and Remark is {1}rf   z{0}r   Zrevoked_successfulr+   Z$only_approved_records_can_be_revokedZ!workflow_instance_does_not_exists)r/   r.   rb   Zmysite.att.models_choicesrm   r   r4   r5   r   rl   r   r;   rX   r   r   r0   r}   Z_approve_userrq   ri   r   r
   r@   rA   r	   r   )rB   rW   rs   rC   rD   rE   rF   r/   rb   rm   r   r[   userrx   rf   ru   rP   rP   rQ   revoke  s(    

zBioTimeAppSchedule.revokeN)__name__
__module____qualname____doc__r   r   intrj   rR   ra   ry   r   r   r   r   rP   rP   rP   rQ   r   	   s     \'$= 9" "Nr   )Zmysite.ladon.ladonizerr   Zmysite.mobile.utilsr   r   r   r   r   r   r	   r
   r   r   r   r   r@   Zdjango.utils.translationr   ri   objectr   rP   rP   rP   rQ   <module>   s   8