| 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, |
| 3600*2:3000, |
| 3600*4:4000 |
| } |
| otro=6000 |
| 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) |
| |