
    ڵ1iL                         d dl Z d dlmZ d dlmZ d dlmZmZmZ d dl	m	Z	m
Z
 d dlmZ d dlmZ dd	lmZ d d
lmZmZmZmZmZmZmZ  e         G d d      Zy)    N)MongoClient)load_dotenv)DictAnyList)datetimetimezone)ObjectId)
quote_plus   )MongoService)JobseekerCVJobseekerBasicDetailsJobseekerEducationDetailsJobseekerEmploymentDetailsJobseekerCourseDetailsJobseekerProjectDetailsJobseekerCertificationDetailsc                   p   e Zd Zd ZdedefdZddededeeef   ded	edefd
Z	ddedeeef   d	edefdZ
dedeeeef      dee   fdZdedeeeef      dee   fdZdedee   dee   fdZdedeeeef      dee   fdZdedeeeef      dee   fdZddededeeef   ded	edeeef   fdZy)CVStorageServicec                 X   t               | _        | j                  j                  | _        | j                  j                  | _        | j                  j	                         sy | j                  | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _	        | j                  d   | _
        | j                  d   | _        y d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        y )Njobseekers_bulk_upload_cv&jobseeker_basic_details_bulk_upload_cv'jobseeker_course_details_bulk_upload_cv*jobseeker_education_details_bulk_upload_cv+jobseeker_employment_details_bulk_upload_cv(jobseeker_project_details_bulk_upload_cv.jobseeker_certification_details_bulk_upload_cv)r   mongo_serviceclientdbis_connectedjobseekers_cvbasic_detailscourse_detailseducation_detailsemployment_detailsproject_detailscertification_details)selfs    7/var/www/html/drjob-dev/drjob-ai/services/cv_storage.py__init__zCVStorageService.__init__   s	   )^((//$$''!!..0 77!%)D!ED!%)Q!RD"&''*S"TD%)WW-Y%ZD"&*gg.[&\D##'77+U#VD )-1a)bD&!%D!%D"&D%)D"&*D##'D )-D&    collection_namereturnc                     | j                   t        d      | j                   j                  j                  d|idddiidd      }|d   S )z+Get next auto-increment ID for a collectionzDatabase not connected_idz$incseqr   T)upsertreturn_document)r!   	Exceptioncountersfind_one_and_update)r*   r.   counters      r+   get_next_sequence_valuez(CVStorageService.get_next_sequence_value3   s\    77?455''""66O$eQZ  	 7 
 u~r-   filenameraw_textparsed_data
job_emp_id	file_pathc           	      4   | j                   t        d      ||j                         dk(  rt        d      | j                  d      }t	        ||j                  d      |j                  d      nd|j                  d      |j                  d      ndt        j                  t        j                        j                  d      ||nd||nd||nd      }|j                         }t               |d	<   ||d
<   | j                   j                  |       |S )z,Store main CV record and return jobseeker_id2Database not connected or collection not available *job_emp_id is required and cannot be emptyr   emailphonez%Y-%m-%d %H:%M:%S)idrC   mobile_numberlast_login_datecv_filenamecv_raw_textcvfile_store_pathr1   r=   )r#   r5   stripr9   r   getr   nowr	   utcstrftimedictr
   
insert_one)	r*   r:   r;   r<   r=   r>   jobseeker_idcv_data	cv_records	            r+   store_jobseeker_cvz#CVStorageService.store_jobseeker_cv@   s   %PQQ!1!1!3r!9HII334OP .9oog.F.R+//'*XZ6Aoog6N6Z+//'2`b$LL6??@ST$,$8b$,$8b+4+@ib
 LLN	#:	% #-	,%%i0r-   rR   c                    | j                   t        d      | j                  d      }|j                  d      |j                  d      nd}|r|j	                         ng }|r|d   nd}t        |      dkD  rdj                  |dd       nd}|j                  d	g       }	g }
|	rt        |	t              r|	D ]  }t        |t              r|
j                  |       %t        |t              rV|j                  d      xs% |j                  d
      xs |j                  dd      }|sp|
