
    9ZhF                        d dl Z 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 d dlmZ d dlmZ d dlmZ 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 d dlmZmZ d dlmZm Z  d dl!Z!d dl"Z"d dl#Z#d dl$Z$d dl%Z% ejL                  ejN                         d dl(m)Z* 	 d dl(m+Z+ d dl(Z(d dl-m.Z.m/Z/m0Z0m1Z1m2Z2 d Z3dgZ4d Z5d Z6de7de7de8fdZ9d Z:d Z;d'dZ<d'dZ=d Z>d  Z?d'd!Z@d" ZAd# ZBd$ ZCd% ZDd& ZEy# e,$ r dZ+Y Yw xY w)(    N)service_account)build)MediaFileUpload)	HttpError)Credentials)InstalledAppFlow)secure_filename)geocoder)region_code_for_country_code)headers_tookanPLANDAY_CLIENT_IDPLANDAY_REFRESH_TOKENALLOWED_EXTENSIONS)get_cred_google_service_accget_data_from_fk_table)datetime	timedelta)level)__version__)__version_info__)r   r   r   r   r   )ApplicationCommandHandlerContextTypesMessageHandlerfiltersc                 r   K   t        j                  |       }|j                  ||d       d{    y7 w)u   
    Senden Nachrichten an Telegramuser/Grupper

    Args:
        TOKEN String: Token für Telegram Bot
        msg String: Nachricht 
        id int: id für den Chat
    HTML)
parse_modeN)telegramBotsend_message)TOKENmsgidbots       /var/www/html/crm/standalone.pysend_msg_telegramr'   $   s1      ,,u
C


2sv

666s   -757z%https://www.googleapis.com/auth/drivec                     g }| D ])  }	 t        j                  |      }|j                  |       + |S # t        t        f$ r}t        d| d|        Y d}~Sd}~ww xY w)a0  
    Converts a list containing string representations of dictionaries into a list of actual dictionaries.
    
    Args:
    - data_list (list): List containing string representations of dictionaries.
    
    Returns:
    - list[dict]: A list of dictionaries parsed from the input list of strings.
    zError parsing item: z
Error: N)astliteral_evalappend
ValueErrorSyntaxErrorprint)	data_listconverted_listitemparsed_itemes        r&   parse_file_datar4   5   ss     N 	**40K!!+.  K( 	(is;<	s   &3AAAc                 `    d| v xr) | j                  dd      d   j                         t        v S )N.   )rsplitlowerr   )filenames    r&   allowed_filer;   K   s7    (? D??3"1%++-1CCD    old_datanew_datareturnc                     g }|D ]Q  }| j                  |      }|j                  |      }t        |      t        |      k7  s=|j                  |||d       S |S )u[  
    Vergleicht alte und neue Daten und gibt eine Liste von Änderungen zurück.

    Args:
        old_data (dict): Alte Daten aus der Datenbank.
        new_data (dict): Neue Daten aus dem Formular.

    Returns:
        list: Liste von Änderungen, z.B.
        [{"field": "email", "old": "old@example.com", "new": "new@example.com"}, ...]
    )fieldoldnew)getstrr+   )r=   r>   changeskeyold_valnew_vals         r&   compare_changesrJ   P   se     G ,,s#,,s#w<3w<'NN 	 Nr<   c                     d| d| d}| j                         j                  |dddd      j                         }|j                  dg       }|sy	|d
   d   S )aI  
    Find the Google Drive folder ID based on folder name within a specified parent folder.

    Args:
        service: Authenticated Google Drive service instance.
        folder_name (str): Name of the folder.
        parent_id (str): ID of the parent folder.

    Returns:
        str: Folder ID if found, None otherwise.
    z8mimeType='application/vnd.google-apps.folder' and name='z' and '' in parentsdrivezfiles(id, name)T)qspacesfieldsincludeItemsFromAllDrivessupportsAllDrivesfilesNr   r$   )rS   listexecuterD   )servicefolder_name	parent_idqueryresponsefolderss         r&   find_folder_idr\   i   s     G{mSZ[dZeeqrE}}##eGDUrv  JN#  O  W  W  YHll7B'G1:dr<   c                    	 | j                         j                  |dd      j                         }y# t        $ rO}t	        j
                  d|       |j                  j                  dk(  rt	        j
                  d|       Y d }~yd }~ww xY w)Nr$   T)fileIdrP   rR   zAn error occurred: %si  zFolder with ID %s not found.F)rS   rD   rU   r   loggingerrorrespstatus)rV   	folder_idfolderr`   s       r&   check_folder_existsre   ~   st    $$IdUY$Zbbd -u5::#MM8)D	s   03 	BABBc                 8   t               }	 t        j                  j                  |t              }	 t        dd|      }t        |||      }|sd
gS g }| D ]  }	|	j                  d      d   }
t        j                  |	      \  }}|sd}|
|gd}t        |	       t        |	|      }	 |j                         j!                  ||dd      j#                         }|j%                  |
|d   |d   dd        |S # t
        $ r#}t        j                  d|       dgcY d}~S d}~ww xY w# t
        $ r#}t        j                  d|       d	gcY d}~S d}~ww xY w# t
        $ r9}d|
 d| }t        j                  |       |j%                  |       Y d}~>d}~ww xY w)a  
    Uploads multiple files to Google Drive to a specified folder by folder name, within a specified parent folder.
    Automatically determines the MIME type of each file based on its extension.

    Args:
        file_paths (list of str): List of file paths.
        folder_name (str): The name of the Google Drive folder where the files will be uploaded.
        parent_id (str): ID of the parent folder where the target folder resides.

    Returns:
        list: A list of URLs or error messages for each file uploaded.
    scopes.Failed to load service account credentials: %s*Error loading service account credentials.NrM   v3credentials%Failed to build the Drive service: %s!Error building the Drive service.z!Folder not found or inaccessible./zapplication/octet-stream)nameparents)mimetypeid, webViewLinkT)body
