
    s]jYI                     ~   d dl mZ d dlmZ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mZ d dlmZ d dlmZ d	d
lmZmZmZ d	dlmZmZmZ d	dlmZmZmZm Z  d	dl!m"Z"m#Z# d	dl$m%Z% d	dl&m'Z'm(Z( d	dl)m*Z*m+Z+m,Z,  ee-      j]                         j^                  Z0 e e1e0dz              Z2d e2jf                  jh                  d<    ed      Z5e5jm                  d e e1e0dz              d       e5jo                  d      d        Z8e5jo                  d      d        Z9dZ:dZ;d Z<d!Z=e5j}                  d"      d#efd$       Z?e5j                  e ej                         %       e5j                  d&      d#efd'       ZCe5j                  d(       ed)       ed)       ed*      fd#ed+e1d,e1d-e1fd.       ZEe5j                  d/      d#efd0       ZFe5j                  d1      d2        ZGe5j                  d3      d#efd4       ZHe5j                  d5       ed)       ed)       ed*       ed6       ee      fd#ed7e1d8e1d9e1d:e1d;efd<       ZIe5j                  d=      d#efd>       ZJe5j                  d?       ed)       ed)       ee      fd#ed7e1d8e1d;efd@       ZKe5j                  dA      d#efdB       ZLe5j                  dC       ee      fd#ed;efdD       ZMe5j                  dE       ed)       ed)       ed)       ee      fd#ed7e1d8e1dFe1d;ef
dG       ZNe5j                  dH       ed)       ed)       ee      fd#edIeOdJe1dKe1d;ef
dL       ZPe5j                  dM       ee      fdIeOd;efdN       ZQe5j                  dO      dP ee      fd#edQe1d;efdR       ZRe5j                  dS      dT        ZSe5j                  dU       ee      fd#edVeOd;efdW       ZTe5j                  dX       ed*       ee      fdVeOdYe1d;efdZ       ZUe5j                  d[       ed)       ed)       ed*       ed*       ed\       ed\       ed\       ed*       ee      f	dVeOd]eOd^e1d_e1d`e1dae1dbe1dce1dde1d;efde       ZVe5j                  df       ee      fd#ed;efdg       ZWdhZXe5j                  di       ed)       ed*       ed*       ed*       ee      fdje1dke1dle1dme1d;ef
dn       ZYe5j                  do       ed)       ed*       ed*       ed*       edp       edq       edr       ed*       ee      f	d]eOdje1dke1dle1dme1dse1dte1due1dve1d;efdw       ZZe5j                  dx       ee      fd]eOd;efdy       Z[e5j                  dz      d#efd{       Z\e5j                  d|       ed)      fd}eOfd~       Z]e5j                  d      d        Z^y)    )Path)datetimetimezone)FastAPIRequestFormDependsHTTPException)RedirectResponse)StaticFiles)Jinja2Templates)Session)SessionMiddleware   )securitylicense_onlineauth)init_dbget_dbSessionLocal)TruckMaintenanceItemMaintenanceRecordUser)compute_item_statusworst_status)get_geotab_client)run_syncseed_default_maintenance_items)start_scheduler
rescheduleshutdown_scheduler	templates)	directoryc                  2    t        j                         xs i S N)r   load_active_license     >D:/Nextcloud/SISTEMAS WINDOWS/frota-trucks-cliente/app/main.py<lambda>r+      s    x/K/K/M/SQS/Sr)   header_infozFrota Trucks)title/staticstatic)namestartupc                      t                t               } 	 t        j                  |        | j	                          t        j                          t                y # | j	                          w xY wr&   )r   r   r   seed_default_usercloser   refresh_from_serverr    )dbs    r*   
on_startupr7      sI    I	Br"

