B
    )ec-`                 @   s  d dl mZmZ d dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lT d dlmZ d dlmZmZmZ dZdZejddddd Zeed d ddddd Zejddddd Zejddddd Z ejdddd d! Z!d"d# Z"dFd%d&Z#ejdd'ddGd(d)Z$ejdd*dd+d, Z%ejdd-dd.d/ Z&ejdd0dd1d2 Z'd3d4 Z(ejdd5dd6d7 Z)d8d9 Z*ejdd:ddHd;d<Z+ejdd=dd>d? Z,ejdd@dAdBdCdDdE Z-dS )I    )absolute_importunicode_literalsN)cache)Q)settings)periodic_task)crontab)
celery_app)save_capture)*)sending_mail_attach_image)sending_mailsend_notificationssend_sms_notificationzgps_setting_{hash}without_gpsTzmobile.tasks.upload_gps_operate)bindnamec             C   s  ddl m} ddlm}m} tj }|jj	t
|dt
|d@ |jd}i }x\|D ]T}|j|  }	|j|jf|j|	d}
|jjj	dd	jd
dd}|t||
 qRW |jj	|jdd	t
|dt
|d@  }|ddddd}xj|D ]b}|d }||krt }	n|d |  }	|d |d f|d |	d}
|t|d g|
 qW x0| D ]$\}}ttj|d||d  q^W |jj	|jdd}|r|j|  djd
dd}|rdd |D }tt!| d S )Nr   )Employee)GPSForEmployeeGPSForDepartment)start_date__lte)end_date__gte)department__company_id)gpsdistancevalid   )
app_statusidT)flat)Z employee__department__company_idemployee__app_statusemployee_id	longitudelatituder   end_date)hashr   )r   r   )id__inc             S   s   g | ]}|qS  r'   ).0r   r'   r'   ,G:\easytimepro\master/mysite/mobile\tasks.py
<listcomp>D   s    z&upload_gps_operate.<locals>.<listcomp>)"mysite.personnel.modelsr   mysite.mobile.modelsr   r   datetimedatetodayobjectsfilterr   r   r$   total_secondsr#   r"   r   
departmentZemployee_setvalues_listupdatedictfromkeysZselect_relatedvaluesrest_of_todayitemsr   set	CACHE_KEYformatexcludekeysWITHOUT_GPS)taskZcurrent_companyr   r   r   nowdepartment_gpsr   gps_settingr   paramsempsemployee_gpsr$   kvr'   r'   r)   upload_gps_operate   sD    






 rJ   )ZminuteZhourzmobile.task.upload_gps)Z	run_everyr   c              C   s0   ddl m}  | j }x|D ]}t| qW d S )Nr   )Company)Zmysite.cloud.modelsrK   r0   allrJ   )rK   Z	companiescompanyr'   r'   r)   
upload_gpsJ   s    

rN   z!mobile.tasks.update_personnel_gpsc          
   C   s  yRddl m}m} tj }|js<tt	j
|jd d S |jj|ddt|dt|d@  }|r|j}||krt }n|j|  }|j|jf|j|d}tt	j
|jd|| t|j d	S |jj|jd
t|dt|d@  }	|	rD|	j|  }|	j|	jf|	j|d}tt	j
|jd|| t|j dS t|jdd dS  tk
r| }
 zt|
S d }
~
X Y nX d S )Nr   )r   r   )r%   r   )employeer    )r   )r   )r   r   r   r   )r3   Z
DepartmentT)deleteZ9999)r,   r   r   r-   r.   r/   r   r   rP   r<   r=   r   r0   r1   r   firstr$   r9   r2   r#   r"   r   r;   update_without_gpsr3   	Exceptionstr)rA   empr   r   rB   rG   r$   r   rE   rC   er'   r'   r)   update_personnel_gpsR   sB    




rW   z"mobile.tasks.update_department_gpsc             C   sN  ddl m} ddlm} |jr$|js(d S tj }|j}|j}t	|tjs\tj
|d }t	|tjsztj
|d }||  kr|krJn n||  kr|krn n|jj|jdjddd}|jj|jd	d
j|djddd}||krt }	n||  }	|j|jf|j|	d}
x,|D ]$}ttj|d|
|	 t| q"W d S )Nr   )r   )r   z%Y-%m-%d)employee__departmentr!   T)r   r   )r3   r   )r&   r   )r   r   r   )r%   )r+   r   r,   r   
start_dater$   r-   r.   r/   
isinstancestrptimer0   r1   r3   r4   r>   r9   r2   r#   r"   r   r   r;   r<   r=   rR   )rA   rD   r   r   rB   rY   r$   rF   Zcachesr   valrU   r'   r'   r)   update_department_gps}   s2    

r]   z mobile.tasks.update_employee_gpsc             C   s   |j r|jsd S tj }|j}|j }|jj}t|tjsLtj|d }t|tjsjtj|d }||  kr~|krn nP||krt	 }n|| 
 }|j|jf|j|d}ttj|d|| t| d S )Nz%Y-%m-%d)r   r   r   )r%   )rY   r$   r-   r.   r/   rO   r   rZ   r[   r9   r2   r#   r"   r   r   r;   r<   r=   rR   )rA   rD   rB   r$   rY   emp_idr   r\   r'   r'   r)   update_employee_gps   s$    
r_   c              C   s@   t j tt j d} | t jdd }t j  }|| j}|S )Nz%Y-%m-%dr   )Zdays)r-   r[   rT   r.   r/   Z	timedeltarB   Zseconds)r/   ZtomorrowrB   Z	rest_timer'   r'   r)   r9      s
    

r9   Fc             C   sX   t t}| } |r2|r*| |kr0||  qH| g}n|rH| |krH||  t t| dS )zp
    :param emp_id:    emp_id
    :param delete:   true, employee gps be deleted or not exists
    :return:
    N)r   getr@   appendremover;   )r^   rP   r   r'   r'   r)   rR      s    

rR   z"mobile.tasks.delete_department_gpsc             C   s~  ddl m} ddlm} ddlm} ddlm} tj	 }|j
}|j}	||  kr\|	krzn n|r|jj|j||djddd	}
|jj|jd
dj|
djddd	}ng }|jj}|jj}|jj|||ddddd }|r<|	|krt }n|	|  }|d |d f|d |d}|tj|d|| dS || |rzx,|D ]$}|tj|d t|dd qRW d S )Nr   )r   )r   )r   )r   )rX   r   r   r!   T)r   r   )r3   r   )r&   r   )r3   r   r   r#   r"   r   r$   )r   r   r   )r%   ZUPDATED)rP   )r+   r   r,   r   r   django.core.cacher   r-   r.   r/   rY   r$   r0   r1   r3   r4   r>   rO   r   r8   Zorder_byrQ   r9   r2   r;   r<   r=   ra   rP   rR   )rA   Zgps_instanceZdeptr   r   r   r   rB   rY   r$   Zemp_idsrF   Zemp_deptr^   Zdept_gpsr   rE   r'   r'   r)   delete_employee_gps   sF    


rd   zmobile.tasks.save_clock_capturec             C   s:   yt ||| W n$ tk
r4   dd l}|  Y nX d S )Nr   )r
   rS   	traceback	print_exc)rA   r^   
punch_timeZcapturere   r'   r'   r)   save_clock_capture   s
    rh   zmobile.tasks.push_mobile_msgc             C   s  ddl m} ddlm}m} ddlm} d}|r|d }|d }	|jj|dd|d	}
|
s^d S |
d }|j	|krdd
l
m} | }||j|	dd}||}td|	 |jrtdd|j nJ|j	|krtd ddlm} ||d}d}|j|j||	d}td|	 nd S d S )Nr   )AppList)IOSANDROID)get_apn_connectionzAAAAIFvPA7I:APA91bHqm3JV2Z5119n0wF8JKgafbVMOnXGzC9DbqTCfHlERy3VHOkdbeOiZ-z3LriuSCdgPB4Alp3eWu7Zos8smnSkstIGprx38_0k69uWOQYL_O28FL31C6HKjvey-u2lDalTnLoWLaccountmessageT)usernameactiveenable
company_id)Messager   )tokensalertbadgez[*]Push APNs:z{0},z[*] ANDROID CLIENT)FCMNotification)api_keyNotification)registration_idmessage_titlemessage_bodyz[*]Push FCM:)r,   ri   mysite.mobile.choicesrj   rk   mysite.mobile.utilsrl   r0   r1   client_categoryZ
apnsclientrs   device_tokensendprinterrorsr=   joinpyfcmrx   notify_single_device)rA   rr   datari   rj   rk   rl   ANDROID_SERVER_KEYuserrn   appsapprs   Zsrvmsgresrx   push_servicetitleresultr'   r'   r)   push_mobile_msg  s:    



r   z)mobile.tasks.push_mobile_msg_notificationc             C   sV  ddl m} ddlm}m} d}|rN|d }|d }|jj|dd|d}	|	sRd S |	d }
|
j|krdd l}dd	l	m
} dd
lm} |jtjd}|j|d}|
j}||ddd}d}||ddd}tdddg}|||dg}|j||d td| nJ|
j|krRtd ddlm} ||d}d}|j|
j||d}td| nd S d S )Nr   )ri   )rj   rk   zAAAACibfadM:APA91bH8bWU9Tf06kvajaa2a8n9dV5Mnpx6hv2YUf0gccvd43bIzrihmleHJgDDQv-zAv2l8oqM0MiAWqepLl29N9suOV2k23VM3cOsgQ4gqUjo37MycpmcvdPx-da69KnQZqTm8deSqrm   rn   T)ro   rp   rq   rr   )
APNsClient)PayloadZapp_certzproduction.pemdefaultr   )ru   Zsoundrv   zcom.easytimepro.zktecoF)Zuse_sandboxZuse_alternative_portrz   tokenpayload)r   r   )notificationstopicz[*]Push APNs:z[*] ANDROID CLIENT)rx   )ry   )r{   r|   r}   z[*]Push FCM Notification:)r,   ri   r~   rj   rk   r0   r1   r   osZapns2.clientr   Zapns2.payloadr   pathr   r   ZADDITION_FILE_ROOTr   collections
namedtupleZsend_notification_batchr   r   rx   r   )rA   rr   r   ri   rj   rk   r   r   rn   r   r   r   r   r   ZctfcZpemZ	token_hexr   r   Zclientrz   r   rx   r   r   r   r'   r'   r)   push_mobile_msg_notification#  sD    
r   c             C   sN   ddl m} ddlm} | }| |_||_||_||_tj	 |_
|  d S )Nr   )AppNotification)CATEGORY_ATTENDANCE)r,   r   r~   r   receiver_idcategorysub_categorycontentr-   rB   notification_timesave)receiverr   r   rn   r   r   notifyr'   r'   r)   save_attendance_messageN  s    r   z*mobile.tasks.delivery_attendance_exceptionc       
      C   st  ddl m} |rl|dd }|s&d S |jjt|dd dt|dd dB t|dd dB d|d }|svd S |d	ddkrd
j|d	d|d|dd}	|	d|	 t
|jd||	 |dddkrdj|dd|d|dd}	|	d|	 t
|jd||	 |dddkrpdj|dd|d|dd}	|	d|	 t
|jd||	 nd S d S )Nr   )ri   emp_code)ro   mobileemailT)rq   rr   Z
late_timesz2You got {count} times late during {start} to {end}z%Y-%m-%d)countstartendZ
AttendanceG   Zearly_eave_timesz9You got {count} times early leave during {start} to {end}H   Zabsent_timesz4You got {count} times absent during {start} to {end}I   )r,   ri   r`   r0   r1   r   rQ   r=   strftimeZdelivery_messager   r   )
rA   r   r   rY   r$   rr   ri   ro   r   rn   r'   r'   r)   delivery_attendance_exceptionZ  s<    "r   c             C   s^   t dd }|dkr d| gi}n$t|}|d }||  d|i}t|}t d| d S )NZmobile_notice)ZnullNmessages)r   r`   jsonloadsra   dumpsr;   )r   Zcache_messagesZdictsZload_messagesr   r'   r'   r)   
save2cache}  s    


