def __init__(self, objeto = None, usuario = None): """ Constructor. objeto puede ser un objeto de pclases con el que comenzar la ventana (en lugar del primero de la tabla, que es el que se muestra por defecto). """ global fin Ventana.__init__(self, os.path.join("ui", 'consulta_precios.glade'), objeto) connections = {'b_salir/clicked': self.salir, 'b_buscar/clicked': self.buscar, 'b_imprimir/clicked': self.imprimir, 'b_fecha_inicio/clicked': self.set_inicio, 'b_fecha_fin/clicked': self.set_fin, 'b_exportar/clicked': self.exportar} self.add_connections(connections) cols = [('Fecha', 'gobject.TYPE_STRING', False, True, True, None)] for p in pclases.ProductoVenta.select(orderBy = "nombre"): cols.append((p.nombre, "gobject.TYPE_STRING", False, False, False, None)) cols += [('id', 'gobject.TYPE_STRING', False, False, False, None)] utils.preparar_listview(self.wids['tv_datos'], cols) for i in range(1, len(cols)-1): col = self.wids['tv_datos'].get_column(i) for cell in col.get_cell_renderers(): cell.set_property("xalign", 1) temp = mx.DateTime.localtime() self.fin = utils.abs_mxfecha(temp) self.wids['e_fechafin'].set_text(utils.str_fecha(temp)) self.wids['tv_datos'].set_size_request(700, 200) gtk.main()
def es_diferente(self, debug_mode = False): """ Devuelve True si algún valor en ventana difiere de los del objeto. Si debug_mode es True devuelve la lista de campos que no son iguales en vez de un booleano. """ campos_diferentes = [] if self.objeto == None: igual = True else: igual = self.objeto != None for colname in self.clase.sqlmeta.columns: col = self.clase.sqlmeta.columns[colname] valor_ventana = self.leer_valor(col) valor_objeto = getattr(self.objeto, col.name) if isinstance(col, pclases.SODateCol): valor_objeto = utils.abs_mxfecha(valor_objeto) igual = igual and (valor_ventana == valor_objeto) if not igual: campos_diferentes.append(colname) if not debug_mode: # No sigo mirando break if not debug_mode: return not igual else: return campos_diferentes
def es_diferente(self): """ Devuelve True si algún valor en ventana difiere de los del objeto. """ if self.objeto == None: igual = True else: igual = self.objeto != None for colname in self.dic_campos: if colname in ("id", ): continue col = self.clase.sqlmeta.columns[colname] try: valor_ventana = self.leer_valor(col, self.dic_campos[colname]) except (ValueError, mx.DateTime.RangeError, TypeError): if isinstance(col, pclases.SODateCol): valor_ventana = None else: igual = False valor_objeto = getattr(self.objeto, col.name) if isinstance(col, pclases.SODateCol): if valor_objeto: valor_objeto = utils.abs_mxfecha(valor_objeto) igual = igual and (valor_ventana == valor_objeto) if not igual: break return not igual
def drop_jornal(self, b): selection = self.wids['tv_jornales'].get_selection() model, paths = selection.get_selected_rows() for path in paths: id = model[path][-1] jornal = pclases.Jornal.get(id) # jornal.destroySelf() jornal.salario.horasCampo -= jornal.horasCampo jornal.salario.totalEuros -= (jornal.eurosCampo + jornal.eurosManipulacion) dia = utils.abs_mxfecha(jornal.fechahoraInicio) dias = [utils.abs_mxfecha(j.fechahoraInicio) for j in jornal.salario.jornales] if dias.count(dia) == 1: jornal.salario.totalEuros -= jornal.empleado.precioDiario jornal.salario = None self.objeto.update_actividad() self.actualizar_ventana()
def add_jornal(self, b): """ Muestra un diálogo de resultados con los jornales sin salarios relacionados, pertenecientes al empleado del registro salario y su fechahoraInicio esté entre la fecha del salario y el final del mes de esa misma fecha. """ findemes = mx.DateTime.DateTimeFrom(day = -1, month = self.objeto.fecha.month, year = self.objeto.fecha.year) findemes += mx.DateTime.oneDay # Porque vamos a comparar con fechahora. J = pclases.Jornal jornales = J.select(pclases.AND(J.q.salarioID == None, J.q.empleadoID == self.objeto.empleadoID, J.q.fechahoraInicio < findemes, J.q.fechahoraInicio >= self.objeto.fecha), orderBy = "fechahoraInicio") cabeceras=("ID", "Inicio", "Fin", "Actividad", "Parcela", "Produccion") filas = [(j.id, utils.str_fechahora(j.fechahoraInicio), utils.str_fechahora(j.fechahoraFin), j.actividad and j.actividad.descripcion or "", j.parcela and j.parcela.parcela or "", utils.float2str(j.produccion)) for j in jornales] resjornales = utils.dialogo_resultado(filas, "SELECCIONE JORNADAS", self.wids['ventana'], cabeceras, multi = True) if resjornales and resjornales[0] > 0: for jid in resjornales: jornal = pclases.Jornal.get(jid) jornal.salario = self.objeto jornal.salario.horasCampo += jornal.horasCampo jornal.salario.totalEuros += (jornal.eurosCampo + jornal.eurosManipulacion) dia = utils.abs_mxfecha(jornal.fechahoraInicio) dias = [utils.abs_mxfecha(j.fechahoraInicio) for j in jornal.salario.jornales] if dia not in dias: jornal.salario.totalEuros += jornal.empleado.precioDiario self.objeto.update_actividad() self.actualizar_ventana()
def add_ldv_a_diccionario_resultados(ldv, r): if ldv.productoCompra: material = ldv.productoCompra.tipoDeMaterial else: material = None if material not in r: r[material] = {} if ldv.facturaVenta: fecha = ldv.facturaVenta.fecha elif ldv.albaranSalida: fecha = ldv.albaranSalida.fecha elif ldv.ticket: fecha = utils.abs_mxfecha(ldv.ticket.fechahora) else: fecha = None if fecha not in r[material]: r[material][fecha] = [ldv] else: r[material][fecha].append(ldv)
def __init__(self, objeto = None, usuario = None): """ Constructor. objeto puede ser un objeto de pclases con el que comenzar la ventana (en lugar del primero de la tabla, que es el que se muestra por defecto). """ global fin Ventana.__init__(self, os.path.join("ui", 'consulta_clientes.glade'), objeto) connections = {'b_salir/clicked': self.salir, 'b_buscar/clicked': self.buscar, 'b_imprimir/clicked': self.imprimir, 'b_fecha_inicio/clicked': self.set_inicio, 'b_fecha_fin/clicked': self.set_fin, 'b_exportar/clicked': self.exportar} self.add_connections(connections) cols = (('Cliente', 'gobject.TYPE_STRING', False, True, True, None), ('Producto', 'gobject.TYPE_STRING', False, True, False, None), ('Media precio', 'gobject.TYPE_STRING', False, True, False, None), ('Facturación', 'gobject.TYPE_STRING', False, True, False, None), ('% facturación', 'gobject.TYPE_STRING', False, True, False, None), ('kg facturados', 'gobject.TYPE_STRING', False, True, False, None), ('id', 'gobject.TYPE_STRING', False, False, False, None)) utils.preparar_treeview(self.wids['tv_datos'], cols) for i in range(2, 6): col = self.wids['tv_datos'].get_column(i) for cell in col.get_cell_renderers(): cell.set_property("xalign", 1) col = self.wids['tv_datos'].get_column(1) self.wids['tv_datos'].set_expander_column(col) temp = mx.DateTime.localtime() self.fin = utils.abs_mxfecha(temp) self.wids['e_fechafin'].set_text(utils.str_fecha(temp)) ops = [] for s in pclases.SerieFacturasVenta.select(): ops.append((s.id, s.get_info())) utils.rellenar_lista(self.wids['cb_serie'], ops) gtk.main()
def __init__(self, objeto = None, usuario = None): """ Constructor. objeto puede ser un objeto de pclases con el que comenzar la ventana (en lugar del primero de la tabla, que es el que se muestra por defecto). """ global fin Ventana.__init__(self, os.path.join("ui", 'consulta_parcelas.glade'), objeto) connections = {'b_salir/clicked': self.salir, 'b_buscar/clicked': self.buscar, 'b_imprimir/clicked': self.imprimir, 'b_fecha_inicio/clicked': self.set_inicio, 'b_fecha_fin/clicked': self.set_fin, 'b_exportar/clicked': self.exportar} self.add_connections(connections) cols = (('Parcela', 'gobject.TYPE_STRING', False, True, True, None), ('Kg/planta', 'gobject.TYPE_STRING', False, True, False, None), ('Kg totales', 'gobject.TYPE_STRING', False, True, False, None), ('Gastos apertura', 'gobject.TYPE_STRING', False, True, False, None), ('Gastos cierre', 'gobject.TYPE_STRING', False, True, False, None), ('Gastos generales', 'gobject.TYPE_STRING', False, True, False, None), ('Ingresos', 'gobject.TYPE_STRING', False, True, False, None), ('id', 'gobject.TYPE_STRING', False, False, False, None)) utils.preparar_listview(self.wids['tv_datos'], cols) for i in range(1, 7): col = self.wids['tv_datos'].get_column(i) for cell in col.get_cell_renderers(): cell.set_property("xalign", 1) temp = mx.DateTime.localtime() self.fin = utils.abs_mxfecha(temp) self.wids['e_fechafin'].set_text(utils.str_fecha(temp)) gtk.main()
def generar(self, boton): """ Genera un salario por empleado con todos los jornales que tenga a True. Después abre una ventana Salarios con cada uno de los salarios generados. Finalmente recarga la información de esta ventana con los jornales que han quedado pendientes. """ horas = self.wids['e_horas'].get_text() try: horas = utils._float(horas) except ValueError: utils.dialogo_info(titulo = "ERROR", texto = "El texto «%s» no es un número."%horas, padre = self.wids['ventana']) else: jornales = {} model = self.wids['tv_datos'].get_model() for fila in range(len(model)): if model[fila][2]: jornal = pclases.Jornal.get(model[fila][-1]) try: jornales[jornal.empleado].append(jornal) except KeyError: jornales[jornal.empleado] = [jornal] txtfecha = self.wids['e_fecha'].get_text() fecha = utils.parse_fecha(txtfecha) salarios_creados = [] for empleado in jornales: gasto, empleado = build_gasto_salario(self.wids['ventana'], empleado) salario = pclases.Salario(horasCampo = 0.0, fecha = fecha, horasManipulacion = horas, totalEuros = 0.0, empleado = empleado, gasto = gasto, actividad = None) for jornal in jornales[empleado]: jornal.salario = salario salario.horasCampo += jornal.horasCampo # OJO: CWT: No actualizo las horas de manipulación. Eran # las mismas para todos los salarios creados según # documento de requisitos v2 (cuaderno). salario.totalEuros += (jornal.eurosCampo + jornal.eurosManipulacion) dias = [] for jornal in salario.jornales: dia = utils.abs_mxfecha(jornal.fechahoraInicio) if dia not in dias: dias.append(dia) # NOTA: OJO: Si echa "dos peonás" en el mismo día, se # le cuenta como un día (aparte de las horas que eche # y demás. Hablo del precio por día del empleado). Lo # mismo digo si viene y echa tres días seguidos en el # mismo jornal. Cuenta como uno. O lo parte el nodo de # campo o se le cuenta como uno. salario.totalEuros += len(dias) * empleado.precioDiario salario.update_actividad() salarios_creados.append(salario) self.rellenar_widgets() import salarios #for salario in salarios_creados: # ventana = salarios.Salarios(salario, self.usuario) #No puedo abrir varias ventanas a la vez. Abro el último salario creado. try: ventana = salarios.Salarios(salarios_creados[-1], self.usuario) except IndexError: pass