a
    {J£iÄO  ã                   @   s¼  d dl mZmZmZmZ d dlZd dlmZ d dlm	Z	 ee
ƒZde_dddd	d
œZdd„ Zdd„ Zdd„ Zejdd„ ƒZejddgddd„ ƒZejddgddd„ ƒZejddgddd„ ƒZejdd gdd!d"„ ƒZe d#¡ed$d%„ ƒƒZejd&d gded'd(„ ƒƒZejd&dgded)d*„ ƒƒZejd+d,gded-d.„ ƒƒZejd+d/gded0d1„ ƒƒZejd2d gded3d4„ ƒƒZejd2dgded5d6„ ƒƒZejd7d,gded8d9„ ƒƒZejd:d gded;d<„ ƒƒZejd=d gded>d?„ ƒƒZ ejd=dgded@dA„ ƒƒZ!ejdBd gdedCdD„ ƒƒZ"ejdBdgdedEdF„ ƒƒZ#ejdGd/gdedHdI„ ƒƒZ$ejdJd gdedKdL„ ƒƒZ%e dM¡e dN¡e dO¡dPdQ„ ƒƒƒZ&e
dRkr¸ej'dSdTdUdV dS )Wé    )ÚFlaskÚrequestÚjsonifyÚsessionN)Údatetime©ÚwrapszR0mt3l3c0m!Z	localhostÚrootZ
romtelecomZevidenta_deconturi)ÚhostÚuserÚpasswordZdatabasec                   C   s   t jjf i t¤ŽS )N)ÚmysqlÚ	connectorZconnectÚ	DB_CONFIG© r   r   ú$/var/www/html/concedii/app_pontaj.pyÚget_db_connection   s    r   c                    s   t ˆ ƒ‡ fdd„ƒ}|S )Nc                     s&   dt vrtddiƒdfS ˆ | i |¤ŽS )NÚuser_idÚerrorÚNeautentificaté‘  )r   r   ©ÚargsÚkwargs©Úfr   r   Údecorated_function   s    z*login_required.<locals>.decorated_functionr   ©r   r   r   r   r   Úlogin_required   s    r   c                    s   t ˆ ƒ‡ fdd„ƒ}|S )Nc                     sD   dt vrtddiƒdfS t  d¡dkr6tddiƒdfS ˆ | i |¤ŽS )	Nr   r   r   r   ÚroleÚadminzAcces interzis. Doar admin.é“  )r   r   Úgetr   r   r   r   r   "   s
    z*admin_required.<locals>.decorated_functionr   r   r   r   r   Úadmin_required!   s    r#   c                 C   s<   | j  dd¡ | j  dd¡ | j  dd¡ | j  dd¡ | S )	NzAccess-Control-Allow-OriginÚ*zAccess-Control-Allow-HeaderszContent-Type,AuthorizationzAccess-Control-Allow-MethodszGET,PUT,POST,DELETE,OPTIONSz Access-Control-Allow-CredentialsÚtrue)ZheadersÚadd)Zresponser   r   r   Úafter_request-   s
    r'   z/api/<path:path>ZOPTIONS)Úmethodsc                 C   s   t i ƒdfS )NéÈ   )r   )Úpathr   r   r   Úoptions_handler5   s    r+   z
/api/loginZPOSTc            	   
   C   sz  t  ¡ } |  dd¡ ¡ }|  dd¡ ¡ }|r0|s@tddiƒdfS tƒ }|jdd}| d	|f¡ | ¡ }| 	¡  | 	¡  |sŒtdd
iƒdfS zLdd l
}|d }t|tƒr²| d¡}| | d¡|¡sÖtdd
iƒdfW S W nD ty } z*td|› ƒ tdd
iƒdfW  Y d }~S d }~0 0 |d td< |d td< |d td< | dd¡td< td|d |d |d td dœdœƒS )NÚusernameÚ r   r   zCompleteaza username si parolaé  T©Z
dictionaryz+SELECT * FROM employees WHERE username = %szUsername sau parola incorectar   r   úutf-8zEroare verificare parola: Úidr   Únamer   r   ©r1   r2   r,   r   )Úsuccessr   )r   Úget_jsonr"   Ústripr   r   ÚcursorÚexecuteÚfetchoneÚcloseÚbcryptÚ
isinstanceÚstrÚencodeZcheckpwÚ	ExceptionÚprintr   )	Údatar,   r   Úconnr7   r   r;   Úpassword_hashÚer   r   r   Úlogin<   sF    

