Vehiculos / app.py
Nyashi's picture
Update app.py
5cc0f9a verified
import gradio as gr
from random import randint
from barcode import EAN13
from io import BytesIO
from datetime import datetime,date as Date
from base64 import b64encode,b64decode
from PIL import Image
from barcode.writer import ImageWriter
min_n=100_000_000_000
max_n=999_999_999_999
min_n_codebar=100_000_000_000_0
max_n_codebar=999_999_999_999_9
tarifas={
3600:2000, #1 hora
3600*2:3000, #2 horas
3600*4:4000 #4 horas
}
otro=6000 #mas de 4 horas
class Registro:
id:int=None
foto_entrada:str=None
foto_salida:str=None
ingreso:Date=None
salida:Date=None
tipo:str=None
matricula:str=None
def __init__(self,id_tick,matricula,foto_entrada,tipo):
self.id=id_tick
self.matricula=matricula
self.ingreso=datetime.now()
self.tipo=tipo
self.foto_entrada=foto_entrada
def generar_factura(self,foto_salida):
self.foto_salida=foto_salida
self.salida=datetime.now()
def tarifa(self):
secs=(self.salida-self.ingreso).total_seconds()
for s,p in tarifas.items():
if secs<s:
return p
return otro
def tiempo(self):
t=(self.salida-self.ingreso)
return f"""{getattr(t,"hours",0)}h{getattr(t,"minutes",0)}m{getattr(t,"seconds",0)}s"""
registros={}
retiros={}
def registrar_auto(matricula,foto:str,tipo:str):
ticket=EAN13(str(randint(min_n,max_n)),writer=ImageWriter())
rid=ticket.get_fullcode()
vehiculo=Registro(rid,matricula,foto,tipo)
registros[int(rid)]=vehiculo
ticket.save(f"{rid}")
return Image.open(f"{rid}.png"),rid
def retirar_vehiculo(id_tick:int,foto_salida:str):
registr=registros.get(id_tick,None)
if registr and registr.salida==None:
registr.generar_factura(foto_salida)
return [
"Perfecto" if registr else "No se ha encontrado la matricula",
gr.Textbox(value=registr.matricula if registr else "",visible=registr!=None),
gr.DateTime(value=registr.ingreso,visible=registr!=None),
gr.Image(value=registr.foto_entrada if registr else "",visible=registr!=None),
gr.DateTime(value=registr.salida if registr else "",visible=registr!=None),
gr.Image(value=registr.foto_salida if registr else "",visible=registr!=None),
gr.Number(value=registr.tarifa() if registr else 0,visible=registr!=None),
gr.Textbox(value=registr.tiempo() if registr else "",visible=registr!=None)
]
reg=gr.Interface(registrar_auto,inputs=[
gr.Textbox(max_lines=1,label="Matricula del vehiculo"),
gr.Image(type="filepath",label="Imagen del vehiculo"),
gr.Dropdown(label="Tipo de Vehiculo",choices=["Automovil","Moto"])
],outputs=[
gr.Image(label="Ticket",format="png"),
gr.Textbox(label="Ticket ID")
],clear_btn=None,submit_btn="Registrar")
sal=gr.Interface(retirar_vehiculo,inputs=[
gr.Number(label="Ticket",minimum=min_n_codebar,maximum=max_n_codebar),
gr.Image(type="filepath",label="Imagen del vehiculo")
],outputs=[
gr.Textbox(label="Estado"),
gr.Textbox(label="Matricula",visible=False),
gr.DateTime(type="datetime",label="Ingreso",visible=False),
gr.Image(label="Imagen de ingreso",visible=False),
gr.DateTime(type="datetime",visible=False,label="Salida"),
gr.Image(label="Imagen de salida",visible=False),
gr.Number(label="Precio a pagar($)",visible=False),
gr.Textbox(label="Tiempo total",visible=False)
],clear_btn=None,submit_btn="Retirar")
todo=gr.TabbedInterface([reg,sal],["Registrar auto","Retirar auto"],title="Administrador de vehiculos")
todo.launch(show_api=False)