B
    bo                 @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZmZmZmZmZ G dd deZdd	 ZdS )
    N)gettext_lazy)ladonize)MESSAGE_CODESUCCESS_CODESYSTEM_EXCEPTIONDATA_EXCEPTIONpaging)request_validdatetime2stampstamp2datetimeinterface_responseonline_employee_new
user_photoc               @   s&  e Zd ZdZeeeeeeeeddd Z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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e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ddd ZdS )BioTimeAppOutDoorManagementu   
    【Leave】
    )Zrtypec          
   C   s   ddl m} ddlm} yht|}|jjj}	|jj	|	d
d}
| }|r`|
j	||d|	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 dS )u  
        Get customers
        @param search_item:     search condition(company_name), return all data when this field is None
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            success
                {"code":1,"error":"","describe":"","message":"","data":[{}]}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )Q)ClientDetails)companyid)company_name__icontainsc             S   sF   g | ]>}|j |j|j|j|j|j|j|j|j|j	d t
|j dqS )z/files/)r   customer_namecust_idcontact_person
contact_nolatitude	longitudepunch_radiusaddressbranchlogo)r   company_name	client_idr   mobiler   r   punch_location_radiusr   r   strr   ).0obj r&   FG:\easytimepro\master/mysite/mobile\services\app_outdoor_management.py
<listcomp>+   s   z9BioTimeAppOutDoorManagement.customers.<locals>.<listcomp> 
successfulN)django.db.modelsr   %mysite.att.models.model_clientdetailsr   r   
departmentr   r   objectsfilterorder_bystripr   r   jsondumps	Exception	traceback	print_excr   r   )selfsearch_itemsourcedevice_tokenlanguagetokenr   r   emp
company_id	customerschoiceser5   r&   r&   r'   r?      s     
z%BioTimeAppOutDoorManagement.customersc          
   C   s   ddl m} ddlm} yt|}|jjj}	|jj	|	d
d}
| }|r|
j	||d|	d}
|
dkrdddd	g}ttt|dd
S 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 customers
        @param search_item:     search condition(company_name), return all data when this field is None
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            success
                {"code":1,"error":"","describe":"","message":"","data":[{}]}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )r   )r   )r   r   )r   Nr)   )r   r   r   r*   c             S   s   g | ]}|j |j|jd qS ))r   r   r   )r   r   r    )r$   r%   r&   r&   r'   r(   Q   s    z=BioTimeAppOutDoorManagement.customers_new.<locals>.<listcomp>)r+   r   r,   r   r   r-   r   r   r.   r/   r0   r1   r   r   r2   r3   r4   r5   r6   r   r   )r7   r8   r9   r:   r;   r<   r   r   r=   r>   r?   r@   rA   r5   r&   r&   r'   customers_new5   s$    
z)BioTimeAppOutDoorManagement.customers_newc          
   C   s   ddl m} ddlm} yt|}|jjj}|jj	|d
d}	dd |	D }
xX|
D ]P}t|d }x4|D ],}|jj	|d	 d
}dd |D }||d< qlW ||d< qTW 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 schedule_planner
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            success
                {"code":1,"error":"","describe":"","message":"","data":[{}]}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )OutdoorSchedulePlanner)r   )r   r   c             S   s   g | ]}|j |j|jd qS ))r   plannerplanner_details)r   schedule_nameschedule_details)r$   r%   r&   r&   r'   r(   n   s   z@BioTimeAppOutDoorManagement.schedule_planner.<locals>.<listcomp>rE   r    )r   c             S   sF   g | ]>}|j |j|j|j|j|j|j|j|j|j	d t
|j dqS )z/files/)r   r   r   r   r   r   r   r   r   r   r   )r   r   r    r   r!   r   r   r"   r   r   r#   r   )r$   r%   r&   r&   r'   r(   u   s   client_detailsr)   r*   N).mysite.att.models.model_outdoorscheduleplannerrC   r,   r   r   r-   r   r   r.   r/   r0   r2   loadsr   r   r3   r4   r5   r6   r   r   )r7   r9   r:   r;   r<   rC   r   r=   r>   rD   r@   datarE   data1clientsclients_detailsrA   r5   r&   r&   r'   schedule_plannerX   s*    


z,BioTimeAppOutDoorManagement.schedule_plannerc          
   C   sJ  ddl m} ddlm} ddlm} yt|}	|	jjj	}
|j
jd|
dd}| }|rz|j||d||d	B |
d
}n|j
jd|
d}dd |D }xX|D ]P}t|d }x4|D ],}|j
j|d d}dd |D }||d< qW ||d< qW ttt|ddS  tk
rD } z ddl}|  ttdd|tS d}~X Y nX dS )u  
        Get schedule_employee
        @param search_item
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            success
                {"code":1,"error":"","describe":"","message":"","data":[{}]}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )OutdoorEmployeeSchedule)r   )r      )Z#employee__enable_outdoor_managementr   r   )Zemployee__first_name__icontains)Zemployee__emp_code__icontains)r   c             S   sT   g | ]L}|j t|jt|j|j|jj|jj|jj	|jj
|jd t|jj d
qS )z/files/)
r   
start_dateend_dateemployee_idemployee_nameemp_coderF   rG   assigned_byphoto)r   r#   rR   rS   rT   employee
first_namerV   rO   rF   rG   rW   rX   )r$   r%   r&   r&   r'   r(      s   zABioTimeAppOutDoorManagement.schedule_employee.<locals>.<listcomp>rG   r    )r   c             S   sF   g | ]>}|j |j|j|j|j|j|j|j|j|j	d t
|j dqS )z/files/)r   r   r   r   r   r   r   r   r   r   r   )r   r   r    r   r!   r   r   r"   r   r   r#   r   )r$   r%   r&   r&   r'   r(      s   rH   r)   r*   N)*mysite.att.models.model_outdoorempschedulerP   r,   r   r+   r   r   r-   r   r   r.   r/   r0   r1   r2   rJ   r   r   r3   r4   r5   r6   r   r   )r7   r8   r9   r:   r;   r<   rP   r   r   r=   r>   schEmployeer@   rK   rE   rL   rM   rN   rA   r5   r&   r&   r'   schedule_employee   s<    



z-BioTimeAppOutDoorManagement.schedule_employeec          
   C   s   ddl m} ddlm} t|}y|jj|jd}dd |D }	xX|	D ]P}
t	|
d }x4|D ],}|jj|d d	}d
d |D }||d< q^W ||
d< qFW 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 my_schedule
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
        success
            {"code":1,"error":"","describe":"","message":"","data":[{}]}
        fail
            {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )rP   )r   )rT   c             S   sT   g | ]L}|j t|jt|j|j|jj|jj|jj	|jj
|jd t|jj d
qS )z/files/)
r   rR   rS   rT   rU   rV   rF   rG   rW   rX   )r   r#   rR   rS   rT   rY   rZ   rV   rO   rF   rG   rW   rX   )r$   r%   r&   r&   r'   r(      s   z;BioTimeAppOutDoorManagement.my_schedule.<locals>.<listcomp>rG   r    )r   c             S   s:   g | ]2}|j |j|j|j|j|j|j|j|j|j	d 
qS ))
r   r   r   r   r   r   r   r   r   r   )
r   r   r    r   r!   r   r   r"   r   r   )r$   r%   r&   r&   r'   r(      s   rH   r)   r*   N)r[   rP   r,   r   r   r.   r/   r   r2   rJ   r   r   r3   r4   r5   r6   r   r   )r7   r9   r:   r;   r<   rP   r   r=   r\   r@   rK   rE   rL   rM   rN   rA   r5   r&   r&   r'   my_schedule   s(    

z'BioTimeAppOutDoorManagement.my_schedulec       /      C   s  ddl }ddlm} ddl}ddlm} ddlm} ddlm	} t
|}|j}||}t|tg krz|d d d }nd	|d
 }|jd}|r|r|
sd}td}dtd}ttd|||S n,dtd}dtd}ttdd||S y|jj||d}W n |jk
r(   d}Y nX |dkr>yddlm	} | }||_||_|	|_||_|dkr||_|
|_||_||_||_||_ ||_n*||_!|
|_"||_#||_$||_%||_ ||_|&  ddtdi} tt'|(| ddS  t)k
r8 }! z,t*  ddl+}"|",  ttdd|!d|!S d}!~!X Y nX nx|D ]}#t-|#d }$|$rFx|$D ]~}#|#d}%|%|krf|#}&|&d }'|&d }(|&d })||)kr||(ks||'k rd}td}td}ttd|||S |r|jj||d}*|jj|*j.j/|d}+t0|j1|j2f|
|f},|j3d }-|,|-krVd}td}td}ttd|||S |dkr|jj4|||||d}.|.r~n$d}td}td}ttd|||S yddlm	} | }||_||_||_5|	|_|r|+|_6||_|dkr||_|
|_||_||_||_||_ ||_n*||_!|
|_"||_#||_$||_%||_ ||_|&  ddtdi} tt'|(| ddS  t)k
r }! z&ddl+}"|",  ttdd|!d|!S d}!~!X Y nX n.d}td}td j||d!}ttd|||S qfW qFW dS )"u  
        Apply employee punch status
        @param date
        @param punch_type
        @param punch_time
        @param capture
        @param schedule_type
        @param schedule_id
        @param client_id
        @param latitude
        @param longitude
        @param summary:
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            success
                {"code": 1, "error": "", "describe": "", "message": "", "data":{"message":"Pop-up message"}}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   N)r   )rP   )rC   )OutdoorTrackZmAddressLines0,ZFormattedAddressLinesrG   r)   Zlongitude_or_latitude_missingz{0}Zapp_clockIn_gps_requiredZapp_clockIn_upload_failed)r   r>   messagezRequest already processingr*   r    ZinclockZoutclockdatesZ&app_outdoor_clockIn_invalid_punch_timei  Zinvalid_punched_locationrQ   )rT   r    schedule_typedater>   z$please_select_punch_type_as_check-inZ&app_outdoor_clockIn_invalid_punch_datez/{date}_you_dont_have_{company}_schedule_planner)re   r   )7datetimemysite.att.modelsr   r2   r[   rP   rI   rC   Z$mysite.att.models.model_outdoortrackr_   r   r>   rJ   typejoinr.   Zvalues_list_formatr   r   getZDoesNotExistrY   rd   client_namere   checkincheckin_latitudecheckin_longitudeZcheckin_addresscheckin_capturesummarycheckoutcheckout_latitudecheckout_longitudeZcheckout_addresscheckout_captureZsaver   r3   r4   printr5   r6   evalrO   r   distancer   r   r"   r/   clientschedule)/r7   re   Z
punch_typer   Z
punch_timeZcapturerd   schedule_idr    rm   r   r   rr   r9   r:   r;   r<   rf   r   r2   rP   rC   r_   r=   r>   Zfetch_addressrD   errorZdescriberb   rH   r%   rK   rA   r5   ZeachZdatasZc_idZtimingZin_timeZout_timerc   ZscheduleEmp_detailsZschedulePlanner_detailsZpunched_radiusZactual_radiusZoutDoorTrackr&   r&   r'   apply   s   



(








&z!BioTimeAppOutDoorManagement.applyc	          
   C   s   ddl m}	 ddlm}
 yt|}|jjj}|dkrJ|	jj	||||d}n|	jj	|j||||d}y"dd |D }t
tt|d	d
S    dd |D }t
tt|d	d
S W n> tk
r } z ddl}|  t
td	d	|tS d}~X Y nX dS )u  
                outdoor_schedule_report
                @param start_date
                @param end_date
                @param schedule_type
                @param employee_id
                @param source:          data source(1: IOS， 2：Android)
                @param device_token:    Token for push message
                @param language:
                @param token:
                @rtype:
                success
                    {"code":1,"error":"","describe":"","message":"","data":[{}]}
                fail
                    {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
                r   )r_   )Employeez-1)rT   rd   	date__gte	date__lte)rT   rd   r   r   r   c             S   sd   g | ]\}|j |jj|j|j|j|jt|jt|j	|j
|jt|j|j|j|j|jj|jjd qS ))emp_idemp_namer    r|   image_in	image_outre   zcheckin-timezcheckin-latitudezcheckin-longitudezcheckout-timezcheckout-latitudezcheckout-longituderr   rm   rF   )rT   rY   rZ   r    r|   rq   rv   r#   re   rn   ro   rp   rs   rt   ru   rr   rz   r   r{   rF   )r$   r%   r&   r&   r'   r(     s   zGBioTimeAppOutDoorManagement.outdoor_schedule_report.<locals>.<listcomp>r)   r*   c             S   s\   g | ]T}|j |jj|j|j|j|jt|jt|j	|j
|jt|j|j|j|j|jd qS ))r   r   r    r|   r   r   re   zcheckin-timezcheckin-latitudezcheckin-longitudezcheckout-timezcheckout-latitudezcheckout-longituderr   rm   )rT   rY   rZ   r    r|   rq   rv   r#   re   rn   ro   rp   rs   rt   ru   rr   rm   )r$   r%   r&   r&   r'   r(     s   N)rg   r_   mysite.personnel.modelsr   r   r-   r   r   r.   r/   r   r   r2   r3   r4   r5   r6   r   r   )r7   rR   rS   rd   rT   r9   r:   r;   r<   r_   r   r=   r>   Zoutdoor_detailsr@   rA   r5   r&   r&   r'   outdoor_schedule_report  s.    

z3BioTimeAppOutDoorManagement.outdoor_schedule_reportc          
   C   s   t |}|jjj}ddlm} ddlm} y>|jj	||jd d|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 dS )u  
            outdoor_schedule_report
            @param source:          data source(1: IOS， 2：Android)
            @param device_token:    Token for push message
            @param language:
            @param token:
            @rtype:
            success
                {"code":1,"error":"","describe":"","message":"","data":[{}]}
                fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )r   )r   )r   rQ   )Zenable_outdoor_managementr>   c             S   s   g | ]}|j |j|jd qS ))r   r   rV   )r   rZ   rV   )r$   r%   r&   r&   r'   r(     s    zIBioTimeAppOutDoorManagement.outdoor_schedule_employee.<locals>.<listcomp>r)   r*   N)r   r-   r   r   r   r   r+   r   r.   r/   r   r   r2   r3   r4   r5   r6   r   r   )r7   r9   r:   r;   r<   r=   r>   r   r   Zoutdoor_employeesr@   rA   r5   r&   r&   r'   outdoor_schedule_employee  s    
z5BioTimeAppOutDoorManagement.outdoor_schedule_employeeN)__name__
__module____qualname____doc__r	   r   r#   intr?   rB   rO   r]   r^   floatr~   r   r   r&   r&   r&   r'   r      s$   #"*6+4 .$:r   c             C   s   | \}}|\}}d}t || }t || }t |d t |d  t t |t t | t |d  t |d   }	dt t |	t d|	  }
||
 }|S )Ni     rQ   )mathZradiansZsinZcosZatan2Zsqrt)originZdestinationZlat1Zlon1Zlat2Zlon2ZradiusZdlatZdlonacdr&   r&   r'   ry     s    > ry   )r   r2   Zdjango.utils.translationr   rj   Zmysite.ladon.ladonizerr   Zmysite.mobile.utilsr   r   r   r   r   r	   r
   r   r   r   r   objectr   ry   r&   r&   r&   r'   <module>   s       e