&üþrE   z/api/logoutc                   C   s   t  ¡  tddiƒS )Nr4   T)r   Úclearr   r   r   r   r   Úlogoutk   s    rG   z/api/angajati-publiciZGETc                  C   s<   t ƒ } | jdd}| d¡ | ¡ }| ¡  |  ¡  t|ƒS )zREndpoint public - doar nume si username, fara autentificare, pentru lista de loginTr/   z2SELECT username, name FROM employees ORDER BY name©r   r7   r8   Úfetchallr:   r   ©rB   r7   Zangajatir   r   r   Úget_angajati_publiciq   s    
rK   z/api/current-userc                   C   s"   t td td td td dœƒS )Nr   r2   r,   r   r3   )r   r   r   r   r   r   Úcurrent_user}   s    ürL   z/api/lucraric                  C   sz   t ƒ } | jdd}| d¡ | ¡ }| ¡  |  ¡  |D ]8}| d¡rV|d  ¡ |d< | d¡r8|d  ¡ |d< q8t|ƒS )NTr/   z3SELECT * FROM lucrari ORDER BY status ASC, nume ASCÚdata_creareÚdata_modificare)r   r7   r8   rI   r:   r"   Ú	isoformatr   )rB   r7   ZlucrariÚlr   r   r   Úget_lucrariŠ   s    


rQ   c                  C   sÜ   t  ¡ } |  dd¡ ¡ }|  dd¡ ¡ }|  dd¡}|sHtddiƒdfS |d	vrTd}tƒ }|jd
d}| d||ptd |f¡ | ¡  |j	}| d|f¡ | 
¡ }| ¡  | ¡  |d  ¡ |d< |d  ¡ |d< t|ƒdfS )NÚnumer-   ÚlocatieÚstatusÚactivar   z#Denumirea lucrarii este obligatorier.   )rU   Z
finalizataZ
suspendataTr/   z?INSERT INTO lucrari (nume, locatie, status) VALUES (%s, %s, %s)z#SELECT * FROM lucrari WHERE id = %srM   rN   éÉ   )r   r5   r"   r6   r   r   r7   r8   ÚcommitÚ	lastrowidr9   r:   rO   )rA   rR   rS   rT   rB   r7   Únew_idZlucrarer   r   r   Úadd_lucrareœ   s.    þrZ   z/api/lucrari/<int:id>ZPUTc                 C   s`   t  ¡ }tƒ }| ¡ }| d| d¡| d¡| d¡| f¡ | ¡  | ¡  | ¡  tddiƒS )Nz=UPDATE lucrari SET nume=%s, locatie=%s, status=%s WHERE id=%srR   rS   rT   r4   T)	r   r5   r   r7   r8   r"   rW   r:   r   )r1   rA   rB   r7   r   r   r   Úupdate_lucrare¼   s    þr[   ZDELETEc                 C   s‚   t ƒ }| ¡ }| d| f¡ | ¡ d }|dkrP| ¡  | ¡  tddiƒdfS | d| f¡ | ¡  | ¡  | ¡  tddiƒS )	Nz2SELECT COUNT(*) FROM pontaje WHERE lucrare_id = %sr   r   zOLucrarea are pontaje asociate si nu poate fi stearsa. Marcheaz-o ca finalizata.r.   z!DELETE FROM lucrari WHERE id = %sr4   T)r   r7   r8   r9   r:   r   rW   )r1   rB   r7   Úcountr   r   r   Údelete_lucrareÌ   s    r]   z/api/pontajec                  C   s@  t ƒ } | jdd}t dd¡}td }tj d¡}tj d¡}tj d¡}d	}g }|d
krl|d7 }| |¡ |r†|d7 }| t|ƒ¡ |rœ|d7 }| |¡ |r²|d7 }| |¡ |d7 }| ||¡ | 	¡ }	| 
¡  |  
¡  |	D ]T}
dD ]}|
 |¡rê|
