Beispiel #1
0
 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()
Beispiel #2
0
 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()
Beispiel #3
0
 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()
Beispiel #4
0
 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()
Beispiel #5
0
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'))
Beispiel #6
0
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'))
Beispiel #7
0
 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()
Beispiel #8
0
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'
Beispiel #9
0
 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()
Beispiel #10
0
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'))
Beispiel #11
0
 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()
Beispiel #12
0
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")
Beispiel #13
0
 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()
Beispiel #14
0
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'))
Beispiel #15
0
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'))
Beispiel #16
0
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"
Beispiel #17
0
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'))
Beispiel #18
0
 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()
Beispiel #19
0
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'))
Beispiel #20
0
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'))
Beispiel #21
0
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")
Beispiel #22
0
 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()
Beispiel #23
0
 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()
Beispiel #24
0
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'))