class CanchasTabJuego(wx.Panel): def addPanel(self, label, panel, header=False, data=None, cliente=None, precio=None, disabled=None): panel_tmp = wx.Panel(parent = self, id = wx.ID_ANY, style = wx.SIMPLE_BORDER) if label != "RESERVADA" and label != 'LIBRE' and label != 'CERRADA': text = wx.StaticText(panel_tmp, label=label) else: text = wx.StaticText(panel_tmp, label="") tmp_vbox = wx.BoxSizer(wx.HORIZONTAL) tmp_global_sizer = wx.GridSizer(0, 3, 0, 0) font = wx.Font(16, wx.NORMAL, wx.NORMAL, wx.BOLD) if header: text.SetForegroundColour((255,255,255)) panel_tmp.SetBackgroundColour("Black") text.SetFont(font) else: if label != "RESERVADA" and label != "ACTIVA" and label != 'CERRADA': image2 = wx.Image('images/favicon.ico', wx.BITMAP_TYPE_ANY).ConvertToBitmap() self.btn_res = wx.BitmapButton(panel_tmp, id=-1, bitmap=image2, size=(24,24)) else: if label != 'CERRADA' and label != "ACTIVA": image5 = wx.Image('images/delete.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap() self.btn_del = wx.BitmapButton(panel_tmp, id=-1, bitmap=image5, size=(24,24)) if label == "RESERVADA" or label == 'CERRADA' or label == 'ACTIVA': image_info = wx.Image('images/info.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap() self.btn_inf = wx.BitmapButton(panel_tmp, id=-1, bitmap=image_info, size=(24,24)) if label != 'ACTIVA' and label == 'RESERVADA': image6 = wx.Image('images/green-ok.gif', wx.BITMAP_TYPE_ANY).ConvertToBitmap() self.btn_act = wx.BitmapButton(panel_tmp, id=-1, bitmap=image6, size=(24,24)) elif label == 'ACTIVA': image9 = wx.Image('images/red.gif', wx.BITMAP_TYPE_ANY).ConvertToBitmap() self.btn_dct = wx.BitmapButton(panel_tmp, id=-1, bitmap=image9, size=(24,24)) image3 = wx.Image('images/venta.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap() self.btn_vnt = wx.BitmapButton(panel_tmp, id=-1, bitmap=image3, size=(24,24)) panel_tmp.SetBackgroundColour("White") if label != "RESERVADA" and label != 'ACTIVA' and label != 'CERRADA': tmp_vbox.Add(self.btn_res) if label == 'RESERVADA': tmp_vbox.Add(self.btn_del) if label == 'CERRADA' or label == "RESERVADA" or label == "ACTIVA": tmp_vbox.Add(self.btn_inf) if label != 'ACTIVA' and label == 'RESERVADA': tmp_vbox.Add(self.btn_act) elif label == 'ACTIVA': tmp_vbox.Add(self.btn_dct) tmp_vbox.Add(self.btn_vnt) m_total = self.__MontoTotal( data ) monto_total = wx.StaticText(panel_tmp, id=-1, label="$%s" % m_total) monto_font = wx.Font(14, wx.NORMAL, wx.NORMAL, wx.BOLD) monto_total.SetFont( monto_font ) desfa = wx.StaticText(panel_tmp, id=-1, label=" | %s min" % data[2]) desfa.SetFont( monto_font ) tmp_vbox.Add(monto_total, flag=wx.RIGHT) tmp_vbox.Add(desfa, flag=wx.RIGHT) self.Bind(wx.EVT_BUTTON, lambda evt, data=data: self.__OnAddVenta(evt, data), self.btn_vnt) self.Bind(wx.EVT_BUTTON, lambda evt, data=data: self.__OnCloseCancha(evt, data), self.btn_dct) elif label == 'CERRADA': m_total = self.__MontoTotal( data ) monto_total = wx.StaticText(panel_tmp, id=-1, label="$%s" % m_total) monto_font = wx.Font(14, wx.NORMAL, wx.NORMAL, wx.BOLD) monto_total.SetFont( monto_font ) monto_total.SetForegroundColour((255,255,0)) tmp_vbox.Add(monto_total, flag=wx.RIGHT) if label != "RESERVADA": text = wx.StaticText(panel_tmp, label="") tmp_vbox.Add(text) if label != "ACTIVA" and label == 'RESERVADA': if data is not None: self.Bind(wx.EVT_BUTTON, lambda evt, data=data: self.__OnActivate(evt, data), self.btn_act) if label != "RESERVADA" and label != "ACTIVA" and label != "CERRADA": if data is not None: self.Bind(wx.EVT_BUTTON, lambda evt, data=data: self.__OnBallClick(evt, data), self.btn_res) if label == "RESERVADA": if date_selected.GetDate() is not None: cliente = self.DBM.getClienteReservado(date_selected.GetDate(), data[0], data[1])[0] else: cliente = self.DBM.getClienteReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] cliente_label = wx.StaticText(panel_tmp, id=-1, label="%s" % cliente) monto_font = wx.Font(14, wx.NORMAL, wx.NORMAL, wx.BOLD) cliente_label.SetFont(monto_font) tmp_vbox.Add(cliente_label) if data is not None: self.Bind(wx.EVT_BUTTON, lambda evt, data=data: self.__OnCancelClick(evt, data), self.btn_del) if label == "RESERVADA" or label == 'CERRADA' or label == "ACTIVA": if data is not None: self.Bind(wx.EVT_BUTTON, lambda evt, data=data: self.__OnInfoClick(evt, data), self.btn_inf) if label == "RESERVADA": panel_tmp.SetBackgroundColour("Yellow") elif label == "ACTIVA": panel_tmp.SetBackgroundColour("Green") if label == "CERRADA": panel_tmp.SetBackgroundColour("Red") tmp_vbox.Add(tmp_global_sizer, flag=wx.EXPAND) panel_tmp.SetSizer(tmp_vbox) panel.Add(panel_tmp, flag=wx.EXPAND, proportion=1) def __MontoTotal(self, data): id_reserva = None if date_selected.GetDate() is not None: id_reserva = self.DBM.getIDReservado( data_selected.GetDate(), data[0], data[1] ) else: id_reserva = self.DBM.getIDReservado( datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1] ) id_cuenta = self.DBM.getCuentaHorarioID( id_reserva ) productos = self.DBM.getProductosByCuenta( id_cuenta ) total = 0 for prod in productos: total += prod[1] * prod[2] return total def __OnActivate(self, evt, data): minutos = MinutosDespues(self, -1, "Minutos", data) def __PostOnActivate(self, evt): data = evt.data['data'] stamp = evt.data['value'] if date_selected.GetDate() is not None: cliente = self.DBM.getClienteReservado(date_selected.GetDate(), data[0], data[1]) precio = self.DBM.getPrecioReservado(date_selected.GetDate(), data[0], data[1]) result = self.DBM.activateCancha(date_selected.GetDate(), data[0], data[1], cliente, precio, stamp) else: cliente = self.DBM.getClienteReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1]) precio = self.DBM.getPrecioReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1]) result = self.DBM.activateCancha(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1], cliente, precio, stamp) self.OnCalSelected( date_selected ) def __OnCloseCancha( self, evt, data ): if date_selected.GetDate() is not None: cliente = self.DBM.getClienteReservado(data_selected.GetDate(), data[0], data[1]) precio = self.DBM.getPrecioReservado(data_selected.GetDate(), data[0], data[1]) result = self.DBM.closeCancha(date_selected.GetDate(), data[0], data[1], cliente, precio) else: cliente = self.DBM.getClienteReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1]) precio = self.DBM.getPrecioReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1]) result = self.DBM.closeCancha(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1], cliente, precio) self.OnCalSelected( date_selected ) def __OnAddVenta(self, evt, data): status = None if date_selected.GetDate() is not None: status = self.DBM.getCanchaStatus(date_selected.GetDate(), data[0], data[1]) else: status = self.DBM.getCanchaStatus(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1]) if status is not None: if status[0] != "2": wx.MessageBox("La cancha debe estar activa para poder asignarle una compra", "Activar Primero", wx.OK | wx.ICON_INFORMATION) else: result = dict() if date_selected.GetDate() is not None: result['cliente'] = self.DBM.getClienteReservado(date_selected.GetDate(), data[0], data[1])[0] result['precio'] = self.DBM.getPrecioReservado(date_selected.GetDate(), data[0], data[1])[0] result['cancha'] = [name for name in self.DBM.getCanchasNames() if name[0] == data[0]][0][1] result['horario'] = "%s:00 hs" % data[1] result['status'] = self.DBM.getCanchaStatus(date_selected.GetDate(), data[0], data[1])[0] result['fecha'] = date_selected.GetDate() result['id_cancha'] = data[0] else: result['cliente'] = self.DBM.getClienteReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] result['precio'] = self.DBM.getPrecioReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] result['cancha'] = [name for name in self.DBM.getCanchasNames() if name[0] == data[0]][0][1] result['horario'] = "%s:00 hs" % data[1] result['status'] = self.DBM.getCanchaStatus(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] result['fecha'] = datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__() result['id_cancha'] = data[0] CuentaCancha(self, id=wx.ID_ANY, title="Cuenta de cancha", data=result) else: wx.MessageBox("La cancha debe estar activa para poder asignarle una compra", "Activar Primero", wx.OK | wx.ICON_INFORMATION) def __OnCancelClick( self, evt, data ): if date_selected.GetDate() is not None: result = self.DBM.cancelReserva(date_selected.GetDate(),data[0], data[1]) else: result = self.DBM.cancelReserva(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(),data[0], data[1]) if result: wx.MessageBox('Cancelacion exitosa', 'Cancelacion Exitosa', wx.OK | wx.ICON_INFORMATION) self.OnCalSelected( date_selected ) def __OnBallClick( self, evt, data ): result = None ReservaForm( self, id=wx.ID_ANY, title="Formulario de Reserva", data=data ) def __OnInfoClick( self, evt, data ): result = dict() if date_selected.GetDate() is not None: result['cliente'] = self.DBM.getClienteReservado(date_selected.GetDate(), data[0], data[1])[0] result['precio'] = self.DBM.getPrecioReservado(date_selected.GetDate(), data[0], data[1])[0] result['cancha'] = [name for name in self.DBM.getCanchasNames() if name[0] == data[0]][0][1] result['horario'] = "%s:00 hs" % data[1] result['status'] = self.DBM.getCanchaStatus(date_selected.GetDate(), data[0], data[1])[0] id_reserva = self.DBM.getIDReservado( date_selected.GetDate(), data[0], data[1] ) id_cuenta_horario = self.DBM.getCuentaHorarioID( id_reserva ) else: result['cliente'] = self.DBM.getClienteReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] result['precio'] = self.DBM.getPrecioReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] result['cancha'] = [name for name in self.DBM.getCanchasNames() if name[0] == data[0]][0][1] result['horario'] = "%s:00 hs" % data[1] status = self.DBM.getCanchaStatus(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] try: id_reserva = self.DBM.getIDReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] id_cuenta_horario = self.DBM.getCuentaHorarioID( id_reserva ) productos = self.DBM.getProductosByCuenta( id_cuenta_horario ) total = 0 result['productos'] = productos for y in [i[1] * i[2] for i in productos]: total += y result['gastos'] = total except: result['gastos'] = 0 if status == '1': result['status'] = 'Reservada' elif status == '2': result['status'] = 'Activa' id_reserva = self.DBM.getIDReservado(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(), data[0], data[1])[0] id_cuenta_horario = self.DBM.getCuentaHorarioID( id_reserva ) productos = self.DBM.getProductosByCuenta( id_cuenta_horario ) result['productos'] = productos elif status == '3': result['status'] = 'Cerrada' InfoDialog( self, id=wx.ID_ANY, title="Informacion de Horario", data=result ) def __postReserva( self, evt ): data = evt.data['old_data'] precio = evt.data['precio'] cliente = evt.data['cliente'] msg = evt.data['msg'] result = None if not msg[0]: if date_selected.GetDate() is not None: result = self.DBM.doReserva(date_selected.GetDate(),data[0], data[1], precio, cliente) else: result = self.DBM.doReserva(datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S").__str__(),data[0], data[1], precio, cliente) if result: wx.MessageBox('La reserva fue exitosa', 'Reversa Exitosa', wx.OK | wx.ICON_INFORMATION) else: wx.MessageBox('Este horario estaba reservado', 'Reseva Cancelada', wx.OK | wx.ICON_HAND) else: wx.MessageBox(msg[1], 'Error', wx.OK | wx.ICON_ERROR) self.OnCalSelected( date_selected ) def buildCells(self, this_time=None): cells = list() c_canchas = self.DBM.countCanchas() n_canchas = self.DBM.getCanchasNames() horarios = ['14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24'] if this_time == 'None': this_time = datetime.datetime.now().strftime("%m/%d/%y %H:%M:%S") cells.append({'label' : 'HORARIOS', 'header' : True, 'data' : None, 'cliente' : '', 'precio' : ''}) for nombre in n_canchas: cells.append( {'label' : nombre[1], 'header' : True, 'data' : None, 'cliente' : '', 'precio' : ''} ) for hora in horarios: cells.append( {'label' : "%s:00 hs" % hora, 'header' : True, 'data' : None, 'cliente' : '', 'precio' : ''} ) for cancha in n_canchas: status = self.DBM.getCanchaStatus(this_time, cancha[0], hora) paso = True cliente = '' precio = '' if status is not None and status[0] == '1': cliente = self.DBM.getClienteReservado(this_time, cancha[0], hora) precio = self.DBM.getPrecioReservado(this_time, cancha[0], hora) if status is not None and status[0] == '0': paso = False if status is not None and paso : status = str( status[0] ) if status == '0': cells.append( {'label' : 'LIBRE', 'header' : False, 'data' : ( cancha[0], hora), 'cliente' : cliente, 'precio' : precio } ) if status == '1': cells.append( {'label' : 'RESERVADA', 'header' : False, 'data' : ( cancha[0], hora), 'cliente' : cliente, 'precio' : precio } ) if status == '2': desfasa = self.DBM.getMinutosActivacion(this_time, cancha[0], hora) cells.append( {'label' : 'ACTIVA', 'header' : False, 'data' : ( cancha[0], hora, desfasa[0] ), 'cliente' : cliente, 'precio' : precio } ) if status == '3': cells.append( {'label' : 'CERRADA', 'header' : False, 'data' : ( cancha[0], hora ), 'cliente' : cliente, 'precio' : precio } ) else: cells.append( {'label':'LIBRE', 'header': False, 'data': (cancha[0], hora), 'cliente':'', 'precio':'' } ) return cells def constructCells(self, global_sizer, this_time=None): this_time = this_time.__str__() #print "This_time: %s" % type( this_time ) for cell in self.buildCells(this_time): self.addPanel(label=cell['label'], header=cell['header'], panel=global_sizer, data=cell['data'], cliente=cell['cliente'], precio=cell['precio'], disabled=False) def __refresh( self, evt ): self.global_sizer.Clear(deleteWindows=True) self.global_sizer.Layout() self.constructCells( self.global_sizer ) self.global_sizer.Layout() def OnCalSelected( self, evt ): self.global_sizer.Clear(deleteWindows=True) self.global_sizer.Layout() self.constructCells(self.global_sizer, evt.GetDate()) self.global_sizer.Layout() def OnExternalCalSelected( self, evt ): self.global_sizer.Clear(deleteWindows=True) self.global_sizer.Layout() self.constructCells(self.global_sizer, evt.data) self.global_sizer.Layout() #self.fecha_banner.SetLabel( evt.data.__str__() ) date_selected.SetDate( evt.data ) def ShowCalendar( self, evt ): MyCalendar(self, id=wx.ID_ANY, title="Calendar") def OnVenta( self, evt ): venta = VentaAdmin(self, -1, 'Realizar una venta') def __init__(self, parent): wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY) self.DBM = DBManager() canchas = self.DBM.countCanchas() + 1 self.vbox = wx.BoxSizer(wx.VERTICAL) self.global_sizer = wx.GridSizer(canchas, canchas, 0, 0) image1 = wx.Image('calendar.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap() self.btn_cal = wx.BitmapButton(self, id=-1, bitmap=image1, size=(30,30)) image2 = wx.Image('venta.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap() self.btn_vnt = wx.BitmapButton(self, id=-1, bitmap=image2, size=(30,30)) cur_date = None if date_selected.GetDate() is not None: cur_date = date_selected.GetDate() else: cur_date = datetime.datetime.now().strftime("%m/%d/%y").__str__() titulo = wx.StaticText(self, -1, "Fecha: %s" % cur_date) line = wx.StaticText(self, -1, "") font = wx.Font(16, wx.MODERN, wx.NORMAL, wx.BOLD) titulo.SetFont(font) self.Bind(wx.EVT_BUTTON, self.ShowCalendar, self.btn_cal) self.Bind(wx.EVT_BUTTON, self.OnVenta, self.btn_vnt) self.constructCells(self.global_sizer) self.tool_bar = wx.BoxSizer(wx.HORIZONTAL) self.tool_bar.Add(self.btn_cal) self.tool_bar.Add(self.btn_vnt) self.tool_bar.Add(titulo) self.vbox.Add(self.tool_bar, proportion=1) self.vbox.Add(line, proportion=1) self.vbox.Add(self.global_sizer, proportion=27, flag=wx.EXPAND) self.SetSizer(self.vbox) Publisher().subscribe(self.OnExternalCalSelected, ("date_selected")) Publisher().subscribe(self.__postReserva, ("reserva_form")) Publisher().subscribe(self.__refresh, ("cuentacancha_cerrada")) Publisher().subscribe(self.__PostOnActivate, ("procced"))