o
    vq0h*                    @   s  d dl mZmZmZmZmZmZm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mZmZmZ d dl mZ d dl mZ d dlZdd	d
Zeeeje ddZde_d dlmZ d dlm Z  d dlZdej!d< dej!d< e
eZ"G dd de"j#Z$d dl	m
Z
 d dl%Z%G dd de"j#Z&G dd de"j#Z'd dlmZ G dd de"j#Z(d dlmZ G dd de"j#Z)G dd de"j#Z*G d d! d!e"j#Z+G d"d# d#e"j#Z,G d$d% d%e"j#Z-G d&d' d'e"j#Z.G d(d) d)e"j#Z/d dl0Z0e1  e"2  W d   n	1 sw   Y  d*d+ Z3ej4d,d-d.gd/d0d1 Z5e4d2d3d4 Z6d dlZd dl%Z%d d5l7m8Z8 d d6l mZmZmZmZmZm9Z9mZ d d7lmZm:Z: d d8l;m<Z< d dl	m
Z
 d d9l=m>Z> d:Z?h d;Z@d<ej!d=< e?ej!d>< ejAe?d?d@ dAdB ZBddDdEZCej4dFd-d.gd/dGdH ZDe4dIdJdK ZEej4dLd-d.gd/dMdN ZFej4dOd-d.gd/dPdQ ZGej4dRd-d.gd/dSdT ZHe4dUdVdW ZIe4dXdYdZ ZJe4d[d\d] ZKe4d^d_d` ZLe4dadbdc ZMe4dddedf ZNe4dgdhdi ZOe4djdkdl ZPddmdnZQd dlmZ ej4dod-d.gd/dpdq ZRd drl;mSZS e4dsdtdu ZTd dl mZ dvdw ZUej4dxdygd/dzd{ ZVej4d|d-gd/d}d~ ZWd dlmZ d dl mZmZmZm9Z9 ej4dd.gd/dd ZXe4ddd ZYej4dd.gd/dd ZZd dl[m\Z\ d dl[m\Z\ dZ]dZ^dZ_dZ`dZadd Zbd dl%Z%ej4dd.gd/dd Zcej4dd.gd/dd Zdd dl[m\Z\ d dleZed dlfmgZg d dlhmiZi d dljmkZk dZldZmdZndZodddZpd dlmqZq d dlm Z  d dlZd dlZd dlrmsZs d dltmuZu d dlmqZq d dlm Z  d dlZejvejwexZyejeyddZzd dlrmsZs d dltmuZu eu{esdez ddn ZQdd Z|G dd de"j#Z}e1  e"2  W d   n	1 sbw   Y  ej4dd-d.gd/dd Z~ej4dd.gd/dd Zej4dd.gd/dd Zej4dd.gd/dd Zd dlZd dl%Z%d d5l7m8Z8 d d6l mZmZmZmZmZm9Z9mZ d d7lmZm:Z: d d8l;m<Z< d dl	m
Z
 d d9l=m>Z> d:Z?h d;Z@d<ej!d=< e?ej!d>< ejAe?d?d@ ddB ZBdddEZCej4dd-d.gd/dd Zd dlZd dlmZmZ d dl mZmZmZ d d7lmZm:Z: d drl;mSZS ej4dd-gd/dd ZG dd de"j#Ze1  e"2  W d   n	1 sMw   Y  ej4dd-d.gd/ddń Zej4dd-d.gd/ddȄ Zej4dd-gd/dd˄ Zdd̈́ ZG ddτ de"j#Ze1  e"2  W d   n	1 sw   Y  ej4dd.gd/dd҄ Zej4dd-gd/ddՄ Ze4d֡dd؄ Zd dlZd dlZdejd< e  ej4dd.gd/dd݄ Zej4dd.gd/dd Zdd Ze4ddd Zd d7lmZm:Z: ej4dd-gd/dd Zd dl mZmZmZ d dlmZm:Z:mZ d dl%Z%d dlmZ d drl;mSZS ddddddddZej4dd-gd/dd Zd dl mZ ej4dd.gd/dd Zd dl mZmZ ej4dd.gd/dd Zej4dd.gd/dd Zej4d d-gd/dd Zd dl mZmZmZm9Z9 d dlmZ ej4dd.gd/dd Zej4dd-gd/dd Zd dl mZmZmZm9Z9 d dlmZ ej4d	d.gd/d
d Zd dl mZ ej4d	d-gd/dd Zej4dd.gd/dd Zd dlmZ d dlmZ d dl	m
Z
 G dd de"j#Zd dl mZm9Z9mZmZmZmZmZ ej4dd-d.gd/dd Ze4ddd Ze4ddd Zd drl;mSZS e4ddd  Zd dlmZ ej4d!d-d.gd/d"d# Zej4d$d.gd/d%d& Zej4d'd.gd/d(d) Zej4d*d-d.gd/d+d, Zej4d-d-d.gd/d.d/ Zej4d0d-d.gd/d1d2 Zej4d3d-d.gd/d4d5 Zd dl%Z%d dlZd d6l mZm9Z9mZmZmZmZ d dl[m\Z\ dZdZdZd7Ze\eeZej4d8d-d.gd/d9d: Zej4d;d-d.gd/d<d= Zej4d>d-d.gd/d?d@ Ze4dAdBdC Zej4dDd.gd/dEdF Zej4dGd.gd/dHdI ZdJdB ZBd dKl m9Z9 d d5l7m8Z8 d d9l=m>Z> d dlZdLZ?h d;Z@dMZdNZe?ej!d>< ej4dOd-d.gd/dPdQ Zd dRl mZmZmZ d drl;mSZS e4dSdTdU Zej4dVd-gd/dWdX Zej4dYd.gd/dZd[ Zej4d\dygd/d]d^ Ze4d_d`da Zd dlZejwejvexZejeƐdbdcZǐddeǛ ej!d< dej!d< G dedf dfe"j#Ze1  e"2  W d   n	1 s:w   Y  ej4dgd-d.gd/dhdi Zej4djd-gd/dkdl Zej4dmd-d.gd/dndo ZG dpdq dqe"j#Ze1  e"2  W d   n	1 sw   Y  ej4drd-d.gd/dsdt Ze1  e"2  W d   n	1 sw   Y  ej4dud-d.gd/dvdw Zej4dxd-gd/dydz ZG d{d| d|e"j#Ze1  e"2  W d   n	1 sw   Y  ej4d}d-d.gd/d~d Zej4dd-d.gd/dd Zej4dd-gd/dd Zd dlmZ d dlmZ G dd de"j#Ze1  e"2  W d   n	1 	s\w   Y  d dlmZ d dlmZ G dd de"j#ZG dd de"j#ZG dd de"j#Ze1  e"2  W d   n	1 	sw   Y  ej4dd-d.gd/dd Zej4dd-d.gd/dd Zej4dd-gd/dd Ze4ddd Zej4dd-d.gd/dd Zd d7lmZm:Z: ej4dd.gd/dd Zd dl mZmZ ej4dd.gd/dd Zd dlmZ ej4dd.gd/dd Zd dlmZ ej4dd.gd/dd Zd dlmZ e4ddd Zej4dd-d.gd/dd Zej4dd-d.gd/dd Zej4dd.gd/dd Zd d8l;m<Z< e4ddd Zd d8l;m<Z< d dlmZ e4ddd Zd dl mZmZmZmZ d d7lmZm:Z: d d8l;m<Z< ej4dd-gd/dd Ze4ddd Ze4dádĐdń Ze4dơdǐdȄ Ze4dɡdʐd˄ Zd dl mZ e4d,d͐d΄ Ze4dϡdАdф ZdҐdӄ Zej4dd-d.gd/dՐdք Ze4dסdؐdل ZG dڐdۄ de"j#Zej4dd-d.gd/dݐdބ Ze4dߡdd Ze4ddd Zeddd Ze4ddd Ze4ddd Zej4dd-gd/dd Zej4dd.gd/dd Zedkre1  e"2  W d   n	1 sw   Y  ejd?ddd dS dS (      )Flaskrender_templaterequestredirecturl_forsessionjsonifyN)
SQLAlchemydatetime)ZoneInfo)radianscossinsqrtatan2)r   send_from_directoryc              
   C   sh   d}| |d}|r||d< zt j||d}| }|W S  ty3 } zdt|iW  Y d }~S d }~ww )Nzhttp://localhost:5560/send)numbermessageimage)jsonerror)requestspostr   	Exceptionstr)r   r   	image_urlurldataresponseresulte r#   /var/www/html/site2/app.pysend_whatsapp_message   s   r%   	templates)template_foldergizli_anahtar)A4)canvaszsqlite:///izin_takip.dbSQLALCHEMY_DATABASE_URIFSQLALCHEMY_TRACK_MODIFICATIONSc                   @   s:   e Zd ZejejddZejeddddZdd Z	dS )	BolumTprimary_keyd   Funiquenullablec                 C      d| j  dS )Nz<Bolum >nameselfr#   r#   r$   __repr__9      zBolum.__repr__N)
__name__
__module____qualname__dbColumnIntegeridStringr7   r:   r#   r#   r#   r$   r-   5       r-   c                   @   s   e Zd ZejejddZejedddZejedddZ	ejedddZ
eedZeedZejeddddZejedd	d
Zejejdd
ZeedZeejZejejdd
Zdd Zdd ZdS )UserTr.   2   Fr3   r0   r1      personeldefault   c                 C   s   | j r	t| j S i S N)calisma_saatlerir   loadsr8   r#   r#   r$   get_calisma_saatleriP   s   zUser.get_calisma_saatleric                 C   s   t || _d S rM   )r   dumpsrN   )r9   saatler_dictr#   r#   r$   set_calisma_saatleriU   s   zUser.set_calisma_saatleriN)r<   r=   r>   r?   r@   rA   rB   rC   
first_name	last_namepassword
departmentphone_numberemailroleBooleanactivecalisma_gunleriTextrN   is_shift_workerrP   rS   r#   r#   r#   r$   rE   B   s    rE   c                   @   s   e Zd ZejejdddZejejedddZejej	ddZ
ejejddZejejdddZejdejd	dd
dZdd ZdS )SalaryTr/   autoincrementuser.idFrG      r3   rK   rE   salarieslazybackrefc                 C   s   d| j  d| j d| j dS )Nz<Salary  - r5   )user_idsalary
valid_fromr8   r#   r#   r$   r:   e   s   zSalary.__repr__N)r<   r=   r>   r?   r@   rA   rB   
ForeignKeyrl   Floatrm   Datern   monthly_hoursrelationshiprj   userr:   r#   r#   r#   r$   r`   \   s    r`   c                   @   s|   e Zd ZejejdddZejedddZejedddZ	ejedddZ
ejejddZejejejdZdS )	OvertimeMultiplierTra   rH   FrG      rJ   N)r<   r=   r>   r?   r@   rA   rB   rC   day
start_timeend_timerp   
multiplierDateTimer   utcnow
created_atr#   r#   r#   r$   ru   l   s    ru   c                   @   sP   e Zd ZejejddZejejddZeje	dddZ
ejejddZdS )
SpecialDayTr.   FrG   r0   N)r<   r=   r>   r?   r@   rA   rB   rq   daterC   r7   rp   rz   r#   r#   r#   r$   r~   v   s
    r~   c                   @   s"  e Zd ZejejddZejejedddZej	dej