|  ¡ |
|< qêdD ]&}|
 |¡d urt|
| ƒ|
|< qqât|	ƒS )NTr/   r   r   r   Ú
lucrare_idÚ
data_startÚdata_enda[  
        SELECT p.*,
               e.name   AS angajat_nume,
               e.username AS angajat_username,
               l.nume   AS lucrare_nume,
               l.locatie AS lucrare_locatie
        FROM pontaje p
        LEFT JOIN employees e ON p.employee_id = e.id
        LEFT JOIN lucrari l   ON p.lucrare_id  = l.id
        WHERE 1=1
    r    z AND p.employee_id = %sz AND p.lucrare_id = %sz AND DATE(p.checkin_ora) >= %sz AND DATE(p.checkin_ora) <= %sz ORDER BY p.checkin_ora DESC©Úcheckin_oraÚcheckout_orarM   ©Úcheckin_latÚcheckin_lngÚcheckout_latÚcheckout_lng)r   r7   r   r"   r   r   ÚappendÚintr8   rI   r:   rO   Úfloatr   )rB   r7   r   r   r^   r_   r`   ZsqlÚparamsZpontajeÚpÚkeyr   r   r   Úget_pontajeá   sD    



ro   c               	   C   sP  t  ¡ } |  d¡}|s&tddiƒdfS td }tƒ }|jdd}| d|f¡ | ¡ }|rz| 	¡  | 	¡  tdd	iƒdfS |  d
¡}|  d¡}|  d¡}|  dd¡ 
¡ pªd}	| d||||||	f¡ | ¡  |j}
| d|
f¡ | ¡ }| 	¡  | 	¡  |d  ¡ |d< |d  ¡ |d< dD ]&}| |¡durt|| ƒ||< qt|ƒdfS )z"Check-In: inceput sesiune de lucrur^   r   zLucrarea este obligatorier.   r   Tr/   zFSELECT id FROM pontaje WHERE employee_id = %s AND checkout_ora IS NULLzHAi deja o sesiune activa. Efectueaza Check-Out inainte de a incepe alta.re   rf   Úcheckin_accuracyÚ	obs_startr-   Nzº
        INSERT INTO pontaje
            (employee_id, lucrare_id, checkin_ora, checkin_lat, checkin_lng, checkin_accuracy, obs_start)
        VALUES (%s, %s, NOW(), %s, %s, %s, %s)
    úà
        SELECT p.*, e.name AS angajat_nume, l.nume AS lucrare_nume
        FROM pontaje p
        LEFT JOIN employees e ON p.employee_id = e.id
        LEFT JOIN lucrari l ON p.lucrare_id = l.id
        WHERE p.id = %s
    rb   rM   ©re   rf   rV   )r   r5   r"   r   r   r   r7   r8   r9   r:   r6   rW   rX   rO   rk   )rA   r^   r   rB   r7   Zsesiune_activare   rf   rp   rq   rY   Úpontajrn   r   r   r   Ú
add_pontaj   sJ    
þ


üúru   z/api/pontaje/<int:id>/checkoutc              	   C   s¼  t  ¡ }td }t dd¡}tƒ }|jdd}| d| f¡ | ¡ }|sh| ¡  | ¡  t	ddiƒd	fS |d
krœ|d |krœ| ¡  | ¡  t	ddiƒdfS |d rÄ| ¡  | ¡  t	ddiƒdfS | d¡}| d¡}| d¡}	| dd¡ 
¡ pôd}
|d }t ¡ }t||  ¡ d ƒ}| d|||	|
|| f¡ | ¡  | d| f¡ | ¡ }| ¡  | ¡  dD ]"}| |¡rd||  ¡ ||< qddD ]&}| |¡durŒt|| ƒ||< qŒt	|ƒS )z#Check-Out: sfarsit sesiune de lucrur   r   r   Tr/   z#SELECT * FROM pontaje WHERE id = %sr   úPontaj negasité”  r    Úemployee_idúNu ai acces la acest pontajr!   rc   zCheck-Out deja inregistratr.   rg   rh   Úcheckout_accuracyÚobs_endr-   Nrb   é<   a  
        UPDATE pontaje SET
            checkout_ora        = NOW(),
            checkout_lat        = %s,
            checkout_lng        = %s,
            checkout_accuracy   = %s,
            obs_end             = %s,
            durata_minute       = %s
        WHERE id = %s
    rr   ra   rd   )r   r5   r   r"   r   r7   r8   r9   r:   r   r6   r   Znowrj   Ztotal_secondsrW   rO   rk   )r1   rA   r   r   rB   r7   rt   rg   rh   rz   r{   rb   rc   Zdurata_minuteZpontaj_updatedrn   r   r   r   Úcheckout_pontaj\  sV    


	÷
