B
    âªcÈ,  ã               @   s    d dl Z d dlmZ d dlmZmZmZmZmZ dZ	da
dadadai adadZddd„Zddd„Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    N)Údate)ÚEmployeeÚ
DepartmentÚAreaÚPositionÚResignFc             C   sð  ddl m} ddlm} ddddddddi ddd	œ}|sZ|jjd
d ¡ }|rZt |j	¡} d}d}| rì|rÀ|  
dd¡}	|  
dd¡}
|  
dd¡}|  
dd¡}|  
dd¡}|  
dd¡}|  
d¡}nL|  
dd¡}	|  
dd¡}
|  
dd¡}|  
dd¡}|  
dd¡}|  
dd¡}d}|	 ¡ dkr:ddl}|  
dd¡}| |¡}n²| ||
|||dœ¡ |	 ¡ dkr®dj|	d|d < |	 ¡ d!krÔd"di|d#< |dkrÔd$|||f |d%< d|d&< n&|	 ¡ d'krÔd(|d < dd)d*d+œ|d#< ||d  ƒ}| ||¡}|S ),z)
    make a connection for database.
    r   )Úload_backend)Ú	DbMigratezdjango.db.backends.dummyÚ TNF)ÚENGINEÚNAMEÚUSERÚPASSWORDÚHOSTÚPORTZCONN_MAX_AGEZ
AUTOCOMMITÚOPTIONSZ	TIME_ZONEZATOMIC_REQUESTSZ
db_migrate)ÚnameZmigrateZdatabaseÚuserZdatabase_nameÚpasswordZ
ip_addressÚportÚservice_typeZmigrate_database_typeZmigrate_database_userZmigrate_database_nameZmigrate_database_passwordZmigrate_database_addressZmigrate_database_portZsqliteZmigrate_sqlite_database)r   r   r   r   r   )ÚmysqlÚoracleÚ
postgresqlzdjango.db.backends.{engine})Úenginer   )r   Zthreadedr   z%s:%s/%sr   r   )Zsqlserver_adozsql_server.pyodbcé
   é   )Zuse_legacy_datetimeZconnection_timeoutZconnection_retries)Zdjango.db.utilsr   Zmysite.base.modelsr	   ÚobjectsÚfilterÚfirstÚjsonÚloadsÚvalueÚgetÚlowerÚsqlite3ZconnectÚupdateÚformatZDatabaseWrapper)ÚparamsÚtestÚis_parallel_dbr   r	   ZdbZconfÚconnÚaliasr   r   r   r   Zhostr   r   r%   Zdb_addrZbackend© r-   ú7G:\easytimepro\master/mysite/base\views\intergration.pyÚget_connection   sn    

r/   c          
   C   s~   d}d}d}zTyt | ||ƒ}| ¡ }W n6 tk
r\ } zddl}| ¡  |}W dd}~X Y nX W d|rn| ¡  |rz| ¡  |S )u…   
    æµ‹è¯•è¿žæŽ¥æ± è¿žæŽ¥æ˜¯å¦æ­£å¸¸
    return:
    res: True:æ­£å¸¸,False:ä¸æ­£å¸¸
    msg: å¦‚æžœä¸æ­£å¸¸,ä¸ºå¼‚å¸¸ä¿¡æ¯
    Nr
   r   )r/   ZcursorÚ	ExceptionÚ	tracebackÚ	print_excÚclose)r(   r)   r*   r+   ZcurÚmsgÚer1   r-   r-   r.   Ú	test_connX   s    r6   c          
   C   sÜ   ddl m}m}m} ddlm} |  dd¡}|  dd¡}d|  dd¡ d	 }|  d
d¡}|  dd¡}	||	 }
|rØy8|||d|d}|||
|dd}|j|	ddgdd |S  |k
rÎ } z|}W d d }~X Y nX | ¡ S d S )Nr   )ÚServerÚALLÚ
Connection)ÚLDAPExceptionÚserver_addressr
   r   zCN=r   ú,r   Údomain_nodeF)r   Úuse_sslÚget_infoT)r   r   Ú	auto_bindÚSUBTREEÚ*z"(objectClass=organizationalPerson))Úsearch_baseÚsearch_scopeÚ
attributesÚsearch_filter)	Úldap3r7   r8   r9   Úldap3.core.exceptionsr:   r#   ÚsearchZbind)r(   r7   r8   r9   r:   r;   r   r   r   r=   Úuser_base_dnÚserverZ	conn_bindr5   r-   r-   r.   Úad_test_connq   s$    rL   c             C   sl   ddl m} |jj| d |d d¡ ¡ }|sd|ƒ }| d |_|d pRd| d › |_| ¡  |j	S |d S )Nr   )r   )Ú	dept_codeÚ
company_idÚidr   )
Úmysite.personnel.modelsr   r   r   Zvalues_listr   rM   Ú	dept_nameÚsaverO   )rM   rQ   rN   r   ZdptZ
departmentr-   r-   r.   Úad_department_sync‡   s    
rS   c       
      C   sÀ   t jj|| d d}| ¡ r&|d }n4t ƒ }|j tjj|ddj¡ t	jj|ddj|_
| d |_|d |_|r€t|||ƒ}	ntjj|ddj}	|	|_|r¦|d |_|r´|d |_| ¡  d S )Nr   )rN   Úemp_codeT)rN   Z
is_default)r   r   r   ÚexistsZareaÚaddr   r#   rO   r   Zposition_idrT   Ú
first_namerS   r   Zdepartment_idÚ	mobile_noZemailrR   )
rT   Úemp_first_namerM   rQ   Úemail_idrX   rN   Z	check_empÚemployeeZdept_idr-   r-   r.   Úad_employee_sync”   s"    