dddd	Zejed
ddZejejddZejejeeddZejejddZejedddZejejddZejedddZejedddZejed
ddZejed
ddZejed
ddZdS )
IzinTalebiTr.   rc   FrG   rE   izin_taleplerirg   ri      Europe/IstanbulrJ   rF   BekliyorN)r<   r=   r>   r?   r@   rA   rB   ro   rl   rs   rj   rt   rC   reasonr^   reason_textr{   r   nowr   request_daterq   
start_daterx   end_datery   statusbolum_yoneticisibolum_muduru	ik_mudurur#   r#   r#   r$   r      s    r   c                   @   s   e Zd ZejejddZejejedddZejej	ddZ
ejej	ddZejejddZejejddZejejejdZejdejddd	d
ZdS )CalismaSaatleriTr.   rc   FrG   rJ   rE   
vardiyalarrg   ri   N)r<   r=   r>   r?   r@   rA   rB   ro   rl   rq   baslangic_tarihibitis_tarihiTimegiris_saaticikis_saatir{   r   r|   r}   rs   rj   rt   r#   r#   r#   r$   r      s    r   c                   @   sr   e Zd ZejejddZejeddddZejej	ddZ
ejej	ddZejej	ddZejej	ddZdS )   ModulAyarlarıTr.   rH   Fr1   rJ   N)r<   r=   r>   r?   r@   rA   rB   rC   rZ   r[   izin_modulugiris_cikis_modulubordro_moduluvardiya_modulur#   r#   r#   r$   r      s    r   c                   @   s   e Zd ZejejdddZejedddZejej	ddZ
ejedddZejedddZejejejdZdd	 Zd
S )BilgilendirmeTra   r   FrG   rL   rJ   c                 C   r4   )Nz<Bilgilendirme r5   titler8   r#   r#   r$   r:      r;   zBilgilendirme.__repr__N)r<   r=   r>   r?   r@   rA   rB   rC   r   r^   r   
image_pathdepartmentsr{   r   r|   r}   r:   r#   r#   r#   r$   r          r   c                   @   sT   e Zd ZejejddZejejedddZejejedddZ	dd Z
d	S )
UserReadMessageTr.   rc   FrG   zbilgilendirme.idc                 C   s   d| j  d| j dS )Nz<UserReadMessage user_id=z, mesaj_id=r5   rl   mesaj_idr8   r#   r#   r$   r:      s   zUserReadMessage.__repr__N)r<   r=   r>   r?   r@   rA   rB   ro   rl   r   r:   r#   r#   r#   r$   r      s
    r   c                   @   s`   e Zd ZejejddZejejedddZeje	dddZ
ejdejddd	d
ZdS )	UserPhotoTr.   rc   FrG   rL   rE   photosrg   ri   N)r<   r=   r>   r?   r@   rA   rB   ro   rl   rC   
photo_pathrs   rj   rt   r#   r#   r#   r$   r      s
    r   c                 C   s&   | rt d| ddd S dS )NNFKDASCIIignorezutf-8 )unicodedata	normalizeencodedecodelower)textr#   r#   r$   normalize_text   s   r   /GETPOST)methodsc                  C   s  t jdkrtt jd} tt jd}t jd}tj }d }|D ]}t|j| kr=t|j	|kr=|j
|kr=|} nq$|r|jtd< |jtd< t|jtrYd|jtd< n
|jr_|jnd	td< td
|j d|j	  td|j dtd   |jdkrttdS |jdkrttdS |jdkrttdS |jdkrttdS ttdS tdS tjtj d }td|dS )Nr   rT   rU   rV   rl   rZ   , rW   
Bilinmiyoru   ✅ Giriş Başarılı:  u
   🔹 Rol: z, Departman: admin
admin_homemanagermanager_homefactory_managerfactory_manager_home
hr_managerhr_manager_homepersonel_homezlogin_failed.html   
login.htmlbilgiler)r   methodr   formgetrE   queryallrT   rU   rV   rB   r   rZ   
isinstancerW   listjoinprintr   r   r   Bilgiorder_byr}   desclimit)rT   rU   rV   usersmatched_userrt   r   r#   r#   r$   login   s>   

&





r   z/logoutc                   C   s   t   ttdS )Nr   )r   clearr   r   r#   r#   r#   r$   logout  s   r   )secure_filename)r   r   r   r   r   flashr   )r   	timedelta)func)Imagestatic/uploads/   gifjpgpngjpegi   MAX_CONTENT_LENGTHUPLOAD_FOLDERTexist_okc                 C       d| v o|  ddd  tv S u!   Geçerli uzantıları kontrol et..   rsplitr   ALLOWED_EXTENSIONSfilenamer#   r#   r$   allowed_file;      r   rH   c                 C      t | }d}tj| |d kr0|dkr0|j| d|dd |d8 }tj| |d kr0|dkstdtj| d d	d
 dS u:   📌 Fotoğrafı sıkıştırarak 20KB altına düşürürU   i   
   JPEGT)formatqualityoptimizerv   u"   ✅ Fotoğraf sıkıştırıldı: .2fz KBNr   openospathgetsizesaver   r   max_size_kbimgr   r#   r#   r$   resize_image?     
"r  z/add_personc                  C   s(  dt vrdS t d} | dv rt|  dntd}tj }tjdkrtjd}tjd	}tjd
}tjd}tjd}t	d tj
d}i }	dD ]'}
tjd|
 }tjd|
 }|
|v rx|rm|nd|rr|ndd|	|
< qQtjddk}t|||||dd|t|	|d	}tj | tj   t	d|j  dtjv rtjd }|jdkrt	d nF|rt|jrt|j}d|j d| }tjtjd  |}|| t| t|j|d!}tj | tj   t	d"|  nt	d# td$d% ttd&S t d'||d(S ))Nrl      Yetkisiz erişim!  rZ   r   r   r   r   _homeindexr   rT   rU   rV   rW   rX   u"   📌 Kullanıcı oluşturuluyor...calisma_gunleri[]	Pazartesi   Salı
   Çarşamba	   PerşembeCuma	CumartesiPazargiris_saati_cikis_saati_z08:00z18:00giriscikisr_   onrI   ,)	rT   rU   rV   rW   rX   rZ   r]   rN   r_   u   ✅ Kullanıcı eklendi: profile_photor   u   ❌ HATA: Dosya seçilmedi!user__r   rl   r   u   ✅ Fotoğraf kaydedildi: u#   ❌ HATA: Geçersiz dosya formatı!u"   Yeni personel başarıyla eklendi!successpersonel_listesiadd_person.html)bolumlerback_url)!r   r   r   
Departmentr   r   r   r   r   r   getlistrE   r   r   rQ   r?   addcommitrB   filesr   r   r   r   r   appconfigr   r  r   r   r   r   )rZ   r$  r#  rT   rU   rV   rW   rX   r]   rN   gunr   r   r_   new_userfiler   photo_filename	file_path
user_photor#   r#   r$   
add_personK  sn   












r2  z/personel_listesic                  C   s.  dt vr
ttdS t d} t d} | dv rt|  dntd}| dkr,td}n| d	kr5td
}n| dkr>td}n| dkrFtd}tj tjtjtj	tj
tjtjjttjtjkdd}|tjdk }g }|D ] }|jrzd|j nd}|j|j|j	|j
|j|d}|| qotd||dS )Nrl   r   rZ   r	  r
  r  r   r   r   r   r   r   r   r   T)isouterr   r   static/uploads/person.png)rB   rT   rU   rW   rX   	foto_pathzpersonel_listesi.html)r   r$  )r   r   r   r   r?   r   rE   rB   rT   rU   rW   rX   r   r   r   rl   filterr\   r   appendr   )rZ   r$  r   	user_listrt   r5  	user_datar#   r#   r$   r!    sH   




	r!  z/add_managerc                  C      dt vst ddkrdS tj } tjdkrYtjd}tjd}tjd}tjd	}tjd
}|s9dS d	|}t
|||||dd}tj | tj   ttdS td| dS )Nrl   rZ   r   r  r   rT   rU   rV   rX   rW   u!   Lütfen en az bir bölüm seçin.  r  r   rT   rU   rV   rX   rW   rZ   r   zadd_manager.htmlr#  r   r   r%  r   r   r   r   r   r&  r   rE   r?   r'  r(  r   r   r   )r#  rT   rU   rV   rX   r   department_strnew_managerr#   r#   r$   add_manager  0   



rB  z/add_factory_managerc                  C   r:  )Nrl   rZ   r   r  r   rT   rU   rV   rX   rW   r;  r  r   r=  r   zadd_factory_manager.htmlr>  r?  )r#  rT   rU   rV   rX   r   r@  new_factory_managerr#   r#   r$   add_factory_manager  rC  rE  z/add_hr_managerc               	   C   s   dt vst ddkrdS tjdkrttjd} tjd}tjd}tjd	}tjd
}| r:|r:|r:|r:|s<dS |drGt|dkrIdS t| ||||dd}tj 	| tj 
  td|  d| d| d|  ttdS tdS )Nrl   rZ   r   r  r   rT   rU   rV   rX   rY   )    Lütfen tüm alanları doldurun!r<  +90   )u:   Telefon numarası '+90XXXXXXXXXX' formatında olmalıdır!r<  r   )rT   rU   rV   rX   rY   rZ   u    ✅ Yeni İK Müdürü Eklendi: r   z, Telefon: z	, Email: r   zadd_hr_manager.html)r   r   r   r   r   
startswithlenrE   r?   r'  r(  r   r   r   r   )rT   rU   rV   rX   rY   new_hr_managerr#   r#   r$   add_hr_manager(  s2   

 rL  z/personel_izinleric                  C   s   dt vr
ttdS t d } t d}tjj| dt	tj
tjtjtjtjtjtjtjtjtjtj }ddddd	d
}t||d	}dd |D }td||dS )Nrl   r   rZ   rl   r   r   r   r   r   )r   r   r   r   rI   c                 S   s   g | ]I}|j |jr|jd nd|jr|jdd nd|jr$|jd nd|jr/|jdd nd|j|j|j|j	|j
rC|j
dd nd|jpHddqS )%d.%m.%Yr   Nrv   r  r      Belirtilmemiş)rB   r   rx   r   ry   r   r   rT   rU   rW   r   )rB   r   strftimerx   r   ry   r   r   rT   rU   rW   splitr   .0talepr#   r#   r$   
<listcomp>v  s    z%personel_izinleri.<locals>.<listcomp>zpersonel_izinleri.html)taleplerr$  )r   r   r   r   r   r   	filter_byr   rE   add_columnsrB   r   rx   r   ry   r   r   rT   rU   rW   r   r   r   )rl   rZ   rV  role_back_urlsr$  formatted_taleplerr#   r#   r$   personel_izinleriS  s<   
r[  z/factory_manager/homec                  C   sf   dt vst ddkrttdS tjjdd } td| r!| j	nd| r'| j
nd| r/| jdS ddS )	Nrl   rZ   r   r   rZ   zfactory_manager_home.htmlFr   r   r   )r   r   r   r   r   r   rW  firstr   r   r   r   )ayarlarr#   r#   r$   r     s   r   z/hr_manager/homec                  C   sh   dt vst ddkrttdS tjjdd } | s#d}d}d}n	| j}| j	}| j
}td|||d	S )
Nrl   rZ   r   r   r\  TFzhr_manager_home.htmlr]  )r   r   r   r   r   r   rW  r^  r   r   r   r   )r_  r   r   r   r#   r#   r$   r     s    r   z/personel_homec                  C   s   dt vr
ttdS t d} tjj| d }tt dd	d}t
jtdd	 |D   }td
|r9|jnd|r?|jnd|rH|j|dS d|dS )Nrl   r   rZ   r\  r   r   r  c                 S       g | ]}t jd | d qS %r   r   like)rS  deptr#   r#   r$   rU         z!personel_home.<locals>.<listcomp>zpersonel_home.htmlF)r   r   r   okunmamis_sayi)r   r   r   r   r   r   rW  r^  setrQ  r   r6  or_countr   r   r   r   )	user_rolemodulleruser_departmentsrg  r#   r#   r$   r     s(   
r   z/manager/homec                  C   sr   dt vst ddkrttdS tjjdd } td| r!| j	nd| r'| j
nd| r-| jnd| r5| jdS ddS )	Nrl   rZ   r   r   r\  zmanager_home.htmlF)r   r   r   r   )r   r   r   r   r   r   rW  r^  r   r   r   r   r   ayarr#   r#   r$   r     s   r   z/admin/homec                  C   st   dt vst ddkrttdS tjjdd } | s/tddddd} tj 	|  tj 
  td| j| j| jd	S )
Nrl   rZ   r   r   r\  T)rZ   r   r   r   zadmin_home.htmlr]  )r   r   r   r   r   r   rW  r^  r?   r'  r(  r   r   r   r   rn  r#   r#   r$   r     s   
r   z/admin/izin_talepleric                  C   s^  dt vst ddkrttdS tj tjtjtj	tj
tjtjtjtjtjtjtjtjttjtjkttjtjktjddg  } g }| D ]Z}|jrYd|j nd}||j|jrh|jd	nd
|j	rzt|j	dkrz|j	d d nd
|j
r|j
d	nd
|jrt|jdkr|jd d nd
|j|j|j|j|j|j|d qNtd|dS )Nrl   rZ   r   r      İzin Verildi
Reddedildi/static/uploads//static/uploads/person.pngrN  r   rv   rB   r   rx   r   ry   r   r   rT   rU   rW   r   r5  izin_talepleri_goster.htmlrV  )r   r   r   r   r?   r   r   rB   r   rx   r   ry   r   r   rE   rT   rU   rW   r   r   r   r   rl   	outerjoinr6  in_r   r7  rP  rJ  r   rV  rZ  rT  r5  r#   r#   r$   r   
  s>   $$
r   z/manager/izin_talepleric                  C   sZ  dt vst ddkrttdS tj tt d } | sdS | jd}tj t	j
t	jt	jt	jt	jt	jt	jtjtjtjt	jtjttj
t	jkttj
tjktj|t	jddg }g }|D ]A}|jrpd	|j nd
}||j
|jr|jdnd|j|jr|jdnd|j|j|j|j|j|jdd |jpd|d qetd|dS )Nrl   rZ   r   r      Kullanıcı bulunamadı!  r  r   u   Yönetici Onayladırr  rs  rN  r   r   rO  rt  ru  rv  )r   r   r   r   r?   rE   rW   rQ  r   r   rB   r   rx   r   ry   r   r   rT   rU   r   r   r   r   rl   rw  r6  rx  r   r7  rP  r   rt   yetkili_bolumlerrV  rZ  rT  r5  r#   r#   r$   manager_izin_talepleri4  s\   

r  c                 C   sL   | r$z|rt | ddW S t | ddW S  ty#   |  Y S w dS )u   
    Tarih formatlarını düzenler.
    - `to_db=True` olduğunda `GG.AA.YYYY` → `YYYY-MM-DD` formatına çevirir (DB için).
    - `to_db=False` olduğunda `YYYY-MM-DD` → `GG.AA.YYYY` formatına çevirir (Ekran için).
    rN  %Y-%m-%dr   )r   strptimerP  
ValueError)	tarih_strto_dbr#   r#   r$   format_tarihm  s   r  z/talep_izinc                  C   s  dt vr
ttdS tjdkrtjd} tjd}tjd}tjd}tjd}tjd	}t d}tj t|}|sDd
S t	d|j
 d|j d|j d dd }|| } ||}t	d|   t	d|  dd }	|	|j}
t	d|
  d }d}|jdkrd }tjjdd }|D ]'}|	|j}|
|}t	d|j
 d|j d| d|
 d| 
 |r|} nq|r|}d}ntjjdd }|r|}d }nd!}n|jdkrtjjdd }|r|}d }nd!}n|jdkrd!}nd }tjjdd }|D ]&}|	|j}|
|}t	d"|j
 d|j d#| d|  |r)|} nq|r3|}d}nXt	d$ d }tjjdd }|D ]#}|	|j}|
|}t	d%|j
 d|j d|  |rf|} nqD|rp|}d}nt	d& tjjdd }|r|}d }nt	d' d!}t|||| ||||d(}tj | tj   t	d)|j
 d|j d*|  |rt	d+|j
 d|j d t|jd,d  d-|j
 d.|j
 d|j d/ |jdkrttd0S |jdkrttd1S |jdkrttd2S ttd3S td4S )5Nrl   r   r   r   rx   r   ry   r   r   rz  u   🛠 İzin talep eden: r    ()c                 S   s@   | sd S z	t | d W S  ty   td|  d Y d S w )Nr  &   ⚠️ HATA: Tarih formatı hatalı! (r  r   r  r   r  r   tarihr#   r#   r$   r    s   z talep_izin.<locals>.format_tarihu#   ✅ İşlenen Başlangıç Tarihi: u   ✅ İşlenen Bitiş Tarihi: c                 S   s"   | st  S t dd | dD S )Nc                 s   s(    | ]}|  d dddV  qdS )r   r   -N)stripreplace)rS  br#   r#   r$   	<genexpr>  s   & z6talep_izin.<locals>.normalize_bolum.<locals>.<genexpr>r  )rh  rQ  )bolumr#   r#   r$   normalize_bolum  s   z#talep_izin.<locals>.normalize_bolumu   🔍 İzin Sahibi Bölümleri: r   r   r   r\  u   🟠 Müdür Kontrol: u    | Müdür Bölümleri: u    | Personel Bölümleri: u    | Ortak Bölümler: !   Bölüm Müdürü Onayı Bekliyorr   ,   İnsan Kaynakları Müdürü Onayı Bekliyorrp  u   🔍 Yönetici Kontrol: u    | Yönetici Bölümleri: u@   ⚠️ Yönetici bulunamadı, fabrika müdürüne bakılıyor...u    🔍 Bölüm Müdürü Kontrol: uG   ⚠️ Bölüm müdürü de bulunamadı, İK müdürüne bakılıyor...u<   🚨 İK Müdürü de bulunamadı, izin otomatik onaylandı!)rl   r   r   r   rx   r   ry   r   u   📢 u*    izin talep etti! ✅ Kaydedildi. Statü: u(   📩 Onay merciine mesaj gönderiliyor: r   Merhaba r   @    adlı personel izin talebinde bulundu.
https://izindefteri.com/r   r   r   r   ztalep_izin.html)r   r   r   r   r   r   r   r?   rE   r   rT   rU   rZ   rW   r   rW  r   intersectionr^  r   r'  r(  r%   rX   r   )r   rx   r   ry   r   r   rl   izin_sahibir  r  izin_sahibi_bolumlerionay_merciir   r   bolum_mudurlerimudurmudur_bolumleriortak_bolumlerr   r   bolum_yoneticileriyoneticiyonetici_bolumleri
yeni_talepr#   r#   r$   
talep_izin  s   
"












.r  )ri  z/factory_manager/izin_talepleric                  C   s  dt vst ddkrttdS tj tt d } | sdS | jd}td| j	 d| j
 d	|  tj tjtjtjtjtjtjtjtj	tj
tjtjtjttjtjkttjtjktjd
ktdd |D   }g }|D ]A}|jrd|j nd}||j|jr|jdnd|j|jr|jdnd|j|j|j|j	|j
|jdd |jpd|d qt|std td|dS )Nrl   rZ   r   r   rz  r  u   🛠 Bölüm Müdürü: r   u   , Yetkili Bölümler: r  c                 S   r`  ra  )rE   rW   rd  rS  r  r#   r#   r$   rU  c  rf  z2factory_manager_izin_talepleri.<locals>.<listcomp>rr  rs  rN  r   r   rO  rt  u;   ⚠️ Bölüm Müdürüne düşen hiçbir izin talebi yok!ru  rv  ) r   r   r   r   r?   rE   rW   rQ  r   rT   rU   r   r   rB   r   rx   r   ry   r   r   r   r   r   r   rl   rw  r6  ri  r   r7  rP  r   r}  r#   r#   r$   factory_manager_izin_talepleriD  sb   
r  c                     s\   t d} | s	dS tj t| }|sdS ddg |jdkrdS t fdd|jd	D S )
ua    Kullanıcının İnsan Kaynakları veya Planlama bölümünde olup olmadığını kontrol eder. rl   F   İnsan KaynaklarıPlanlamar   Tc                 3   s    | ]	}|   v V  qd S rM   r  rS  depr~  r#   r$   r    s    z yetki_kontrol.<locals>.<genexpr>r  )r   r   r?   rE   rZ   anyrW   rQ  )rl   rt   r#   r  r$   yetki_kontrol  s   