r   z)mobile.tasks.prepare_mobile_notificationsc       )   	   C   s<  ddl m} ddlm}	 ddlm}
m}m}m}m	}m
}m}m}m} ddlm} ddlm}m} ddlm} d}y
| }W n tk
r   Y nX |r|n| }|j}|r8|jjj}|r|n|}|rt|| r|j}q|j}nd}i }d}|
||||||d	}t|} |||fkr$|}!|j}"nd
|  ||}d}"|dkrtt!|" ||j#||j$|j%||||d}n|dkr|" ||j&|j%||||d}n~|dkrd|j%|||||j'd
|j(d}nN|dkr|j|j)d}n4|dkr d|j*||j+||j,|j-||||d}t./|}#yd|#t0j01 |j|| |jd}$|r|j|$d< ||$d< |	j2j3|j|jd}%|%r|%j4f |$ n|	f |$5  n8|j6r|j6p|j7|$d< ||$d< |!|$d< |	f |$5  W n& tk
r   dd l8}&|&9  Y n<X |j:}'|'|"d}(t;j<r0t=>||( t?>||( nt@|( d S )Nr   )get_user_model)r   )	CATEGORY_LEAVECATEGORY_OVERTIMECATEGORY_MANUALCATEGORY_SCHEDULECATEGORY_TRAININGCATEGORY_ANNOUNCEMENTSUB_CATEGORY_PUBLICSUB_CATEGORY_PRIVATECATEGORY_REIMBURSEMENT)ALL_AUDIT_STATUS)datetime2stamponline_employee)threadlocals )leaveovertime	manuallogchangescheduletrainingannouncementreimbursementz{0}zNew approval message.)r   r   r   )r   r   r   remark
apply_timeapprove_statusapprove_describe)r   )r   rg   r   r   r   r   )r   )r   r   r   r   r   previous_timeintervalZcurrently_timeinterval)r   )subjectr   )r   )r   r   rY   r$   Zamountr   r   r   )Zread_statusr   r   r   r   sourcesendersystem_sender)r   r   r   )rm   rn   )AZdjango.contrib.authr   r,   r   r~   r   r   r   r   r   r   r   r   r   Zmysite.att.models_choicesr   r   r   r   Zmysite.baser   rS   Zget_current_userr3   rM   r   rZ   ro   r   r6   r   r=   r`   rT   Zget_sub_categoryZ
start_timeZend_timeZapply_reasonrg   r   Ztimeintervalr   Z
rmb_remarkZrmb_start_dateZrmb_end_dateZ
rmb_amountr   r   r-   rB   r0   r1   r5   r   r   r   re   rf   r   r   ZACTIVE_CELERYr   Zdelayr   r   ))ZtasksZ	exceptionZ
model_nameZapproverZcommit_timeZapproval_statusZ	applicantZnode_approverr   Z
app_noticer   r   r   r   r   r   r   r   r   r   r   r   r   Z	push_userZsys_userZapprover_deptrr   Z
sys_senderZsystem_userZcontent_dictr   ZAPPNOTICE_CATEGORYZSTATUS_DESCRIBEr   rn   Zapp_contextZnotice_dictZ
tmp_noticere   rm   Z	data_dictr'   r'   r)   prepare_mobile_notifications  s    ,













r   zmobile.tasks.otp_sms_sendc             C   s(   ddl m} d|}td||d d S )Nr   )send_smszEOne Time Password is {0} to register your company in Intelligent Timer   )r   tobody)Z(mysite.personnel.send_tripartite_messager   r=   r   )rA   Zmobile_numberotpr   rn   r'   r'   r)   otp_sms_send  s    
r         zmobile.tasks.send_otp_email)r   Zmax_retriesZdefault_retry_delayr   c             C   s>   t j}d}dj|d}|d }d|i}t|||g|d d d S )Nz*Account Verification From Intelligent Timez
                Dear User,<br>
                    One Time Password is {otp} to register your company in Intelligent Time
            )r   Zdynamic_contentZbodyContent)rr   )r   ZNOTIFICATION_TEMPLATE_IDr=   r   )rA   r   r   Zall_template_idr   r   Ztemplate_idcontextr'   r'   r)   send_otp_email  s    r   )F)F)NNN).Z
__future__r   r   r   r   r-   rc   r   Zdjango.db.modelsr   Zdjango.confr   Zcelery.taskr   Zcelery.schedulesr   mysiter	   r   r
   Zmysite.core.zkcmdprocZmysite.base.utilsr   r   r   r   r<   r@   rA   rJ   rN   rW   r]   r_   r9   rR   rd   rh   r   r   r   r   r   r   r   r   r'   r'   r'   r)   <module>   sD   .+
(	"+#|
