o
    *il                     @   s  d dl Z d dlZd dlZd dl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mZmZmZ d dlmZmZ d d	lmZ d
dlmZmZmZmZ d dlmZ e  dZdZ dZ!dede"fddZ#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"fddZ&de%de"fdd Z'de%d!ede"fd"d#Z(de%de"fd$d%Z)d@de%d'e%deee%e%f  fd(d)Z*d@de%d'e%deee%e+f  fd*d+Z,	dAde%dee% deee%ef  fd,d-Z-d.e%fd/d0Z.dBde%d1e%d'e%d2eee%  d3ee/ d4ee/ d5ee% d6ee% d7ee d8ee d9ee% deee%e+f  fd:d;Z0d@de%d'e%dee" fd<d=Z1d@d'e%dee" fd>d?Z2dS )C    N)datetimetime)ObjectId)DuplicateKeyError)HTTPExceptionstatus)load_dotenv)OptionalListDictAny)	ASCENDING
DESCENDING)str_to_objectid   )	WorkforceWorkforceBaseWorkforceUpdateWorkforceResponseList)get_next_sequence_value_int	workforcetag_nameaccountsreturnc                 C   s*  |t  }|t }|dt| ji}|stdddt|dd }d|v rAzt	|
dd  }W n< ty@   d	}Y n2w |d
r`zt	|d
d }d}W n ty_   d}Y nw zt	|}W n tyq   d	}Y nw |d| ji}||krtdd| dd|dd| jid| jigirtddd|t }	| jr|	d| ji}
|
s|	| jt d |  }|t t dd d|vrd |d< d|d< z0td||d< ||}|d|ji}t|d |d< |drt d|d  |d< |W S  ty   tdddw )N_id  zAccount not foundstatus_codedetailworkforce_countz0-10-
   + i ʚ;
account_idi  z=Workforce limit reached. Maximum allowed for this account is .$ormobile_numberemail_idz6Workforce with this contact information already existsr   )r   created_dateactive)r*   last_updatedr   photoFis_fleet_assignedw_idz/public/workforce/zDuplicate workforce entry)COLLECTION_NAMEACCOUNTS_COLLECTIONfind_oner   r%   r   strgetstripintsplit
ValueErrorendswithreplacecount_documentsr(   r)   TAG_COLLECTIONr   
insert_oner   utcnowdictupdater   inserted_idBASE_URLr   )r   dbworkforce_collectionaccounts_collectionaccountworkforce_rangemax_allowedbaseexisting_counttag_collectionexisting_tagworkforce_dataresultinserted_data rP   >/var/www/html/moveengine/app/v1/services/platform/workforce.pycreate_workforce_service   s~   


rR   skiplimitqr   created_date_fromcreated_date_tosort_by
sort_orderr%   c                 C   s@  |	t  }i }|r|dd}d|id|id|id|ig|d< |r#||d< |r)||d	< |s-|rGi }|r9t|d
|d< |rCt|d
|d< ||d< ddddddd}||d}|dkr\tnt}||||| 	|}t
|}|D ]"}t|d |d< dD ]}||v rt|| tr||  ||< qqs||}||dS )Niz$regexz$options
first_name	last_namer)   r(   r'   r   r%   z%Y-%m-%dz$gtez$lter*   )r\   r]   r(   r)   r   r*   ascr   workforce_id)r*   r,   date_of_birth	join_date)total_countr   )r0   r   strptimer4   r   r   findsortrS   rT   listr3   
isinstance	isoformatr;   )rS   rT   rU   r   rV   rW   rX   rY   r%   rC   current_userrD   queryregex_querydate_filtersort_fields
sort_fieldsort_directioncursorr   entryfieldrb   rP   rP   rQ   get_workforce_services   sP   


rs   r_   c                 C   s.   |t  dt| i}|rt|d |d< |S )Nr   id)r0   r2   r   r3   )r_   rC   r   rP   rP   rQ   read_workforce_service   s   ru   rM   c                 C   s   |t  }|dt| i}|stddddd |  D }|dt| id|i}|jdkr7tddd|dt| i}|rMt|	d|d	< |S tdd
d)Nr   r   Workforce not foundr   c                 S   s   i | ]\}}|d ur||qS NrP   ).0kvrP   rP   rQ   
<dictcomp>   s    z,update_workforce_service.<locals>.<dictcomp>z$setr   rt   z Workforce not found after update)
r0   r2   r   r   r?   items
update_onematched_countr3   pop)r_   rM   rC   rD   existingupdate_datarN   updatedrP   rP   rQ   update_workforce_service   s    

r   c                 C   sV   |t  }|dt| i}|stdddt|d |d< |d= |dt| i |S )Nr   r   rv   r   rt   )r0   r2   r   r   r3   
delete_one)r_   rC   rD   r   rP   rP   rQ   delete_workforce_service   s   r   r$   rj   c                 C   sF   | t  }d|i}|rt|dd|d< ||ddi}dd |D S )Nr%   rZ   r[   r\      c                 S   s&   g | ]}t |d  |dddqS )r   r\   r$   )rt   r\   r3   r4   )rx   frP   rP   rQ   
<listcomp>   s   & z/get_workforce_dropdown_list.<locals>.<listcomp>)r0   reescaperd   )rC   r%   rj   
collectionfiltersresultsrP   rP   rQ   get_workforce_dropdown_list   s   r   c                 C   s   | t  }| d }| d }d|i}|rt|dd|d< ||ddi}g }|D ]&}	t|	d }
|||
d	}|||
d	}||
|	dd
||d q(|S )N	schedulestasksr%   rZ   r[   r\   r   r   r%   r_   r$   )rt   r\   total_schedulestotal_tasks)r0   r   r   rd   r3   r;   appendr4   )rC   r%   rj   r   schedule_collectiontask_collectionr   workforce_cursorresponser   r_   schedule_count
task_countrP   rP   rQ   get_freeworkforce_with_counts   s2   

r   c                    s   | d }| d }| d }d|i}|rt ||d< ||}g }|D ]U}	t|	d }
t|||
d}dd |D }g }|rJt|d	d
|ii}||
|	dd|	dd|	dd|	dg t|t|dd |D dd |D d	 q"|S )Nr   r   r   r%   r   r   c                 S   s   g | ]}t |d  qS )r   )r3   rx   schrP   rP   rQ   r         zBget_workforce_details_with_tasks_and_schedules.<locals>.<listcomp>schedule_id$inr\   r$   r]   r)   
fleet_infoc              
   S   sH   g | ] }t |d  |dd|dd|d|d|ddqS )r   schedule_namer$   r   
start_timeend_timer*   )r   r   r   r   r   r*   r   r   rP   rP   rQ   r     s    	


c                 S   sh   g | ]0}t |d  |d|d|d|d|d|d|d|di |d	i d

qS )r   r   scheduled_startscheduled_endtiminglocationpriority	task_modecustomer_infor   )
task_idr   r   r   r   r   r   r   r   r   r   )rx   taskrP   rP   rQ   r     s    


)	r_   r\   r]   r)   r   r   r   r   r   )r   rd   r3   rf   r   r4   len)rC   r%   r_   rD   r   r   r   
workforcesr   r   	wf_id_strr   schedule_idsr   rP   rP   rQ   .get_workforce_details_with_tasks_and_schedules  sJ   





	
$r   shift_timingc                 C   s|   t ddt ddft ddt ddft ddt ddft ddt ddft ddt ddfd}|| t ddt ddfS )z=Return (start_time, end_time) tuple for a shift_timing label.   r            ;   )Morning	AfternoonEveningNightFlexible)r   r4   )r   	shift_maprP   rP   rQ   get_shift_period  s   r   workforce_typeskillsvehicle_requiredcan_flyaddons_namevehicle_model_idr   r   customer_idc           #      C   sN  | t  }| d }| d }d|i}|rt|dd|d< |r*t|dkr*d|i|d	< |d urC|d
u r?dd
iddd
iig|d< nd|d< |d urj|d
u r`dd
iddd
iidd
iddd
iig|d< n
ddiddig|d< |d urr||d< |d urz||d< g }g }|r| d dt|i}|r|dg pg }|dg pg }||dddddddd}g }|D ]}t|d }|r||v rq|di }t	|t
r|d}|r| d dt|iddi}|r|ddkrq|dd}|	r |	 }t|\}}|d kr
||kp||k}n||  ko|kn  }|s |dkr q|||d!}|d"|i} t	|dt
rA|di dn|dd
}!||dd#|d$d#|d	g |dd#|dd#|!|| d%	}"|d&kr|dkr|r||v r|d|" q||" q|d'kr|dkr|r||v r|d|" q||" q|S )(Nr   r   r%   rZ   r[   r\   r   r   r   Fr.   z$existsr'   Tr   fleet_info.can_flyr   r   	customersr   restricted_workforcefavourite_workforcer   )r\   r   r   r   r   r   r   r   fleet_idfleetsmaintenance_statusmaintenancer   r   r   r   r_   r$   r   )	rt   r\   r   r   r   r   r   r   r   free	scheduled)r0   r   r   r   r2   r   r4   rd   r3   rg   r?   r   r   r;   insertr   )#rC   r%   r   rj   r   r   r   r   r   r   r   r   r   r   r   r   restricted_idsfavourite_idscustomerr   result_listr   r_   r   r   fleetshift_label	task_timeshift_start	shift_endin_shiftr   r   can_fly_valuerM   rP   rP   rQ   get_workforce_list_by_type  s   
