r  z/izin_sil/<int:talep_id>DELETEc                 C   s`   t  stddddfS tjt| }|stddddfS tj| tj  tddd	S )
NFr  r   r   r     İzin talebi bulunamadı!r|  Tu!   İzin talebi başarıyla silindi!r   r   )r  r   r?   r   r   r   deleter(  talep_idrT  r#   r#   r$   izin_sil  s   
r  z/izin_duzenle/<int:talep_id>c                 C   s,   t  sdS tjt| }|sdS td|dS )Nu)   Bu izin talebini düzenleme yetkiniz yok!r  r  r|  zizin_duzenle.html)rT  )r  r?   r   r   r   r   r  r#   r#   r$   izin_duzenle  s   r  )r   r   r   r   z/izin_guncelle/<int:talep_id>c           	      C   s   t  sdS tjt| }|sdS tjd}tjd}tjd}tjd}tjd}tjd}d	d
 }|||_|||_||_	||_
||_||_d|_tj  tdd ttdi tjS )Nr  r  r   r   rx   ry   r   r   c                 S   s   | r
t | d S d S Nr  )r   r  r   )date_strr#   r#   r$   
parse_date  s   z!izin_guncelle.<locals>.parse_daterp  u&   İzin talebi başarıyla güncellendi!r   izin_raporlari)r  )r  r?   r   r   r   r   r   r   r   rx   ry   r   r   r   r(  r   r   r   args)	r  rT  start_date_strend_date_strrx   ry   r   r   r  r#   r#   r$   izin_guncelle  s,   



r  z/hr_manager/izin_talepleric                  C   s$  dt vst ddkrttdS tj tjtjtj	tj
tjtjtjtjtjtjtjtjttjtjkttjtjktjdk } g }| D ]A}|jrUd|j nd}||j|jrd|jdnd	|j	|j
rp|j
dnd	|j|j|j|j|j|jd
d |jpd|d qJtd|dS )Nrl   rZ   r   r   r  rr  rs  rN  r   r  r   rO  rt  ru  rv  )r   r   r   r   r?   r   r   rB   r   rx   r   ry   r   r   rE   rT   rU   rW   r   r   r   r   rl   rw  r6  r   r7  rP  rQ  r   ry  r#   r#   r$   hr_manager_izin_talepleri  sN   
r  z/izin_iptalc                  C   sd   dt vr
ttdS tjd} tj| }|sdS |jdkr0t	j 
| t	j   ttdS dS )Nrl   r   r  r  r   r[  )zBu izin talebi iptal edilemez!r  )r   r   r   r   r   r   r   r   r   r?   r  r(  )r  izin_talebir#   r#   r$   
izin_iptal  s   

r  )Client"ACcf644212580de8814867a0e3fd9b5607 283fbb7a78fa071ac4026525afc6b147zwhatsapp:+15153750115"HX42d224aec5c65ed7c3a41c564c383a1d"HX6ad1fd61cc79de6f40a4b5afb44037aac              
   C   s   | st d dS zttt}|jjtd|  ||d}t d|j  W dS  tyA } zt dt	|  W Y d}~dS d}~ww )	u5   Belirtilen numaraya Twilio şablon mesajı gönderir.u&   ❌ Hata: Geçersiz telefon numarası!Fz	whatsapp:)from_tocontent_sidcontent_variablesu9   ✅ WhatsApp mesajı başarıyla gönderildi! Mesaj SID: Tu+   ❌ WhatsApp mesajı gönderilemedi! Hata: N)
r   r  ACCOUNT_SID
AUTH_TOKENmessagescreateTWILIO_WHATSAPP_NUMARASIsidr   r   )kimetemplate_sid	variablesclientr   r"   r#   r#   r$   whatsapp_mesaj_gonderI  s$   
r  z/izin_onaylac                  C   s^  dt vr
ttdS tjd} tj t| }|sdS tj tt d }tj t|j	}|j
dvr3dS tjtjd|j dtj
dk }tjtjd|j dtj
d	k }tjjd
d }td|j d|j d|j
 d |j d|j |jr|jnd|jr|jnd|jr|jndd}g }d }	|j
dkr|j d|j |_td|j  |rd|_||jt|jf d|j d|j d|j d}	nd|_|r||jt|jf d|j d|j d|j d}	n|j
d	kr(|j d|j |_td|j  d|_|r'||jt|jf d|j d|j d|j d}	nw|j
d
kr|j d|j |_td|j  d|_t|||jj d|jj |j|j|jd}
|r|jr|
rd}d|j d|j d|j d|j d |j  d!}t!|j|||
}td"|j d#|  d|j d|j d|j d$}	tj "  |D ]\}}}|rt#|d%d  d&| d'|j d|j d( q|	r|jdkrt#|jd%d  d&|j d)|j d|j d* nt$%|	}t#|jd%d  d&|d+  d)|d,  d-|d.  d/ |j
dkrttd0S |j
d	krttd1S |j
d
kr)ttd2S ttd3S )4Nrl   r   r  r  r   r   r   r  rb  r   r   r   r\  u   🛠 Onaylayan kişi: r   r  r  r   )rI   r   r   r   u#   ✅ Bölüm Yöneticisi Onayladı: r  z{"1":"z", "2":"u   ", "3":"Bölüm Müdürü"}r  u   ", "3":"İK Müdürü"}u!   ✅ Bölüm Müdürü Onayladı: u   ✅ İK Müdürü Onayladı: rp  u   Tamamlanan İzin Talebi Formuz
            <p><b>uW   </b> adlı personelin izin talebi tamamlandı.</p>
            <p><b>İzin Tarihi:</b> rk   u)   </p>
            <p><b>İzin Sebebi:</b> u]   </p>
            <p>Bu e-posta sistem tarafından otomatik gönderilmiştir.</p>
            u5   📧 İK Müdürüne e-posta gönderildi (PDF ekli): u
   , Sonuç: z"}r   r  r   r  z, izin talebin uF    tarafından onaylandı. Süreç Tamamlandı.
https://izindefteri.com/12u     tarafından onaylandı. Şimdi 3u/    onayına gönderildi.
https://izindefteri.com/r  r  r  r   )&r   r   r   r   r   r   r?   r   rE   rl   rZ   r   r6  rW   rd  r^  rW  r   rT   rU   r   r   r   r   r7  rX   TEMPLATE_IZIN_TALEBIizin_belgesi_olusturrt   rY   r   r   r   eposta_gonderr(  r%   r   rO   )r  r  rt   r  r   r   r   imzalarmesaj_gonderileceklerpersonel_mesajipdf_dosya_yolukonuicerikeposta_sonucnumaratemplateisimjr#   r#   r$   izin_onaylac  s   
"
 
*0
"r  z/izin_reddetc                  C   s   dt vr
ttdS tjd} tj t| }|sdS tj tt d }tj t|j	}|j
dvr3dS d|_dd	d
d}||j
d}t|jdd  d| d tj   |j
dkrattdS |j
dkrlttdS |j
dkrwttdS ttdS )Nrl   r   r  r  r  r  rq  u	   Yöneticiu   Bölüm Müdürüu   İK MüdürüzBilinmeyen Yetkilir   z	Formunuz u1    tarafından reddedildi.
https://izindefteri.com/r   r  r   r  r   r  r   )r   r   r   r   r   r   r?   r   rE   rl   rZ   r   r%   rX   r(  )r  r  rt   r  role_mapreddeden_rolr#   r#   r$   izin_reddet  s8   





r  )MIMEMultipart)MIMEApplication)MIMETextsmtp.gmail.comK  zpersonelbilgimerkezi@gmail.comzxxvj mjlt ggom hrhvc           	   
   C   s  zrt  }t|d< | |d< ||d< |t|d |rLt|d}t| tj	|d}W d    n1 s6w   Y  dtj	| d|d	< || t
tt}|  |tt |t| |  |  td
|   W dS  ty } ztdt|  W Y d }~dS d }~ww )NFromToSubjecthtmlrb)Namezattachment; filename=""zContent-Dispositionu&   📧 E-posta başarıyla gönderildi: Tu   ❌ E-posta gönderme hatası: F)r  
GMAIL_USERattachr  r   r  readr   r   basenamesmtplibSMTPSMTP_SERVER	SMTP_PORTstarttlsr   GMAIL_PASSWORDsendmail	as_stringquitr   r   r   )	alicir  r  
dosya_yolumsgdosyapartserverr"   r#   r#   r$   r  @  s0   
r  )A3)TTFont)
pdfmetricsstaticzDejaVuSans.ttf
DejaVuSansc                 C   sH   t | tr
| dS ztt| ddW S  ty#   t|  Y S w )uB   Tarihi 'YYYY-MM-DD' formatından 'DD.MM.YYYY' formatına çevirir.rN  r  )r   r   rP  r  r   r  r  r#   r#   r$   r    s   

c           	      C   s  d|j  d|j d}tjd|}tj|td}|dd |	dd	d
 |	ddd|j  d|j  t
| drA| jd}nd}|	ddd|  |	dddt| j d| j  |	dddt| j d| j  | jr{| j d| j n| j}|	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) |  |S )-Nizin_belgesi_r  z.pdfr  )pagesizer     iT  iL  u   PERSONEL İZİN BELGESİ<   i  z
Ad Soyad: r   r   z%d.%m.%Y - %H:%Mr   i  zBildirim Tarihi: i  u   İznin Başlama Tarihi: rk   i  u   İznin Bitiş Tarihi: i  rF      z	Personel:   u   Bölüm Sorumlusu:i  u   Bölüm Müdürü:i  u   İnsan Kaynakları Müdürü:c                 S   s   i | ]\}}||r|nd qS )r   r#   )rS  keyvaluer#   r#   r$   
<dictcomp>      z(izin_belgesi_olustur.<locals>.<dictcomp>c                 S   sD   |r |  dd | ||| |  dd | ||d d d S d S )Nr  r        u!   Dijital ortamda onaylanmıştır.)setFont
drawString)cxyimzar#   r#   r$   yazdir_imza  s   z)izin_belgesi_olustur.<locals>.yazdir_imzai  rI   r   r   r   r   )rT   rU   r   r   r   r*   Canvasr  r  r  hasattrr   rP  r  r   rx   r   ry   r   r   itemsr   r   )	r  r  r  	dosya_adir  r   bildirim_tarihimazeretr$  r#   r#   r$   r    s4   
""	r  c                   @   s2   e Zd ZejejddZejeddddZdS )r%  Tr.   r0   Fr1   N)	r<   r=   r>   r?   r@   rA   rB   rC   r7   r#   r#   r#   r$   r%    s    r%  z/admin/bolumlerc                  C   s   dt vst ddkrdS tjdkr7tjd } | r7tjj| d	 }|s7t| d}t
j | t
j   tj }td|d	S )
Nrl   rZ   r   r  r   	bolum_adir6   zadmin_bolumler.htmlr>  )r   r   r   r   r   r  r%  r   rW  r^  r?   r'  r(  r   r   )r+  mevcut_bolum
yeni_bolumr#  r#   r#   r$   r#    s   



r#  z/admin/bolum_sil/<int:bolum_id>c                 C   sL   dt vst ddkrdS tj| }|r tj | tj   ttdS )Nrl   rZ   r   r  r#  )	r   r   r%  r   r?   r  r(  r   r   )bolum_idr  r#   r#   r$   	bolum_sil  s   
r/  z#/admin/bolum_duzenle/<int:bolum_id>c                 C   sp   dt vst ddkrdS tj| }|r2tjd }|r2tjj|d }|s2||_	t
j   ttdS )Nrl   rZ   r   r  r+  r6   r#  )r   r   r%  r   r   r   r  rW  r^  r7   r?   r(  r   r   )r.  r  yeni_adr,  r#   r#   r$   bolum_duzenle   s   
r1  z/delete_personel/<int:user_id>c                 C   sp   dt vst ddvrdS tj| }|sdS tjj|jd }|r'd|_nt	j 
| t	j   ttdS )	Nrl   rZ   r	  r  )   Personel bulunamadı!r|  rM  r   r!  )r   r   rE   r   r   rW  rB   r^  r\   r?   r  r(  r   r   )rl   rt   izin_var_mir#   r#   r$   delete_personel  s   
r4  c                 C   r   r   r   r   r#   r#   r$   r   I  r   c                 C   r   r   r   r  r#   r#   r$   r  M  r  z/edit_person/<int:user_id>c                 C   s  dt vrdS t d}|dv rt| dntd}tj| }tj }|jr.|j	dng }t
jj|jd }|r?|jnd }|rLtd	d
| dnd }tjdkrWtjd|_tjd|_tjd|_tjd|_|jdv rtjd}	|	rd|	nd |_ntjdrtjdnd |_tjd}
i }dD ]#}tjd| }tjd| }||
v r|r|r||d||< qd|
|_t||_tjddk|_dtjv rGtjd }|jrG|jdkrGt |j}d|j d| }t!j"t#j$d |}|%| |r(|jr(t!j"t#j$d |j}t!j"&|r(t!'| |r/||_nt
|j|d }t(j )| |}td	d
| d}t(j *  t+d!d" t,td#S t-d$|||d%||||jd&	S )'Nrl   r  rZ   r	  r
  r  r  rM  r  zuploads/profile_pictures/r   r   rT   rU   rV   rX   r  zdepartments[]rW   r  r  r  r  r  r_   r  r  r   r  r  r   r  u    Personel bilgileri güncellendi!r   r!  r"  T)rt   r#  r$  	edit_modemevcut_bolumler   mevcut_foto_adımevcut_foto_urlr_   ).r   r   r   rE   r   
get_or_404r%  r   rW   rQ  r   rW  rB   r^  r   r   r   r   rT   rU   rV   rX   rZ   r&  r   r]   r   rQ   rN   r_   r)  r   r   r   r   r*  r+  r   existsremover?   r'  r(  r   r   r   )rl   rZ   r$  rt   r#  r6  r1  r7  r8  secilen_bolumlerr]   rN   r,  r   r   r.  r   new_photo_filenamenew_photo_patheski_foto_pathr#   r#   r$   edit_personZ  sz   








r@  )defaultdictCounter)r   r   r   z/izin_raporlaric            "      C   sJ  dt vrdS t d} t d}dd }dd }tjd}tjd	}|r*||nd }|r2||nd }td
| d|  tjt}| dv rIn5| dkr|tj|}	|	rz|	j	rzd|	j	v r^n dd |	j	
dD }
|tdd |
D  tjdk}ndS dS |r|r|tj|ktj|k}n|r|tj|k}n|r|tj|k}ng }td|dS |tjtjtjtjtjtjtjtjtjtj	
 }tdt| d dd |D }dd |D }t|}dd |dD }tt}|D ]K}|d  d|d  }|d r|d 
dd   nd!}|d  d|d"  }|d	  d|d#  }z|||}|||f  |7  < W q   Y qt |! d$d% d&d'd d }d(d |D }tt"}|D ]+}|d  d|d  }|d rx|d 
dd   nd!}||f}|| #| q[t }|D ]}|d r||d   d)7  < q|d}tt"}|D ]}|d r||d  #| qzt$%t$j&}t$%t$j&d* W n t$j'y   td+ Y nw t }|D ]'}|d rzt()|d d,}|*d-} ||   d)7  < W q   Y qq| }!d.t+ v rt$%t$j&| td||||||!|d/S )0Nrl   r  rZ   c                 S   sh   | sd S zd| v rt | d W S d| v rt | d W S W d S  ty3   td|  d Y d S w )Nr  r  r   rN  r  r  r  r  r#   r#   r$   r    s   z$izin_raporlari.<locals>.format_tarihc                 S   s   t dd}t dd}zt| d}t|d}W n
 ty"   Y dS w d}|}| | krx| dk rit| tj | }t| tj | }	t	||}
t||	}|
|k ri||
 }||
 d 7 }|t dd	7 }| | ks/|S )
N   hours   %d.%m.%Y %H:%Mr   rv     r   days)r   r   r  r  r   weekdaycombinemintimemaxtotal_seconds)	start_strend_strmesai_baslangicmesai_bitisstartendtoplam_saatcurrentgun_baslangic	gun_bitisactual_start
actual_endfarkr#   r#   r$   hesapla_izin_saati  s,   



z*izin_raporlari.<locals>.hesapla_izin_saatir   r   u!   📅 Gelen filtreleme tarihleri: rk   )r   r   r   r   r  c                 S   s   g | ]}|  qS r#   r  r  r#   r#   r$   rU        z"izin_raporlari.<locals>.<listcomp>r  c                 S   r`  ra  )rE   rW   iliker  r#   r#   r$   rU    rf  rI   zizin_raporlari.htmlrv  u   📊 Sonuçlar: u    kayıt bulundu.c                 S   s   g | ]K}|j |jr|jd ndt|jtr|jn
|jr"|jdnd|jr,|jd ndt|jtr6|jn
|jr?|jdnd|j|j	|j
|j|jd
qS )rN  r   %H:%Mr  )
rB   r   rx   r   ry   r   r   rT   rU   rW   )rB   r   rP  r   rx   r   r   ry   r   r   rT   rU   rW   rR  r#   r#   r$   rU    s    &&c                 S   sD   g | ]}|d   d|d  |d r|d  dd  ndfqS )rT   r   rU   rW   r  r   r  )rQ  r  )rS  tr#   r#   r$   rU  0  s    6c                 S   s   g | ]\\}}}|||fqS r#   r#   )rS  adsoyadre  rj  r#   r#   r$   rU  5  r  r   rT   r   rU   rW   r   r  rx   ry   c                 S      | d S )Nr   r#   r!  r#   r#   r$   <lambda>D      z izin_raporlari.<locals>.<lambda>Tr  reversec                 S   s$   g | ]\\}}}||t |d fqS )r   )round)rS  adr  saatr#   r#   r$   rU  E     $ r   ztr_TR.UTF-8uV   ⚠️ Uyarı: 'tr_TR.UTF-8' sistemde mevcut değil. Gün adları İngilizce olabilir.rN  %Aonceki_locale)rV  ilk_10ilk_10_saatizin_detaylarien_cok_gunleren_cok_gun_adlariizin_detaylari_by_day),r   r   r   r  r   r   r   r   rE   rW   rQ  r6  ri  rZ   r   r   r   rX  rB   rx   ry   r   r   rT   rU   r   rJ  rB  most_commonrA  floatr  sortedr'  r   r7  locale	setlocaleLC_TIMEErrorr   r  rP  locals)"rk  rl   r  r^  start_date_rawend_date_rawr   r   r   rt   rm  rV  rZ  ad_soyad_listesiizin_sayimirp  
saat_sayacrb  rc  rW   rU  rV  izin_suresirq  rr  r  
gun_sayacirs  ru  ro  izin_gunleridtgun_adirt  r#   r#   r$   r    s   



