
    ^h<                         d Z ddlmZ ddlZddlZddlZddlmZmZ d Z	d Z
d Zd Zd	 Zdd
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddlZd Zd Zd Zy)u   
Dieses Modul bietet Zugriffsfunktionen für Benutzerdaten in der Datenbank.

Hier sind die Zugriffe wo die Applikation benötigt um die Daten anzuzeigen und zu bearbeiten. 
    )mysqlN)datetimedatec                     d}t         j                  j                         5 }|j                  || f       |j	                         }|cd d d        S # 1 sw Y   y xY w)Nzselect first_name, last_name, logins.passwd from users left join logins on logins.user_id = users.id left join users_contact on users_contact.user_id = users.id where users_contact.company_email = %sr   
connectioncursorexecutefetchone)emailLOGIN_QUERYr	   results       /var/www/html/crm/models.pyget_login_userr      sR     \K				 	 	" f{E8,"  s   %AAc                      d} t         j                  j                         5 }|j                  |        |j                  D cg c]  }|d   	 }}|j                         }||fcd d d        S c c}w # 1 sw Y   y xY w)Nzselect company.id , company.name, company_industry.name as industry, prefix, phone, email, address, postal_code, location, country from company left join company_industry on company.industry = company_industry.id r   r   r   r	   r
   descriptionfetchallTABLE_DATA_QUERYr	   desccolumn_namesrowss        r   get_company_view_datar      s}     o				 	 	" "f'(,2,>,>?DQ?? T!" " @" "    A1A,A1,A11A:c                      d} t         j                  j                         5 }|j                  |        |j                  D cg c]  }|d   	 }}|j                         }||fcd d d        S c c}w # 1 sw Y   y xY w)Na  SELECT customer_interactions.id, customer_interactions.date, customer_interactions.follow_up, company.name as company_name, company_contact_person.name as contact_person,communication_method.name as communication_method, customer_interactions.note  FROM `customer_interactions` left join communication_method on communication_method.id = customer_interactions.communicated_over LEFT JOIN company on company.id = customer_interactions.company LEFT JOIN company_contact_person on company_contact_person.id = customer_interactions.company_user;r   r   r   s        r   #get_customer_interactions_view_datar       s}     w				 	 	" "f'(,2,>,>?DQ?? T!" " @" "r   c                    t         j                  j                         5 }|j                  d| f       |j                  D cg c]  }|d   	 }}|j                         }|D cg c]2  }t        t        |            D ci c]  }||   ||   ||   nd c}4 }}}|cd d d        S c c}w c c}w c c}}w # 1 sw Y   y xY w)NzSELECT `id`, `date`, `follow_up`, `communicated_over`, `company`, `company_user`, `note` FROM `customer_interactions` WHERE id = %sr    r   r   r	   r
   r   r   rangelen)row_idr	   r   company_column_namescompany_rowsrow_dataicustomer_interactionss           r   "get_customer_interactions_for_editr)   +   s    				 	 	" %f  ]  `f  _h  	i4:4F4FGDQGG(
 )!
 affij~f  aA  B[\!!$hqk6Mx{SUU  B!
 !

 %% %G
 B!
% %sA   "B9B)B9$B3?B.B3B9)B9.B33B99Cc                    t         j                  j                         5 }|j                  d| f       |j                  D cg c]  }|d   	 }}|j                         }|D cg c]2  }t        t        |            D ci c]  }||   ||   ||   nd c}4 }}}|j                  d| f       |j                  D cg c]  }|d   	 }}|j                         }	|	D cg c]2  }t        t        |            D ci c]  }||   ||   ||   nd c}4 }
}}||
fcddd       S c c}w c c}w c c}}w c c}w c c}w c c}}w # 1 sw Y   yxY w)av  

    Retrieves column names and data based on the row ID.

    Args:
        user_id (str): The ID of the user to fetch data for.

    Returns:
        list[Dict]: A list containing a dictionary for the specific row, 
                    with column names as keys and data as values. If a data value is None,
                    it is replaced with an empty string ''.
    z{select id ,name, prefix, phone, email, address, postal_code, location, country, industry, status from company where id = %sr   Nr   ztselect id ,name, prefix, phone, job_title, email, job_title, phone from company_contact_person where company_id = %sr    )r#   r	   r   r$   r%   r&   r'   company_data#company_contact_person_column_namescompany_contact_person_rowscompany_contact_person_datas              r   get_company_data_for_editr/   9   s    
			 	 	" 9f  U  X^  W`  	a4:4F4FGDQGG(
 )
 affij~f  aA  B[\!!$hqk6Mx{SUU  B
 

 	  N  QW  PY  	ZCICUCU.V4tAw.V+.V&,oo&7# 8'
 puux  z]  v^  p_  `jk03Xa[E\hqkbdd  `'
# '

 88)9 9G
 B
 /W `'
9 9sq   "E	D)E	$D3?D.D3$E	?D9E	"E=D>EE	)E	.D33E	>EE		Ec                 (   t         j                  j                         5 }|du r|j                  d| z   dz          n|j                  d| z          |j	                         }|D cg c]  }|d   ||   d }}|cddd       S c c}w # 1 sw Y   yxY w)u   
    Vorbereitung daten für FK Tabellen für Dropdown liste

    Args:
        table_name String: Tabellen name
        description_pos int: welche Spalte steht Beschreibung

    Returns:
        List: Tabelle mit id und beschreibung
    TzSELECT * FROM z WHERE igno = 0r   idr   Nr   r   r	   r
   r   )
table_namedescription_posignorer	   
data_fetchitem
final_datas          r   get_data_from_fk_tabler:   \   s     
			 	 	" fT>NN+j8;LLMNN+j89__&
XbcPTT!WT/5JKc
c  d s   AB$B6BBBc                     t         j                  j                         5 }|j                  d| |f       |j	                         }|r|cddd       S 	 ddd       y# 1 sw Y   yxY w)u+  
    Kontrolliert ob der email oder Telefonummer schon existiert

    Args:
        email String: _description_
        phone String: _description_
        func_row_id (Boolean), optional): Row id muss keine value haben. Defaults to None.

    Returns:
        dict: Gibt dict zurück mit daten
    z2SELECT * FROM users WHERE email = %s OR phone = %sNr   )r   phoner	   datas       r   check_duplicater>   p   sb     
			 	 	" fKeUZ^\     s   (AAA$c                     t         j                  j                         5 }|j                  d|  d||gz          t         j                  j	                          ddd       y# 1 sw Y   yxY w)
    Zeile Updaten mit neue Daten

    Args:
        update_set String: Update string mit Spaltennamen und dazue den Platzhalter
        values String: Die neue Values um zu Updaten
        row_id String: Zeilen ID um die Zeile zu bestimmen
    zUPDATE company SET  WHERE id = %sNr   r   r	   r
   commit
update_setvalues
company_idr	   s       r   update_companyrH      s`     
			 	 	" "f,ZLGQ[P\H\]!" " "   9A!!A*c                     t         j                  j                         5 }|j                  d|  d||gz          t         j                  j	                          ddd       y# 1 sw Y   yxY w)r@   z!UPDATE customer_interactions SET rA   NrB   rD   s       r   update_customer_interactionsrK      sa     
			 	 	" "f::,nUV\_i^jVjk!" " "rI   c           
         t         j                  j                         5 }d}| j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      f}|j	                  ||       t         j                  j                          |j                  cd	d	d	       S # 1 sw Y   y	xY w)