media_bodyrP   rR   webViewLinkr$   insert)rr   urlr$   	operationzError uploading the file z: )r   r   r   from_service_account_infoSCOPES	Exceptionr_   r`   r   r\   split	mimetypes
guess_typer.   r   rS   createrU   r+   )
file_pathsrW   rX   	cred_jsonrm   r3   rV   rc   results	file_path	file_name	mime_type_file_metadatamediafiler`   error_messages                     r&   upload_files_to_google_driver      s    ,-I>%11KKf L &5;? wY?I344G   *	OOC(,	 ++I6	12I !{
 	i	I>	*==?))}Wh  }A)  B  J  J  LDNNIT-5HtTXzhpqr'*2 NY  >FJ<==>  5=qA3445@  	*7	{"UGLMMM-(NN=))	*sS   %C9 D( (AE9	D%D D% D%(	E1E	EE	F .FFc                    t               }	 t        j                  j                  |t              }	 t        dd|      }t        || |      }|t        j                  d
       g S 	 d| d}|j                         j                  |dddd      j                         }|j                  dg       }	|	D 
cg c]  }
d|
d   j                         vs|
 }}
|S # t
        $ r }t        j                  d|       Y d}~yd}~ww xY w# t
        $ r }t        j                  d|       Y d}~y	d}~ww xY wc c}