$
$




r  c                   @   sb   e Zd ZejejddZejedddZejej	ddZ
ejej	ddZejej	dddZdS )	KonumlarTr.   r0   FrG   g?re   N)r<   r=   r>   r?   r@   rA   rB   rC   r7   rp   latlonmax_mesafe_kmr#   r#   r#   r$   r    s    r  z/admin/ayarlarc                  C   s   dt vst ddkrdS tjdkrHtjd} ttjd}ttjd}ttjd	}t| |||d
}tj | tj 	  t
dd tj }td|dS )Nrl   rZ   r   r  r   r7   r  r  r  )r7   r  r  r  u#   ✅ Yeni konum başarıyla eklendi!r   zadmin_ayarlar.html)konumlar)r   r   r   r   r   rw  r  r?   r'  r(  r   r   r   r   )r7   r  r  r  
yeni_konumr  r#   r#   r$   sistem_ayarlar  s   



r  z#/admin/konum_duzenle/<int:konum_id>c                 C   s   dt vst ddkrdS tj| }tjdkrJtjd|_t	tjd|_
t	tjd|_t	tjd	|_tj   td
d ttdS td|dS )Nrl   rZ   r   r  r   r7   r  r  r  u#   ✅ Konum başarıyla güncellendi!r   r  zkonum_duzenle.html)konum)r   r   r  r   r9  r   r   r   r7   rw  r  r  r  r?   r(  r   r   r   r   konum_idr  r#   r#   r$   konum_duzenle  s   


r  z/admin/konum_sil/<int:konum_id>c                 C   sR   dt vst ddkrdS tj| }tj | tj   tdd t	t
dS )Nrl   rZ   r   r  u"   🗑️ Konum başarıyla silindi!dangerr  )r   r   r  r   r9  r?   r  r(  r   r   r   r  r#   r#   r$   	konum_sil  s   

r  c           	      C   sv   d}t ||  }t || }t|d d tt | tt | t|d d   }dtt|td|  }|| S )Ni     r   )r   r   r   r   r   )	lat1lon1lat2lon2Rdlatdlonar   r#   r#   r$   	haversine  s   8r  c                   @   s   e Zd ZejejddZejejedddZej	dej
dddd	ZejejddZejejddZejejddZejejddZd
S )PersonelHareketleriTr.   rc   FrG   rE   
hareketlerrg   ri   N)r<   r=   r>   r?   r@   rA   rB   ro   rl   rs   rj   rt   r{   giris_tarihicikis_tarihirp   	konum_lat	konum_lngr#   r#   r#   r$   r    s    r  z/konum_kontrolc                  C   s   t j} t| d t| d }}tj }|stddddS |D ]!}t|||j|j	}||j
krBtd|j dd	d
|jd  S q!td|d dddddS )Nlatitude	longitudeu/   ⚠️ Tanımlı çalışma alanı bulunamadı!ERRORFmesajr   r      ✅     alanındasınız!OKTr  r   r   
   konum_adı-   ⚠️ Çalışma alanı dışındasınız! (  .0f    metre uzaktasınız)OUT)r   r   rw  r  r   r   r   r  r  r  r  r7   )r   r  r  r  r  mesafer#   r#   r$   konum_kontrol  s(   

r  z/konumc                   C      t dS )Nzkonum_kontrol.htmlr   r#   r#   r#   r$   konum_sayfasi	     r  z/giris_cikisc                  C   s^   dt vst ddvrdS t d} tdtdtdtdd}|| td}td	|d
S )Nrl   rZ   rI   r   r   r   r  r   r   r   r   zgiris_cikis.html)r$  )r   r   r   r   )rZ   back_url_mapr$  r#   r#   r$   giris_cikis	  s   
r  r   TZz
/giris_yapc                  C   s   dt vrtddddfS tj} | d}| d}t||}|drItt d t ||d	}t	j 
| t	j   td
d|d ddS td|ddS )Nrl   Fr  r  r  r  r  r   )rl   r  r  r  Tr  r  u&    konumunda giriş işlemi başarılı!r  )r   r   r   r   r   konum_kontrol_testr  r   r   r?   r'  r(  )r   r  r  sonuc
yeni_girisr#   r#   r$   	giris_yap7	  s"   




r  z
/cikis_yapc                  C   s   dt vrtddddfS tj} | d}| d}t||}|drWtjjt d d d		tj
  }|rPt |_tj   td
d|d ddS tdddS td|ddS )Nrl   Fr  r  r  r  r  r   rl   r  Tu   🚪 r  u)    konumunda çıkış işlemi başarılı!u4   ❌ Çıkış yapacak bir giriş kaydı bulunamadı!r  )r   r   r   r   r   r  r  r   rW  r   r  r   r^  r   r   r  r?   r(  )r   r  r  r  	son_girisr#   r#   r$   	cikis_yapR	  s$   





r  c                 C   s   t j }|sddddS td}d}|D ],}tt| t||j|j}||jkr8d|j dd	d
|jd  S ||k rA|}|j}qd| d|d dddddS )z*Personelin konumunu kontrol eden fonksiyonu2   ⚠️ Henüz tanımlı bir çalışma alanı yok!r  Fr  infNr  r  r  Tr  r  z
 konumuna r  r  r  r  )	r  r   r   rw  r  r  r  r  r7   )r  r  r  en_yakin_mesafeen_yakin_konumr  r  r#   r#   r$   r  m	  s*   


r  z/son_giris_kontrolc                  C   sN   dt vrtddddfS tjjt d d dtj  } tdt	| iS )Nrl   Fr  r  r  r  giris_devam_ediyor)
r   r   r  r   rW  r   r  r   r^  bool)r  r#   r#   r$   son_giris_kontrol	  s   $r  z/hareketlerc            	      C   s   dt vr
ttdS t d } t  }|tdd }tj	d|
d}tj	d|
d}t|d}t|dtdd }tjtj| ktj|ktj|k tj  }d	d
 |D }td|||dS )Nrl   r      rI  r   r  r   r   c                 S   sF   g | ]}|j r|j d nd|jr|jd nd|jrdnddqS )rG     —u   ⏳ Devam Ediyoru   ✅ Tamamlandıu   ⏳ Çalışıyor)r  r  durum)r  rP  r  )rS  hareketr#   r#   r$   rU  	  s    zhareketler.<locals>.<listcomp>zhareketler.htmlr  r   r   )r   r   r   r   r   r   r   r   r  r   rP  r  r  r   r6  rl   r  r   r   r   r   )	rl   todayseven_days_agor   r   start_datetimeend_datetimer  formatted_hareketlerr#   r#   r$   r  	  s(   	r  )r   r   rN  )
joinedloadr  r  r  r  r  r  r  )MondayTuesday	WednesdayThursdayFridaySaturdaySundayz/giris_cikis_raporlaric            (         s  dt vst ddvrdS tjt d } dd }t  }|tjdp(| |tjdp2|}t	d	  d
|  tj
ttj }|sLdS d}d}d}d}g }	i }
tjtjt tjktjt|tjk }t }t }t }t }t }|D ]-} | j| j d| j }| j}| jr| jdng }| jrt| jni }tfdd|D } fddt |  j!d D D ]t"#dd}t$jt$j%kt$j&kt$j'k( }|r|j)}|j*}n||vrq||i dd }||i dd }t+|t,rt-|d }t+|t,r"t-|d }t|}t|}t.jt.j%kt.j/dkt.j0kt.j1k( }fdd|D }|r|j0#dd |j2 }|j1#dd |j3 }||d|
< |4 |r|D ]8} | j}!| j5}"|	6| j| j| j| j||!r|!#dnd |"r|"#dnd d!| d"| d#d$ |4| j qyn|	6d | j| j| j|d d d%| d"| d#d$ q|4 |s|s|	6d | j| j| j|d d d&d$ q|D ]} | j}!| j5}"|!| 7 d' }#|"rp|"| 7 d' }$|#|krd(}%n|#| k rd)}%nd*}%|$|kr!d(}&n|$| k r*d)}&nd*}&|%d*kr9|&d*kr9d+}'nJ|%d(krF|&d*krFd,}'n=|%d)krS|&d*krSd-}'n0|%d*kr`|&d(kr`d.}'n#|%d*krm|&d)krmd/}'nd0}'n|#|krxd,}'n|#| k rd-}'nd+}'|	6| j| j| j| j||!#d|"r|"#dnd |vr|'nd1d$ |4| j qqq|D ]=} | j%| j8} | j}!| j5}"|v sˈ|v r͐q|	6| j| j| j| j|!r|!#dnd |"r|"#dnd d2d$ qt9d3|	 #d4|#d4d5S )6Nrl   rZ   )r   r   r   r   r  c                 S   s0   | sd S z	t | d W S  ty   Y d S w r  )r   r  r   r  r  r#   r#   r$   r  	  s   z+giris_cikis_raporlari.<locals>.format_tarihr   r   u"   📅 Filtreleme Tarih Aralığı: rk   )u'   Veritabanında kullanıcı bulunamadı.i     r  r   r   r  c                 3   s    | ]}|j  kV  qd S rM   rM  rS  hrM  r#   r$   r  
  s    z(giris_cikis_raporlari.<locals>.<genexpr>c                 3   s    | ]
} t |d  V  qdS )rI  N)r   )rS  n)r   r#   r$   r  
  s    r   rn  r   r  r  ra  rp  c                    s(   g | ]}|j kr|j  kr|qS r#   )rl   r  r   r  )r  rl   r#   r$   rU  8
  s   ( z)giris_cikis_raporlari.<locals>.<listcomp>rN  )rU  rV  rG  r  z<button class='izin-button btn btn-primary' data-bs-toggle='modal' data-bs-target='#izinModal' 
                                         data-start='z' data-end='u   '>🔵 İzinli</button>)rB   rl   rT   rU   rW   r  r  r   z<button class='izin-button btn btn-primary' data-bs-toggle='modal' data-bs-target='#izinModal' 
                                     data-start='u   🔴 Hiç Giriş Yapmadır  gecerkenuygunu   🟢 Kurallara Uygunu   🟠 Geç Girişu   🟠 Erken Girişu   🟠 Geç Çıkışu   🟠 Erken Çıkışu   🔴 Düzensiz Giriş Çıkışu   🔵 İzinliu   🟡 Fazla Mesaizgiris_cikis_raporlari.htmlr  r  ):r   r   rE   r   r   r   r   r   r  r   optionsr  r  r   r  r6  r  rL  rN  rM  rO  rh  rB   rT   rU   rW   r]   rQ  rN   r   rO   r  rangerJ  GUN_DONUSUMUrP  r   rl   r   r   r^  r   r   r   r   r  r   r   r   r   rx   ry   r'  r  r7  rP  rt   r   )(rt   r  r  r   r   GIRIS_EKSI_TOLERANSGIRIS_ARTI_TOLERANSCIKIS_ARTI_TOLERANSCIKIS_EKSI_TOLERANSr  rr  hareketler_tumucalismasi_gereken_user_idsfazla_mesai_user_idseklenen_kullanicilarizinli_kullanicilareklenen_hareket_ids	user_namerW   r]   rN   kullanici_giris_yapti_mir  vardiyar   r   planlanmis_girisplanlanmis_cikisizin_varr  izin_baslangic
