o
    AhU                     @   s.  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	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(d5de$d'e$deee$e$f  fd(d)Z)d5de$d'e$deee$e*f  fd*d+Z+	d6de$dee$ deee$ef  fd,d-Z,d5de$d.e$d'e$deee$e*f  fd/d0Z-d5de$d'e$dee! fd1d2Z.d5d'e$dee! fd3d4Z/dS )7    N)datetime)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| jrtd| ji}	|	st| jt d |  }
|
t t dd d|
vrd |
d< z/td||
d< ||
}|d|ji}t|d |d< |drt 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   photo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(   r   tag_collection
insert_oner   utcnowdictupdater   inserted_idBASE_URLr   )r   dbworkforce_collectionaccounts_collectionaccountworkforce_rangemax_allowedbaseexisting_countexisting_tagworkforce_dataresultinserted_data rM   >/var/www/html/moveengine/app/v1/services/platform/workforce.pycreate_workforce_service   sz   



rO   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)   )rY   rZ   r'   r(   r   r)   ascr   workforce_id)r)   r+   date_of_birth	join_date)total_countr   )r.   r   strptimer2   r   r   findsortrP   rQ   listr1   
isinstance	isoformatr9   )rP   rQ   rR   r   rS   rT   rU   rV   r$   rA   current_userrB   queryregex_querydate_filtersort_fields
sort_fieldsort_directioncursorr   entryfieldr_   rM   rM   rN   get_workforce_servicep   sP   


rp   r\   c                 C   s.   |t  dt| i}|rt|d |d< |S )Nr   id)r.   r0   r   r1   )r\   rA   r   rM   rM   rN   read_workforce_service   s   rr   rJ   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 NrM   ).0kvrM   rM   rN   
<dictcomp>   s    z,update_workforce_service.<locals>.<dictcomp>z$setr   rq   z Workforce not found after update)
r.   r0   r   r   r=   items
update_onematched_countr1   pop)r\   rJ   rA   rB   existingupdate_datarK   updatedrM   rM   rN   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   rs   r   rq   )r.   r0   r   r   r1   
delete_one)r\   rA   rB   r   rM   rM   rN   delete_workforce_service   s   r   r#   rg   c                 C   sF   | t  }d|i}|rt|dd|d< ||ddi}dd |D S )Nr$   rW   rX   rY      c                 S   s&   g | ]}t |d  |dddqS )r   rY   r#   )rq   rY   r1   r2   )ru   frM   rM   rN   
<listcomp>   s   & z/get_workforce_dropdown_list.<locals>.<listcomp>)r.   reescapera   )rA   r$   rg   
collectionfiltersresultsrM   rM   rN   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$   rW   rX   rY   r   r   r$   r\   r#   rq   rY   total_schedulestotal_tasks)r.   r   r   ra   r1   r9   appendr2   )rA   r$   rg   r   schedule_collectiontask_collectionr   workforce_cursorresponser   r\   schedule_count
task_countrM   rM   rN   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   )r1   ru   schrM   rM   rN   r         zBget_workforce_details_with_tasks_and_schedules.<locals>.<listcomp>schedule_idz$inrY   r#   rZ   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   rM   rM   rN   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   )ru   taskrM   rM   rN   r     s    


)	r\   rY   rZ   r(   r   r   r   r   r   )r   ra   r1   rc   r   r2   len)rA   r$   r\   rB   r   r   r   
workforcesr   r   	wf_id_strr   schedule_idsr   rM   rM   rN   .get_workforce_details_with_tasks_and_schedules  sJ   





	
$r   workforce_typec                 C   s   | t  }| d }| d }d|i}|rt|dd|d< ||ddi}g }	|D ]=}
t|
d }|||d	}|d
|i}||
dd||d}|dkrX|dkrX|	| q(|dkre|dkre|	| q(|	S )Nr   r   r$   rW   rX   rY   r   r   r   r\   r#   r   freer   	scheduled)r.   r   r   ra   r1   r9   r2   r   )rA   r$   r   rg   r   r   r   r   r   result_listr   r\   r   r   rJ   rM   rM   rN   get_workforce_list_by_type  s8   

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$   rW   rX   rY   r   )rY   rZ   r   r   r   
inprogress)r\   r   	completed   r      r   r\   user_idr#   rZ   r'   r(   genderr]   
license_idnational_idemergency_contactshift_timingaddressblood_groupis_humanTr)   r+   r   cense_numberr^   is_fleet_assignedFskillsr-   workforce_category_nameskills_namer   workforce_category_idr   busyr*   )r   r   r   r   r   )r+   r   r   r^   r   r   r-   r   r   r   r   workforce_statusstatus_label)	r.   r   r   ra   r1   r9   r0   r2   r   )rA   r$   rg   r   r   r   r   r   r   r   r\   r   inprogress_taskcompleted_taskr   rJ   rM   rM   rN   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 )	NrW   rX   r   r   r   )r   r   c                 S   s   g | ]}d |d  iqS )r   rM   )ru   trM   rM   rN   r   O  r   z%get_tag_name_list.<locals>.<listcomp>)TAG_COLLECTIONr   r   rc   ra   )rA   rg   r:   r   tagsrM   rM   rN   get_tag_name_listG  s   r   )r#   rt   )0jsonosr   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   r.   r   r/   r=   rO   r4   r1   rp   rr   r   r   r   objectr   r   r   r   r   rM   rM   rM   rN   <module>   sp    W	
C$
$
 %
(K(P