def canvas_edison(request): template = "statistiche/canvas_edison.html" if request.method == "GET" and request.GET.has_key("fperiodo"): period = u.get_period(request.GET) else: period = u.get_current_quarter() contratti = models.Contratto.objects.filter(pianotariffario__tariffa__gestore="edison", data_stipula__gte=period[0], data_stipula__lte=period[1]) # ricaviamo gli agenti artefici dei contratti selezionati # ricaviamo gli agenti artefici dei contratti selezionati if request.method == "GET" and request.GET.has_key("fagente"): agenti_ids = u.get_agenti_ids(request.GET) agenti = models.Dipendente.objects.filter(contratto__pk__in=contratti).filter(pk__in=agenti_ids).distinct().iterator() else: agenti = models.Dipendente.objects.filter(contratto__pk__in=contratti).distinct().iterator() # objs = [] # # if contratti.exists(): # for agt in agenti: # points = get_edison_points(contratti, agt) # # contratti_agt = contratti.filter(agente=agt) # # if contratti_agt.exists(): # pt_edison_agt = models.PianoTariffario.objects.filter(contratto__in=contratti_agt) # bus_en_tot = pt_edison_agt.filter(tariffa__tipo=models.TipologiaTariffa.objects.get(denominazione="luce"), # cliente__tipo="bus").aggregate(tot=Sum("num")) # bus_en_tot = bus_en_tot["tot"] if bus_en_tot["tot"] else 0 # # pri_en_tot = pt_edison_agt.filter(tariffa__tipo=models.TipologiaTariffa.objects.get(denominazione="luce"), # cliente__tipo="pri").aggregate(tot=Sum("num")) # pri_en_tot = pri_en_tot["tot"] if pri_en_tot["tot"] else 0 # # bus_gas_tot = pt_edison_agt.filter(tariffa__tipo=models.TipologiaTariffa.objects.get(denominazione="gas"), # cliente__tipo="bus").aggregate(tot=Sum("num")) # bus_gas_tot = bus_gas_tot["tot"] if bus_gas_tot["tot"] else 0 # # pri_gas_tot = pt_edison_agt.filter(tariffa__tipo=models.TipologiaTariffa.objects.get(denominazione="gas"), # cliente__tipo="pri").aggregate(tot=Sum("num")) # pri_gas_tot = pri_gas_tot["tot"] if pri_gas_tot["tot"] else 0 # # objs.append({"agente": agt, # "bus_en": points["bus_en"], # "pri_en": points["pri_en_tot"], # "bus_gas": points["bus_gas_tot"], # "pri_gas": points["pri_gas_tot"], # "tot": (points["bus_en_tot"] + points["bus_gas_tot"] # + points["pri_en_tot"] + points["pri_gas_tot"]), # "posizione": None}) # # # selezioniamo solo i primi 15 agenti in base al totale dei punteggi # objs = [ obj for obj in sorted(objs, key=lambda x: x["tot"], reverse=True)[:15]] # # aggiungiamo il valore della posizione # # la posizione aumenta solo nel caso in cui il totale dei punti è minore # pos = 1 # tot_punti_cur = 0 # for obj in objs: # obj["posizione"] = pos # if obj["tot_punti"] != tot_punti_cur: # pos += 1 # tot_punti_cur = obj["tot_punti"] # # objs = sort_objs(objs) objs = get_edison_ranking(contratti, agenti) # calcoliamo i totali # bus_en= 0 # pri_en = 0 # bus_gas = 0 # pri_gas = 0 # for obj in objs: # bus_en += obj["bus_en"] # pri_en += obj["pri_en"] # bus_gas += obj["bus_gas"] # pri_gas += obj["pri_gas"] # totals = [bus_en, pri_en, bus_gas, pri_gas, bus_en + pri_en + bus_gas + pri_gas] totals = get_edison_totals(objs) table = tables.CanvasTable(objs) table.paginate(page=request.GET.get("page", 1)) table.order_by = request.GET.get("sort") if request.is_ajax(): # template = "statistiche/reporttable_snippet.html" data = {"table": table, "totals": totals, "period": (period[0].strftime("%d/%m/%Y"), period[1].strftime("%d/%m/%Y"))} return render_to_response(template, data, context_instance=RequestContext(request)) filterform = forms.CanvasFilterForm() data = {"table": table, "filterform": filterform, "period": (period[0].strftime("%d/%m/%Y"), period[1].strftime("%d/%m/%Y"))} return render_to_response(template, data, context_instance=RequestContext(request))
def details(request): #TODO: controllare che effettivamente i calcoli siano giusti # getcontext().prec = 2 template = "statistiche/dettaglio_dipendente.html" if request.method == "GET" and request.GET.has_key("fperiodo"): period = u.get_period(request.GET) else: period = u.get_current_month() # entrate # 1 - contratti stipulati contratti = models.Contratto.objects.filter(data_stipula__gte=period[0], data_stipula__lte=period[1])\ .order_by("data_stipula")\ .select_related() # ricaviamo contratti solo degli agenti selezionati dipendente = None if request.method == "GET" and request.GET.has_key("fdipendente"): dipendente_id = request.GET["fdipendente"][1:] if dipendente_id: dipendente = models.Dipendente.objects.get(id=dipendente_id) if dipendente.ruolo == "agt": contratti = contratti.filter(agente=dipendente) else: filter_ids = [] for contratto in contratti: if contratto.appuntamento: if contratto.appuntamento.telefonista == dipendente: filter_ids.append(contratto.id) if filter_ids: contratti = contratti.filter(id__in=filter_ids) n_stipulati = 0 # n_completi = 0 # n_inviati = 0 # n_caricati = 0 # n_attivati = 0 in_tot = 0 out_tot = 0 tot_fisso = 0 in_tot_detail = {} out_tot_detail = {} n_stipulati_details ={} gestori = models.Gestore.objects.all() for gestore in gestori: g = str(gestore) in_tot_detail[g] = 0 out_tot_detail[g] = 0 n_stipulati_details[g] = 0 out_tot_prov_agt = 0 out_tot_prov_bonus_agt = 0 out_tot_extra_agt = 0 out_tot_prov_tel = 0 out_tot_prov_bonus_tel = 0 out_tot_extra_tel = 0 if contratti.exists() and dipendente: dates = contratti.values("data_stipula").distinct() for date in dates: contratti_day = contratti.filter(data_stipula=date["data_stipula"]).iterator() daily_totals = get_daily_totals(contratti_day, date["data_stipula"]) n_stipulati += daily_totals["contratti"]["stipulati"] # aggoiorniamo i totali in_tot += daily_totals["totali"]["entrate"]["total"] if dipendente.ruolo == "agt": out_tot += (daily_totals["uscite"]["prov_agt"] + daily_totals["uscite"]["prov_bonus_agt"] + daily_totals["uscite"]["extra_agt"]) out_tot_extra_agt += daily_totals["uscite"]["extra_agt"] else: out_tot += (daily_totals["uscite"]["prov_tel"] + daily_totals["uscite"]["prov_bonus_tel"] + daily_totals["uscite"]["extra_tel"]) out_tot_extra_tel += daily_totals["uscite"]["extra_tel"] # aggiorniamo i dettagli dei totali for gestore in gestori: g = str(gestore) in_tot_detail[g] += daily_totals["totali"]["entrate"]["details"][g] out_tot_detail[g] += daily_totals["totali"]["uscite"]["details"][g] n_stipulati_details[g] += daily_totals["contratti"]["details"][g] out_tot_prov_agt += daily_totals["uscite"]["prov_agt"] out_tot_prov_bonus_agt += daily_totals["uscite"]["prov_bonus_agt"] out_tot_prov_tel += daily_totals["uscite"]["prov_tel"] out_tot_prov_bonus_tel += daily_totals["uscite"]["prov_bonus_tel"] # aggiungiamo il fisso tot_fisso = calc_fisso(period, [dipendente,]) out_tot += tot_fisso tot_tot_detail = {} for gestore in gestori: g = str(gestore) tot_tot_detail[g] = in_tot_detail[g] - out_tot_detail[g] tot_tot_detail["fisso"] = tot_fisso out_tot_detail["fisso"] = tot_fisso details = {} if dipendente: details["stipulati"] = {} details["stipulati"]["tot"] = n_stipulati details["stipulati"]["details"] = n_stipulati_details details["economia"] = {} details["economia"]["tot_uscite"] = out_tot details["economia"]["tot_fisso"] = tot_tot_detail["fisso"] if dipendente.ruolo == "agt": details["economia"]["tot_prov"] = out_tot_prov_agt details["economia"]["tot_prov_bonus"] = out_tot_prov_bonus_agt details["economia"]["extra"] = out_tot_extra_agt else: details["economia"]["tot_prov"] = out_tot_prov_tel details["economia"]["tot_prov_bonus"] = out_tot_prov_bonus_tel details["economia"]["extra"] = out_tot_extra_tel details["economia"]["tot_entrate"] = in_tot if request.is_ajax(): data = {"dipendente": dipendente, "details": details, "period": (period[0], period[1])} return render_to_response(template, data, context_instance=RequestContext(request)) filterform = forms.DetailsFilterForm() data = {"dipendente": dipendente, "details": details, "filterform": filterform, "period": (period[0], period[1])} return render_to_response(template, data, context_instance=RequestContext(request))
def canvas_tim_telecom(request): template = "statistiche/canvas_tim_telecom.html" if request.method == "GET" and request.GET.has_key("fperiodo"): period = u.get_period(request.GET) else: period = u.get_current_quarter() contratti = models.Contratto.objects.filter(data_stipula__gte=period[0], data_stipula__lte=period[1]) contratti = contratti.exclude(pianotariffario__tariffa__gestore="edison") # ricaviamo gli agenti artefici dei contratti selezionati if request.method == "GET" and request.GET.has_key("fagente"): agenti_ids = u.get_agenti_ids(request.GET) agenti = models.Dipendente.objects.filter(contratto__pk__in=contratti).filter(pk__in=agenti_ids).distinct().iterator() else: agenti = models.Dipendente.objects.filter(contratto__pk__in=contratti).distinct().iterator() # # objs = [] # # if contratti.exists(): # for agt in agenti: # points = get_tim_telecom_points(contratti, agt) # objs.append({"agente": agt, # "sim": points["sim_tot"], # "dati_opz": points["dati_tot"] + points["opz_tot"], # "nip_ull": points["nip_tot"] + points["ull_tot"], # "adsl": points["adsl_tot"], # "punti_tim": points["ptg_tim"], # "punti_telecom": points["ptg_telecom"], # "tot_punti": points["ptg_tim"] + points["ptg_telecom"], # "posizione": None}) # contratti_agt = contratti.filter(agente=agt) # # if contratti_agt.exists(): # # TIM # pt_tim_agt = models.PianoTariffario.objects.filter(contratto__in=contratti_agt, # tariffa__gestore=models.Gestore.objects.get(denominazione="tim")) # # sim_tot = pt_tim_agt.filter(tariffa__tipo=models.TipologiaTariffa.objects.get(denominazione="sim"), # opzione=False).aggregate(tot=Sum("num")) # sim_tot = sim_tot["tot"] if sim_tot["tot"] else 0 # # dati_tot = pt_tim_agt.filter(tariffa__tipo=models.TipologiaTariffa.objects.get(denominazione="dati"), # opzione=False).aggregate(tot=Sum("num")) # dati_tot = dati_tot["tot"] if dati_tot["tot"] else 0 # # opz_tot = pt_tim_agt.filter(opzione=True).aggregate(tot=Sum("num")) # opz_tot = opz_tot["tot"] if opz_tot["tot"] else 0 # # # calcoliamo il punteggio ricavato dai contratti # # 1 - estraiamo una lista con quantità delle tariffa * punteggio della tariffa # # 2 - sommiamo i valori contenuti nella lista # list_ptg = [ptar.tariffa.punteggio * ptar.num for ptar in pt_tim_agt] # ptg_tim_tot = reduce(operator.add, list_ptg) if list_ptg else 0 # # #TELECOM # pt_telecom_agt = models.PianoTariffario.objects.filter(contratto__in=contratti_agt, # tariffa__gestore=models.Gestore.objects.get(denominazione="telecom")) # # nip_tot = pt_telecom_agt.filter(tariffa__servizio=models.ServizioTariffa.objects.get(denominazione="nip"), # opzione=False).aggregate(tot=Sum("num")) # nip_tot = nip_tot["tot"] if nip_tot["tot"] else 0 # # ull_tot = pt_telecom_agt.filter(tariffa__servizio=models.ServizioTariffa.objects.get(denominazione="ull"), # opzione=False).aggregate(tot=Sum("num")) # ull_tot = ull_tot["tot"] if ull_tot["tot"] else 0 # # adsl_tot = pt_telecom_agt.filter(tariffa__tipo=models.TipologiaTariffa.objects.get(denominazione="adsl"), # opzione=False).aggregate(tot=Sum("num")) # adsl_tot = adsl_tot["tot"] if adsl_tot["tot"] else 0 # # # calcoliamo il punteggio ricavato dai contratti # # 1 - estraiamo una lista con quantità delle tariffe * punteggio della tariffa # # 2 - sommiamo i valori contenuti nella lista # list_ptg = [ptar.tariffa.punteggio * ptar.num for ptar in pt_telecom_agt] # ptg_telecom_tot = reduce(operator.add, list_ptg) if list_ptg else 0 # # objs.append({"agente": agt, # "sim": sim_tot, # "dati_opz": dati_tot + opz_tot, # "nip_ull": nip_tot + ull_tot, # "adsl": adsl_tot, # "punti_tim": ptg_tim_tot, # "punti_telecom": ptg_telecom_tot, # "tot_punti": ptg_tim_tot + ptg_telecom_tot, # "posizione": None}) # # # selezioniamo solo i primi 15 agenti in base al totale dei punteggi # objs = [ obj for obj in sorted(objs, key=lambda x: x["tot_punti"], reverse=True)[:15]] # # aggiungiamo il valore della posizione # # la posizione aumenta solo nel caso in cui il totale dei punti è minore # pos = 1 # tot_punti_cur = 0 # for obj in objs: # obj["posizione"] = pos # if obj["tot_punti"] != tot_punti_cur: # pos += 1 # tot_punti_cur = obj["tot_punti"] # # objs = sort_objs(objs) objs = get_tim_telecom_ranking(contratti, agenti) # calcoliamo i totali # sim = 0 # dati_opz = 0 # nip_ull = 0 # adsl = 0 # punti_tim = 0 # punti_telecom = 0 # for obj in objs: # sim += obj["sim"] # dati_opz += obj["dati_opz"] # nip_ull += obj["nip_ull"] # adsl += obj["adsl"] # punti_tim += obj["punti_tim"] # punti_telecom += obj["punti_telecom"] # totals = [sim, dati_opz, nip_ull, adsl, punti_tim, punti_telecom, punti_tim + punti_telecom] totals = get_tim_telecom_totals(objs) table = tables.CanvasTable(objs) table.paginate(page=request.GET.get("page", 1)) table.order_by = request.GET.get("sort") if request.is_ajax(): # template = "statistiche/reporttable_snippet.html" data = {"table": table, "totals": totals, "period": (period[0].strftime("%d/%m/%Y"), period[1].strftime("%d/%m/%Y"))} return render_to_response(template, data, context_instance=RequestContext(request)) filterform = forms.CanvasFilterForm() data = {"table": table, "totals": totals, "filterform": filterform, "period": (period[0].strftime("%d/%m/%Y"), period[1].strftime("%d/%m/%Y"))} return render_to_response(template, data, context_instance=RequestContext(request))
def inout(request): #TODO: controllare che effettivamente i calcoli siano giusti # getcontext().prec = 2 template = "statistiche/entrate_uscite.html" if request.method == "GET" and request.GET.has_key("fperiodo"): period = u.get_period(request.GET) else: period = u.get_current_month() # entrate # 1 - contratti stipulati contratti = models.Contratto.objects.filter(data_stipula__gte=period[0], data_stipula__lte=period[1])\ .order_by("data_stipula")\ .select_related() # ricaviamo contratti solo degli agenti selezionati if request.method == "GET" and request.GET.has_key("fagente"): agenti_ids = u.get_agenti_ids(request.GET) if agenti_ids: contratti = contratti.filter(agente__in=agenti_ids) if request.method == "GET" and request.GET.has_key("ftelefonista"): tel_ids = u.get_telefonisti_ids(request.GET) if tel_ids: # contratti = contratti.filter(telefonista__in=tel_ids) filter_ids = [] telefonisti = models.Dipendente.objects.filter(id__in=tel_ids) for contratto in contratti: if contratto.appuntamento: if contratto.appuntamento.telefonista in telefonisti: filter_ids.append(contratto.id) if filter_ids: contratti = contratti.filter(id__in=filter_ids) # FIXME: implementare selezione gestori objs = [] objs_in = [] objs_out = [] n_stipulati = 0 n_completi = 0 n_inviati = 0 n_caricati = 0 n_attivati = 0 in_tot = 0 out_tot = 0 in_tot_detail = {} out_tot_detail = {} gestori = models.Gestore.objects.all() for gestore in gestori: g = str(gestore) in_tot_detail[g] = 0 out_tot_detail[g] = 0 out_tot_prov_agt = 0 out_tot_prov_bonus_agt = 0 out_tot_prov_tel = 0 out_tot_prov_bonus_tel = 0 if contratti.exists(): dates = contratti.values("data_stipula").distinct() for date in dates: contratti_day = contratti.filter(data_stipula=date["data_stipula"]).iterator() daily_totals = get_daily_totals(contratti_day, date["data_stipula"]) t = "{}/{}/{}/{}".format(daily_totals["contratti"]["stipulati"], daily_totals["contratti"]["completi"], daily_totals["contratti"]["inviati"], daily_totals["contratti"]["caricati"], daily_totals["contratti"]["attivati"]) objs.append({"data": date["data_stipula"], "n_stipulati": t, "entrate": daily_totals["totali"]["entrate"], "uscite": daily_totals["totali"]["uscite"], "totali": daily_totals["totali"]["totali"]}) objs_in.append({"data": date["data_stipula"], "n_stipulati": t, "entrate": daily_totals["entrate"]["entrate"]}) objs_out.append({"data": date["data_stipula"], "n_stipulati": t, "uscite": daily_totals["uscite"]["uscite"], "prov_agt": "{0:.2f}".format(Decimal(daily_totals["uscite"]["prov_agt"])), "prov_bonus_agt": "{0:.2f}".format(Decimal(daily_totals["uscite"]["prov_bonus_agt"])), "prov_tel": "{0:.2f}".format(Decimal(daily_totals["uscite"]["prov_tel"])), "prov_bonus_tel": "{0:.2f}".format(Decimal(daily_totals["uscite"]["prov_bonus_tel"]))}) # aggoiorniamo i totali in_tot += daily_totals["totali"]["entrate"]["total"] out_tot += daily_totals["totali"]["uscite"]["total"] # aggiorniamo i dettagli dei totali for gestore in gestori: g = str(gestore) in_tot_detail[g] += daily_totals["totali"]["entrate"]["details"][g] out_tot_detail[g] += daily_totals["totali"]["uscite"]["details"][g] out_tot_prov_agt += daily_totals["uscite"]["prov_agt"] out_tot_prov_bonus_agt += daily_totals["uscite"]["prov_bonus_agt"] out_tot_prov_tel += daily_totals["uscite"]["prov_tel"] out_tot_prov_bonus_tel += daily_totals["uscite"]["prov_bonus_tel"] n_stipulati += daily_totals["contratti"]["stipulati"] n_completi += daily_totals["contratti"]["completi"] n_inviati += daily_totals["contratti"]["inviati"] n_caricati += daily_totals["contratti"]["caricati"] n_attivati += daily_totals["contratti"]["attivati"] # aggiungiamo il fisso tot_fisso = calc_fisso(period) out_tot += tot_fisso tot_tot_detail = {} for gestore in gestori: g = str(gestore) tot_tot_detail[g] = in_tot_detail[g] - out_tot_detail[g] tot_tot_detail["fisso"] = tot_fisso out_tot_detail["fisso"] = tot_fisso totals = {"n_stipulati": "{}/{}/{}/{}/{}".format(n_stipulati, n_completi, n_inviati, n_caricati, n_attivati), "entrate": {"total": in_tot, "details": in_tot_detail}, "uscite": {"total": out_tot, "details": out_tot_detail}, "totali": {"total": in_tot - out_tot, "details": tot_tot_detail}} totals_in = {"n_stipulati": "{}/{}/{}/{}/{}".format(n_stipulati, n_completi, n_inviati, n_caricati, n_attivati), "entrate": {"total": in_tot, "details": in_tot_detail}} totals_out = {"n_stipulati": "{}/{}/{}/{}/{}".format(n_stipulati, n_completi, n_inviati, n_caricati, n_attivati), "uscite": {"total": out_tot, "details": out_tot_detail}, "prov_agt": out_tot_prov_agt, "prov_bonus_agt": out_tot_prov_bonus_agt, "prov_tel": out_tot_prov_tel, "prov_bonus_tel": out_tot_prov_bonus_tel} # creiamo le tabelle table = tables.InOutTotalsTable(objs, per_page_field=10,) table.paginate(page=request.GET.get("page", 1)) table.order_by = request.GET.get("sort") table_in = tables.InTable(objs_in, prefix="in-", per_page_field=10,) table_in.paginate(page=request.GET.get("in-page", 1)) table_in.order_by = request.GET.get("in-sort") table_out = tables.OutTable(objs_out, prefix="out-", per_page_field=10,) table_out.paginate(page=request.GET.get("out-page", 1)) table_out.order_by = request.GET.get("out-sort") if request.is_ajax(): data = {"table": table, "table_in": table_in, "table_out": table_out, "totals": totals, "totals_in": totals_in, "totals_out": totals_out, "period": (period[0], period[1])} return render_to_response(template, data, context_instance=RequestContext(request)) filterform = forms.InOutFilterForm() data = {"table": table, "table_in": table_in, "table_out": table_out, "totals": totals, "totals_in": totals_in, "totals_out": totals_out, "filterform": filterform, "period": (period[0], period[1])} return render_to_response(template, data, context_instance=RequestContext(request))