izin_bitisr  r  r  giris_farkicikis_farkigiris_durumucikis_durumur   r#   )r   r  rl   r$   giris_cikis_raporlari	  sp  
&





 r  z/update_giris_cikisc                  C   s   t j} | d}| d}| d}| d}|s!tddidfS |dks'|s>t|d d d	d	d
}tj| tj  |j	}tj
|}|sNtddidfS |dkrZt|d|_n|dkrft|d|_ntddidfS tj  tdddS )N	record_idfield	new_valuerl   r   u!   Kullanıcı kimliği bulunamadı!r<  nullr   )rl   r  r  r  r     Kayıt bulunamadı!r|  r  rG  r     Geçersiz alan!Tu   Veri başarıyla güncellendi!r  )r   r   r   r   r  r?   r   r'  r(  rB   r   r   r  r  r  )r   
hareket_idr  r   rl   yeni_hareketr  r#   r#   r$   update_giris_cikis
  s8   





r  )r   r   z/delete_giris_cikisc                  C   s   t j} | d}| d}| d}|r|stddidfS tjj||d }|s2tddid	fS |d
kr:d |_n|dkrBd |_	ntddidfS |jsV|j	sVt
j| t
j  tdddS )Nr  r  rl   r   u+   Hareket ID veya Kullanıcı ID bulunamadı!r<  )rB   rl   r  r|  r  r  r  Tu   Veri başarıyla silindi!r  )r   r   r   r   r  r   rW  r^  r  r  r?   r   r  r(  )r   r  r  rl   r  r#   r#   r$   delete_giris_cikis
  s$   



r  z/debug_user_idc                  C   s,   t j} | d}td|  tdddS )Nrl   u1   📌 Kullanıcı Tıklama Algılandı: User ID = Tu    User ID terminale yazdırıldı.r  )r   r   r   r   r   )r   rl   r#   r#   r$   debug_user_id  s   
r  z/calisma_saatleric                  C   sl   dt vst ddvrdS tj tt d } | sdS | jd}tjtj|tj	dk
 }td|d	S )
Nrl   rZ   r   r   r  rz  r  rI   zcalisma_saatleri.html)personeller)r   r   r?   rE   rW   rQ  r   r6  rx  rZ   r   r   )rt   r#  r
  r#   r#   r$   rN   +  s    rN   z/calisma_saatleri_kaydetc               
   C   s  dt vst ddvrdS tj tt d } | sdS | jd}tjtj|	 }d}|D ]}t
jd|j }t
jd	|j }t
jd
|j }t
jd|j }|rb|rb|rb|swt|j d|j dd ttd  S t|d }t|d }t|d }t|d }tjtj|jktj|ktj|k }	|	rt|j d|j d| d| dd q0t|j||||d}
tj |
 |d7 }q0tj   |dkrt| dd ntdd ttdS )Nrl   rZ   r	  r  rz  r  r   start_date_	end_date_r  r  r   u    için tüm alanları doldurun!r  rN   r  ra  u    için rk   u    tarihleri zaten kayıtlı!warning)rl   r   r   r   r   r   u7    personelin çalışma saatleri başarıyla kaydedildi!r   uS   Yeni bir kayıt eklenmedi. Tüm personel için çalışma saatleri zaten kayıtlı!info)r   r   r?   rE   rW   rQ  r   r6  rx  r   r   r   rB   r   rT   rU   r   r   r   r  r   rN  r   rl   r   r   r^  r'  r(  )rt   r#  r
  kaydedilen_personel_sayisirI   r   r   r   r   mevcut_kayityeni_calisma_saatir#   r#   r$   calisma_saatleri_kaydetC  sX   
&


r  z/vardiya_goruntulec               	   C   s  dt vst ddvrdS tj tt d } | sdS | jd}tjtj|tj	dk
 }dd	 |D }td
| td| tjd}tjd}tjttj|}|rd|tj|k}|rn|tj|k}|tjtjtjtjtjtjtj
 }td| td|||dS )Nrl   rZ   r	  r  rz  r  rI   c                 S      g | ]}|j qS r#   rB   )rS  pr#   r#   r$   rU        z%vardiya_goruntule.<locals>.<listcomp>u   📌 Yöneticinin Bölümleri:u   📌 Personel ID'leri:r   r   u   📌 Vardiyalar Gönderiliyor:zvardiya_goruntule.html)r   r   r   )r   r   r?   rE   rW   rQ  r   r6  rx  rZ   r   r   r   r  r   r   rl   r   r   rX  rT   rU   r   r   rB   r   )rt   r#  r
  personel_idsr   r   r   r   r#   r#   r$   vardiya_goruntule  s<    


	r  z!/vardiya_duzenle/<int:vardiya_id>c                 C   sR  dt vst ddvrdS tj t| }|s!tdd ttdS tjd}tjd	}tjd
}tjd}|rA|rA|rA|sNtdd ttd| dS t	
|d }t	
|d }t	
|d }t	
|d }|j|kr|j|kr|j|kr|j|krtdd ttdS ||_||_||_||_tj   tdd ttdS )Nrl   rZ   r	  r     Vardiya bulunamadı!r  r  r   r   r   r   u*   Tüm alanları doldurmanız gerekmektedir!vardiya_duzenle_form)
vardiya_idr  ra  u!   Hiçbir değişiklik yapılmadı!r  u!   Vardiya başarıyla güncellendi!r   )r   r   r?   r   r   r   r   r   r   r   r  r   rN  r   r   r   r   r(  )r  r  r   r   r   r   r#   r#   r$   vardiya_duzenle  s<   








r  r  c                 C   sN   dt vst ddvrdS tj t| }|s!tdd ttdS td|d	S )
Nrl   rZ   r	  r  r  r  r  zvardiya_duzenle.html)r  )r   r   r?   r   r   r   r   r   r  r  r#   r#   r$   r    s   
r  z/vardiya_sil/<int:vardiya_id>c                 C   sl   dt vst ddvrdS tj| }|s tdd ttdS tj | tj 	  tdd	 ttdS )
Nrl   rZ   r	  r  u(   Silmek istediğiniz vardiya bulunamadı!r  r  u   Vardiya başarıyla silindi!r   )
r   r   r   r   r   r   r   r?   r  r(  r  r#   r#   r$   vardiya_sil  s   


r  c                   @   s   e Zd ZejejddZejejedddZejej	ddZ
ejejdd dZejejddZejd	ejd
dddZdS )
GorusOneriTr.   rc   FrG   c                   C   s   t tdS )Nr   )r   r   r   r#   r#   r#   r$   rf    s    zGorusOneri.<lambda>rJ   rE   gorus_onerirg   ri   N)r<   r=   r>   r?   r@   rA   rB   ro   rl   r^   r   r{   r}   r[   okundurs   rj   rt   r#   r#   r#   r$   r    s    r  )r   r   r   r   r   r   r   z/gorus_oneri_gonderc                  C   s   dt vr
ttdS tj tt d } | sttdS ddddd}|| jd}tjdkrMtj	d	}|rMt
| j|d
}tj | tj   tdd t
jj| jdt
j  }td||dS )Nrl   r   r   r   r   r   r  r   r   )rl   r   u.   Görüş ve öneriniz başarıyla gönderildi!r   rM  zgorus_oneri_gonder.html)gorus_onerileri
home_route)r   r   r   r?   r   rE   rZ   r   r   r   r  rB   r'  r(  r   r   rW  r   r}   r   r   r   )rt   home_routesr#  r   
yeni_onerir"  r#   r#   r$   gorus_onerisi_gonder/  s(   


 r&  z/gorus_onerileric                  C   s   dt vst ddvrdS tjttjtjtj	tj
tjtjtj	  } t ddkrAtjjdddd	i tj   td
| dS )Nrl   rZ   r   r   r  r   Fr!  r!  Tzgorus_onerileri.htmlr"  )r   r   r  r   r   rE   rX  rB   r   r}   r!  rT   rU   r   r   r   rW  updater?   r(  r   r)  r#   r#   r$   r"  T  s    

r"  z/okunmamis_oneri_sayisic                  C   s@   dt vst ddvrtddiS tjjdd } td| iS )Nrl   rZ   r'  rj  r   Fr(  )r   r   r   r  r   rW  rj  )okunmamis_sayisir#   r#   r$   okunmamis_oneri_sayisiq  s   r,  z/bekleyen_izin_sayisic                  C   s  dt vr
tddiS tj tt d } | stddiS td| j d| j d| j d | jdkrNt	j
tt	jd	kt	jd
kt	jdk }td|  np| jdkrw| jd}t	j
ttdd |D  t	jd	k }td|  nG| jdkr| jd}t	j
ttdd |D  t	jd
k }td|  n| jdkrt	j
t	jdk }td|  nd}td tdd|i td|iS )Nrl   rj  r   u   🛠 Kullanıcı: r   r  r  r   r   r  r  u0   📢 Admin için bekleyen toplam izin sayısı: r   r  c                 S   $   g | ]}t jd |  d qS ra  rE   rW   rd  r  r  r#   r#   r$   rU    rm  z(bekleyen_izin_sayisi.<locals>.<listcomp>u+   📢 Manager için bekleyen izin sayısı: r   c                 S   r-  ra  r.  r  r#   r#   r$   rU    rm  u3   📢 Factory Manager için bekleyen izin sayısı: r   u.   📢 HR Manager için bekleyen izin sayısı: u6   ❌ Yetkili rol bulunamadı, bekleyen izin sayısı: 0u   📌 API Yanıtı:)r   r   r?   r   rE   r   rT   rU   rZ   r   r   r6  ri  r   rj  rW   rQ  r   )rt   rj  r~  r#   r#   r$   bekleyen_izin_sayisi  s\   "



r/  z/salaryc            
      C   s  dt vst ddvrdS tj } tj }tjdkrtjd}tjd}|dkrtjd}tjd	}tjd
}tjd}|rL|rL|rL|sWt	dd t
tdS z
t|d }W n tyu   t	dd t
td Y S w t|t||t|d}	tj |	 tj   t	dd nR|dkrtj|}|rttjd	|_ttjd
d |_ttjd|_tj   t	dd n|dkrtj|}|rtj | tj   t	dd t
tdS td| |dS )Nrl   rZ   r'  r  r   action	salary_idr'  rm   rn   rr   &   Tüm alanları doldurmanız gerekiyor!r  manage_salaryr  u(   Geçersiz tarih formatı! (Yıl-Ay-Gün))rl   rm   rn   rr   u"   Maaş bilgisi başarıyla eklendi!r   edit'   Maaş bilgisi başarıyla güncellendi!r  u   Maaş kaydı silindi!r  zsalary.html)r   rf   )r   r   rE   r   r   r`   r   r   r   r   r   r   r   r  r   r  rw  intr?   r'  r(  rm   rn   rr   r  r   )
r   rf   r0  r1  rl   rm   valid_from_strrr   rn   
new_salaryr#   r#   r$   r3    s^   









r3  z/salary_edit/<int:salary_id>c              
   C   s   dt vst ddvrdS tj| }tjd}tjd}tjd}|r+|r+|s6tdd	 tt	d
S zt
||_t|d |_t||_tj   tdd W n tyq } ztdt| d	 W Y d }~nd }~ww tt	d
S )Nrl   rZ   r'  r  rm   rn   rr   r2  r  r3  r  r5  r      Hata oluştu: )r   r   r`   r   r9  r   r   r   r   r   rw  rm   r   r  r   rn   r6  rr   r?   r(  r   r   )r1  rm   salary_amountrn   rr   r"   r#   r#   r$   salary_edit  s(   



 r;  z/salary_delete/<int:salary_id>c              
   C   s   dt vst ddvrdS tj| }ztj | tj   tdd W n t	yA } ztdt
| d W Y d }~nd }~ww ttd	S )
Nrl   rZ   r'  r  u!   Maaş kaydı başarıyla silindi!r   r9  r  r3  )r   r   r`   r   r9  r?   r  r(  r   r   r   r   r   )r1  rm   r"   r#   r#   r$   salary_delete  s   
 r<  z	/overtimec                  C   s  dt vst ddvrdS ddddd	d
dd} dd |  D }tj }|D ]}||j|j|_q'tj	dkrtj
d}|dkrtj
d}| ||}tj
d}tj
d}tj
d}	|rh|rh|rh|	sstdd ttdS t|||t|	d}
tj |
 tj   tdd nc|dkrtj
d}tj|}|rtj
d}| |||_tj
d|_tj
d|_ttj
d|_tj   tdd n"|dkrtj
d}tj|}|rtj | tj   td d! ttdS td"||d#S )$Nrl   rZ   r'  r  r  r  r  r  r  r  r  r  c                 S   s   i | ]\}}||qS r#   r#   )rS  kvr#   r#   r$   r  D  s    z#manage_overtime.<locals>.<dictcomp>r   r0  r'  rw   rx   ry   rz   r2  r  manage_overtime)rw   rx   ry   rz   u*   Fazla mesai çarpanı başarıyla eklendi!r   r4  multiplier_idu)   Çarpan bilgisi başarıyla güncellendi!r  u   Çarpan bilgisi silindi!r  zovertime.html)multipliersenglish_to_turkish_days)r   r   r'  ru   r   r   rw   display_dayr   r   r   r   r   r   rw  r?   r'  r(  rx   ry   rz   r  r   )turkish_to_english_daysrB  rA  rz   r0  turkish_dayrw   rx   ry   multiplier_valuenew_multiplierr@  r#   r#   r$   r?  5  sn   








r?  z/special_daysc            	      C   s  dt vst ddvrdS tjtj } tjdkrtj	d}tj	d}|dkrptj	d	}tj	d
}tj	d}|rC|rC|sNt
dd ttdS t|d }t||t|d}tj | tj   t
dd nP|dkrtj|}|rttj	d	d |_tj	d
|_ttj	d|_tj   t
dd n|dkrtj|}|rtj | tj   t
dd ttdS td| dS )Nrl   rZ   r'  r  r   r0  day_idr'  r   r7   rz   u   Tüm alanları doldurun!r  manage_special_daysr  )r   r7   rz   u   Özel gün başarıyla eklendi!r   r4  u   Özel gün güncellendi!r  u   Özel gün silindi!r  zspecial_days.html)special_days)r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r  rw  r?   r'  r(  r7   rz   r  r   )	rJ  r0  rH  r  r7   rz   r   new_dayspecial_dayr#   r#   r$   rI    sF   






