o
    :0iv                     @   s  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
 d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lZd d
lmZmZ d dlmZ dZdZdZdZdZdede
jde fddZ!de"de
jde fddZ#de"dede
jde fddZ$de"de
jde fddZ%	 																			 		dKd!e"d"e&d#e&d$ee" d%ee" d&ee" d'ee" d(ee" d)ee" d*ee& d+ee" d,ee" d-ee& fd.d/Z'de"d!e"d)e"de
jde(f
d0d1Z)				dLd!e"d$ee" fd2d3Z*de"d4e&de
jde fd5d6Z+d7ede
jde fd8d9Z,d!e"d:e fd;d<Z-d7ede
jde fd=d>Z.d7ede
jde fd?d@Z/dAe"de
jdee  fdBdCZ0d!e"de"de
jde fdDdEZ1dAe"dFede
jdee  fdGdHZ2dAe"de
jdee  fdIdJZ3d	S )M    )datetime)ObjectId)ScheduleCreateScheduleUpdateScheduleWithTasksCreateShiftStatusCreateShiftStatusUpdate)database)Optional)	ASCENDING
DESCENDING)get_next_sequence_value_int)connected_clientsN)Pointshape)send_push_notification	schedules	workforcefleetstasksshift_statusscheduledbreturnc                 C   s>  |   }t |d< |dr8|d dt|d i}|r8|d|d|d|dt|d d	|d
< |drf|d dt|d i}|rf|d|d|d|dt|d d|d< |dr|d dt|d i}|r|dt|d d|d< td||d< |t 	|}t|j
|d< |S )Ncreated_datecustomer_id	customers_id
first_name	last_namephoneemailr   r   r    r!   r   customer_infoworkforce_idr   mobile_numberemail_id)r   r   r%   r&   r$   workforce_infofleet_idr   
fleet_name)r)   r(   
fleet_infosch_idschedule_id)dictr   utcnowgetfind_oner   strr   SCHEDULES_COLLECTION
insert_oneinserted_id)r   r   datacustomerr   fleetresult r9   >/var/www/html/moveengine/app/v1/services/platform/schedules.pycreate_schedule_service   s<   



	


	

r;   r,   c                 C   s2   |t  dt| i}|rt|d |d< |S d S )Nr   r,   )r2   r0   r   r1   r,   r   r   r9   r9   r:   get_schedule_service@   s
   r=   updatec                 C   s<   dd |   D }|t dt| id|i t| |S )Nc                 S      i | ]\}}|d ur||qS Nr9   .0kvr9   r9   r:   
<dictcomp>Q       z+update_schedule_service.<locals>.<dictcomp>r   $set)r-   itemsr2   
update_oner   r=   )r,   r>   r   updatesr9   r9   r:   update_schedule_serviceP   s   
rK   c                 C   s(   t | |}|r|t dt| i |S )Nr   )r=   r2   
delete_oner   r<   r9   r9   r:   delete_schedule_serviceU   s   
rM   
   r      