úr}   z/api/pontaje/sesiune-activac                  C   sœ   t d } tƒ }|jdd}| d| f¡ | ¡ }| ¡  | ¡  |sLtdƒS |d  ¡ |d< |d  ¡ |d< dD ]"}| |¡durpt	|| ƒ||< qpt|ƒS )	z?Returneaza sesiunea activa (fara checkout) a angajatului curentr   Tr/   a0  
        SELECT p.*, e.name AS angajat_nume, l.nume AS lucrare_nume
        FROM pontaje p
        LEFT JOIN employees e ON p.employee_id = e.id
        LEFT JOIN lucrari l ON p.lucrare_id = l.id
        WHERE p.employee_id = %s AND p.checkout_ora IS NULL
        ORDER BY p.checkin_ora DESC LIMIT 1
    Nrb   rM   rs   )
r   r   r7   r8   r9   r:   r   rO   r"   rk   )r   rB   r7   rt   rn   r   r   r   Úget_sesiune_activa¦  s"    ùr~   z/api/comentariic                  C   s°   t j d¡} | s tddiƒdfS tƒ }|jdd}| dt| ƒf¡ | ¡ }| 	¡  | 	¡  |D ]F}| d¡r~|d  
¡ |d< d	D ]"}| |¡d ur‚t|| ƒ||< q‚q`t|ƒS )
NÚ	pontaj_idr   zpontaj_id este obligatoriur.   Tr/   zÂ
        SELECT c.*, e.name AS angajat_nume
        FROM pontaje_comentarii c
        LEFT JOIN employees e ON c.employee_id = e.id
        WHERE c.pontaj_id = %s
        ORDER BY c.ora ASC
    Úora©Úlocatie_latÚlocatie_lng)r   r   r"   r   r   r7   r8   rj   rI   r:   rO   rk   )r   rB   r7   Z
comentariiÚcrn   r   r   r   Úget_comentariiÇ  s$    ú
r…   c               
   C   sž  t  ¡ } |  d¡}|  dd¡ ¡ }|r*|s:tddiƒdfS td }t dd	¡}tƒ }|jd
d}| d|f¡ | 	¡ }|sš| 
¡  | 
¡  tddiƒdfS |dkrÎ|d |krÎ| 
¡  | 
¡  tddiƒdfS |  dd¡}d}	||	vrêd}|  d¡}
|  d¡}|  d¡}| d|||||
||f¡ | ¡  |j}| d|f¡ | 	¡ }| 
¡  | 
¡  |d  ¡ |d< dD ]&}| |¡d urjt|| ƒ||< qjt|ƒdfS )Nr   Útextr-   r   z"pontaj_id si text sunt obligatoriir.   r   r   r   Tr/   z;SELECT employee_id, checkout_ora FROM pontaje WHERE id = %srv   rw   r    rx   ry   r!   ÚtipÚ	alt_motiv)Zfront_lucruZ	materialeZutilajeZconditiirˆ   r‚   rƒ   Úlocatie_accuracyz´
        INSERT INTO pontaje_comentarii
            (pontaj_id, employee_id, tip, text, locatie_lat, locatie_lng, locatie_accuracy)
        VALUES (%s, %s, %s, %s, %s, %s, %s)
    z 
        SELECT c.*, e.name AS angajat_nume
        FROM pontaje_comentarii c
        LEFT JOIN employees e ON c.employee_id = e.id
        WHERE c.id = %s
    r€   r   rV   )r   r5   r"   r6   r   r   r   r7   r8   r9   r:   rW   rX   rO   rk   )rA   r   r†   r   r   rB   r7   rt   r‡   Zvalid_tipurir‚   rƒ   r‰   rY   Z
