def get_porcentaje_cc(start, end): """ Muestra el porcentaje de asistencia por persona en cada proyecto :param start: fecha limite inicial :param end: fecha limite final :return: reporte """ processed = defaultdict(dict) totales = dict() header = ["CCT", "APELLIDO NOMBRE", "C.U.I.L.", "PROYECTO", "Cuenta en ESTADO"] qs = RegistroAsistencia.objects.filter( asistencia__fecha__gte=start, asistencia__fecha__lte=end) qs = qs.values('persona__cct__nombre', 'persona__apellido','persona__nombre', 'persona__cuil', 'asistencia__proyecto__nombre', ).annotate(est=Count('pk')) for it in qs: persona = "{} {}".format(it["persona__apellido"], it["persona__nombre"]) processed[persona][it['asistencia__proyecto__nombre']]=it val = totales.get(persona, 0) + it["est"] totales[persona] = val report = list() report.append(header) for nombre, data in sort_dict(processed): for row, data1 in data.items(): aux = list() porc = data1["est"] * 100 / totales.get(nombre) aux.extend([data1["persona__cct__nombre"], nombre, data1["persona__cuil"], row, "{0:.2f}".format(porc)]) report.append(aux) return report
def get_asistencia_persona(start, end, group_by): """ Reportes de cantidad de registros por estado por día, agrupados por group_by :param start: fecha limite inicial :param end: fecha limite final :param group_by: agrupador :return: reporte """ if group_by is None: group_by = 'persona' processed = defaultdict(dict) header = list() estados = Estado.objects.values_list('codigo', flat=True) qs = RegistroAsistencia.objects.filter( asistencia__fecha__gte=start, asistencia__fecha__lte=end) if group_by == 'persona': qs = qs.values( 'persona__apellido', 'persona__nombre', 'estado__codigo').annotate(cant=Count('pk')).order_by('persona') for it in qs: processed["{} {}".format(it["persona__apellido"], it["persona__nombre"])][it['estado__codigo']]=it["cant"] header.append("Nombre") elif group_by == 'responsable': qs = qs.values('asistencia__proyecto__responsable_rel__persona', 'estado__codigo').annotate( cant=Count('persona_id')).order_by('asistencia__proyecto__responsable_rel__persona__apellido') responsables = dict([(x[0], "{} {}".format(x[1], x[2])) for x in Responsable.objects.values_list( 'persona', 'persona__apellido', 'persona__nombre').distinct()]) for it in qs: processed[responsables[it["asistencia__proyecto__responsable_rel__persona"]]][it['estado__codigo']]=it["cant"] header.append("Responsable") report = list() header.extend(estados) header.append("Total") report.append(header) values = list() for nombre, data in sort_dict(processed): total_row = 0 aux = list() aux.append(nombre) for est in estados: val = data.get(est, 0) aux.append(val) total_row += val aux.append(total_row) values.append(aux[1:]) report.append(aux) totales = [sum(i) for i in zip(*values)] totales.insert(0, "Total general") report.append(totales) return report