def imprimir(self,boton): """ Prepara la vista preliminar para la impresión del informe """ import informes datos = [] for i in self.resultado: # if len(i.observaciones) > 35: # observaciones = i.observaciones[:35]+'...' # else: # observaciones = i.observaciones # Ya administra bien el salto de línea. No hace falta cortar. observaciones = i.observaciones # Ya administra bien el salto de línea. No hace falta cortar. datos.append((i.tipoDeIncidencia.descripcion, utils.str_hora_corta(i.horainicio), utils.str_hora_corta(i.horafin), utils.str_fecha(i.parteDeProduccion.fecha), utils.str_hora_corta(i.parteDeProduccion.horainicio)+'-'+utils.str_hora_corta(i.parteDeProduccion.horafin), observaciones)) if (self.inicio) == None: fechaInforme = 'Hasta '+utils.str_fecha(time.strptime(self.fin,"%Y/%m/%d")) else: fechaInforme = utils.str_fecha(time.strptime(self.inicio,"%Y/%m/%d"))+' - '+utils.str_fecha(time.strptime(self.fin,"%Y/%m/%d")) if datos != []: informes.abrir_pdf(geninformes.incidencias(datos,fechaInforme))
def rellenar_tabla(self, items): """ Rellena el model con los items de la consulta """ model = self.wids['tv_datos'].get_model() model.clear() self.wids['tv_datos'].freeze_child_notify() self.wids['tv_datos'].set_model(None) total = 0 for i in items: total += 1 model.append((i.tipoDeIncidencia.descripcion, utils.str_hora_corta(i.horainicio), utils.str_hora_corta(i.horafin), utils.str_fecha(i.parteDeProduccion.fecha), utils.str_hora_corta(i.parteDeProduccion.horainicio)+'-'+utils.str_hora_corta(i.parteDeProduccion.horafin), i.observaciones.decode('UTF-8', 'ignore'), i.id)) # El .decode es para evitar esto: #./consulta_incidencias.py:81: PangoWarning: Invalid UTF-8 string passed to pango_layout_set_text() self.wids['tv_datos'].set_model(model) self.wids['tv_datos'].thaw_child_notify() self.wids['e_total'].set_text("%d " % total)
def rellenar_horas(self, b = None): """ Rellena el model con las horas trabajadas en cada parte del rango de fechas. """ try: dia, mes, anno = map(int, self.wids['e_fecha'].get_text().split('/')) except: utils.dialogo_info(titulo = "FECHA INCORRECTA", texto = "La fecha no es correcta. Use el formato día/mes/año", padre = self.wids['ventana']) return fecha = mx.DateTime.DateTimeFrom(day = dia, month = mes, year = anno) model = self.wids['tv_horas'].get_model() model.clear() partes_produccion = self.buscar_partes_produccion(fecha) empleados, aux = self.preparar_datos(partes_produccion, fecha) fecha_ini = fecha_fin = fecha ftini = mx.DateTime.DateTimeFrom(year = fecha_ini.year, month = fecha_ini.month, day = fecha_ini.day, hour = 6, minute = 0, second = 0).strftime('%Y-%m-%d %H:%M:%S') ftfin = (mx.DateTime.DateTimeFrom(year = fecha_fin.year, month = fecha_fin.month, day = fecha_fin.day, hour = 6, minute = 0, second = 0) + mx.DateTime.oneDay).strftime('%Y-%m-%d %H:%M:%S') partes_t = pclases.ParteDeTrabajo.select("""horainicio >= '%s' AND horainicio < '%s' """ % (ftini, ftfin)) empleados = self.preparar_datos_recuperacion(empleados, partes_t, fecha, aux) self.convertir_valores_a_cadena(empleados) for empleado in empleados: e = pclases.Empleado.get(empleado['id']) try: laborable = [l for l in e.grupo.laborables if l.fecha == fecha][0] nombre_empleado = "%s (%s)" % (empleado['nombre'], laborable.turno.nombre[0]) except AttributeError: nombre_empleado = empleado['nombre'] # No tiene grupo. except IndexError: nombre_empleado = empleado['nombre'] # No tiene laborables asignados. padre = model.append(None, (nombre_empleado, e.centroTrabajo and e.centroTrabajo.nombre or "", empleado['horainicio'], empleado['horafin'], empleado['horas'], empleado['noche'], empleado['extra'], empleado['gtx'], empleado['fib'], empleado['gmp'], empleado['mgtx'], empleado['mfib'], empleado['mgmp'], empleado['almacen'], empleado['varios'], empleado['observaciones'], empleado['id'])) for parte in empleado['partes']: try: hts = [ht for ht in parte.horasTrabajadas if ht.empleadoid == empleado['id']] horas_en_parte_del_empleado = sum([ht.horas for ht in hts]) model.append(padre, (utils.str_fecha(parte.fecha), parte.es_de_balas() and "fibra" or "geotextil", # PLAN: De geocompuestos y tapicerías ni hablamos. utils.str_hora_corta(parte.horainicio), utils.str_hora_corta(parte.horafin), utils.str_hora_corta(parte.get_duracion()), parte.es_nocturno(), "", not parte.es_de_balas() and \ utils.str_hora_corta(horas_en_parte_del_empleado) or "", parte.es_de_balas() and \ utils.str_hora_corta(horas_en_parte_del_empleado) or "", "-", # PLAN: Hasta que esté habilitada la línea de geocompuestos. "", "", "", "", "", "", parte.id)) except AttributeError: # Es parte de trabajo. # OJO: NOTA: HARCODED. Pero es que no encuentro otra # forma de hacerlo. ct_gtx, ct_fib, ct_gmp, ct_almacen = self.get_centros() ct = parte.centroTrabajo mgtx = mfib = mgmp = almacen = varios = "" if ct != None and ct == ct_gtx: mgtx = utils.str_hora_corta(parte.horas) elif ct != None and ct == ct_fib: mfib = utils.str_hora_corta(parte.horas) elif ct != None and ct == ct_gmp: mgmp = utils.str_hora_corta(parte.horas) elif ct != None and ct == ct_almacen: almacen = utils.str_hora_corta(parte.horas) else: varios = utils.str_hora_corta(parte.horas) horas_en_parte_del_empleado = parte.horas model.append(padre, (utils.str_fecha(parte.horainicio), parte.centroTrabajo and parte.centroTrabajo.nombre or "", utils.str_hora_corta(parte.horainicio), utils.str_hora_corta(parte.horafin), utils.str_hora_corta(parte.horas), parte.es_nocturno(), "", "", "", "-", mgtx, mfib, mgmp, almacen, varios, parte.trabajo, parte.id)) # Ahora los que no trabajaron: all_emps = pclases.Empleado.select( pclases.AND(pclases.Empleado.q.planta == True, pclases.Empleado.q.activo == True)) ids_emps_trabajo = [e['id'] for e in empleados] descanso = [e for e in all_emps if e.id not in ids_emps_trabajo] mesAnno = mx.DateTime.DateTimeFrom(day = 1, mes = fecha.month, year = fecha.year) # Los calendarios laborales siempre tienen 1 en el día. calendarios = pclases.CalendarioLaboral.select(pclases.CalendarioLaboral.q.mesAnno == mesAnno) for e in descanso: categoria = e.categoriaLaboral motivo = "" motivo_abr = " (D)" if categoria != None: try: calendario = [c for c in calendarios if c.lineaDeProduccion == categoria.lineaDeProduccion][0] if fecha in [f.fecha for f in calendario.festivos]: motivo = "FESTIVO" motivo_abr = " (FS)" elif fecha in [v.fecha for v in calendario.vacaciones]: motivo = "VACACIONES" motivo_abr = " (VC)" elif fecha in [a.fecha for a in e.ausencias]: ausencia = [a for a in e.ausencias if a.fecha == fecha][0] if ausencia.motivo != None: motivo = ausencia.motivo.descripcion if ausencia.motivo.convenio: motivo_abr = " (DC)" else: motivo_abr = " (BL)" else: motivo = "PERMISO SOLICITADO" motivo_abr = " (AP)" except IndexError: pass # No hay calendario relacionado con el trabajador. Puede que le falte categoría laboral, # que ésta no tenga linea de producción o que no se haya asignado aún un calendario. model.append(None,("%s, %s%s" % (e.apellidos, e.nombre, motivo_abr), e.centroTrabajo and e.centroTrabajo.nombre or "", "--", "--", "--", "", "", "", "", "", "", "", "", "", "", motivo, e.id))
def mostrar_horas(self, tv, path, vc): """ Abre una ventana de búsqueda con las horas trabajadas en partes de producción y partes de trabajo. """ # EMPLEADO self.wids['ventana'].window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) while gtk.events_pending(): gtk.main_iteration(False) model = tv.get_model() idempleado = model[path][-1] empleado = pclases.Empleado.get(idempleado) # PARTES DE PRODUCCIÓN try: dia, mes, anno = map(int, self.wids['e_fecha_ini'].get_text().split('/')) except: utils.dialogo_info(titulo = "FECHA INCORRECTA", texto = "La fecha inicial no es correcta. Use el formato día/mes/año") else: fecha_ini = mx.DateTime.DateTimeFrom(day = dia, month = mes, year = anno) dia, mes, anno = map(int, self.wids['e_fecha_fin'].get_text().split('/')) try: fecha_fin = mx.DateTime.DateTimeFrom(day = dia, month = mes, year = anno) except: utils.dialogo_info(titulo = "FECHA INCORRECTA", texto = "La fecha inicial no es correcta. Use el formato día/mes/año") else: partes_produccion = self.buscar_partes_produccion(fecha_ini, fecha_fin) horas_trabajadas = [] # Horas en partes de producción horas_recuperacion = [] # Horas en partes de trabajo for pdp in partes_produccion: for ht in pdp.horasTrabajadas: if ht.empleado == empleado: horas_trabajadas.append(("PDP:%d" % (ht.parteDeProduccion.id), utils.str_fecha(pdp.fecha), utils.str_hora_corta(pdp.horainicio), utils.str_hora_corta(pdp.horafin), utils.str_hora_corta(pdp.get_duracion()), utils.str_hora_corta(ht.horas), pdp)) # PARTES DE TRABAJO ftini = mx.DateTime.DateTimeFrom(year = fecha_ini.year, month = fecha_ini.month, day = fecha_ini.day, hour = 6, minute = 0, second = 0).strftime('%Y-%m-%d %H:%M:%S') ftfin = (mx.DateTime.DateTimeFrom(year = fecha_fin.year, month = fecha_fin.month, day = fecha_fin.day, hour = 6, minute = 0, second = 0) + mx.DateTime.oneDay).strftime('%Y-%m-%d %H:%M:%S') partes_trabajo = pclases.ParteDeTrabajo.select("""horainicio >= '%s' AND horainicio < '%s' """ % (ftini, ftfin)) for pdt in partes_trabajo: if pdt.empleado == empleado: horas_recuperacion.append(("PDT:%d" % (pdt.id), utils.str_fecha(pdt.horainicio), utils.str_hora_corta(pdt.horainicio), utils.str_hora_corta(pdt.horafin), utils.str_hora_corta(pdt.get_duracion()), utils.str_hora_corta(pdt.get_duracion()), pdt)) horas = horas_trabajadas + horas_recuperacion horas.sort(lambda x, y: utils.orden_por_campo_o_id(x[-1], y[-1], "fecha")) horas = [i[:-1] for i in horas] # DIÁLOGO RESULTADOS id_parte = utils.dialogo_resultado(horas, "Horas trabajadas de producción y partes de trabajo de %s %s:" % (empleado.nombre, empleado.apellidos), multi = False, padre = self.wids['ventana'], cabeceras = ("ID", "Fecha", "Hora inicio", "Hora fin", "Duración", "Horas trabajadas")) if id_parte != -1: tipo, id = id_parte.split(":") self.wids['ventana'].window.set_cursor(None) if tipo == "PDP": parte = pclases.ParteDeProduccion.get(id) if parte.es_de_geotextiles(): import partes_de_fabricacion_rollos v = partes_de_fabricacion_rollos.PartesDeFabricacionRollos(objeto = parte, usuario = self.usuario) elif parte.es_de_fibra(): import partes_de_fabricacion_balas v = partes_de_fabricacion_balas.PartesDeFabricacionBalas(objeto = parte, usuario = sef.usuario) elif tipo == "PDT": parte = pclases.ParteDeTrabajo.get(id) import partes_de_trabajo v = partes_de_trabajo.PartesDeTrabajo(objeto = parte, usuario = self.usuario) self.wids['ventana'].window.set_cursor(None)