w # t
        $ r"}t        j                  d|       g cY d}~S d}~ww xY w)a  
    List all files in a specified Google Drive folder using the folder name.

    Args:
        service: Authenticated Google Drive service instance.
        folder_name (str): The name of the folder.
        parent_id (str): The ID of the parent folder (default is 'root' for the main directory).

    Returns:
        list: A list of dictionaries, each containing details about the files within the folder.
    rg   ri   Nrj   rM   rk   rl   rn   ro   z Folder not found or inaccessible'rL   zGfiles(id, name, mimeType, size, webViewLink, createdTime, modifiedTime)T)rN   rO   rP   rR   rQ   rS   DELETEDrr   zFailed to retrieve files: %s)r   r   r   r|   r}   r~   r_   r`   r   r\   rS   rT   rU   rD   upper)rW   rX   r   rm   r3   rV   rc   rY   r   rS   r   filtered_filess               r&   list_files_in_folderr      sr    ,-I<%11KKf L &3;?
 wY?I89	I;l+--/&&w  HQ  ei  EI&  J  R  R  TGR(+0Z4IT&\EWEWEY4Y$ZZ+  <FJ;<  3=qA23 [ 4a8	se   %C D 'AD5 5D0D0D5 	D!C<<D	D-D((D-0D5 5	E >EE E c                    t               }	 t        j                  j                  |t              }	 t        dd|      }d	|i}	 |j                         j                  | |d
      j                         }|S # t
        $ r }t        j                  d|       Y d }~yd }~ww xY w# t
        $ r }t        j                  d|       Y d }~yd }~ww xY w# t
        $ r }t        j                  d|       Y d }~y d }~ww xY w)Nrg   ri   rj   rM   rk   rl   rn   ro   rr   T)r^   rv   rR   zFailed to rename file: %s)r   r   r   r|   r}   r~   r_   r`   r   rS   updaterU   )file_idrr   r   rm   r3   rV   r   updated_files           r&   rename_filer      s    +-I<%11KKf L &3;?
 TNM}}--W=dh-iqqs  <FJ;<  3=qA23  115sF   %A7 B# 1C 7	B  BB #	C,CC	C8C33C8c                     g } g }t               }t        j                  D ]  }	 |j                  }t	        j
                  |      }|rqdt        |j                        z   }||vrU|j                  |       | j                  |t	        j                  |      d       |j                  d|j                  i        d}||vr'| j                  |dd       |j                  ddi       |j                  dd	i       | j                  d
        |j                  d        | |fS # t        $ r&}t        d|j                   d|        Y d }~.d }~ww xY w)N+)	dial_coderegion_codecountryzError processing country: z, z+383XKKosovoMoroccoc                 $    t        | d   dd        S )Nr   r7   )intxs    r&   <lambda>z+get_country_dialing_codes.<locals>.<lambda>5  s    #anQR.@*A r<   )rG   c                     | d   S )Nr    r   s    r&   r   z+get_country_dialing_codes.<locals>.<lambda>7  s
    Qy\ r<   )set	pycountry	countriesalpha_2phonenumbersexample_numberrE   country_codeaddr+   region_code_for_numberrr   r~   r.   sort)	country_dial_codescountry_namesseen_dial_codesr   r   r   r   r3   kosovo_dial_codes	            r&   get_country_dialing_codesr     s|   MeO && D	D"??L)88FN#n&A&A"BB	O3#''	2&--%.'3'J'J>'Z/  "((!7<<* D$ .!!)#
 	 	x
 	
 9 
  AB12},,/  	D.w||nBqcBCC	Ds   BD##	E,EEc                 J   t               }	 t        j                  j                  |t              }	 t        dd|      }t        ||      sd
| dS | d|r|gng d}	 |j                         j                  |dd      j                         }|j                  d      }|S # t
        $ r }t        j                  d|       Y d}~yd}~ww xY w# t
        $ r }t        j                  d|       Y d}~y	d}~ww xY w# t        $ r }	t        j                  d|	       Y d}	~	yd}	~	ww xY w)an  
    Creates a folder in Google Drive with the given name, within a specified parent folder.

    Args:
        folder_name (str): The name of the folder to create.
        parent_id (str): The ID of the parent folder in which to create the new folder (default is set).

    Returns:
        str: The URL of the created folder, or a message indicating an error.
    rg   ri   Nrj   rM   rk   rl   rn   ro   zParent folder with ID z not found or inaccessible.z"application/vnd.google-apps.folder)rr   mimeTypers   ru   T)rv   rP   rR   rx   z,An error occurred during folder creation: %szError creating the folder.)r   r   r   r|   r}   r~   r_   r`   r   re   rS   r   rU   rD   r   )