&&( 	
s   A A,shutdownc                      t                y r&   )r"   r(   r)   r*   on_shutdownr:   (   s    r)   )r.   	/ativacao/api/ativacao)/setup
/api/setup)
/renovacao/api/licenca/verificar-agora)/login
/api/loginhttprequestc                 J  K   | j                   j                  }|j                  t              s|j                  t              r ||        d {   S t        j                         s?t        j                         rnt        j                         rt        d      S t        d      S t        j                         rAt
        j                  j                          t        j                         rdnd}t        |      S |j                  t              r ||        d {   S t        j                         st        d      S |j                  t               r ||        d {   S | j"                  j%                  d      st        d      S  ||        d {   S 7 L7 7 ?7 w)Nr?   r;   r=   	logged_inrA   )urlpath
startswithPUBLIC_PREFIXESRENOVACAO_PREFIXESr   r'   r   r5   known_activation_datar   is_server_blockedBLOCK_FLAG_FILEtouchSETUP_PREFIXEShas_geotab_credentialsLOGIN_PREFIXESsessionget)rD   	call_nextrH   dests       r*   gate_middlewarerW   3   s@    ;;D'4??;M+Nw''''')--/113#L11#K00		)	)	+  &&(-CCE|;%%~&w'''**,))~&w'''??{+))7###5 ( ( (
 $sJ   AF#FCF#FAF#F 5F#F!F#F#F#!F#)
secret_keyr;   c                     t        j                         r%t        t        j                         sd      S d      S t        j                  d| d d      S )Nr=   /activation.htmlrD   error)r   r'   r   rQ   r#   TemplateResponserD   s    r*   ativacao_formr`   \   sG    ##%0O0O0Q[[WZ[[%%&7WW[9\]]r)   r<   . nome_empresacodigolicense_keyc           	      f   |j                         }|j                         }|r|}n2t        j                  |      }|st        j	                  d| d||d      S t        j                  ||      \  }}|st        j	                  d| ||||d      S t        j                  |||       t        dd      S )Nr[   u   Nenhuma chave encontrada pra esse código (sem internet, ou o fornecedor ainda não publicou). Tente de novo em instantes, ou digite a chave manualmente se já recebeu uma.)rD   r]   submitted_empresasubmitted_codigo)rD   r]   submitted_keyrf   rg   r=   /  status_code)	stripr   fetch_published_keyr#   r^   r   validate_license_keysave_licenser   )rD   rb   rc   rd   
machine_idchaveokinfo_or_errors           r*   ativacao_submitrt   c   s     J##%K22:>--.?"t%1z	B   !55j%HB))*;(|ak>
  	 %}=H#66r)   r?   c                 v    t        j                         }t        j                  d| |r|d   d      S d d      S )Nzrenovacao.htmlrp   )rD   rc   )r   rL   r#   r^   )rD   dadoss     r*   renovacao_pagerw      sI    002E%%&6UeL&99  HL9  r)   r@   c                  X    t        j                         } t        | rdd      S dd      S )NrZ   r?   ri   rj   )r   r5   r   )rr   s    r*   verificar_licenca_agorary      s)    		+	+	-B2CSII<SIIr)   r=   c                 r    t        j                         rt        d      S t        j	                  d| d d      S )NrZ   
setup.htmlr\   )r   rQ   r   r#   r^   r_   s    r*   
setup_formr|      s2    &&($$%%lRV4WXXr)   r>   zmy.geotab.comusernamepassworddatabaseserverr6   c           
      (   ||||d}	 t        |      }|j                          t        j                  ||||       t        |       t                t        dd      S # t        $ r)}t        j	                  d| d| |||d      cY d }~S d }~ww xY w)	N)r}   r~   r   r   )credentialsr{   u   Não foi possível conectar: )rD   r]   r}   r   r   rZ   ri   rj   )
r   get_devices	Exceptionr#   r^   r   save_geotab_credentialsr   r   r   )	rD   r}   r~   r   r   r6   credsclientexcs	            r*   setup_submitr      s     "xXY_`E"u5 $$Xx6J"2&JCS11  )),+H)N h&9
  	s   A 	B(BBBrA   c                 4    t         j                  d| d d      S )N
login.htmlr\   )r#   r^   r_   s    r*   
login_formr      s    %%lRV4WXXr)   rB   c                     t        j                  |||      st        j                  d| d|d      S d| j                  d<   || j                  d<   t        dd	      S )
Nr   u   Usuário ou senha incorretos.)rD   r]   r}   TrF   r}   rZ   ri   rj   )r   verify_userr#   r^   rS   r   )rD   r}   r~   r6   s       r*   login_submitr      sd     B(3)),)HV^9
  	 $(GOOK "*GOOJCS11r)   z/api/logoutc                 P    | j                   j                          t        dd      S )NrA   ri   rj   )rS   clearr   r_   s    r*   logoutr      s    OOH#66r)   	/usuariosc                     |j                  t              j                  t        j                        j	                         }t
        j                  d| |d d      S )Nusuarios.htmlrD   usersr]   )queryr   order_byr}   allr#   r^   )rD   r6   r   s      r*   usuarios_pager      sH    HHTN##DMM2668E%%oUT8  r)   z/api/usuariosconfirmar_senhac                    |j                  t              j                  t        j                        j	                         }t        |      dk  rt        j                  d| |dd      S ||k7  rt        j                  d| |dd      S |j                  t              j                  |      j                         rt        j                  d| |dd      S t        j                  |||       t        dd	
      S )N   r   ,A senha precisa ter pelo menos 4 caracteres.r      As senhas não conferem.)r}   u%   Já existe um usuário com esse nome.r   ri   rj   )r   r   r   r}   r   lenr#   r^   	filter_byfirstr   create_userr   )rD   r}   r~   r   r6   r   s         r*   criar_usuarior      s     HHTN##DMM2668E
8}q))/9g<
  	 ?"))/9S<
  	 
xx~288:))/9`<
  	 	R8,KS99r)   z/api/usuarios/{user_id}/senhauser_id
nova_senhaconfirmar_nova_senhac                 X   |j                  t              j                  t        j                        j	                         }t        |      dk  rt        j                  d| |dd      S ||k7  rt        j                  d| |dd      S t        j                  |||       t        dd      S )	Nr   r   r   r   r   r   ri   rj   )r   r   r   r}   r   r   r#   r^   r   change_passwordr   )rD   r   r   r   r6   r   s         r*   trocar_senha_usuarior      s     HHTN##DMM2668E
:))/9g<
  	 ))))/9S<
  	 	Wj1KS99r)   z/api/usuarios/{user_id}/excluirc                     |j                  t              j                         dk  rt        dd      t	        j
                  ||        t        dd      S )Nr     u-   Não é possível excluir o último usuário.r   ri   rj   )r   r   countr
   r   delete_userr   )r   r6   s     r*   excluir_usuarior      sF    	xx~"C!PQQR!KS99r)   rZ   todosstatusc           
      v   |dv r|nd}|j                  t              j                  d      j                  t        j                        j                         }|j                  t              j                  d      j                         }g }t        |      dddd}|D ]  }g }	|D ]  }
|j                  t              j                  |j                  |
j                        j                  t        j                  j                               j                         }t        ||
|      }|	j                  |d           |	D cg c]
  }|d	k7  s	| }}|rt        |      n|	rd	nd
}||v r||xx   dz  cc<   |j                  ||d        |dk7  r|D cg c]  }|d   |k(  s| }}|j                  t              j!                  t        j"                  j%                  d             j                  t        j"                  j                               j                         }d }|r8|j"                  j'                  t(        j*                        j-                         }d }t/        j0                         }|r|d   dk7  rt3        j4                  |d   t(        j*                        j7                         }|t3        j8                  t(        j*                        j7                         z
  j:                  }|dk  rd| d}t<        j?                  d| ||||r|jA                  d      nd |d      S c c}w c c}w )N)rr   vencendovencidor   Tactiver   )totalrr   r   r   truck_iditem_idr   sem_registrosem_configuracaor   )truckr   tzinfoexpires_epochtz   zFaltam u    dia(s) para o fim da licença.zdashboard.htmlz%d/%m/%Y %H:%M)rD   truckscountsfiltro	last_syncmensalidade_aviso)!r   r   r   r   r0   r   r   r   r   idservice_datedescr   r   appendr   filterlast_synced_atisnotreplacer   utc
astimezoner   r'   r   fromtimestampdatenowdaysr#   r^   strftime)rD   r   r6   r   r   itemsrowsr   r   statusesitemlast_recordresultstrackedrlast_sync_trucklast_sync_localr   license_info	expira_emdias_restantess                         r*   	dashboardr      s   !>>VGFXXe_&&d&3<<UZZHLLNFHH_%//t/<@@BED6{!qIFD*+EHHdgg>+88==?@	  )kBFOOF8,-  '>h!~*=1h>*1g&(XjV6NaNev67 " 94a1X;&#849hhuo,,U-A-A-G-G-MNWWX]XlXlXqXqXstzz|OO)88@@@U``b//1L_5:**<+HX\\Z__a	#hll8<<&@&E&E&GGMMQ").)99X Y%%&6dfCR_--.>?X\.9  - ? :s   
L1L1L6&L6z	/api/syncc                  0    t                t        dd      S )NrZ   ri   rj   )r   r   r(   r)   r*   api_syncr   -  s    JCS11r)   z/trucks/{truck_id}r   c           	         |j                  t        |      }|t        dd      |j                  t              j                  d      j                         }g }|D ]  }|j                  t              j                  |j                  |j                        j                  t        j                  j                               j                         }t        |||      }|j                  ||d|        |j                  t              j                  |j                        j                  t        j                  j                               j                  d      j                         }	t         j#                  d	| ||||	d
      S )N     Truck não encontradoTr   r   )r   r   )r      ztruck_detail.html)rD   r   r   r   history)rT   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   limitr#   r^   )
rD   r   r6   r   r   r   r   r   r   r   s
             r*   truck_detailr   5  s?   FF5(#E}C!899HH_%//t/<@@BEDHH&'Y$''Y:X'4499;<UW	 	 %UD+>T+HHI  	"#	EHH	%	#00557	8	r	  %%&9UD5U\<  r)   z/api/trucks/{truck_id}engine_modelc                     |j                  t        |       }|t        dd      |xs d |_        |j	                          t        d|  d      S )Nr   r   /trucks/ri   rj   )rT   r   r
   r   commitr   )r   r   r6   r   s       r*   update_truckr   T  sO    FF5(#E}C!899%-EIIKhxj1sCCr)   z!/api/trucks/{truck_id}/manutencao0r   r   mileage_at_servicehours_at_service
parts_cost
labor_costdowntime_daysnotesc
                    |	j                  t        |       }
|
t        dd      t        | |t	        j
                  |d      j                  t        j                        |rt        |      n|
j                  |rt        |      n|
j                  t        |xs d      t        |xs d      t        |xs d      |xs d 	      }|	j                  |       |	j                          t        d|  d	      S )
Nr   r   z%Y-%m-%dr   r   )	r   r   r   r   r   r   r   r   r   r   ri   rj   )rT   r   r
   r   r   strptimer   r   r   floatodometer_milesengine_hoursaddr   r   )r   r   r   r   r   r   r   r   r   r6   r   records               r*   register_maintenancer  ^  s     FF5(#E}C!899&&|Z@HHPXP\P\H]8J5!34PUPdPd4D/0%J\J\q)q)M.Q/mt
F FF6NIIKhxj1sCCr)   /manutencaoc                     |j                  t              j                  t        j                        j	                         }t
        j                  d| |d      S )Nzmanutencao.html)rD   r   )r   r   r   r0   r   r#   r^   )rD   r6   r   s      r*   maintenance_items_pager    sD    HH_%../C/CDHHJE%%&7WW\9]^^r)   g?z/api/manutencaor0   interval_milesinterval_hoursinterval_daysc                 P   |rt        |      nd }|rt        |      nd }|rt        |      nd }|j                  t        | ||||rt	        |t
        z        nd|rt	        |t
        z        nd|rt	        |t
        z        nd             |j                          t        dd      S )N        )r0   r  r	  r
  warning_mileswarning_hourswarning_daysr  ri   rj   )r   intr  r   roundWARNING_FRACTIONr   r   )r0   r  r	  r
  r6   mileshoursr   s           r*   create_maintenance_itemr    s     &4E.!E%3E.!E!.3}DDFF?9>eE$445D9>eE$445B7;U4"223  IIKMs;;r)   z/api/manutencao/{item_id}15002515r  r  r  r   c
                    |	j                  t        |       }
|
t        dd      ||
_        |rt	        |      nd |
_        |rt	        |      nd |
_        |rt        |      nd |
_        t	        |xs d      |
_	        t	        |xs d      |
_
        t        |xs d      |
_        t        |      |
_        |	j                          t        dd      S )	Nr      Item não encontrador  r  r  r  ri   rj   )rT   r   r
   r0   r   r  r	  r  r
  r  r  r  boolr   r   r   )r   r0   r  r	  r
  r  r  r  r   r6   r   s              r*   update_maintenance_itemr    s     66/7+D|C!788DI3A%/tD3A%/tD/<]+$D}45D}23DL.B/Dv,DKIIKMs;;r)   z!/api/manutencao/{item_id}/excluirc                 ,   |j                  t        |       }|t        dd      |j                  t              j                  |       j                         d u}|rt        dd      |j                  |       |j                          t        dd      S )	Nr   r  )r   r   ue   Não é possível excluir um item com histórico de manutenção registrado. Desative-o em vez disso.r  ri   rj   )
rT   r   r
   r   r   r   r   deleter   r   )r   r6   r   tem_registros       r*   excluir_maintenance_itemr"    s    66/7+D|C!78888-.888IOOQY]]LC  "I  J  	JIIdOIIKMs;;r)   /configuracoesc                 ~   t        j                         }|rOt        |      }|d   dk(  rdn6t        j                  |d   t
        j                        j                  d      |d<   t        j                         xs i }t        j                         }t        j                  d| ||j                  d      |d	   d
      S )Nr   r   u   sem expiraçãor   z%d/%m/%Yexpires_displayzconfiguracoes.htmlr}   sync_interval_minutes)rD   r   geotab_usernamer&  )r   r'   dictr   r   r   r   r   load_geotab_credentialsload_settingsr#   r^   rT   )rD   r   r   settingss       r*   settings_pager,    s    //1LL)!-o!>!!C''_(E(,,W``akl 	&' ,,.4"E%%'H%%&:L 99Z0!)*A!B=  r)   z /api/configuracoes/sync-intervalr&  c                     t        j                         }t        d|       |d<   t        j                  |       t	        |d          t        dd      S )Nr   r&  r#  ri   rj   )r   r*  maxsave_settingsr!   r   )r&  r+  s     r*   update_sync_intervalr0    sM    %%'H(+A/D(EH$%8$x/01,#>>r)   z/api/configuracoes/reconectarc                  \    t         j                  j                  d       t        dd      S )NT)
missing_okr=   ri   rj   )r   CREDENTIALS_FILEunlinkr   r(   r)   r*   reconectar_geotabr5    s&    $$$5H#66r)   N)_pathlibr   r   r   fastapir   r   r   r	   r
   fastapi.responsesr   fastapi.staticfilesr   fastapi.templatingr   sqlalchemy.ormr   starlette.middleware.sessionsr   ra   r   r   r   r   r   r   r   modelsr   r   r   r   maintenance_logicr   r   geotab_clientr   sync_servicer   r   	schedulerr    r!   r"   __file__resolveparentAPP_DIRstrr#   envglobalsappmounton_eventr7   r:   rJ   rP   rK   rR   
middlewarerW   add_middlewareget_session_secretrT   r`   postrt   rw   ry   r|   r   r   r   r   r   r   r  r   r   r   r   r   r   r  r  r  r  r  r"  r,  r0  r5  r(   r)   r*   <module>rP     s    ' B B . + . " ; , , 3 3 C C @ , B F F
x.
 
 
"
)
)c'K*?&@A	'S	  m $N# 		)[3w/A+BC(	 S i  j  <)C ) $7 $ $F   $1L1L1L1N  O
 ^7 ^ ^ /:>s)SWX[S\(,R7W 7C 7S 7"%7 7: G   
()J *J Y Y Y ,379dSVi"&r($:O '2' 2S 2 224722 2* Y Y Y ,379dSVi '2' 2S 2 22 2 -7G 7 7 29&/ 7    /48ItTWy*.s)76?:7 :c : :$':9@: :& 
)*KOPS96:3iwW]:' :C :S :03:EL: +: 
+,07 :S :g : -: .5WV_ ,w , ,7 , ,^ +2 2 	@G ' S g  < 
"#48HGTZO D3 Dc D' D $D 
-. 9S	"2h H3i3icb&/DDD D 	D
 D D D D D 	D /DD ;B6? _G _ _ _
   
S	r(r(b&/<
<< < 	<
 	< <. 
%& S	r(r(bfdT
r(&/<<
< < 	<
 < < < < < 	< '<6 
-.9@ 	<c 	<w 	< /	< 	7  " 
,-6:3i ? ? .? 
)*7 +7r)   