class AnularGrupalScreen(Screen): """Clase para generar la pantalla que me permite anular un ticket grupal""" def __init__(self, **kwargs): """Pantalla para anular los tickets del usuario""" self.data = {} self.popup = None self.user = user_session.get_user() super(AnularGrupalScreen, self).__init__(**kwargs) def validar_anulacion(self): """Verifica que el numero ingresado corresponda a un ticket valido para el usuario y que sea antes de la hora máxima permitida.""" if self.ids.id_ticket.text: if not self.ids.id_ticket.text.isdigit(): self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rEl código del ticket\r\n solo tiene números." WarningPopup(mensaje).open() else: fecha = controlador.has_ticket_grupal(self.ids.id_ticket.text) if fecha: return fecha.strftime('%d/%m/%Y') # anular else: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "El código del ticket\r\n no es valido." WarningPopup(mensaje).open() else: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rEl código del ticket\r\n no puede estar vacío." WarningPopup(mensaje).open() def confirmacion(self): """Llamada a popup de confirmación de anulación.""" Window.release_all_keyboards() fecha = self.validar_anulacion() if fecha: self.popup = ConfirmPopup( text='\rSeguro deseas anular el ticket\r\n del día %s?' % (fecha)) self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, answer): """Función para enlazar al popup al responder.""" if answer: self.anular_ticket_grupal() self.ids.id_ticket.text = "" self.popup.dismiss() def anular_ticket_grupal(self): """Anula el ticket de acuerdo al id ingresado""" id_ticket = int(self.ids.id_ticket.text) controlador.anular_ticket_grupal(id_ticket, self.user, UNIDAD) def cancel(self): """Vuelve a una pantalla anterior""" self.manager.current = 'servicios' self.manager.remove_widget(self.manager.get_screen('anular_grupal'))
class ControlScreen(Screen): """Pantalla de menú de control""" def iniciar(self): """Accede a la pantalla principal del sistema""" user = user_session.get_user() hora = controlador.get_hora_inicio(UNIDAD) retiro = controlador.get_log(UNIDAD, 'retiro') if not hora: controlador.insert_log(user, 'iniciar', UNIDAD, '1er control') else: controlador.insert_log(user, 'iniciar', UNIDAD, 'control') user_session.close() self.manager.current = 'splash' def servicios(self): """Crea y accede a la pantalla de servicios""" if not self.manager.has_screen('servicios'): self.manager.add_widget(ServiceScreen(name='servicios')) self.manager.current = 'servicios' def confirmacion_apagar(self): self.popup = ConfirmPopup( text='\rSeguro deseas salir y apagar\r\n la maquina?' ) self.popup.bind(on_answer=self._on_answer_apagar) self.popup.open() def _on_answer_apagar(self, instance, answer): if answer: self.apagar() self.popup.dismiss() def confirmacion_reiniciar(self): self.popup = ConfirmPopup( text='\rSeguro deseas salir y reiniciar\r\n la maquina?' ) self.popup.bind(on_answer=self._on_answer_reiniciar) self.popup.open() def _on_answer_reiniciar(self, instance, answer): if answer: self.reiniciar() self.popup.dismiss() def reiniciar(self): """Cierra la sesion y apaga la maquina""" user = user_session.get_user() controlador.insert_log(user, 'apagar', UNIDAD, 'Control - reinicio') user_session.close() controlador.update_all_activos() os.system("/sbin/shutdown -r now") def apagar(self): """Cierra la sesion y apaga la maquina""" user = user_session.get_user() controlador.insert_log(user, 'apagar', UNIDAD, 'Control') user_session.close() controlador.update_all_activos() os.system("/sbin/shutdown -h now")
class AnularGrupalScreen(Screen): def __init__(self, **kwargs): """Pantalla para anular los tickets del usuario""" self.data = {} self.user = user_session.get_user() super(AnularGrupalScreen, self).__init__(**kwargs) def validar_anulacion(self): """Verifica que el numero ingresado corresponda a un ticket valido para el usuario y que sea antes de la hora máxima permitida.""" if self.ids.id_ticket.text: if not self.ids.id_ticket.text.isdigit(): self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rEl código del ticket\r\n solo tiene números." WarningPopup(mensaje).open() else: fecha = controlador.has_ticket_grupal(self.ids.id_ticket.text) if fecha: return fecha.strftime('%d/%m/%Y') # anular else: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "El código del ticket\r\n no es valido." WarningPopup(mensaje).open() else: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rEl código del ticket\r\n no puede estar vacío." WarningPopup(mensaje).open() def confirmacion(self): Window.release_all_keyboards() self.fecha = self.validar_anulacion() if self.fecha: self.popup = ConfirmPopup( text='\rSeguro deseas anular el ticket\r\n del día %s?' % (self.fecha) ) self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.anular_ticket_grupal() self.ids.id_ticket.text = "" self.popup.dismiss() def anular_ticket_grupal(self): """Anula el ticket de acuerdo al id ingresado""" id_ticket = int(self.ids.id_ticket.text) controlador.anular_ticket_grupal(id_ticket, self.user, UNIDAD) def cancel(self): """Vuelve a una pantalla anterior""" self.manager.current = 'servicios' self.manager.remove_widget(self.manager.get_screen('anular_grupal'))
class ControlScreen(Screen): """Pantalla de menú de control""" def iniciar(self): """Accede a la pantalla principal del sistema""" user = user_session.get_user() hora = controlador.get_hora_inicio(UNIDAD) retiro = controlador.get_log(UNIDAD, 'retiro') if not hora: controlador.insert_log(user, 'iniciar', UNIDAD, '1er control') else: controlador.insert_log(user, 'iniciar', UNIDAD, 'control') user_session.close() self.manager.current = 'splash' def servicios(self): """Crea y accede a la pantalla de servicios""" if not self.manager.has_screen('servicios'): self.manager.add_widget(ServiceScreen(name='servicios')) self.manager.current = 'servicios' def confirmacion_apagar(self): self.popup = ConfirmPopup( text='\rSeguro deseas salir y apagar\r\n la maquina?') self.popup.bind(on_answer=self._on_answer_apagar) self.popup.open() def _on_answer_apagar(self, instance, answer): if answer: self.apagar() self.popup.dismiss() def confirmacion_reiniciar(self): self.popup = ConfirmPopup( text='\rSeguro deseas salir y reiniciar\r\n la maquina?') self.popup.bind(on_answer=self._on_answer_reiniciar) self.popup.open() def _on_answer_reiniciar(self, instance, answer): if answer: self.reiniciar() self.popup.dismiss() def reiniciar(self): """Cierra la sesion y apaga la maquina""" user = user_session.get_user() controlador.insert_log(user, 'apagar', UNIDAD, 'Control - reinicio') user_session.close() controlador.update_all_activos() os.system("/sbin/shutdown -r now") def apagar(self): """Cierra la sesion y apaga la maquina""" user = user_session.get_user() controlador.insert_log(user, 'apagar', UNIDAD, 'Control') user_session.close() controlador.update_all_activos() os.system("/sbin/shutdown -h now")
class GrupalesScreen(Screen): def __init__(self, **kwargs): """ Pantalla para reimprimir tickets de cierre antiguos. """ super(GrupalesScreen, self).__init__(**kwargs) self.cargar_datos() def cargar_datos(self): """ Carga los datos de los días. """ self.categorias = controlador.get_categorias() self.unidades = controlador.get_all_facultades() self.ids.year.values = ['2015', '2016', '2017', '2018', '2019'] self.ids.mes.values = [ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' ] self.ids.dia.values = [str(i) for i in range(1, 32)] self.ids.categorias.values = sorted(self.categorias.keys()) self.ids.categorias.text = 'Regular' date = datetime.today() self.ids.year.text = str(date.year) self.ids.mes.text = self.ids.mes.values[date.month - 1] self.ids.dia.text = str(date.day) def confirmacion(self): self.popup = ConfirmPopup( text='\rSeguro deseas comprar el \r\n ticket grupal?' ) self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.check_fecha() self.popup.dismiss() def check_fecha(self): """ Verifica que la fecha sea correcta y menor o igual a la actual. """ year = int(self.ids.year.text) mes = self.ids.mes.values.index(self.ids.mes.text) + 1 dia = int(self.ids.dia.text) cant = int(self.ids.cantidad.text) delegacion = self.ids.delegacion.text recibo = self.ids.recibo.text cat = ( self.categorias[self.ids.categorias.text], self.ids.categorias.text ) try: date = datetime(year, mes, dia) if date >= datetime.now(): self.print_ticket_grupal(cant, delegacion, cat, date, recibo) else: mensaje = u"Fecha Inválida" WarningPopup(mensaje).open() except ValueError: mensaje = u"Fecha Inválida" WarningPopup(mensaje).open() def print_ticket_grupal(self, cant, delegacion, cat, date, recibo): """ Imprime el ticket grupal para el día(date), para la delegación dada y la cantidad solicitada. """ user = user_session.get_user() id_log = controlador.insert_log(user, 'comprar_grupal', UNIDAD) ticket_grupal = controlador.comprar_ticket_grupal( cant, delegacion, cat, date, recibo, id_log ) row = controlador.get_ticket_grupal_by_id(ticket_grupal) id_log = controlador.insert_log(user, 'imprimir_grupal', UNIDAD) controlador.insert_ticket_log(ticket_grupal, id_log) print_thread = Thread( target=impresora.imprimir_ticket_grupal, args=( user['nombre'], user['dni'], row['id'], UNIDAD, row['fecha'].strftime('%d/%m/%Y'), row['cantidad'], row['barcode'], row['importe'], row['delegacion'], row['recibo'] ) ) print_thread.start() Window.release_all_keyboards() self.cancel() def cancel(self): """Vuelve a la pantalla anterior""" self.manager.current = 'servicios' self.manager.remove_widget(self.manager.get_screen('grupales'))
class AnularScreen(Screen): def __init__(self, **kwargs): """Pantalla para anular los tickets del usuario""" self.data = {} self.cargar_datos() super(AnularScreen, self).__init__(**kwargs) def validar_anulacion(self): """Verifica que el numero ingresado corresponda a un ticket valido para el usuario y que sea antes de la hora máxima permitida.""" if self.ids.id_ticket.text: if not self.ids.id_ticket.text.isdigit(): self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rEl código del ticket\r\n solo tiene números." WarningPopup(mensaje).open() else: fecha = controlador.has_ticket(self.user, self.ids.id_ticket.text) hora_max = controlador.get_hora_anulacion() if fecha: codigo = self.check_hora(fecha, hora_max) if codigo == 1: return fecha.strftime("%d/%m/%Y") # anular elif codigo == 0: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rNo puede anular un ticket\r\n" mensaje += "despues de las %d hs." % (hora_max) WarningPopup(mensaje).open() return 0 # nada else: self.ticket_vencido() self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rNo puede anular un ticket\r\n despues" mensaje += " de la fecha\r\n de servicio.\r\n\r\n" mensaje += "Su ticket se venció." WarningPopup(mensaje).open() return 0 # vencer else: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "El código del ticket\r\n no es valido." WarningPopup(mensaje).open() else: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rEl código del ticket\r\n no puede estar vacío." WarningPopup(mensaje).open() def confirmacion(self): Window.release_all_keyboards() self.fecha = self.validar_anulacion() if self.fecha: self.popup = ConfirmPopup(text="\rSeguro deseas anular el ticket\r\n del día %s?" % (self.fecha)) self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.anular_ticket() self.ids.id_ticket.text = "" self.popup.dismiss() def ticket_vencido(self): """ Anula el ticket vencido poniendo el estado vencido. """ id_ticket = int(self.ids.id_ticket.text) controlador.update_ticket(id_ticket, self.user, UNIDAD, 4) def anular_ticket(self): """Anula el ticket de acuerdo al id ingresado""" id_ticket = int(self.ids.id_ticket.text) controlador.anular_ticket(id_ticket, self.user, UNIDAD) self.update_datos() def update_datos(self): """Actualiza los datos de la pantalla para plasmar cambios""" user_session.update(controlador.get_usuario(self.data["dni"])) self.cargar_datos() self.ids.saldo.text = self.data["saldo"] self.ids.nombre.text = self.data["nombre"] def check_hora(self, fecha, hora): """Verifica que no se pueda anular un ticket despues de la hora""" ahora = datetime.now() if ahora.date() < fecha.date(): return 1 # Ok (anular) elif ahora.date() > fecha.date(): return 2 # Fecha anterior al día de hoy(vencer). else: if hora <= ahora.hour < 15: return 0 # Hora invalida para anular (Nada) elif ahora.hour < hora: return 1 # Ok (anular) else: return 2 # Hora posterior al permitido.(vencer) def cargar_datos(self): """Carga los datos del usuario dentro de la pantalla de anulación""" self.user = user_session.get_user() self.data["nombre"] = self.user["nombre"] self.data["dni"] = self.user["dni"] self.data["saldo"] = "$%.0f" % (self.user["saldo"]) self.data["categoria"] = controlador.get_categoria_nombre(self.user["id_categoria"]) self.data["ruta_foto"] = self.user["ruta_foto"] def cancel(self): """Vuelve a una pantalla anterior""" self.manager.current = "opciones"
class Compra3Screen(Screen): def __init__(self, dias, titulo, **kwargs): """Pantalla para confirmar e imprimir los tickets""" self.user = user_session.get_user() id_log = controlador.insert_log(self.user, 'reservar', UNIDAD) self.reserva, full, state = controlador.reservar_tickets( self.user, dias, id_log, UNIDAD) if state: if full: for dia in full: mensaje = "\rNo se pudo reservar: \r\n\t%s" % ( dia.strftime('%d/%m/%Y')) WarningPopup(mensaje).open() else: mensaje = "\rHubo un error al reservar \r\nIntente nuevamente" WarningPopup(mensaje).open() self.cancel() self.bandera = True self.data = {} self.dias = dias self.titulo = titulo self.cargar_datos() super(Compra3Screen, self).__init__(**kwargs) def update_datos(self): """Actualiza los datos de la pantalla para plasmar cambios""" user_session.update(controlador.get_usuario(self.data['dni'])) self.user = user_session.get_user() self.cargar_datos() self.ids.saldo.text = self.data['saldo'] self.ids.nombre.text = self.data['nombre'] def cargar_datos(self): """Carga los datos del usuario dentro de la pantalla de compra""" self.data['nombre'] = self.user['nombre'] self.data['dni'] = self.user['dni'] self.data['saldo'] = '$ %.0f' % (self.user['saldo']) self.data['categoria'] = controlador.get_categoria_nombre( self.user['id_categoria']) self.data['facultad'] = controlador.get_facultad( self.user['id_facultad']) self.data['ruta_foto'] = self.user['ruta_foto'] cantidad = len(self.reserva) self.data['cantidad'] = str(cantidad) importe = controlador.get_categoria_importe(self.user['id_categoria']) self.data['total'] = '$ %.0f' % (importe * cantidad) self.total = importe * cantidad self.saldo = self.user['saldo'] self.data['titulo'] = self.titulo def confirmar_tickets(self): """Confirma la compra y verifica que haya saldo suficiente.""" self.popup = ConfirmPopup(text='Seguro deseas comprar?') self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.comprar_tickets() self.popup.dismiss() def imprimir_todos(self): """ Imprime todos los tickets que se hayan comprado. """ id_log = controlador.insert_log(self.user, 'imprimir', UNIDAD) ticket_list = [] for ticket, id_dia in self.reserva: row = None ticket_data = {} row = controlador.get_ticket_by_id(ticket) if row: id_ticket = row['id'] ticket_data['fecha'] = row['fecha'].strftime('%d/%m/%Y') ticket_data['code'] = row['barcode'] ticket_data['nombre'] = self.data['nombre'].decode('utf8') ticket_data['dni'] = self.data['dni'].decode('utf8') categoria = self.data['categoria'].decode('utf8') ticket_data['categoria'] = categoria ticket_data['facultad'] = self.data['facultad'].decode('utf8') ticket_data['unidad'] = UNIDAD mensaje = u"Gracias por usar el Comedor Universitario" ticket_data['mensaje'] = mensaje ticket_data['ticket'] = str(id_ticket) ticket_data['saldo'] = self.user['saldo'] controlador.insert_ticket_log(id_ticket, id_log) ticket_list.append(ticket_data) controlador.update_papel_disponible(UNIDAD, 0, len(ticket_list)) print_thread = Thread(target=impresora.imprimir_tickets_alumno, args=ticket_list) print_thread.start() def comprar_tickets(self): """ Realiza la inserción de los tickets en la db y cambia a la siguiente pantalla. """ if self.bandera: id_log = controlador.insert_log(self.user, 'comprar', UNIDAD) if id_log: self.bandera = False controlador.comprar_tickets(self.reserva, id_log) controlador.update_saldo(self.user, self.total, 1) self.update_datos() self.imprimir_todos() self.manager.add_widget( ConfirmacionScreen(len(self.reserva), name='confirmacion')) self.manager.current = 'confirmacion' if self.manager.has_screen('compra_2'): self.manager.remove_widget( self.manager.get_screen('compra_2')) self.manager.remove_widget(self.manager.get_screen('compra_1')) self.manager.remove_widget(self.manager.get_screen('compra_3')) else: self.cancel() def cancel(self): """Vuelve a una pantalla anterior""" controlador.cancelar_tickets(self.reserva) self.manager.current = 'compra_1' self.manager.remove_widget(self.manager.get_screen('compra_3'))
class ServiceScreen(Screen): """Pantalla de servicio de control""" def imprimir(self): """imprime un ticket de control""" print_status = impresora.check_status() papel_disponible = controlador.get_papel_disponible(UNIDAD) if ((print_status == 1) or (print_status == 2 and papel_disponible >= 1) ): user = user_session.get_user() controlador.insert_log( user, 'imprimir', UNIDAD, 'Ticket de prueba' ) fecha = "dd/mm/aaaa" code = str(int(time())) + "0000000000" nom = user['nombre'] dni = user['dni'] cat = u"control" fac = u"Secretaría de Bienestar" msj = u"Ticket NO VALIDO" sdo = 0 ticket = "XXX" print_thread = Thread( target=impresora.imprimir_ticket_alumno, args=( nom, dni, fac, cat, code, UNIDAD, ticket, fecha, msj, sdo ) ) print_thread.start() controlador.update_papel_disponible(UNIDAD, 0, 1) elif print_status == 2: mensaje = u"No hay papel" WarningPopup(mensaje).open() else: mensaje = u"Impresora desconectada" WarningPopup(mensaje).open() def confirmacion(self): self.popup = ConfirmPopup( text='\rSeguro deseas retirar\r\n e imprimir el ticket de cierre?' ) self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.retirar() self.popup.dismiss() def retirar(self): """ Controla que se pueda hacer un ticket de cierre para poder retirar el dinero. """ user = user_session.get_user() retiro = controlador.get_log(UNIDAD, 'retiro') hora = controlador.get_hora_inicio(UNIDAD) if not retiro and hora: total, bills = controlador.get_total(UNIDAD) if total: desc = 'Control - 1er Cierre' id_log = controlador.insert_log(user, 'retiro', UNIDAD, desc) id_ticket = controlador.insert_ticket_cierre( id_log, total, UNIDAD ) ticket = controlador.get_ticket_cierre(id_ticket) hora = controlador.get_hora_inicio(UNIDAD) print_status = impresora.check_status() papel_disponible = controlador.get_papel_disponible(UNIDAD) if ((print_status == 1) or (print_status == 2 and papel_disponible >= 2) ): print_thread = Thread( target=impresora.imprimir_ticket_cierre, args=( user['nombre'], id_ticket, UNIDAD, hora, bills, total, ticket['barcode'] ) ) print_thread.start() elif print_status == 2: mensaje = u"No hay papel" WarningPopup(mensaje).open() else: mensaje = u"Impresora desconectada" WarningPopup(mensaje).open() else: mensaje = u"No hay registros para hoy" WarningPopup(mensaje).open() elif retiro and hora: total, bills = controlador.get_total(UNIDAD) if total: desc = 'Control - Cierre' id_log = controlador.insert_log(user, 'retiro', UNIDAD, desc) total, bills = controlador.get_total(UNIDAD) id_ticket = controlador.get_id_ticket_cierre(UNIDAD) if not id_ticket: id_ticket = controlador.insert_ticket_cierre( id_log, total, UNIDAD ) ticket = controlador.get_ticket_cierre(id_ticket) hora = controlador.get_hora_inicio(UNIDAD) print_status = impresora.check_status() papel_disponible = controlador.get_papel_disponible(UNIDAD) if ((print_status == 1) or (print_status == 2 and papel_disponible >= 2) ): print_thread = Thread( target=impresora.imprimir_ticket_cierre, args=( user['nombre'], id_ticket, UNIDAD, hora, bills, total, ticket['barcode'] ) ) print_thread.start() controlador.update_papel_disponible(UNIDAD, 0, 2) elif print_status == 2: mensaje = u"No hay papel" WarningPopup(mensaje).open() else: mensaje = u"Impresora desconectada" WarningPopup(mensaje).open() else: mensaje = u"No hay rergistros para hoy" WarningPopup(mensaje).open() else: msje = u"\rNo puede hacer cierre\r\n sin iniciar antes el sistema." WarningPopup(msje).open() def informacion(self): """ Crea y accede a la pantalla de información del estado de la maquina. """ if not self.manager.has_screen('info'): self.manager.add_widget(InfoScreen(name='info')) self.manager.current = 'info' def tickets_cierre(self): """ Crea y accede a la pantalla de impresión de tickets de cierre. """ if not self.manager.has_screen('cierre'): self.manager.add_widget(CierreScreen(name='cierre')) self.manager.current = 'cierre' def tickets_grupales(self): """ Crea y accede a la pantalla de impresión de tickets grupales. """ if not self.manager.has_screen('grupales'): self.manager.add_widget(GrupalesScreen(name='grupales')) self.manager.current = 'grupales' def anular_grupal(self): """ Crea y accede a la pantalla de anulación de tickets grupales. """ if not self.manager.has_screen('anular_grupal'): self.manager.add_widget(AnularGrupalScreen(name='anular_grupal')) self.manager.current = 'anular_grupal' def cancel(self): """Vuelve a la pantalla anterior""" self.manager.current = 'menu_control' self.manager.remove_widget(self.manager.get_screen('servicios'))
class Compra3Screen(Screen): def __init__(self, dias, titulo, **kwargs): """Pantalla para confirmar e imprimir los tickets""" self.user = user_session.get_user() id_log = controlador.insert_log(self.user, 'reservar', UNIDAD) self.reserva, full, state = controlador.reservar_tickets( self.user, dias, id_log, UNIDAD ) if state: if full: for dia in full: mensaje = "\rNo se pudo reservar: \r\n\t%s" % ( dia.strftime('%d/%m/%Y')) WarningPopup(mensaje).open() else: mensaje = "\rHubo un error al reservar \r\nIntente nuevamente" WarningPopup(mensaje).open() self.cancel() self.bandera = True self.data = {} self.dias = dias self.titulo = titulo self.cargar_datos() super(Compra3Screen, self).__init__(**kwargs) def update_datos(self): """Actualiza los datos de la pantalla para plasmar cambios""" user_session.update(controlador.get_usuario(self.data['dni'])) self.user = user_session.get_user() self.cargar_datos() self.ids.saldo.text = self.data['saldo'] self.ids.nombre.text = self.data['nombre'] def cargar_datos(self): """Carga los datos del usuario dentro de la pantalla de compra""" self.data['nombre'] = self.user['nombre'] self.data['dni'] = self.user['dni'] self.data['saldo'] = '$ %.0f' % (self.user['saldo']) self.data['categoria'] = controlador.get_categoria_nombre( self.user['id_categoria']) self.data['facultad'] = controlador.get_facultad( self.user['id_facultad']) self.data['ruta_foto'] = self.user['ruta_foto'] cantidad = len(self.reserva) self.data['cantidad'] = str(cantidad) importe = controlador.get_categoria_importe(self.user['id_categoria']) self.data['total'] = '$ %.0f' % (importe * cantidad) self.total = importe * cantidad self.saldo = self.user['saldo'] self.data['titulo'] = self.titulo def confirmar_tickets(self): """Confirma la compra y verifica que haya saldo suficiente.""" self.popup = ConfirmPopup(text='Seguro deseas comprar?') self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.comprar_tickets() self.popup.dismiss() def imprimir_todos(self): """ Imprime todos los tickets que se hayan comprado. """ id_log = controlador.insert_log(self.user, 'imprimir', UNIDAD) ticket_list = [] for ticket, id_dia in self.reserva: row = None ticket_data = {} row = controlador.get_ticket_by_id(ticket) if row: id_ticket = row['id'] ticket_data['fecha'] = row['fecha'].strftime('%d/%m/%Y') ticket_data['code'] = row['barcode'] ticket_data['nombre'] = self.data['nombre'].decode('utf8') ticket_data['dni'] = self.data['dni'].decode('utf8') categoria = self.data['categoria'].decode('utf8') ticket_data['categoria'] = categoria ticket_data['facultad'] = self.data['facultad'].decode('utf8') ticket_data['unidad'] = UNIDAD mensaje = u"Gracias por usar el Comedor Universitario" ticket_data['mensaje'] = mensaje ticket_data['ticket'] = str(id_ticket) ticket_data['saldo'] = self.user['saldo'] controlador.insert_ticket_log(id_ticket, id_log) ticket_list.append(ticket_data) controlador.update_papel_disponible(UNIDAD, 0, len(ticket_list)) print_thread = Thread( target=impresora.imprimir_tickets_alumno, args=ticket_list ) print_thread.start() def comprar_tickets(self): """ Realiza la inserción de los tickets en la db y cambia a la siguiente pantalla. """ if self.bandera: id_log = controlador.insert_log(self.user, 'comprar', UNIDAD) if id_log: self.bandera = False controlador.comprar_tickets(self.reserva, id_log) controlador.update_saldo(self.user, self.total, 1) self.update_datos() self.imprimir_todos() self.manager.add_widget( ConfirmacionScreen(len(self.reserva), name='confirmacion') ) self.manager.current = 'confirmacion' if self.manager.has_screen('compra_2'): self.manager.remove_widget( self.manager.get_screen('compra_2') ) self.manager.remove_widget(self.manager.get_screen('compra_1')) self.manager.remove_widget(self.manager.get_screen('compra_3')) else: self.cancel() def cancel(self): """Vuelve a una pantalla anterior""" controlador.cancelar_tickets(self.reserva) self.manager.current = 'compra_1' self.manager.remove_widget(self.manager.get_screen('compra_3'))
class CierreScreen(Screen): def __init__(self, **kwargs): """ Pantalla para reimprimir tickets de cierre antiguos. """ super(CierreScreen, self).__init__(**kwargs) self.cargar_datos() def cargar_datos(self): """ Carga los datos de los días. """ self.unidades = controlador.get_all_facultades() self.ids.year.values = ['2015', '2016', '2017', '2018', '2019'] self.ids.mes.values = [ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' ] self.ids.dia.values = [str(i) for i in range(1, 32)] self.ids.unidad.values = sorted(self.unidades.keys()) self.ids.unidad.text = controlador.get_ubicacion(UNIDAD) date = datetime.today() self.ids.year.text = str(date.year) self.ids.mes.text = self.ids.mes.values[date.month - 1] self.ids.dia.text = str(date.day) def confirmacion(self): self.popup = ConfirmPopup( text='\rSeguro deseas imprimir el \r\n ticket de cierre?' ) self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.check_fecha() self.popup.dismiss() def check_fecha(self): """ Verifica que la fecha sea correcta y menor o igual a la actual. """ year = int(self.ids.year.text) mes = self.ids.mes.values.index(self.ids.mes.text) + 1 dia = int(self.ids.dia.text) unidad = controlador.get_maquina_ubicacion( self.unidades[self.ids.unidad.text] ) try: date = datetime(year, mes, dia) if date <= datetime.now(): self.print_ticket_cierre(unidad, date) else: mensaje = u"Fecha Inválida" WarningPopup(mensaje).open() except ValueError: mensaje = u"Fecha Inválida" WarningPopup(mensaje).open() def print_ticket_cierre(self, unidad, date): """ Imprime el ticket de cierre de la unidad y del día(date) dado """ total, bills = controlador.get_total(unidad, date) user = user_session.get_user() desc = 'Control - Cierre de la maquina %d del dia %s' % ( unidad, date.strftime('%d/%m/%Y') ) id_log = controlador.insert_log(user, 'retiro', unidad, desc) id_ticket = controlador.get_id_ticket_cierre(unidad, date) if not id_ticket: id_ticket = controlador.insert_ticket_cierre( id_log, total, unidad ) ticket = controlador.get_ticket_cierre(id_ticket) hora = controlador.get_hora_inicio(unidad, date) print_status = impresora.check_status() papel_disponible = controlador.get_papel_disponible(UNIDAD) if ((print_status == 1) or (print_status == 2 and papel_disponible >= 2) ): print_thread = Thread( target=impresora.imprimir_ticket_cierre, args=( user['nombre'], id_ticket, unidad, hora, bills, total, ticket['barcode'], date.strftime('%d/%m/%Y') ) ) print_thread.start() controlador.update_papel_disponible(UNIDAD, 0, 2) elif print_status == 2: mensaje = u"No hay papel" WarningPopup(mensaje).open() else: mensaje = u"Impresora desconectada" WarningPopup(mensaje).open() def cancel(self): """Vuelve a la pantalla anterior""" self.manager.current = 'servicios' self.manager.remove_widget(self.manager.get_screen('cierre'))
class AnularScreen(Screen): def __init__(self, **kwargs): """Pantalla para anular los tickets del usuario""" self.data = {} self.cargar_datos() super(AnularScreen, self).__init__(**kwargs) def validar_anulacion(self): """Verifica que el numero ingresado corresponda a un ticket valido para el usuario y que sea antes de la hora máxima permitida.""" if self.ids.id_ticket.text: if not self.ids.id_ticket.text.isdigit(): self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rEl código del ticket\r\n solo tiene números." WarningPopup(mensaje).open() else: fecha = controlador.has_ticket(self.user, self.ids.id_ticket.text) hora_max = controlador.get_hora_anulacion() if fecha: codigo = self.check_hora(fecha, hora_max) if codigo == 1: return fecha.strftime('%d/%m/%Y') # anular elif codigo == 0: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rNo puede anular un ticket\r\n" mensaje += "despues de las %d hs." % (hora_max) WarningPopup(mensaje).open() return 0 # nada else: self.ticket_vencido() self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rNo puede anular un ticket\r\n despues" mensaje += " de la fecha\r\n de servicio.\r\n\r\n" mensaje += "Su ticket se venció." WarningPopup(mensaje).open() return 0 # vencer else: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "El código del ticket\r\n no es valido." WarningPopup(mensaje).open() else: self.ids.id_ticket.text = "" self.ids.id_ticket.focus = True mensaje = "\rEl código del ticket\r\n no puede estar vacío." WarningPopup(mensaje).open() def confirmacion(self): Window.release_all_keyboards() self.fecha = self.validar_anulacion() if self.fecha: self.popup = ConfirmPopup( text='\rSeguro deseas anular el ticket\r\n del día %s?' % (self.fecha)) self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.anular_ticket() self.ids.id_ticket.text = "" self.popup.dismiss() def ticket_vencido(self): """ Anula el ticket vencido poniendo el estado vencido. """ id_ticket = int(self.ids.id_ticket.text) controlador.update_ticket(id_ticket, self.user, UNIDAD, 4) def anular_ticket(self): """Anula el ticket de acuerdo al id ingresado""" id_ticket = int(self.ids.id_ticket.text) controlador.anular_ticket(id_ticket, self.user, UNIDAD) self.update_datos() def update_datos(self): """Actualiza los datos de la pantalla para plasmar cambios""" user_session.update(controlador.get_usuario(self.data['dni'])) self.cargar_datos() self.ids.saldo.text = self.data['saldo'] self.ids.nombre.text = self.data['nombre'] def check_hora(self, fecha, hora): """Verifica que no se pueda anular un ticket despues de la hora""" ahora = datetime.now() if ahora.date() < fecha.date(): return 1 # Ok (anular) elif ahora.date() > fecha.date(): return 2 # Fecha anterior al día de hoy(vencer). else: if hora <= ahora.hour < 15: return 0 # Hora invalida para anular (Nada) elif ahora.hour < hora: return 1 # Ok (anular) else: return 2 # Hora posterior al permitido.(vencer) def cargar_datos(self): """Carga los datos del usuario dentro de la pantalla de anulación""" self.user = user_session.get_user() self.data['nombre'] = self.user['nombre'] self.data['dni'] = self.user['dni'] self.data['saldo'] = '$%.0f' % (self.user['saldo']) self.data['categoria'] = controlador.get_categoria_nombre( self.user['id_categoria']) self.data['ruta_foto'] = self.user['ruta_foto'] def cancel(self): """Vuelve a una pantalla anterior""" self.manager.current = 'opciones'
class ServiceScreen(Screen): """Pantalla de servicio de control""" def imprimir(self): """imprime un ticket de control""" print_status = impresora.check_status() papel_disponible = controlador.get_papel_disponible(UNIDAD) if ((print_status == 1) or (print_status == 2 and papel_disponible >= 1)): user = user_session.get_user() controlador.insert_log(user, 'imprimir', UNIDAD, 'Ticket de prueba') fecha = "dd/mm/aaaa" code = str(int(time())) + "0000000000" nom = user['nombre'] dni = user['dni'] cat = u"control" fac = u"Secretaría de Bienestar" msj = u"Ticket NO VALIDO" sdo = 0 ticket = "XXX" print_thread = Thread(target=impresora.imprimir_ticket_alumno, args=(nom, dni, fac, cat, code, UNIDAD, ticket, fecha, msj, sdo)) print_thread.start() controlador.update_papel_disponible(UNIDAD, 0, 1) elif print_status == 2: mensaje = u"No hay papel" WarningPopup(mensaje).open() else: mensaje = u"Impresora desconectada" WarningPopup(mensaje).open() def confirmacion(self): self.popup = ConfirmPopup( text='\rSeguro deseas retirar\r\n e imprimir el ticket de cierre?') self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.retirar() self.popup.dismiss() def retirar(self): """ Controla que se pueda hacer un ticket de cierre para poder retirar el dinero. """ user = user_session.get_user() retiro = controlador.get_log(UNIDAD, 'retiro') hora = controlador.get_hora_inicio(UNIDAD) if not retiro and hora: total, bills = controlador.get_total(UNIDAD) if total: desc = 'Control - 1er Cierre' id_log = controlador.insert_log(user, 'retiro', UNIDAD, desc) id_ticket = controlador.insert_ticket_cierre( id_log, total, UNIDAD) ticket = controlador.get_ticket_cierre(id_ticket) hora = controlador.get_hora_inicio(UNIDAD) print_status = impresora.check_status() papel_disponible = controlador.get_papel_disponible(UNIDAD) if ((print_status == 1) or (print_status == 2 and papel_disponible >= 2)): print_thread = Thread( target=impresora.imprimir_ticket_cierre, args=(user['nombre'], id_ticket, UNIDAD, hora, bills, total, ticket['barcode'])) print_thread.start() elif print_status == 2: mensaje = u"No hay papel" WarningPopup(mensaje).open() else: mensaje = u"Impresora desconectada" WarningPopup(mensaje).open() else: mensaje = u"No hay registros para hoy" WarningPopup(mensaje).open() elif retiro and hora: total, bills = controlador.get_total(UNIDAD) if total: desc = 'Control - Cierre' id_log = controlador.insert_log(user, 'retiro', UNIDAD, desc) total, bills = controlador.get_total(UNIDAD) id_ticket = controlador.get_id_ticket_cierre(UNIDAD) if not id_ticket: id_ticket = controlador.insert_ticket_cierre( id_log, total, UNIDAD) ticket = controlador.get_ticket_cierre(id_ticket) hora = controlador.get_hora_inicio(UNIDAD) print_status = impresora.check_status() papel_disponible = controlador.get_papel_disponible(UNIDAD) if ((print_status == 1) or (print_status == 2 and papel_disponible >= 2)): print_thread = Thread( target=impresora.imprimir_ticket_cierre, args=(user['nombre'], id_ticket, UNIDAD, hora, bills, total, ticket['barcode'])) print_thread.start() controlador.update_papel_disponible(UNIDAD, 0, 2) elif print_status == 2: mensaje = u"No hay papel" WarningPopup(mensaje).open() else: mensaje = u"Impresora desconectada" WarningPopup(mensaje).open() else: mensaje = u"No hay rergistros para hoy" WarningPopup(mensaje).open() else: msje = u"\rNo puede hacer cierre\r\n sin iniciar antes el sistema." WarningPopup(msje).open() def informacion(self): """ Crea y accede a la pantalla de información del estado de la maquina. """ if not self.manager.has_screen('info'): self.manager.add_widget(InfoScreen(name='info')) self.manager.current = 'info' def tickets_cierre(self): """ Crea y accede a la pantalla de impresión de tickets de cierre. """ if not self.manager.has_screen('cierre'): self.manager.add_widget(CierreScreen(name='cierre')) self.manager.current = 'cierre' def tickets_grupales(self): """ Crea y accede a la pantalla de impresión de tickets grupales. """ if not self.manager.has_screen('grupales'): self.manager.add_widget(GrupalesScreen(name='grupales')) self.manager.current = 'grupales' def anular_grupal(self): """ Crea y accede a la pantalla de anulación de tickets grupales. """ if not self.manager.has_screen('anular_grupal'): self.manager.add_widget(AnularGrupalScreen(name='anular_grupal')) self.manager.current = 'anular_grupal' def cancel(self): """Vuelve a la pantalla anterior""" self.manager.current = 'menu_control' self.manager.remove_widget(self.manager.get_screen('servicios'))
class CierreScreen(Screen): def __init__(self, **kwargs): """ Pantalla para reimprimir tickets de cierre antiguos. """ super(CierreScreen, self).__init__(**kwargs) self.cargar_datos() def cargar_datos(self): """ Carga los datos de los días. """ self.unidades = controlador.get_all_facultades() self.ids.year.values = ['2015', '2016', '2017', '2018', '2019'] self.ids.mes.values = [ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' ] self.ids.dia.values = [str(i) for i in range(1, 32)] self.ids.unidad.values = sorted(self.unidades.keys()) self.ids.unidad.text = controlador.get_ubicacion(UNIDAD) date = datetime.today() self.ids.year.text = str(date.year) self.ids.mes.text = self.ids.mes.values[date.month - 1] self.ids.dia.text = str(date.day) def confirmacion(self): self.popup = ConfirmPopup( text='\rSeguro deseas imprimir el \r\n ticket de cierre?') self.popup.bind(on_answer=self._on_answer) self.popup.open() def _on_answer(self, instance, answer): if answer: self.check_fecha() self.popup.dismiss() def check_fecha(self): """ Verifica que la fecha sea correcta y menor o igual a la actual. """ year = int(self.ids.year.text) mes = self.ids.mes.values.index(self.ids.mes.text) + 1 dia = int(self.ids.dia.text) unidad = controlador.get_maquina_ubicacion( self.unidades[self.ids.unidad.text]) try: date = datetime(year, mes, dia) if date <= datetime.now(): self.print_ticket_cierre(unidad, date) else: mensaje = u"Fecha Inválida" WarningPopup(mensaje).open() except ValueError: mensaje = u"Fecha Inválida" WarningPopup(mensaje).open() def print_ticket_cierre(self, unidad, date): """ Imprime el ticket de cierre de la unidad y del día(date) dado """ total, bills = controlador.get_total(unidad, date) user = user_session.get_user() desc = 'Control - Cierre de la maquina %d del dia %s' % ( unidad, date.strftime('%d/%m/%Y')) id_log = controlador.insert_log(user, 'retiro', unidad, desc) id_ticket = controlador.get_id_ticket_cierre(unidad, date) if not id_ticket: id_ticket = controlador.insert_ticket_cierre(id_log, total, unidad) ticket = controlador.get_ticket_cierre(id_ticket) hora = controlador.get_hora_inicio(unidad, date) print_status = impresora.check_status() papel_disponible = controlador.get_papel_disponible(UNIDAD) if ((print_status == 1) or (print_status == 2 and papel_disponible >= 2)): print_thread = Thread(target=impresora.imprimir_ticket_cierre, args=(user['nombre'], id_ticket, unidad, hora, bills, total, ticket['barcode'], date.strftime('%d/%m/%Y'))) print_thread.start() controlador.update_papel_disponible(UNIDAD, 0, 2) elif print_status == 2: mensaje = u"No hay papel" WarningPopup(mensaje).open() else: mensaje = u"Impresora desconectada" WarningPopup(mensaje).open() def cancel(self): """Vuelve a la pantalla anterior""" self.manager.current = 'servicios' self.manager.remove_widget(self.manager.get_screen('cierre'))