rI  z/payrollc            3      C   sJ  dt vst ddvrdS tj } tjdkrtjd}tjd}tjd}|r.|s9tdd	 t	t
d
S t|d }t|d }g }|dkrQ| n	tj tt|g}|D ]9}tjtj|jktj|ktj  }	|	std|j d|j  ||ddddddg dd	 q]|	j}
|	j}|
| }tjtj|jktj|ktj|k }t j }t!jt!j|kt!j|k }d}d}d}d}d}g }g }g }t" }|D ]"}|j}|j#pt$| tj%& }|| ' d }||7 }td|j d|j  td| d|  td|d d}|D ]8}|j| krT|| |j( }||7 }||7 }||)dt*|d|j(t*|dd d}|+|j  nq|rZq|} d}!|D ]|}"|)d}#|"j,- }$|#. |$. krt|"j/d& }%t|"j0d& }&t$| |%}'t$| |&}(||'kr||(k rt%||'})t1||(}*|*|) ' d }+|+dkr|!|+7 }!|+| |"j( },||,7 }||)dt*|+d|"j(t*|,dd q`||! } | dkr||)dt*| dt*| | dd  ||!7 }q|D ]"}|j|vr"d!| }-||-7 }||j)dd!d"t*|-dd qt2jt2j|jkt2j3d#kt2j4|kt2j5|kt2j6d$k }.t7d%d& |.D }/t7d'd& |D }0|0| }1|1| | |/|  }2|i d(|d)d*d+|2d,|d-|0d.|1d/|d0|d1|d2|d3|d4|d5|d6|d7|/d8|/|  q]t8d9| |d:S t8d9| d;S )<Nrl   rZ   r'  r  r   r   r   u"   Tarih aralığını seçmelisiniz!r  payrollr  r   u(   DEBUG: Kullanıcı maaşı bulunamadı: r   u   ❌ Maaş bilgisi bulunamadır   )	rt   r   
net_salaryworked_hoursovertime_hoursovertime_payspecial_day_payspecial_day_detailsannual_leave_hoursrH  u   
📌 İşlenen Kullanıcı: u     ➝ Giriş Tarihi: u   , Çıkış Tarihi: u     ➝ Çalışılan Saat: r   FrN  r  )r   rE  rz   amountTrn  ra  g{Gz?)r   rE  rU  rC  g      ?rp  Senelikc                 S   s@   g | ]}|j |j jd  t|jdt|jd jd  qS )rC  ra  rH  )r   r   rJ  r   r  ry   rx   seconds)rS  izinr#   r#   r$   rU  i  s     zpayroll.<locals>.<listcomp>c                 S   s   g | ]}|d  qS rD  r#   )rS  detailr#   r#   r$   rU  p  r_  rt   r   u   ✅ Hesaplama TamamlandırN  rO  normal_hours
normal_paynormal_detailshourly_raterP  rQ  overtime_detailsspecial_day_hoursrR  rS  rT  annual_leave_payzpayroll.html)r   payroll_results)r   )9r   r   rE   r   r   r   r   r   r   r   r   r   r  r   r?   r6  r`   r6  rl   rB   rn   r   r   r^  r   rT   rU   r7  rm   rr   r  r  ru   r~   rh  r  rL  rO  rN  rP  rz   rP  rj  r'  rw   r  r   rx   ry   rM  r   r   r   r   r   sumr   )3r   r  r  rl   r   r   ra  selected_usersrt   rm   monthly_salaryrr   r]  r  overtime_multipliersrJ  total_worked_hoursrP  rQ  rR  r_  r^  rS  r\  special_days_workedr  r  r  rO  is_special_dayspecialspecial_amountnormal_hours_dayovertime_hours_dayovertimecalisma_gunu
mesai_gunuovertime_startovertime_endovertime_start_dtovertime_end_dtoverlap_startoverlap_endovertime_durationovertime_amountfixed_paymentizinlerizin_saatlerirZ  r[  total_salaryr#   r#   r$   rM    sj  

 













	
rM  z/admin/modul_ayarlarc                  C   s   dt vst ddkrdS tjdkrbdD ]=} tjj| d }|rQtjd|  d	k|_	tjd
|  d	k|_
tjd|  d	k|_tjd|  d	k|_qtj   tdd ttdS tj }td|dS )Nrl   rZ   r   r  r   )rI   r   r   r   r   r\  izin_r  giris_cikis_bordro_vardiya_u   Modül ayarları güncellendi!r   modul_ayarlarzmodul_ayarlar.html)rl  )r   r   r   r   r   r   rW  r^  r   r   r   r   r   r?   r(  r   r   r   r   r   )rZ   ro  rl  r#   r#   r$   r    s    



r  )r   r   r   r   r   r   "HXaa1625948d41cd5b3db285352422bc18z/forgot_passwordc               
   C   s  t jdkrt jd } | dddd}|ds$d|dd   }tjj	|d
 }|s:td	d
 ttdS ttdd}|td< |td< zt|dd  d| d tdd ttdW S  ty } ztdt| d
 ttdW  Y d }~S d }~ww tdS )Nr   rX   r   r   r  rG  irX   u>   Bu telefon numarasıyla kayıtlı bir kullanıcı bulunamadı!r  forgot_passwordi i?B 
reset_codereset_phoner   u   Şifre sıfırlama kodunuz: u6   
Kodun süresi 10 dakikadır.
https://izindefteri.com/u8   Şifre sıfırlama kodu WhatsApp üzerinden gönderildi!r   verify_reset_codeu#   Mesaj gönderilirken hata oluştu: zforgot_password.html)r   r   r   r   r  r  rI  rE   r   rW  r^  r   r   r   r   randomrandintr   r%   r   r   )rX   normalized_phonert   r  r"   r#   r#   r$   r    s2   





r  z/verify_reset_codec                  C   sR   t jdkr%t jd} dtv r td | kr tdd ttdS tdd tdS )	Nr   r  u<   Doğrulama başarılı! Yeni şifrenizi belirleyebilirsiniz.r   reset_passwordu&   Geçersiz kod! Lütfen tekrar deneyin.r  zverify_reset_code.html)	r   r   r   r   r   r   r   r   r   )	user_coder#   r#   r$   r    s   


r  z/reset_passwordc                  C   s   t jdkr?t jd} td}tjj|d }|r:| |_	t
j  tdd  tdd  tdd ttdS td	d
 tdS )Nr   new_passwordr  r  r  u;   Şifreniz başarıyla sıfırlandı! Giriş yapabilirsiniz.r   r   u)   Bir hata oluştu! Lütfen tekrar deneyin.r  zreset_password.html)r   r   r   r   r   rE   r   rW  r^  rV   r?   r(  popr   r   r   r   )r  rX   rt   r#   r#   r$   r    s   




r  z	/settingsc                  C   s2   dt vr
ttdS tjt d } td| jdS )Nrl   r   zsettings.htmlr  )r   r   r   rE   r   r   r   rX   )rt   r#   r#   r$   settings  s   r  z/update_phonec                  C   sd   dt vr
ttdS tjt d } tjd }d| }|| _	t
j   tdd ttdS )Nrl   r   rX   rG  u0   ✅ Telefon numaranız başarıyla güncellendi!r   r  )r   r   r   rE   r   r   r   r   r  rX   r?   r(  r   )rt   	new_phoner  r#   r#   r$   update_phone  s   


r  z/update_passwordc                  C   s   dt vr
ttdS tjt d } tjd}tjd}tjd}| j|kr4t	dd ttdS ||krCt	d	d ttdS || _t
j   t	d
d ttdS )Nrl   r   old_passwordr  confirm_passwordu   ❌ Mevcut şifreniz yanlış!r  r  u6   ❌ Yeni şifreler uyuşmuyor! Lütfen tekrar deneyin.u'   ✅ Şifreniz başarıyla güncellendi!r   )r   r   r   rE   r   r   r   r   rV   r   r?   r(  )rt   r  r  r  r#   r#   r$   update_password-  s    




r  c                 C   s(   h d}d| v o|  ddd  |v S )u!   Dosya uzantısını kontrol eder.r   r   r   )r   r   )r   r   r#   r#   r$   r   K  s    )r   zstatic/uploadsi    r  z/bilgilendirme_eklec                     s  dt vrdS t d} t d | dvr(| dv r& r&t fddd	D r&ndS tj }tjd
krtjd}tjd}tj	d}|rJ|rJ|sUt
dd ttdS dtt|}d }dtjv rtjd }|jdkrt|js~t
dd ttdS t|j}tjtjd |}	||	 t|	}
|
jtkrt|
j }t|
j| }|
t|ftj }
|
j|	ddd d| }t!||||d}t"j #| t"j $  t
dd ttdS t%d|dS ) Nrl   r  rZ   rW   r'  r   r   c                 3       | ]}| v V  qd S rM   r#   r  rW   r#   r$   r  j      z%bilgilendirme_ekle.<locals>.<genexpr>r  r  r   r   r   r   u3   Başlık, mesaj ve en az bir bölüm seçmelisiniz!r  bilgilendirme_ekler  r   r   u;   Sadece PNG, JPG, JPEG ve GIF formatları desteklenmektedir!r   Tr   )r   r   r   )r   r   r   r   u*   Bilgilendirme mesajı başarıyla eklendi!r   bilgilendirme_listesizbilgilendirme_ekle.htmlr>  )&r   r   r  r%  r   r   r   r   r   r&  r   r   r   r   mapr   r)  r   r   r   r   r   r*  r+  r   r   r   width	MAX_WIDTHr6  heightresizeLANCZOSr   r?   r'  r(  r   )rZ   r#  r   r   selected_departmentsdepartments_strr   r   r   filepathr  ratio
new_height
yeni_mesajr#   r  r$   r  _  sZ   

"















r  )r   r   r   z/bilgilendirme_listesic                  C   s&  dt vrdS t d } tj| }|sdS |jdv p d|jdv }|r/tjtj	
  }nO|jd}dd tjtj| D }|sNtd	g d
S tjtdd |D tdd |D B tdd |D B tdd |D B tj	
  }dd tjj| d D }td	||dS )Nrl   r  rz  r'  r  r  c                 S      g | ]}t |jqS r#   r   rB   r  r#   r#   r$   rU        
z)bilgilendirme_listesi.<locals>.<listcomp>zbilgilendirme_listesi.html)mesajlarc                 s   s    | ]}t j|kV  qd S rM   )r   r   rS  dep_idr#   r#   r$   r    s
    
z(bilgilendirme_listesi.<locals>.<genexpr>c                 s   "    | ]}t j| d V  qdS ,%Nrc  r  r#   r#   r$   r    
    
c                 s   $    | ]}t jd | dV  qdS %,r  Nrc  r  r#   r#   r$   r    s
    
c                 s   "    | ]}t jd | V  qdS r  Nrc  r  r#   r#   r$   r    r  c                 S   s   h | ]}|j qS r#   r   rS  r  r#   r#   r$   	<setcomp>  r  z(bilgilendirme_listesi.<locals>.<setcomp>rM  )r  okunan_mesajlar)r   rE   r   r   rZ   rW   rQ  r   r   r}   r   r   r%  r6  r7   rx  r   ri  r   rW  )rl   rt   tum_mesajlari_gorebilirfiltreli_mesajlarrm  department_idsr  r#   r#   r$   r    sH   	r  z/okunmamis_mesaj_sayisic                  C   s  dt vrtddddfS t d } tj| }|s"tddddfS |jdv p.d	|jd
v }|rHtj	tj
tj tjj| d  }n[|jd
}dd tj	tj| D }|shtdddS tj	tdd |D tdd |D B tdd |D B tdd |D B 	tj
tj tjj| d  }t|}td|jd
  |std|  tddd tj tjj| d D   tddd |D   td|  td|dS )Nrl   Fr  r  r  r{  r|  r'  r  r  rM  c                 S   r  r#   r  r  r#   r#   r$   rU    r  z*okunmamis_mesaj_sayisi.<locals>.<listcomp>Tr   )r   rg  c                 s   s    | ]
}t j| V  qd S rM   r   r   r`  r  r#   r#   r$   r    s    
z)okunmamis_mesaj_sayisi.<locals>.<genexpr>c                 s   r  r  r  r  r#   r#   r$   r        
c                 s   r  r  r  r  r#   r#   r$   r    s    
c                 s   r  r  r  r  r#   r#   r$   r    r  u   Kullanıcının Bölümleri: u!   Kullanıcının Bölüm ID'leri: u#   Kullanıcının Okuduğu Mesajlar: c                 S   r  r#   r  r  r#   r#   r$   rU  	  r  u#   Gerçek Okunmamış Mesaj ID'leri: c                 S   r  r#   r  r  r#   r#   r$   rU  
  r  u/   ✅ Backend dönen okunmamış mesaj sayısı: )r   r   rE   r   r   rZ   rW   rQ  r   r6  rB   rx  r?   r   r   rW  r   r%  r7   ri  rJ  r   )rl   rt   r  okunmamis_mesajlarrm  r  rg  r#   r#   r$   okunmamis_mesaj_sayisi  sf   
.r  z/okundu_isaretle/<int:mesaj_id>c                 C   s   dt vrtddddfS t d }tj|}|s"tddddfS tjj|| d }|s?t|| d}tj 	| tj 
  td	d
iS )Nrl   Fr  r  r  r{  r|  r   r   T)r   r   rE   r   r   r   rW  r^  r?   r'  r(  )r   rl   rt   okunmus_mesaj
yeni_kayitr#   r#   r$   okundu_isaretle  s   
r  z!/bilgilendirme_sil/<int:mesaj_id>c                    s   dt vrtddddfS t d}t dd |d	v rn|d
v r-t fdddD r-n	tddddfS tj| }|sGtddddfS |jr^tj	t
j|j}tj|r^t| tj | tj   tdddS )Nrl   Fr  r  r  rZ   rW   r   r'  r  c                 3   r  rM   r#   r  r  r#   r$   r  3  r  z$bilgilendirme_sil.<locals>.<genexpr>r  u   Mesaj bulunamadı!r|  Tu   Mesaj başarıyla silindi!r  )r   r   r   r  r   r   r   r   r   r   r*  	root_pathr:  r;  r?   r  r(  )r   rZ   r  r   r#   r  r$   bilgilendirme_sil'  s&   


r  z/uretimc                     s\   dt vrdS t d} t dd g d}ddg}| |v r,t fd	d
|D r,tdS dS )Nrl   r  rZ   rW   r   )r   r   r   rI   r  
Enjeksiyonc                 3   r  rM   r#   r  r  r#   r$   r  Y  r  zuretim.<locals>.<genexpr>zuretim.htmlu   Erişim yetkiniz yok.r  )r   r   r  r   )rZ   authorized_rolesauthorized_departmentsr#   r  r$   uretimL  s   
r  instancezizin_takip.dbz
sqlite:///c                   @   s|   e Zd ZejejddZejedddZejedddZ	ejedddZ
ejedddZejejddZdS )MakineTr.   rF   FrG   r0   N)r<   r=   r>   r?   r@   rA   rB   rC   makine_turu
makine_adimarkamodelr^   ozellikr#   r#   r#   r$   r  k  s    r  z/makine_eklec                  C   s   dt vr
ttdS t dd} d| vrdS tjdkrStjd}tjd	}tjd
}tjd}tjd}t|||||d}tj 	| tj 
  ttdS tj }td|dS )Nrl   r   rW   r   r  r  r   r  r  r  r  r  )r  r  r  r  r  makine_eklezmakine_ekle.html)	makineler)r   r   r   r   r   r   r   r  r?   r'  r(  r   r   r   )user_departmentr  r  r  r  r  yeni_makiner  r#   r#   r$   r  |  s.   