account_idskiplimitsearch_querystatusstart_date_fromstart_date_tor   r$   	trip_typer(   sort_byorder_byc                 C   s^  d| i}|r|dd|d< |r||d< |s|r1i }|r#t |d|d< |r-t |d|d< ||d	< |r7||d
< |r=||d< |
rC|
|d< |	d ur`|	dkrRddi|d< n|	dkr`ddiddig|d< ddddd	d}||d	}|dkrttnt}td t| |d ||||	|}|d 
|}g }|D ]}t|d |d< || q||dS )NrP   iz$regexz$optionsschedule_namerT   z%Y-%m-%dz$gtez$lter   r   r$   r(   r   z$ne   travel_statusrO   	   z$ordescription
start_timeend_time)r\   r`   ra   rb   r   queryqueryqueryqueryr   r   r,   )total_countr   )r   strptimer/   r   r   printfindsortrQ   rR   count_documentsr1   append)rP   rQ   rR   rS   rT   rU   rV   r   r$   rW   r(   rX   rY   r   querydate_filterallowed_sort_fields
sort_fieldsort_directioncursorrd   resultsdocr9   r9   r:   list_schedules_service\   sT   "
rs   c                 C   s  |d  t| |d}|d  t||d}|r|sdS |d|d|d|d|d	|d
|d|d|d|dd
}|d  |dd}d }|r|dr|t  dt|d i}	|	r|	dt|	d|	d|	d|	d|	d|	dd}||d}
|r||
d< |t dt| id|
i |t dt|idd| ii |t d| idd |ii ||d}|r||d< |t	 d| id|i |d!}|rt
|d"d#|d$ d| id% dS td&| d' dS )(Nr   r   rP   r   Fr   r   r%   r&   genderemergency_contactaddressblood_groupis_humanphoto)
r   r   r%   r&   ru   rv   rw   rx   ry   rz   workforce_vehicleT)r$   rT   
vehicle_idr   r)   registration_numbercolorvehicle_image	fuel_typevehicle_type)r)   r|   r}   r~   r   r   r   )r$   r'   r*   rG   r,   r$   	fcm_tokenzNew Schedule Assignedu'   You’ve been assigned a new schedule: r\   )tokentitlebodyr5   u   ⚠️ Workforce z has no FCM token registered.)r0   r   r/   FLEETS_COLLECTIONr1   r2   rI   WORKFORCE_COLLECTIONupdate_manyTASKS_COLLECTIONr   rf   )r,   rP   r$   r   r   r   r'   r{   r*   r7   update_fieldstask_update_fieldsr   r9   r9   r:   assign_schedule_service   s~   






r   c                 C   sd   d| i}|r|dd|d< |d  |dddd}g }|D ]}|t|d	 |d d
 q|S )NrP   rZ   r[   r\   r   rO   )r   r\   2   r   )r,   r\   )rg   rR   rj   r1   )rP   rS   r   rk   rp   rq   rr   r9   r9   r:   search_schedules_select_serviceQ  s   

r   r^   c                 C   s<   |t  dt| iddt|ii}|jdkrd S t| |S )Nr   rG   r^   r   )r2   rI   r   intmatched_countr=   )r,   r^   r   r8   r9   r9   r:   update_travel_status_servicef  s   


r   payloadc                 C   s^  dt  d }ddlm} t| j|| j| j| j	g d}|
||}| jr*| jndddddd d	d
ddddd d	g}g }|D ]V}|d | j|j|j|j|j|j|jt  d	}	t|dd r|d dt|ji}
|
r|
d|
d|
d|
dt|
d d|	d< |t |	}|t|j q@|t dt|d idd|ii ||d< |S )Nmovex_%Y%m%d_%H%M%SrO   r   )rP   r\   r`   ra   rb   task_idszDefault Pickup LocationzDefault Pickup Coordinatespickup)locationlocation_coordsdrop_location_coordstypesequencetimingzDefault Drop Locationdropoffr]   r,   )	r,   rP   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   rG   r   )r   r.   strftime r   r   rP   r`   ra   rb   r;   
task_stopsr   r   r   r   r   r   getattrr0   r   r   r/   r1   r   r3   rj   r4   r2   rI   )r   r   r\   schedule_serviceschedule_datar   
stops_datar   stopstop_docr6   r8   r9   r9   r:   &create_schedule_with_tasks_service_bkp  sp   	


r   coordsc                 C   s  |sddiS t |d |d }t| d d|i}|s ddiS |D ]Z}|d}|d}|r2|s3q"| d	 t||d
}|sBq"|d}	|	rP|	ddkrQq"|	d d }
t|
}||r||dkrrdd|dd d  S |dkr|ddi  S q"ddiS )z
    Check if given coordinates fall inside any geofence polygon
    and whether that area is 'allowed' or 'forbidden' based on geofence_rule_mapping.
    allowedTlnglatgeofence_rule_mappingrP   geofence_idtrigger_events	geofencesrt   locr   Polygoncoordinatesr   	forbiddenFz.Coordinates fall inside a forbidden geofence: nameUnknown)r   message)r   listrg   r/   r0   r   r   contains)r   rP   r   pointmappingsmappingr   trigger_eventgeofencer   polygon_coordspolygonr9   r9   r:   check_geofence_permissionsN  s>   




r   c                 C   s^  ddl m} dt d }t| j|| j| j| j	g | j
d}|||}| jp*g }g }g }|D ]}	|d | j| j
|	j|	jrD|	j nd |	j|	jrO|	j nd |	jt|	j|	jt |	jra|	jng d}
|
d r~t|| j|
d }|d	 s~td
|d d|
d rt|| j|
d }|d	 std
|d d|	jr|d dt|	ji}|r|d|d|d|dt|d d|
d< |t |
}| t|j! | |	j|	jr|	j nd |	j|	jr|	j nd |	jt|	j|	j|	jr|	jng d q1|t" #dt|d id||| j
| j$| j%di ||d< ||d< | j
|d< | j$|d< | j%|d< |S )NrO   r   r   r   )rP   r\   r`   ra   rb   r   addons_namer,   )r,   rP   r   r   r   drop_locationr   r   r   r   r   skillsr   r   i  r   )status_codedetailr   r   r   r   r   r    r!   r"   r#   )r   r   r   r   r   r   r   r   rG   )r   r   r   vehicle_model_idpriority_typer   r   r   r   r   )&r   r   r   r.   r   r   rP   r`   ra   rb   r   r;   r   r   r   r-   r   r   r   r   r   r   r   r   HTTPExceptionr   r0   r   r/   r1   r   r3   rj   r4   r2   rI   r   r   )r   r   r   r\   r   r   r   r   r   r   r   
validationr6   r8   r9   r9   r:   "create_schedule_with_tasks_service  s   	


	