r\   c             C   s¬   ddl m}m}m} ddlm} |  dd¡}|  dd¡}|  dd¡}d|  d	d¡ d
 }|  dd¡}	||	 }
y&|||d|d}|||
|ddd}|S  tk
r¦   dS X d S )Nr   )r7   r8   r9   )r:   Ú	ad_serverr
   Zad_server_portZuser_passwordzCN=Ú	user_namer<   r=   F)r   r>   r?   T)r   r   r@   Zcheck_names)rG   r7   r8   r9   rH   r:   r#   r0   )r]   r7   r8   r9   r:   Zserver_hostr   r   r   r=   rJ   rK   r+   r-   r-   r.   Úget_ad_connection«   s    r_   c             C   sž   ddl m}m} d|  dd¡ d }|  dd¡}|| }|  dd¡}t| ƒ}|sTd S |dd	g|ƒ}|||||ƒ}	|	 ¡  t|	d jƒ}
t|	d jƒ}|
 	|¡S )
Nr   )Ú	ObjectDefÚReaderzCN=r^   r
   r<   r=   Zpersonr   )
rG   r`   ra   r#   r_   rI   ÚsetZallowedAttributesZallowedAttributesEffectiveÚunion)r]   r`   ra   r   r=   rJ   rF   r+   ZinetorgpersonÚreaderZallowed_attributesZallowed_attributes_effectiver-   r-   r.   Úget_all_ad_attributes½   s    re   c          	   C   s@  t | ƒ}|sd S |j|  d¡ddgdd g }xº|jD ]°}t | ¡ ¡d }| | d¡¡}| |¡ | | d¡¡}| | d	¡¡}	| | d
¡¡}
| | d¡¡}| | d¡¡}yt|||	|
|||ƒ W q6 t	k
rä   w6Y q6X q6W dd„ |D ƒ}t
jj||d}t ¡ }x*|D ]"}t|||dddd}| ¡  qW d S )Nr=   rA   rB   z"(objectClass=organizationalPerson))rC   rD   rE   rF   rE   rT   rW   rM   rQ   Zemail_addressZmobile_numberc             S   s   g | ]}|d k	r|d ‘qS )Nr   r-   )Ú.0Úempr-   r-   r.   ú
<listcomp>æ   s    z'sync_ad_server_data.<locals>.<listcomp>)Zemp_code__inrN   é   r
   T)r[   Zresign_dateZreport_generation_end_dateZresign_typeÚreasonZ
disableatt)r_   rI   r#   Úentriesr    r!   Zentry_to_jsonÚappendr\   r0   r   r   Zexcluder   Ztodayr   rR   )Zad_server_settingZad_field_settingrN   r+   Zemployee_codesÚentryZ
entry_datarT   rY   rM   rQ   rZ   rX   Zdeleted_employeesZcurrent_daterg   Úobjr-   r-   r.   Úsync_ad_server_dataÐ   s6    


ro   c              C   sP   ddl m}  d}| ƒ }|dkr$d}n(|dkr2d}n|dkr@d	}n|d
krLd}|S )Nr   )Úget_curr_db_engine_namer
   Z	sqlservera«  if not exists(select id from iclock_transaction where emp_code='%(emp_code)s' and punch_time='%(punch_time)s')
        insert into iclock_transaction (emp_code, emp_id, punch_time, punch_state, verify_type, work_code, terminal_sn, terminal_id, company_id) values 
                ('%(emp_code)s','%(emp_id)s','%(punch_time)s',%(punch_state)s,%(verify_type)s,'%(work_code)s','%(terminal_sn)s',%(terminal_id)s, '%(company_id)s');r   aÀ  insert into iclock_transaction (emp_code, emp_id, punch_time, punch_state, verify_type, work_code, terminal_sn, terminal_id, company_id, source)
        select '%(emp_code)s','%(emp_id)s','%(punch_time)s',%(punch_state)s,%(verify_type)s,'%(work_code)s','%(terminal_sn)s',%(terminal_id)s, '%(company_id)s',1
        from dual where not exists (select id from iclock_transaction where emp_code='%(emp_code)s' and punch_time='%(punch_time)s')
        r   a  insert into iclock_transaction (emp_code, emp_id, punch_time, punch_state, verify_type, work_code,
        terminal_sn, terminal_id, company_id)
        select '%(emp_code)s','%(emp_id)s',to_date('%(punch_time)s', 'yyyy-mm-dd hh24:mi:ss'),%(punch_state)s,%(verify_type)s,
        '%(work_code)s','%(terminal_sn)s',%(terminal_id)s, '%(company_id)s'
        from dual where not exists (select id from iclock_transaction where emp_code = '%(emp_code)s' and 
        punch_time = to_date('%(punch_time)s', 'yyyy-mm-dd hh24:mi:ss'))
        r   a”  
            insert into iclock_transaction (emp_code, emp_id, punch_time, punch_state, verify_type, work_code, terminal_sn, terminal_id, company_id) values 
                    ('%(emp_code)s','%(emp_id)s','%(punch_time)s',%(punch_state)s,%(verify_type)s,'%(work_code)s','%(terminal_sn)s',%(terminal_id)s, '%(company_id)s')
                    ON CONFLICT (emp_code, punch_time) DO NOTHING;
            )Zmysite.sql_utilsrp   )rp   Z
insert_sqlZ	db_enginer-   r-   r.   Úget_insert_sqlñ   s    rq   )FF)NFF)r    Zdatetimer   rP   r   r   r   r   r   ZONLY_ATTZpyDBZmOperationalErrorZmInternalErrorZmProgrammingErrorZ	conn_argsZ
_dbManagerZDJANGOr/   r6   rL   rS   r\   r_   re   ro   rq   r-   r-   r-   r.   Ú<module>   s&   
G
!