r   c                 C   s:  | t  }| d }| d }d|i}|rt|dd|d< ||dddd}g }|D ]}	t|	d	 }
|||
d
}||
dd}||
dd}d}|dkrSd}n|rXd}n|r_|s_d}n|dkred}i d|
d|	d|d|	ddd|	ddd|	ddd|	ddd|	ddd|	ddd|	dd|	ddd|	ddd|	ddd|	ddd|	ddd|	ddd |	d d!d"|	d"|	d#|	d$|	d%|	d&|	d'd(|	d)g |	d*|	d+d|	d,d|	d-|	d.|d/d0ddd1d2| d3}|| q*|S )4Nr   r   r%   rZ   r[   r\   r   )r\   r]   r   r   r   
inprogress)r_   r   	completed   r      r   r_   user_idr$   r]   r(   r)   genderr`   
license_idnational_idemergency_contactr   addressblood_groupis_humanTr*   r,   r   cense_numberra   r.   Fr   r/   workforce_category_nameskills_namer   workforce_category_idr   busyr+   )r   r   r   r   r   )r,   r   r   ra   r.   r   r/   r   r   r   r   workforce_statusstatus_label)	r0   r   r   rd   r3   r;   r2   r4   r   )rC   r%   rj   r   r   r   r   r   r   r   r_   r   inprogress_taskcompleted_taskr   rM   rP   rP   rQ   get_workforce_list_with_status  s   
	





!r   c                 C   sH   | t  }i }|rt|dd|d< t||ddd}dd |D S )	NrZ   r[   r   r   r   )r   r   c                 S   s   g | ]}d |d  iqS )r   rP   )rx   trP   rP   rQ   r     r   z%get_tag_name_list.<locals>.<listcomp>)r<   r   r   rf   rd   )rC   rj   rK   r   tagsrP   rP   rQ   get_tag_name_list  s   r   )r$   rw   )	r$   NNNNNNNN)3jsonosr   r   r   bsonr   pymongo.errorsr   fastapir   r   dotenvr   typingr	   r
   r   r   pymongor   r   app.v1.libraries.objectr   models.platform.workforcemodelr   r   r   r   app.v1.services.sequencer   r0   r<   r1   r?   rR   r6   r3   rs   ru   r   r   r   objectr   r   r   boolr   r   r   rP   rP   rP   rQ   <module>   st    Z	
C$
$
 %
Kl 'P