r   c                 C   sj   |   }t |d< t |d< |t |}t|j|d< |d dt| j	id| j
t di |S )Nr   updated_dateidr   r   rG   )r   r   )r-   r   r.   SHIFT_STATUS_COLLECTIONr3   r1   r4   rI   r   r$   r   )r   r   r5   r8   r9   r9   r:   create_shift_status_service  s   r   shift_status_idc                 C   s2   |t  dt| i}|sd S t|d |d< |S )Nr   r   )r   r0   r   r1   )r   r   r8   r9   r9   r:   get_shift_status_service  s
   r   c                 C   sV   | |d}|t  |dd}g }|D ]}t|d |d< || qt||dS )N)rP   r,   r   r   r   )rd   shift_statuses)r   rg   rh   r1   rj   len)rP   r,   r   rk   rp   rq   rr   r9   r9   r:   list_shift_status_service  s   
r   update_datac                 C   sv   dd |   D }t |d< |t dt| id|i}|jdkr&d S |t dt| i}t	|d |d< |S )Nc                 S   r?   r@   r9   rA   r9   r9   r:   rE     rF   z/update_shift_status_service.<locals>.<dictcomp>r   r   rG   r   r   )
r-   rH   r   r.   r   rI   r   r   r0   r1   )r   r   r   rJ   r8   updatedr9   r9   r:   update_shift_status_service  s   

r   c                 C   s>   |t  dt| i}|sd S |t  dt| i | ddS )Nr   z!Shift status deleted successfully)r   r   )r   r0   r   rL   )r   r   itemr9   r9   r:   delete_shift_status_service!  s
   
r   )r   rN   NNNNNNNNr   rO   N)NN)4r   bsonr    app.v1.models.platform.schedulesr   r   r   r   r   app.dbr	   typingr
   pymongor   r   app.v1.services.sequencer   app.utils.connectionsr   asyncioshapely.geometryr   r   app.utils.notificationsr   r2   r   r   r   r   MongoDBr-   r;   r1   r=   rK   rM   r   rs   boolr   r   r   r   r   r   r   r   r   r   r   r9   r9   r9   r:   <module>   s    +		

  e
@ )9f  