3  
    Fügt eine neue Firma in die company-Tabelle ein und gibt die neue ID zurück.

    Args:
        company_data (dict): Dictionary mit den Schlüsseln:
            'name', 'email', 'prefix', 'phone', 'address', 'postal_code', 'industry'

    Returns:
        int: Die ID der neu eingefügten Firma.
    z
            INSERT INTO company (name, email, prefix, phone, address, postal_code, industry)
            VALUES (%s, %s, %s, %s, %s, %s, %s)
        namer   prefixr<   addresspostal_codeindustryNr   r   r	   getr
   rC   	lastrowidr+   r	   sqlrF   s       r   insert_company_and_get_idrX      s     
			 	 	"  f
 V$W%X&W%Y']+Z(
 	sF#!!     s   B0CC"c           	         t         j                  j                         5 }d}| j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      f}|j	                  ||       t         j                  j                          |j                  cddd       S # 1 sw Y   yxY w)	rM   z
            INSERT INTO customer_interactions (`date`, `follow_up`, `communicated_over`, `company`, `company_user`, `note`)
            VALUES (%s, %s, %s, %s, %s, %s)
        r   	follow_upcommunicated_overcompanycompany_usernoteNrS   rV   s       r   'insert_customer_interactions_and_get_idr_      s     
			 	 	"  f
 V$[)01Y'^,V$
 	sF#!     s   B C		Cc                      t         j                  j                         5 } | j                  d       | j	                         }t        j                  |d   d         }|cd d d        S # 1 sw Y   y xY w)Nz>select json from credentials where name = 'google_service_acc'r   )r   r   r	   r
   r   jsonloads)r	   r=   	cred_jsons      r   get_cred_google_service_accrd      s]    				 	 	" fWX JJtAwqz*		  s   >A''A0c                      t         j                  j                         5 } | j                  d       | j                  D cg c]  }|d   	 }}|cddd       S c c}w # 1 sw Y   yxY w)C
    Erhalte Columnamen

    Returns:
        List: Columnamen
    zSselect id ,name, phone, email, address, postal_code, location, country from companyr   Nr   r   r	   r
   r   r	   r   r   s      r   get_insert_descriptionri      sb     
			 	 	" flm,2,>,>?DQ?? ?     AAAAA&c                      t         j                  j                         5 } | j                  d       | j                  D cg c]  }|d   	 }}|cddd       S c c}w # 1 sw Y   yxY w)rf   zvSELECT `id`, `date`, `follow_up`, `communicated_over`, `company`, `company_user`, `note` FROM `customer_interactions` r   Nrg   rh   s      r   ,get_insert_description_customer_interactionsrl      sh     
			 	 	" f  P  	Q,2,>,>?DQ?? ? rj   c                     t         j                  j                         5 }|j                  d|  d||gz          t         j                  j	                          ddd       y# 1 sw Y   yxY w)a  
    Updates a contact person with the provided values.

    Args:
        update_set (str): SQL SET clause, e.g., "name = %s, email = %s"
        values (list): List of values to substitute in the SQL query.
        person_id (str): The ID of the contact person to update.
    z"UPDATE company_contact_person SET rA   NrB   )rE   rF   	person_idr	   s       r   update_contact_personro      sa     
			 	 	" "f;J<~VX^bkalXlm!" " "rI   c           
          t         j                  j                         5 }|j                  d| d   | d   | d   | d   | d   f       t         j                  j	                          ddd       y# 1 sw Y   yxY w)z
    Inserts a new contact person into the database.

    Args:
        data (dict): A dictionary containing 'name', 'email', 'phone', 'job_title', and 'company_id'.
    z
            INSERT INTO company_contact_person (name, email, phone, job_title, company_id)
            VALUES (%s, %s, %s, %s, %s)
        rN   r   r<   	job_titlerG   NrB   )r=   r	   s     r   insert_contact_personrr     sz     
			 	 	" "f  6lDM4=${:KTR^M_`	b 	!" " "s   AA--A6c                     t         j                  j                         5 }d}|j                  || |f       t         j                  j	                          d d d        y # 1 sw Y   y xY w)Nz/UPDATE company SET folder_id = %s WHERE id = %srB   )
google_urlrG   r	   rW   s       r   update_google_urlru     sU    				 	 	" "f?sZ45!" " "s   5AA&c           	      z   t         j                  j                  t        j                  j
                        5 }|j                  d| f       |j                         xs i }|j                  d| f       |j                         }||D ci c]  }t        |d         | c}dcd d d        S c c}w # 1 sw Y   y xY w)Na  
            SELECT company.name as name, company_industry.name as industry , company_status.name as status, prefix, phone,
                   email, address, postal_code, location, country, note
            FROM company left join company_industry on company_industry.id = company.industry left join company_status on company_status.id = company.status
            WHERE company.id = %s
        z
            SELECT id, name, email, prefix, phone, job_title
            FROM company_contact_person
            WHERE company_id = %s
        r2   )r\   contacts)
r   r   r	   MySQLdbcursors
DictCursorr
   r   r   str)rG   r	   r\   rw   cs        r   get_company_by_id_for_logr}     s    				 	 !;!;	< 
 
 ]	 //#)r 	  ]		
 ??$ 2:;QQtWq;
%
 
( <)
 
s   AB1B,B1,B11B:c                     t         j                  j                  t        j                  j
                        5 }|j                  d| f       |j                         xs i }d|icd d d        S # 1 sw Y   y xY w)Na  
            SELECT date, follow_up, communication_method.name as communicated_over, company.name as company,company_contact_person.name as company_user, customer_interactions.note
            FROM customer_interactions left join communication_method on communication_method.id = customer_interactions.communicated_over left join company on company.id = customer_interactions.company left join company_contact_person on customer_interactions.company_user = company_contact_person.id
            WHERE customer_interactions.id = %s
        r(   )r   r   r	   rx   ry   rz   r
   r   )customer_interactions_idr	   r(   s      r   'get_customer_interactions_by_id_for_logr   0  sq    				 	 !;!;	< 
  '(		*
 !' 1 7R $%:

 
 
s   +A--A6c                 d   |j                  d      s#|j                  d      s|j                  d      sy t        j                  j                         5 }|j	                  d| ||t        j                  |d      f       t        j                  j                          d d d        y # 1 sw Y   y xY w)Nr\   rw   r(   z
            INSERT INTO audit_log (table_name, record_id, changed_by, changed_at, change_summary)
            VALUES (%s, %s, %s, NOW(), %s)
        F)ensure_ascii)rT   r   r   r	   r
   ra   dumpsrC   )r4   	record_iduserchangesr	   s        r   insert_audit_logr   A  s    ;;y!'++j*A'++VmJn				 	 	" 
"f  JJwU3	
	 	!
" 
" 
"s   A
B&&B/c                 V   t         j                  j                  t        j                  j
                        5 }|j                  d| |f       |j                         }|D ]  }	 t        j                  |d         |d<     |cd d d        S # t        $ r i |d<   Y <w xY w# 1 sw Y   y xY w)Na  
            SELECT audit_log.id as id, table_name, company.name as name, changed_by, changed_at, change_summary FROM audit_log left join company on company.id = audit_log.record_id
            WHERE table_name = %s AND record_id = %s
            ORDER BY changed_at DESC
        change_summary)r   r   r	   rx   ry   rz   r
   r   ra   rb   	Exception)tabler#   r	   logslogs        r   get_logs_from_dbr   Q  s    				 	 !;!;	<   V_		
   	+C+(,

37G3H(I$%	+    +(*$%+ s/   *B#B>BBBBBB(c                     t         j                  j                         5 }|j                  d| f       |j	                         }|D cg c]  }|d   |d   d }}|cddd       S c c}w # 1 sw Y   yxY w)u   
    Bereitet Daten für Dropdowns mit Namen + zugehörigem Firmennamen vor.

    Returns:
        List[dict]: Liste mit {'id': ..., 'description': ...}
    aZ  
            SELECT 
                company_contact_person.id, 
                company_contact_person.name 
            FROM 
                company_contact_person 
            LEFT JOIN 
                company ON company.id = company_contact_person.company_id
            WHERE
                company_contact_person.company_id = %s
        r      r1   Nr3   )r#   r	   r=   rowr9   s        r   -get_customer_contact_person_with_company_namer   b  s     
			 	 	" f 
 Y
	  GKLSVCF;L
L  M s   (A+A&A+&A++A4)F)__doc__dbr   MySQLdb.cursorsrx   ra   astr   r   r   r   r   r)   r/   r:   r>   rH   rK   rX   r_   rd   ri   rl   ro   rr   ru   r}   r   r   r   r        r   <module>r      s       
 #""%!9F(*"" : 8

"""
0
 " "r   