rW   rX   r   rm   r3   rV   r   r   
folder_urlr`   s
             r&   create_google_folderr   ;  s$    ,-I<%11KKf L &3;? w	2'	{2MNN 8"+I;M,}}%%=ARfj%kssuXXm,
5  <FJ;<  3=qA23(  ,DeL+,sG   %B! C AC9 !	C
*CC
	C6C11C69	D"DD"c                    t        dd      D ci c]  }t        |d         |d    }}t        dd      D ci c]  }t        |d         |d    }}| j                  j                         D ci c]4  \  }}|dvr+|j	                  d      s|j	                  d      s	||d	v rd n|6 }}}d
|v r|d
   |v r||d
      |d
<   d|v r|d   |v r||d      |d<   i }d}| j                  j                  d|       r| j                  j                  d|       xs d| }	| j                  j                  d|       | j                  j                  d|       | j                  j                  d|       | j                  j                  d|       | j                  j                  d|       d|t        |	      <   |dz  }| j                  j                  d|       r||dS c c}w c c}w c c}}w )Ncompany_industryr7   r$   descriptioncompany_statusrow_idr$   submitActioncontact_rS   None industryrb   contact_name_contact_id_new_contact_email_contact_phone_contact_prefix_contact_job_title_)rr   emailphoneprefix	job_titlecompanycontacts)r   rE   formitems
startswithrD   )
requestr1   industry_map
status_maprG   valcompany_fieldsr   i
contact_ids
             r&   get_company_new_data_from_formr   k  s,   E[\npqErsTCT
OT-%88sLsCYZjlmCno4#d4j/4#66oJo  **,C66z*w'	 	c\)ds2N  ^#z(Bl(R%1.2L%Mz">!nX&>*&L#-nX.F#Gx H	A
,,

]1#.
/\\%%A3&78Fd1#J
LL$$}QC%89\\%%qc&:;\\%%qc&:;ll&&'<= )),>qc*BC%
Z! 	
Q ,,

]1#.
/ " 9 tos   G(G-09G2c                 `   t        dd      D ci c]  }t        |d         |d    }}t        dd      D ci c]  }t        |d         |d    }}t        dd      D ci c]  }t        |d         |d    }}| j                  j                         D ci c]4  \  }}|dvr+|j	                  d	      s|j	                  d
      s	||dv rd n|6 }}}d|v r|d   |v r||d      |d<   d|v r|d   |v r||d      |d<   d|v r|d   |v r||d      |d<   d|iS c c}w c c}w c c}w c c}}w )Nr   r7   r$   r   communication_methodcompany_contact_person   r   r   rS   r   communicated_overcompany_usercustomer_interactions)r   rE   r   r   r   )r   r1   company_mapcommunication_over_mapcompany_contact_person_maprG   r   customer_interactions_fieldss           r&   ,get_customer_interactions_new_data_from_formr     s   DZ[dfgDhiD3tDz?D$77iKiOef|~  PA  Btc$t*otM/BB  B  BSi  kC  EF  TG  "H4#d4j/43F"F  "H  "H  **,$C66z*w'	 	c\)ds2$  $ 005QR[5\`k5k2=>Z[d>e2f$Y/::?[\o?p  uK  @K<RSo  qD  TE  =F$%8955:VWe:f  kE  ;E7QRno}R~7$^4 	 != ' j B "H$s   DD !D%9D*c                     di i}|d   j                         D ]<  \  }}| d   j                  |      }t        |      t        |      k7  s2||d|d   |<   > |S )Nr   rB   rC   r   rD   rE   )r=   r>   rF   rG   rI   rH   s         r&   $get_change_diff_customer_interactionr     sv    G
 !!89??A UW2377<w<3w<'<CG4TG+,S1U Nr<   c                    i i d}|d   j                         D ]<  \  }}| d   j                  |      }t        |      t        |      k7  s2||d|d   |<   > |d   j                         D ]x  \  }}| d   j                  |i       }|j                         D ]K  \  }}|j                  |      }t        |      t        |      k7  s/||d   vri |d   |<   ||d|d   |   |<   M z |S )Nr   r   r   r   r   )	r=   r>   rF   rG   rI   rH   cidnew_contactold_contacts	            r&   get_change_diffr     s"   G !+113 GW9%))#.w<3w<'.5g&FGIs#G %Z0668 Q[z*..sB7'--/ 	QLC!ooc*G7|s7|+gj11/1GJ',8?0P
#C(-	QQ Nr<   c                 v    | rt        |       j                         dk(  ry	 t        |       S # t        $ r Y yw xY w)u?   Konvertiert value in einen Integer, falls möglich, sonst None.noneN)rE   r9   r   r,   )values    r&   	parse_intr     s=    CJ$$&&05z s   
, 	88)!1ihoY1RD5HNY1itj_lkcdPhp3aWM8j6kt)Frandomstringr_   osgoogle.oauth2r   googleapiclient.discoveryr   googleapiclient.httpr   googleapiclient.errorsr   google.oauth2.credentialsr   google_auth_oauthlib.flowr   werkzeug.utilsr	   r   r   r
   phonenumbers.phonenumberutilr   setupr   r   r   r   modelsr   r   r   r   requestsjsonr)   r   rebasicConfigINFOr   r   TG_VERr   ImportErrortelegram.extr   r   r   r   r   r'   r}   r4   r;   dictrT   rJ   r\   re   r   r   r   r   r   r   r   r   r   r   r   r<   r&   <module>r     s      	 ) + 0 , 1 6 *   ! E ^ ^ F (   
  	   ',, ' *')  [ [7 2	2,D
d d t 2*	>B(V0,-\.,`!H42e  '&'s   #C9 9DD