r  z/makine_sil/<int:makine_id>c                 C   sb   dt vr
ttdS t dd}d|vrdS tj| }|s dS tj | tj   ttdS )	Nrl   r   rW   r   r  r  u   Makine bulunamadı.r|  r  )	r   r   r   r   r  r   r?   r  r(  	makine_idr  makiner#   r#   r$   
makine_sil  s   
r  z/makine_duzenle/<int:makine_id>c                 C   s   dt vr
ttdS t dd}d|vrdS tj| }|s dS tjdkrStjd	|_	tjd
|_
tjd|_tjd|_tjd|_tj   ttdS td|dS )Nrl   r   rW   r   r  r  r  r   r  r  r  r  r  r  zmakine_duzenle.html)r  )r   r   r   r   r  r   r   r   r   r  r  r  r  r  r?   r(  r   r  r#   r#   r$   makine_duzenle  s"   

r  c                   @   sl   e Zd ZejejddZejedddZejej	ddZ
ejeddddZejeddddZd	S )
UrunTr.   r0   FrG   rH   r1   rL   N)r<   r=   r>   r?   r@   rA   rB   rC   urun_adirp   ortalama_cevrim_suresibarkodqr_kodr#   r#   r#   r$   r    s    r  z
/urun_eklec                  C   s   dt vr
ttdS t dd} d| vrdS tjdkrRtjd}tjd	}tjd
}tjd}t||r;t|nd ||d}t	j 
| t	j   ttdS tj }td|dS )Nrl   r   rW   r   r  r  r   r  r  r  r  )r  r  r  r  	urun_eklezurun_ekle.html)urunler)r   r   r   r   r   r   r   r  rw  r?   r'  r(  r   r   r   )r  r  r  r  r  	yeni_urunr  r#   r#   r$   r    s*   


r  z/urun_duzenle/<int:urun_id>c                 C   s   dt vr
ttdS t dd}d|vrdS tj| }tjdkrStj	d|_
tj	d	|_|jr7t|jnd |_tj	d
|_tj	d|_tj   ttdS td|dS )Nrl   r   rW   r   r  r  r   r  r  r  r  r  zurun_duzenle.html)urun)r   r   r   r   r  r   r9  r   r   r   r  r  rw  r  r  r?   r(  r   urun_idr  r  r#   r#   r$   urun_duzenle  s   

r  z/urun_sil/<int:urun_id>c                 C   Z   dt vr
ttdS t dd}d|vrdS tj| }tj | tj 	  ttdS )Nrl   r   rW   r   r  r  r  )
r   r   r   r   r  r   r9  r?   r  r(  r  r#   r#   r$   urun_sil(     
r  c                   @   s0   e Zd ZejejddZejedddZdS )RenkTr.   r0   FrG   N)	r<   r=   r>   r?   r@   rA   rB   rC   renk_adir#   r#   r#   r$   r  =  s    r  z
/renk_eklec                  C   s   dt vr
ttdS t dd} d| vrdS tjdkr7tjd}t|d	}tj 	| tj 
  ttd
S tj }td|dS )Nrl   r   rW   r   r  r  r   r  )r  	renk_eklezrenk_ekle.html)renkler)r   r   r   r   r   r   r   r  r?   r'  r(  r   r   r   )r  r  	yeni_renkr  r#   r#   r$   r  H  s   



r  z/renk_duzenle/<int:renk_id>c                 C   sr   dt vr
ttdS t dd}d|vrdS tj| }tjdkr3tj	d|_
tj   ttd	S td
|dS )Nrl   r   rW   r   r  r  r   r  r  zrenk_duzenle.html)renk)r   r   r   r   r  r   r9  r   r   r   r  r?   r(  r   renk_idr  r  r#   r#   r$   renk_duzenled  s   

r  z/renk_sil/<int:renk_id>c                 C   r  )Nrl   r   rW   r   r  r  r  )
r   r   r   r   r  r   r9  r?   r  r(  r  r#   r#   r$   renk_silz  r  r  )rs   c                   @   s  e Zd ZejejddZejeddddZejeje	dddZ
ejeje	dddZejeje	d	ddZejejddZeejZejed
ddZejejejdZejejddZejejddZejdddZejdddZejdddZejejddZejejddZejejddZejejddZejejddZejej ddZ!ejeje	dddZ"ejeje	dddZ#ejeje	dddZ$ejeje	dddZ%ejde"gdZ&ejde#gdZ'ejde$gdZ(ejde%gdZ)ejej ddZ*dS )IsEmriTr.   rF   Fr1   zurun.idrG   zrenk.idz	makine.idrH      BaşlamadırJ   r  is_emirleriri   r  r  r   rc   rE   foreign_keysN)+r<   r=   r>   r?   r@   rA   rB   rC   
is_emri_noro   r  r  r  miktarr^   aciklamar  r{   r   r|   
tarih_saatbaslangic_zamanitamamlanma_zamanirs   r  r  r  kalite_1kalite_2kalite_3fireson_islem_tarihirp   r  personel1_idpersonel2_idpersonel3_idvardiya_ustasi_id	personel1	personel2	personel3vardiya_ustasitoplam_bekleme_suresir#   r#   r#   r$   r    s<    r  c                   @   s   e Zd ZejejddZejejedddZejej	ddZ
ejej	ddZejedddZejedddZejdd	d
ZdS )UretimSureleriTr.   
is_emri.idFrG   rH   rL   r  uretim_sureleriri   N)r<   r=   r>   r?   r@   rA   rB   ro   
is_emri_idr{   r  bitis_zamanirC   r  durus_nedenirs   is_emrir#   r#   r#   r$   r    s    r  c                   @   s:   e Zd ZejejddZejeddddZdd Z	dS )	DurusNedenleriTr.   rL   F)r3   r2   c                 C   r4   )Nz<DurusNedenleri r5   nedenr8   r#   r#   r$   r:     r;   zDurusNedenleri.__repr__N)
r<   r=   r>   r?   r@   rA   rB   rC   r  r:   r#   r#   r#   r$   r    rD   r  c                   @   s  e Zd ZejejddZejejedddZejejedddZ	ejejedddZ
ejejedddZejejedddZejedddZejejejdZejd	d
dZejde	gdZejde
gdZejdegdZejdegdZdS )UretimKayitTr.   r  FrG   rc   rH   rJ   r  uretim_kayitlariri   rE   r  N)r<   r=   r>   r?   r@   rA   rB   ro   r  r  r  r  r  rC   kalite_turur{   r   r|   zamanrs   r  r	  r
  r  r  r#   r#   r#   r$   r    s    r  z/is_emri_eklec                  C   s2  dt vr
ttdS t dd} d| vrdS tjdkrstjd}tjd	}tjd
}tjd}tjd}tjd}|sXtj	tj
  }d|rT|j
d nd }t||||||d}tj | tj   ttdS tj }	tj }
tj }tjtjg d }td|	|
||dS )Nrl   r   rW   r   r  r  r   r  r  r  r  r  r  zEMR-r   )r  r  r  r  r  r  is_emri_ekle)r  Devam Ediyoru   Duruşzis_emri_ekle.html)r  r  r  r  )r   r   r   r   r   r   r   r  r   r   rB   r   r^  r?   r'  r(  r  r   r  r  r6  r  rx  r   )r  r  r  r  r  r  r  son_emiryeni_is_emrir  r  r  r  r#   r#   r$   r    s>   
	



r  z!/is_emri_duzenle/<int:is_emri_id>c                 C   s   dt vr
ttdS t dd}d|vrdS tj| }tjdkr]tj	d|_
tj	d	|_tj	d
|_tj	d|_tj	d|_tj	d|_tj	d|_tj   ttdS tj }tj }tj }td||||dS )Nrl   r   rW   r   r  r  r   r  r  r  r  r  r  r  r  zis_emri_duzenle.html)r  r  r  r  )r   r   r   r   r  r   r9  r   r   r   r  r  r  r  r  r  r  r?   r(  r  r   r  r  r   )r  r  r  r  r  r  r#   r#   r$   is_emri_duzenle4  s(   




r   z/is_emri_sil/<int:is_emri_id>c                 C   r  )Nrl   r   rW   r   r  r  r  )
r   r   r   r   r  r   r9  r?   r  r(  )r  r  r  r#   r#   r$   is_emri_silX  r  r!  z/is_emirleric                  C   s*   dt vr
ttdS tj } td| dS )Nrl   r   zis_emirleri.htmlr  )r   r   r   r  r   r   r   r"  r#   r#   r$   r  o  s   
r  z#/is_emri_goruntule/<int:is_emri_id>c           
   	   C   s  dt vr
ttdS tj| }tj }tj	tj
dk }tjdkrtd tdtj  tjd}tjd}tjd	}tjd
}tjd}td| d| d| d|  |sotdd ttd|jdS t|||gstdd ttd|jdS t||_|rt|nd |_|rt|nd |_|rt|nd |_|rt|nd |_td|j d|j d|j d|j  tj   tj|j}	td|	j d|	j d|	j d|	j  tdd ttd|jdS td|||dS )Nrl   r   r  r   u   📌 FORM GÖNDERİLDİ!u   📌 HAM FORM VERİLERİ: r  r	  r
  r  r  u   📌 FORM VERİLERİ -> P1: z, P2: z, P3: z, VU: u   ⚠️ Makine seçilmelidir!r  is_emri_goruntuler  u(   ⚠️ En az bir personel seçilmelidir!u!   🔍 DB'YE KAYDEDİLİYOR -> P1: u   ✅ DB SONRASI KONTROL -> P1: u(   ✅ İş emri başarıyla başlatıldı.r   uretim_takipzis_emri_goruntule.html)r  r  r
  )r   r   r   r  r   r9  r  r   rE   r6  rW   r   r   r   r   r   r   rB   r  r6  r  r  r  r  r  r?   r(  r   )
r  r  r  r
  r  r  r  r  r  is_emri_checkr#   r#   r$   r#  }  s@   

 


(
(
r#  z /is_emri_uretim/<int:is_emri_id>c                 C   s&  dt vr
ttdS tj| }tjd}t	
 }|jr%||j  }nd }||_|dkrF|jp2dd |_|jd u sB|rE||jk rE||_n&|dkrS|jpNdd |_n|dkr`|jp[dd |_n|d	krl|jphdd |_|r|jprd| |_|jpzdd |_|j|j |_tj   ttd
|jdS )Nrl   r   r  1_kaliter   r   2_kalite3_kaliter  r#  r$  )r   r   r   r  r   r9  r   r   r   r   r|   r  rP  r   en_kisa_cevrimr  r  r  toplam_cevrim_suresiislem_sayisir  r?   r(  rB   )r  r  r  su_an
gecen_surer#   r#   r$   is_emri_uretim  s4   
r/  z/dogrula_sifrec                  C   sn   t  } | d}| d}tj|}|stddddfS |j | kr1tddddfS td	d
iS )Npersonel_idsifreFr2  r  r|  u   Hatalı şifre!r  r   T)r   get_jsonr   rE   r   r   rV   r  )r   r0  girilen_sifrerI   r#   r#   r$   dogrula_sifre  s   

r4  z!/uretim_guncelle/<int:is_emri_id>c              	   C   s  dt vrtddddfS tj| }t }|d}t	 }||_
|jr)|jnd }|jr1|jnd }|jr9|jnd }|jrA|jnd }t|j||||||d}	tj |	 tj   td|	j  |d	krn| jd
7  _n-|dkrz| jd
7  _n!|dkr| jd
7  _n|dkr| jd
7  _n	tddddfS |j|j |j |j }
|j}|}tjj|jdd }tdd |D }|r|
dkr||  | }||
 }nd}dd }tj   td|j|j|j|j|||	jdS )Nrl   F   Yetkisiz erişimr  r  r  )r  r  r  r  r  r  r  u'   ✅ Yeni Üretim Kaydı Eklendi -> ID: r   r   r  r  r  u   Geçersiz kalite türür<  Beklemer  r  c                 s   &    | ]}|j r|j |j  V  qd S rM   r  r  rP  rS  kayitr#   r#   r$   r  7      
z"uretim_guncelle.<locals>.<genexpr>r   c                 S   B   t | d }t | d d }t | d } |dd|dd| dS NrH  r  02:r6  saniyerl  dakikar#   r#   r$   format_sureC     z$uretim_guncelle.<locals>.format_sureT)r   r   r  r  r  r  uretim_kayit_id)r   r   r  r   r9  r   r2  r   r   r|   r  r  r  r  r  r  rB   r?   r'  r(  r   r   r  r  r  r  r  rW  r   rb  rP  )r  r  r   r  r   r  r  r  r  r  toplam_parca_sayisir  r  bekleme_kayitlarir  toplam_gecen_surer  rE  r#   r#   r$   uretim_guncelle  sl   
	


rK  z'/uretim_durum_guncelle/<int:is_emri_id>c                 C   sN  dt vrtddddfS tj| }t }|d}|dd }t	 }||_
|dks1|d	kr]tjj|jd
dtj  }|rJ|jsJ||_t|j|d|d}tj | d|_n|d
krtjj|jd }|s|t|j|d
d}tj | n'tjj|jddtj  }	|	r|	js||	_t|j|d
d}tj | |js||_d
|_nm|dkrtjtj|jktjd
ktjd ktj  }|r||_d|_||_d|_|j|j |j |j }
|jr|jr|
dkr|j|j  }tdd tjj|jdd D }|| }||
 |_ nd |_ tj !  td|jdS )Nrl   Fr5  r  r  r  r  r6  	Beklemeder  r7  )r  r  r  r  r$  )r  r  r     Tamamlandır   c                 s   r8  rM   r9  r:  r#   r#   r$   r    s    
z(uretim_durum_guncelle.<locals>.<genexpr>T)r   
yeni_durum)"r   r   r  r   r9  r   r2  r   r   r|   r  r  rW  rB   r   r  r   r^  r  r?   r'  r  r6  r  r  r   r  r  r  rP  rb  r   r  r(  )r  r  r   rN  r  r   	son_devamr  ilk_kayit_var_mison_beklemerH  rJ  r  net_uretim_suresir#   r#   r$   uretim_durum_guncelle]  s   
"
"



rS  z/uretim_takip/<int:is_emri_id>c                 C   sf  dt vr
ttdS tj| }|jr|jnd }|jr|jnd }|jr&|jnd }t	jj
|jdd }tdd |D }dd }|rLt |  | nd	}||}	||}
|j|j |j |j }|rw|rw|d	krw||  | }|| }nd	}||}t	jj
|jd
t	j  }|r|jnd}|j|kr||_tj   tj }td||||
|	|||d	S )Nrl   r   r6  r7  c                 s   r8  rM   r9  r:  r#   r#   r$   r    r<  zuretim_takip.<locals>.<genexpr>c                 S   r=  r>  rA  rB  r#   r#   r$   rE    rF  z!uretim_takip.<locals>.format_surer   r$  r  zuretim_takip.html)r  r  r  r  r.  mevcut_durumr  durus_nedenleri)r   r   r   r  r   r9  r  r  r  r  rW  rB   r   rb  r   r|   rP  r   r  r  r  r   r   r^  r  r?   r(  r  r   )r  r  r  r  r  rI  r  rE  gecen_sure_saniyegecen_sure_formatlitoplam_bekleme_suresi_formatlirH  rJ  r  ortalama_cevrim_suresi_formatli	son_kayitrT  rU  r#   r#   r$   r%    sN   



r%  z/bekleme_nedenleric               
   C   s   dt vr
ttdS tjdkr\tjd} | rQ|  rQzt|  d}t	j 
| t	j   tdd W n! tyP } zt	j   tdd	 W Y d }~n
d }~ww td
d	 ttdS tj }td|dS )Nrl   r   r   	neden_adir  zBekleme nedeni eklendi.r   u)   Bir hata oluştu, lütfen tekrar deneyin.r  !   Lütfen bir bekleme nedeni girin!bekleme_nedenlerizbekleme_nedenleri.html)nedenler)r   r   r   r   r   r   r   r  r  r?   r'  r(  r   r   rollbackr   r   r   )r  
yeni_nedenr"   r^  r#   r#   r$   r]    s&   




r]  z&/bekleme_nedeni_duzenle/<int:neden_id>c                 C   s|   dt vr
ttdS tj| }tjdkr8tj	d
 }|r-||_tj   tdd ntdd ttd	S td
|dS )Nrl   r   r   r  u   Bekleme nedeni güncellendi.r   r\  r  r]  zbekleme_nedeni_duzenle.htmlr  )r   r   r   r  r   r9  r   r   r   r   r  r  r?   r(  r   r   )neden_idr  r`  r#   r#   r$   bekleme_nedeni_duzenle/  s   