j                  t        |             |
j                  t        |              |j                  dg       }g }|rt        |t              r|D ]  }t        |t              r|j                  |       %t        |t              rV|j                  d      xs% |j                  d      xs |j                  d
d      }|sp|j                  t        |             |j                  t        |              t        |||||t        j                  t        j                         j#                  d      ||nddj                  |
      |
|j                  d      |j                  d      nd|j                  d      |j                  d      nd|j                  d      |j                  d      nd|j                  d      |j                  d      nd|j                  d      |j                  d      nd|      }|j                         }t%               |d<   | j                   j'                  |       |S )zStore basic detailsNr@   r   namerA   r   r    skillstitleskill	languageslanguagez%Y-%m-%d,profile_summaryrC   rD   date_of_birthnationality)rE   rR   	full_name
first_name	last_nameresume_added_dateresume_file
key_skillskey_skills_customer_   rC   rD   r`   ra   r\   r1   )r$   r5   r9   rL   splitlenjoin
isinstanceliststrappendrP   r   r   rM   r	   rN   rO   r
   rQ   )r*   rR   r<   r>   basic_idrW   
name_partsrc   rd   skills_listsafe_skillsr[   
skill_namelanguages_listsafe_languageslang	lang_name
basic_databasic_records                      r+   store_basic_detailsz$CVStorageService.store_basic_details_   s   %PQQ//0XY +6//&*A*M{v&SU%)TZZ\r
&0Z]b
03J!0CCHHZ^,	 "ooh3:k48$ 
3eS)&&u-t,!&6!2!beii6H!bEIIV]_aLbJ!#**3z?;  &&s5z2
3 %b9j>& 
5dC("))$/d+ $ 0 aDHHZ4H aDHHU\^`LaI &--c)n= #))#d)4
5 +%!&ll8<<8AA*M%.%:	xx,*BM//RcBdBpKOO,=>vx.9oog.F.R+//'*XZ.9oog.F.R+//'*XZ>Iooo>^>j+///:pt:E//-:X:d6jn$

& "(&jU%%l3r-   education_listc                    | j                   t        d      g }|D ]  }|r t        d |j                         D              r'| j	                  d      }i dt               d|d|d|j                  d	      |j                  d	      nd
dddddddddddddt        j                  t        j                        dt        j                  t        j                        d|j                  d      |j                  d      nd
d|j                  d      |j                  d      nd
d|j                  d      |j                  d      ndd|j                  d      |j                  d      ndd|j                  d      |j                  d      nd}| j                   j                  |       |j                  |        |S )zStore education detailsNr@   c              3   $   K   | ]  }|d u  
 y wN .0vs     r+   	<genexpr>z;CVStorageService.store_education_details.<locals>.<genexpr>   s     #J!AI#J   r   r1   rE   rR   institute_nameinstitutionrA   completion_yearhighest_education_idr   	degree_idspecialization_idstatusr   
is_deleted
updated_at
created_atdegreefield_of_study
start_dateend_dategrade)r&   r5   allvaluesr9   r
   rL   r   rM   r	   rN   rQ   ro   )r*   rR   r|   education_ids	educationeducation_ideducation_records          r+   store_education_detailsz(CVStorageService.store_education_details   s   !!)PQQ' 	/I#Jy7G7G7I#J J778deL xz l    !)--P]B^Bj)--">pr	 
 "4  '  Q  $Q  !  a  hll8<<8  hll8<<8  Y]]85L5X)--1^`  !Y]]ScEdEp)--0@"Avx  Y]]<=X=dimmL9jn   z9R9^IMM*5dh! " 9==3I3Uw/[_# ( ""--.>?  .7	/: r-   experience_listc                    | j                   t        d      g }|D ]  }|r t        d |j                         D              r'| j	                  d      }i dt               d|d|d|j                  d	      |j                  d	      nd