comentariurn   r   r   r   Úadd_comentariuå  sT    



üûrŠ   z/api/angajatic                  C   s<   t ƒ } | jdd}| d¡ | ¡ }| ¡  |  ¡  t|ƒS )NTr/   z<SELECT id, name, username, role FROM employees ORDER BY namerH   rJ   r   r   r   Úget_angajati(  s    
r‹   c            
      C   s  dd l } t ¡ }| dd¡ ¡ }| dd¡ ¡ }| dd¡ ¡ }| dd¡}|rX|rX|shtdd	iƒd
fS |  | d¡|  ¡ ¡ 	d¡}t
ƒ }| ¡ }z&| d||||f¡ | ¡  |j}	W n6 tjjyî   | ¡  | ¡  tddiƒd
f Y S 0 | ¡  | ¡  t|	|||dœƒdfS )Nr   r2   r-   r,   r   r   r   r   z)Nume, username si parola sunt obligatoriir.   r0   zNINSERT INTO employees (name, username, password, role) VALUES (%s, %s, %s, %s)zUsername-ul exista dejar3   rV   )r;   r   r5   r"   r6   r   Zhashpwr>   ZgensaltÚdecoder   r7   r8   rW   rX   r   r   ZIntegrityErrorr:   )
r;   rA   r2   r,   r   r   rC   rB   r7   rY   r   r   r   Úadd_angajat4  s2    
þ
r   z/api/angajati/<int:id>c                 C   s\   | t d krtddiƒdfS tƒ }| ¡ }| d| f¡ | ¡  | ¡  | ¡  tddiƒS )Nr   r   z Nu te poti sterge pe tine insutir.   z#DELETE FROM employees WHERE id = %sr4   T)r   r   r   r7   r8   rW   r:   )r1   rB   r7   r   r   r   Údelete_angajatU  s    rŽ   z/api/statisticic                  C   s¤   t ƒ } | jdd}| d¡ | ¡ d }| d¡ | ¡ d }| d¡ | ¡ d }| d¡ | ¡ d }| d¡ | ¡ d }| ¡  |  ¡  t|||||d	œƒS )
NTr/   z'SELECT COUNT(*) AS total FROM employeesÚtotalz=SELECT COUNT(*) AS total FROM lucrari WHERE status = 'activa'z%SELECT COUNT(*) AS total FROM pontajez@SELECT COUNT(*) AS total FROM pontaje WHERE checkout_ora IS NULLz0SELECT COUNT(*) AS total FROM pontaje_comentarii)Útotal_angajatiÚlucrari_activeÚtotal_pontajeÚsesiuni_activeÚtotal_comentarii)r   r7   r8   r9   r:   r   )rB   r7   r   r‘   r’   r“   r”   r   r   r   Úget_statisticie  s*    




ûr•   ú/z/pontajz/pontaj/c                  C   s2   ddl m}  ddl}|j |j t¡¡}| |dƒS )z.Serveste fisierul HTML al aplicatiei de pontajr   )Úsend_from_directoryNzpontaj.html)Úflaskr—   Úosr*   ÚdirnameÚabspathÚ__file__)r—   r™   Zbase_dirr   r   r   Úserve_pontajˆ  s    r   Ú__main__z0.0.0.0i‰  F)r
   ÚportÚdebug)(r˜   r   r   r   r   Zmysql.connectorr   r   Ú	functoolsr   Ú__name__ÚappZ
secret_keyr   r   r   r#   r'   Zrouter+   rE   rG   rK   rL   rQ   rZ   r[   r]   ro   ru   r}   r~   r…   rŠ   r‹   r   rŽ   r•   r   Úrunr   r   r   r   Ú<module>   s”   ü


.

=:HA
!