rb  z"/bekleme_nedeni_sil/<int:neden_id>c                 C   sL   dt vr
ttdS tj| }tj | tj   t	dd ttdS )Nrl   r   zBekleme nedeni silindi.r   r]  )
r   r   r   r  r   r9  r?   r  r(  r   )ra  r  r#   r#   r$   bekleme_nedeni_silD  s   

rc  z/is_emri_performansc                  C   s   t jt jdk } g }| D ]T}tjtjt	
tjtj|jktj }ddddd}|D ]\}}|||< q3||j|jrG|jjnd|j|jrP|jnd|j|d |d |d |d	 d
	 qtd|dS )NrM  r   r   r  r  r     Bilinmeyen Ürün   Açıklama yokr   r  r  r  )	rB   r  r  r  r  r   r  r  r  zis_emri_performans.html)is_emri_listesi)r  r   r6  r  r   r?   r   r  r  r   rj  r  rB   group_byr7  r  r  r  r  r   )r  rg  r  kalite_sayilarikalite_dagilimir  sayir#   r#   r$   is_emri_performansU  s6   

rl  z/is_emri_performans_jsonc                  C   s   t jt jdk } g }| D ]}tjtjt	
tjtj|jktj }ddddd}|D ]\}}|||< q3|j}|j}tjj|jdd }	tdd |	D }
|d |d	  |d
  |d  }|r{|r{|dkr{||  |
 }|| }nd}dd }||}|jr|jjr|jjnd}||}||j|jr|jjndt|dr|jr|jjnd|j|jr|jndt|dr|jr|jjnd|j|d |d	 |d
 |d ||t|dr|jr|jjr|jjnd t|dr|jr|jj r|jj nd d qt!|S )NrM  r   rd  r6  r7  c                 s   r8  rM   r9  r:  r#   r#   r$   r    r<  z*is_emri_performans_json.<locals>.<genexpr>r   r  r  r  c                 S   r=  r>  rA  rB  r#   r#   r$   rE    rF  z,is_emri_performans_json.<locals>.format_surere  r  zBilinmeyen Renkrf  r  zBilinmeyen Makiner  )rB   r  r  r  r  r  r  r   r  r  r  r  hedef_cevrim_suresir  r  )"r  r   r6  r  r   r?   r   r  r  r   rj  r  rB   rh  r  r  r  rW  rb  rP  r  r  r7  r  r&  r  r  r  r  r  r  r  r  r   )r  rg  r  ri  rj  r  rk  r  r  rI  r  rH  rJ  r  rE  rY  rm  hedef_cevrim_suresi_formatlir#   r#   r$   is_emri_performans_json  sn   

""
ro  )r   r   r   r   z/personel_performansc                  C   s  t jd} t jd}| r|stdg dddS t| d} t|dtdd tdd	 }tj	tj
d
k }g }tjttj	tj| ktj|k pRd}|dkretdg | d|ddS |D ]F}tj	tj| ktj|ktj|jktj|jkB tj|jkB tjtj }g }d }d }	g }
|D ]$}|d u s|j|ks|	|jkr|
r||
 g }
|
| |j}|j}	q|
r||
 d}d}d}g }|D ]x}|d j}tj|}|r|jr|jjnd}|rt|nd}|r|d jnd }|r|d jnd }|r|r||  nd}|dkr|| nd}|dkr*t || d dnd}||7 }||7 }||r<|j!ndt |d|||d q|r\t t"dd |D t| dnd}|rg|| d nd}t |d dt#t$d| d d  d}t%jj&|jd' }|rd|j( nd}||j|j) d|j* |pdt |d||||d qg|j+dd dd td||| d|ddS ) Nr   r   zpersonel_performans.htmlr   )personel_raporur   r   r  r   rI  )rW  r  r   rH   r0   r  r   )r  r+  uretim_sayisirm  cevrim_suresi_oranic                 s   s    | ]}|d  V  qdS )rs  Nr#   )rS  dr#   r#   r$   r  )  r  z&personel_performans.<locals>.<genexpr>g333333?gffffff?rM  r   r4  r   )rB   ad_soyadrr  uretim_yuzdesirs  toplam_puandetay_listesir5  c                 S   rd  )Nrw  r#   re  r#   r#   r$   rf  A  rg  z%personel_performans.<locals>.<lambda>Trh  )rp  toplam_uretimr   r   ),r   r  r   r   r   r  r   rE   r   r6  rW   r   r?   r   r   rj  r  rB   r  scalarrP  r  r  r  r   r  r7  r  r  r  rJ  rP  rj  r  rb  rM  absr   rW  r^  r   rT   rU   sort)r   r   r
  rp  ry  rI   r  is_emri_gruplarionceki_is_emrionceki_personelblokr;  r+  toplam_cevrim_sayisirw  rx  grupr  r  rm  rr  r  r  r.  r  rs  ortalama_cevrim_suresi_oranirv  
foto_kayitr5  r#   r#   r$   personel_performans  s    



	



 
*
r  z/kvkkc                   C   r  )Nz	kvkk.htmlr  r#   r#   r#   r$   kvkkN  r  r  z/personelyonetimic                   C   r  )Nzpersonelyonetimi.htmlr  r#   r#   r#   r$   personelyonetimiR  r  r  z/hakkimizdac                   C   r  )Nzhakkimizda.htmlr  r#   r#   r#   r$   
hakkimizdaV  r  r  z/izindefteric                   C   r  )Nzizindefteri.htmlr  r#   r#   r#   r$   izindefteriZ  r  r  )Responsec                   C   r  )Nr   r  r#   r#   r#   r$   homec  r  r  z/sitemap.xmlc                  C   s   g } t  d}g d}|D ]}| t|dd|ddd qtj }|D ]}| td|jdd	|j	r;|j	dn|d
dd q't
d| d}t|ddS )Nr  )r  r   r  iletisimbilgi_listesir  T)	_externalweeklyg?)loclastmod
changefreqprioritybilgi_detay)bilgi_idr  monthlyg333333?zsitemap.xml)pageszapplication/xml)mimetype)r   r   rP  r7  r   r   r   r   rB   r}   r   r  )r  ten_days_agostatic_pagespager   bilgisitemap_xmlr#   r#   r$   sitemapg  s(   



r  c              
   C   s   d}d}d}d|  }d|  d| d| d| }t  }	||	d< ||	d	< ||	d
< |	t|d z$tdd}
|
  |
|| |
|||	  |
	  t
d W d S  tyn } zt
dt| W Y d }~d S d }~ww )Nzalptekinalpan@gmail.comzoobw qqwq kkns zomsu   📩 Yeni İletişim Mesajı - zAd: z

Telefon: z

E-posta: z
Mesaj:
r  r  r  plainr  r  u$   ✅ E-posta başarıyla gönderildi!u(   ❌ E-posta gönderilirken hata oluştu:)r  r  r  r  r  r  r   r  r  r  r   r   r   )r7   phonerY   r   sender_emailsender_passwordreceiver_emailsubjectbodyr	  r  r"   r#   r#   r$   
send_email  s*   
r  z	/iletisimc                  C   s   t jdkrBt jd} t jd}t jd}t jd}| r%|r%|r%|s0tdd ttdS t| ||| td	d
 ttdS tdS )Nr   r7   r  rY   r   rF  r  r  uU   Mesajınız başarıyla gönderildi! En kısa sürede sizinle iletişime geçeceğiz.r   ziletisim.html)	r   r   r   r   r   r   r   r  r   )r7   r  rY   r   r#   r#   r$   r    s   


r  z$/uudodszebc3f1cj6h8tydsvaicgcs1.htmlc                   C   s   t dddS )Nr   z#uudodszebc3f1cj6h8tydsvaicgcs1.html)	directoryr   r   r#   r#   r#   r$   meta_domain_verification     r  c                   @   s   e Zd ZejejdddZejedddZejej	ddZ
ejedddZejedddZejejejdZdd	 Zd
S )r   Tra   rL   FrG   i,  rJ   c                 C   r4   )Nz<Bilgi r5   r   r8   r#   r#   r$   r:     r;   zBilgi.__repr__N)r<   r=   r>   r?   r@   rA   rB   rC   r   r^   contentr   meta_descriptionr{   r   r|   r}   r:   r#   r#   r#   r$   r     r   r   z/bilgi-eklec            	      C   s   t jdkrgt jd} t jd}t jd}t jd}d }|rN|jrNtjdd}tj	|dd	 t
 d
|j }tj||}|| |dd}t| |||d}tj| tj  ttdS tdS )Nr   r   r  r  r   r  uploadsTr   %Y%m%d%H%M%S_\r   )r   r  r  r   r  zbilgi_ekle.html)r   r   r   r   r)  r   r   r   r   makedirsr   r|   rP  r   r  r   r?   r   r'  r(  r   r   r   )	r   r  r  r   r   upload_folderr   image_save_path
yeni_bilgir#   r#   r$   
bilgi_ekle  s.   



r  z	/bilgilerc                  C   s"   t jt j  } td| dS )Nzbilgi_listesi.htmlr   )r   r   r   r}   r   r   r   r   r#   r#   r$   r    s   r  z/bilgi/<int:bilgi_id>c                 C   s   t j| }td|dS )Nzbilgi_detay.html)r  )r   r   r9  r   )r  r  r#   r#   r$   r    s   r  nl2brc                 C   s   |  ddS )N
z<br>)r  )r  r#   r#   r$   r    r  z/fiyatc                   C   r  )Nz
fiyat.htmlr  r#   r#   r#   r$   fiyat_sayfasi  r  r  z/hizmetlerimizc                   C   r  )Nzhizmetlerimiz.htmlr  r#   r#   r#   r$   hizmetlerimiz  r  r  z/toplu_mesajc                  C   s   dt vr
ttdS tj tjtjd k 	 } t
 }| D ]}|d r>dd |d dD }td|  || q t|}td|  td	|d
S )Nrl   r   r   c                 S   s   g | ]
}|  r|  qS r#   r  )rS  r!  r#   r#   r$   rU    s    ztoplu_mesaj.<locals>.<listcomp>r  u#   🔍 Bölüm parçalara ayrıldı: u-   📋 HTML için gönderilen bölüm listesi: ztoplu_mesaj.htmlr>  )r   r   r   r?   r   rE   rW   r6  distinctr   rh  rQ  r   r*  rx  r   )bolumler_raw	bolum_setr  parcalarr#  r#   r#   r$   toplu_mesaj  s   "
r  z/toplu_mesaj_gonderc                  C   s  t jd} t jd}t jd}t jd}td td|   td|  td|  d }|rx|jd	krxd
dlm} d
d l}|j	dd}|j
|dd | d|jdd }|j	||}	||	 d| }td|  g }
| dkrt jd}td|  |D ]$}tjtjd| d }td| dt| d |
| qn1| dkrt jd}td|  |D ]}tjj|d }td| d t| d |
| qd!d" |
D  }td#t|  |D ]~}|jrjd$| d%| }|j}|d&r|d'd  }td(|j d|j d)|  |r.td*|  zt|||d+}d,|v rEtd-|d,   ntd.|  W q tyi } ztd/t |  W Y d }~qd }~ww td0|j d|j  qt!t"d1S )2N
secim_tipibaslikr  gorselu    
🚀 Toplu Mesaj Gönderiliyor!u   📝 Seçim Tipi: u   📌 Başlık: u   📨 Mesaj: r   r   r
   r  r  Tr   r  r   r  z'https://izindefteri.com/static/uploads/u   🖼 Görsel kaydedildi: r  r#  u   🎯 Seçilen Bölümler: rb  u   📦 u    bölümünden u    kullanıcı bulundu.rolrolleru   🎯 Seçilen Roller: r\  u    rolünden c                 S   s   i | ]}|j |qS r#   r  )rS  r=  r#   r#   r$   r  A  r_  z&toplu_mesaj_gonder.<locals>.<dictcomp>u0   ✅ Toplam Gönderim Yapılacak Kişi Sayısı: u   📌 z

+r   u   📲 Mesaj Gönderiliyor: rk   u-   📎 Görsel mesajla birlikte gönderiliyor: )r   r   u    ❌ WhatsApp gönderim hatası: u$   ✅ WhatsApp gönderim başarılı: u   🚨 Beklenmeyen hata: u    ⚠️ Telefon numarası eksik: r  )#r   r   r   r)  r   r   r   r   r   r   r  r   rP  r  r   r&  rE   r   r6  rW   rd  r   rJ  extendrW  valuesrX   rI  rT   rU   r%   r   r   r   r   )r  r  r  r  r   r   r   uploads_dirr(  r  hedef_kullanicilarr<  r+  kullanicilarsecilen_rollerr  benzersiz_kullanicilar	kullanici	tam_mesajr  cevapr"   r#   r#   r$   toplu_mesaj_gonder  st   

 
r  __main__z0.0.0.0i  )debughostportrM   )rH   )F)flaskr   r   r   r   r   r   r   r   flask_sqlalchemyr	   r   zoneinfor   mathr   r   r   r   r   r   r   r%   r<   r   r   getcwdr*  
secret_keyreportlab.lib.pagesizesr)   reportlab.pdfgenr*   r+  r?   Modelr-   r   rE   r`   ru   r~   r   r   r   r   r   r   r   app_context
create_allr   router   r   werkzeug.utilsr   r   r   
sqlalchemyr   PILr   r   r   r  r   r  r2  r!  rB  rE  rL  r[  r   r   r   r   r   r   r  r  r  ri  r  r  r  r  r  r  r  twilio.restr  r  r  r  r  TEMPLATE_IZIN_TALEBI_ONAYLANDIr  r  r  r  email.mime.multipartr  email.mime.applicationr  email.mime.textr  r   r  r  r  r  r  reportlab.pdfbase.ttfontsr  reportlab.pdfbaser  dirnameabspath__file__base_dir	font_yoluregisterFontr  r%  r#  r/  r1  r4  r@  ry  collectionsrA  rB  r  r  r  r  r  r  r  r  r  r  rN  environtzsetr  r  r  r  r  sqlalchemy.ormr  r  r  r  r  r  rN   r  r  r  r  r  r  r&  r"  r,  r/  r3  r;  r<  r?  rI  rM  r  r  TWILIO_ACCOUNT_SIDTWILIO_AUTH_TOKENTWILIO_WHATSAPP_NUMBERTWILIO_TEMPLATE_IDr  r  r  r  r  r  r  MAX_FILE_SIZEr  r  r  r  r  r  r  BASE_DIRDATABASE_PATHr  r  r  r  r  r  r  r  r  r  r  r  rs   r  r  r  r  r  r   r!  r  r#  r/  r4  rK  rS  r%  r]  rb  rc  rl  ro  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  template_filterr  r  r  r  r  runr#   r#   r#   r$   <module>   s  $ 

			


1
$


T
4
(
)
*
=





)
8
 :
B


,
1

 
;
#>





$


X
 T




	


	





%


-

 i
'
!
@-4&
$

8=R7 T"
)
	

G
.6
$

	
&



 



.
	

	2#
6,Xe
G!
)
S
s



!





K