d|j                  d      |j                  d      nd
d|j                  d      |j                  d      gng dddddddddddt        j                  t        j                        dt        j                  t        j                        d|j                  d      |j                  d      ndd|j                  d      |j                  d      ndd|j                  d      |j                  d      nd}| j                   j                  |       |j                  |        |S )z#Store employment/experience detailsNr@   c              3   $   K   | ]  }|d u  
 y wr   r   r   s     r+   r   z<CVStorageService.store_employment_details.<locals>.<genexpr>   s     $L1Q$Y$Lr   r   r1   rE   rR   company_namecompanyrA   designationrolejob_descresponsibilitiesfrom_period	to_periodcurrently_workingr   r   r   r   r   r   r   r   job_description)r'   r5   r   r   r9   r
   rL   r   rM   r	   rN   rQ   ro   )r*   rR   r   employment_ids
experienceemployment_idemployment_records          r+   store_employment_detailsz)CVStorageService.store_employment_details   s   ""*PQQ) 	1J$L
8I8I8K$L!L 889fgM!xz!m! ! Z^^I=V=b
y 9hj	!
 9O9[z~~f5ac! JNNSeDfDrZ^^,>?@xz! t! T! $Q! !! a! hll8<<8! hll8<<8! jnn\>Z>fjnn\:lp! *..:T:`JNN:6fj!  "
WhHiHu:>>2C#D{!!& ##../@A!!-05	18 r-   coursesc                    | j                   t        d      g }|D ]  }|r%t        |t              r|j	                         dk(  s|+| j                  d      }i dt               d|d|d||ndd	dd
ddddg dg dddddddt        j                  t        j                        dt        j                  t        j                        dddddd}| j                   j                  |       |j                  |        |S )zCStore course details (if any courses mentioned in skills/education)Nr@   rA   r   r1   rE   rR   course_namecompletion_locationr   r   r   key_skills_idkey_skills_namerg   r   r   r   r   r   providercompletion_dateduration)r%   r5   rl   rn   rK   r9   r
   r   rM   r	   rN   rQ   ro   )r*   rR   r   
course_idscourse	course_idcourse_records          r+   store_course_detailsz%CVStorageService.store_course_details   s   &PQQ
 	)Fj5&,,.B:NSYSa445^_Ixzi  );v	
 &r "1 !"   "2 b ! a hll8<<8 hll8<<8 D  "4!" D#M( **=9i(7	): r-   projectsc                    | j                   t        d      g }|D ]  }|r t        d |j                         D              r'| j	                  d      }i dt               d|d|d|j                  d	      |j                  d	      nd
dd
d|j                  d      |j                  d      nd
d|j                  d      |j                  d      nd
dddddddddt        j                  t        j                        dt        j                  t        j                        d|j                  d      0t        |j                  d      t              r|j                  d      ng d|j                  d      |j                  d      ndd|j                  d      |j                  d      nd}| j                   j                  |       |j                  |        |S )zEStore project details (extracted from experience or separate section)Nr@   c              3   $   K   | ]  }|d u  
 y wr   r   r   s     r+   r   z9CVStorageService.store_project_details.<locals>.<genexpr>!  s     !F!t)!Fr   r   r1   rE   rR   project_titleproject_namerA   organization_nameproject_urlurlproject_descriptiondescriptionproject_start_dateproject_end_dater   r   r   r   r   r   technologiesr   r   )r(   r5   r   r   r9   r
   rL   r   rM   r	   rN   rl   rm   rQ   ro   )r*   rR   r   project_idsproject
project_idproject_records          r+   store_project_detailsz&CVStorageService.store_project_details  s5   'PQQ 	+Gc!FW^^5E!FF556`aJxzj   N@[@g^!<mo	
 $R W[[5G5Sw{{51Y[ &W[[Q^E_Ekw{{='Aqs %d #D ! a hll8<<8 hll8<<8 w{{>?Z?fkuv}  wB  wB  CQ  wR  TX  lYN ;  _a 7;;|;T;`gkk,7fj  w{{:7N7ZGKK
3`d!N&   ++N;z*5	+8 r-   certificationsc                 Z   | j                   t        d      g }|D ]  }|r t        d |j                         D              r'| j	                  d      }t               |||j                  d      |j                  d      nddd|j                  d      |j                  d      ndd	dt        j                  t        j                        t        j                  t        j                        |j                  d
      |j                  d
      nd|j                  d      |j                  d      nd|j                  d      |j                  d      nd|j                  d      |j                  d      ndd}| j                   j                  |       |j                  |        |S )zStore certification detailsNr@   c              3   $   K   | ]  }|d u  
 y wr   r   r   s     r+   r   z?CVStorageService.store_certification_details.<locals>.<genexpr>F  s     @QqDy@r   r   certification_namerA   r   issuing_organizationr   
issue_dateexpiry_datecredential_idr   )r1   rE   rR   certificate_namer   r   r   r   r   r   r   r   r   r   r   )r)   r5   r   r   r9   r
   rL   r   rM   r	   rN   rQ   ro   )r*   rR   r   certification_idscertcert_idcert_records          r+   store_certification_detailsz,CVStorageService.store_certification_details>  st   %%-PQQ" 	.D3@$++-@@223cdG  z ,FJhhOcFdFpDHH-A$Bvx')#$FJhhOeFfFr$((+A"Bxz&ll8<<8&ll8<<88<8N8Zdhh|4`d:>((=:Q:]txx6cg>Bhh>W>c/!:im*.((5/*Etxx4K$ &&11+>$$W-3	.6 ! r-   c           	         	 | j                   | j                  dddS ||j                         dk(  rdddS | j                  |||||      }| j	                  |||      }g }|j                  d      (t        |d   t              r| j                  ||d         }g }	|j                  d      (t        |d   t              r| j                  ||d         }	g }
g }|j                  d	      (t        |d	   t              r| j                  ||d	         }g }|j                  d
      (t        |d
   t              r| j                  ||d
         }d||||	|
||dd}|S # t        $ r}dt        |       }d|dcY d}~S d}~ww xY w)z-Store complete CV data across all collectionsNFz-Database not connected. Cannot store CV data.)successerrorrA   rB   r   r   r   r   T)basic_details_idr   r   r   r   r   )r   rR   stored_recordszError storing CV data: )r!   r    rK   rU   r{   rL   rl   rm   r   r   r   r   r5   rn   )r*   r:   r;   r<   r=   r>   rR   rp   r   r   r   r   r   resulte	error_msgs                   r+   store_complete_cv_dataz'CVStorageService.store_complete_cv_datab  s   A	ww$++"5$L  !Z%5%5%72%=$I   228X{T^`ijL //k9UH M{+7J{S^G_ae<f $ < <\;WbKc d  N|,8ZT`Hacg=h!%!>!>|[YeMf!g J Kz*6:kR\F]_c;d"88{S]G^_ !#/0<KXhLikoAp$($D$D\S^_oSp$q!   ,(0%2&4",#.):#F M 	1#a&:I " 	s(   E E D$E 	F'E?9F?FN)rA   )__name__
__module____qualname__r,   rn   intr9   r   r   rU   r{   r   r   r   r   r   r   r   r   r-   r+   r   r      s   .6s s 3 # DQTVYQYN hk x{   FI >G G$sCx. G]` Gjm GR$C $dSVX[S[nI] $bfgjbk $L#S #4PTUXZ]U]P^K_ #dhildm #J$ $tCy $TRUY $L## #d3PS8nAU #Z^_bZc #J"! "!TRVWZ\_W_R`Ma "!fjknfo "!HCs Cc CPTUXZ]U]P^ Clo C| C  JN  OR  TW  OW  JX Cr-   r   )ospymongor   dotenvr   typingr   r   r   r   r	   bsonr
   urllib.parser   r   r   schemas.cv_modelsr   r   r   r   r   r   r   r   r   r-   r+   <module>r      sB    	   " " '  # '   N Nr-   