def canvas_obiettivo_trimestrale(request): template = TMP_CANVAS # FIXME: ragionare sulla gestione del periodo if request.method == "GET" and request.GET.has_key("fanno") and request.GET.has_key("fquarto"): period = u.get_quarter(request.GET) else: period = u.get_current_quarter() # in conteggio per il raggiungimento degli obiettivi è fatto sui contratti # inviati nel quarto di riferimento contratti_inviati = models.Contratto.objects.filter(data_inviato__gte=period[0], data_inviato__lte=period[1], inviato=True)\ .order_by("data_inviato")\ .select_related("piano_tariffario") # ricaviamo contratti solo degli agenti/telefonisti selezionati if request.method == "GET" and request.GET.has_key("fagente"): agenti_ids = u.get_agenti_ids(request.GET) if agenti_ids: contratti_inviati = contratti_inviati.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_inviati = contratti_inviati.filter(telefonista__in=tel_ids) obiettivi = models.Obiettivo.objects.filter(data_inizio__lte=period[0]) d, totals = get_points(obiettivi, contratti_inviati) # totals = {} # for obiettivo in obiettivi: # totals[obiettivo.denominazione] = {"inviati": 0, # "caricati": 0, # "punteggio": 0,} # d = {} # if contratti_inviati.exists(): # dates = contratti_inviati.values("data_inviato").distinct() # # for date in dates: # data_inviato = date["data_inviato"].strftime("%d/%m/%Y") # d[data_inviato] = {} # # daily_points = get_daily_points(obiettivi, # contratti_inviati, # date["data_inviato"]) # for denominazione in daily_points.keys(): # d[data_inviato][denominazione] = {"data": data_inviato, # "punteggio": daily_points[denominazione]["punteggio"], # "inviati": daily_points[denominazione]["contratti"],} # totals[denominazione]["punteggio"] += daily_points[denominazione]["punteggio"] # totals[denominazione]["inviati"] += daily_points[denominazione]["contratti"] # for obiettivo in obiettivi: # punteggio_day = 0 # # contratti_day = contratti_inviati.filter(data_inviato=date["data_inviato"]) # n_inviati = 0 # for contratto in contratti_day: # # determiniamo il piano tariffario # pts = models.PianoTariffario.objects.filter(contratto=contratto).iterator() # # punteggio_contratto = 0 # for pt in pts: # q = pt.num # tariffa = pt.tariffa # # if check_tariffa(obiettivo, tariffa): # punteggio_contratto = +q # # n_inviati += 1 # punteggio_day += punteggio_contratto # # d[data_inviato][obiettivo.denominazione] = {"data": data_inviato, # "punteggio": punteggio_day, # "inviati": n_inviati,} # totals[obiettivo.denominazione]["punteggio"] += punteggio_day # totals[obiettivo.denominazione]["inviati"] += n_inviati rows = [] date_cur = period[0] today = datetime.today().date() y_cur = 0 m_cur = 0 while date_cur <= period[1]: if date_cur.year != y_cur: year = date_cur.year y_cur = date_cur.year else: year = None if date_cur.month != m_cur: m_cur = date_cur.month if date_cur == today: month = (date_cur.strftime("%B"), today) else: month = (date_cur.strftime("%B"), None) else: if date_cur == today: month = (None, today) else: month = (None, None) row = {"anno": year, "mese": month} k = date_cur.strftime("%d/%m/%Y") if k in d: for obiettivo in obiettivi: row[obiettivo.denominazione] = d[k][obiettivo.denominazione] rows.append(row) date_cur += timedelta(1) # for obiettivo in obiettivi: # diff = obiettivo.punteggio - totals[obiettivo.denominazione]["punteggio"] # diff = totals[obiettivo.denominazione]["goal"] # if diff < 0: # totals[obiettivo.denominazione]["msg"] = "Obiettivo raggiunto (+{})".format(diff) # elif diff == 0: # totals[obiettivo.denominazione]["msg"] = "Obiettivo raggiunto" # else: # totals[obiettivo.denominazione]["msg"] = "Per raggiungere l'obiettivo mancano {} punti".format(diff) if request.is_ajax(): data = {"rows": rows, "obiettivi": obiettivi, "period": period, "totali": totals} return render_to_response(template, data, context_instance=RequestContext(request)) filterform = forms.ObiettivoFilterForm() data = {"rows": rows, "obiettivi": obiettivi, "period": period, "totali": totals, "filterform": filterform,} return render_to_response(template, data, context_instance=RequestContext(request))
def init_provvigione(request, object_id): # FIXME: data licenziamento non è presa in considerazione # da correggere, non ora però template = TMP_PROV dipendente = get_object_or_404(models.Dipendente, pk=object_id) period = u.get_current_quarter() data_inizio = request.GET.get("fdata_inizio", "") data_fine = request.GET.get("fdata_fine", "") retribuzioni = models.RetribuzioneDipendente.objects.filter( dipendente=object_id, variazione=False,).order_by("-data_inizio") earliest_retribuzione = retribuzioni[retribuzioni.count()-1] if retribuzioni.exists() else None variazioni = models.RetribuzioneDipendente.objects.filter( dipendente=object_id, variazione=True,).order_by("-data_inizio") data_min = datetime.strptime(data_inizio[1:], "%d/%m/%Y").date() if data_inizio else period[0] data_min = data_min if data_min >= earliest_retribuzione.data_inizio else earliest_retribuzione.data_inizio data_max = datetime.strptime(data_fine[1:], "%d/%m/%Y").date() if data_fine else period[1] retribuzioni = retribuzioni.filter(Q(data_fine__gte=data_min, data_inizio__lte=data_max) | Q(data_fine__isnull=True, data_inizio__lte=data_max)) variazioni = variazioni.filter(data_fine__gte=data_min, data_inizio__lte=data_max) days = (data_max - data_min).days # creaiamo un dizionario con tutte le variazioni e le retribuzioni objs = {} # variazioni if variazioni.exists(): for index, var_cur in enumerate(variazioni): obj = {"anno": None, "mese": None, "retribuzione": None, "variazione": None, "rowspan_r": None, "rowspan_v": None,} obj["variazione"] = var_cur if data_max < var_cur.data_fine: row = 0 obj["rowspan_v"] = (data_max - var_cur.data_inizio).days + 1 else: row = (data_max - var_cur.data_fine).days obj["rowspan_v"] = (var_cur.data_fine - var_cur.data_inizio).days + 1 objs[row] = obj for i in xrange(row + 1, row + obj["rowspan_v"]): objs[i] = {"anno": None, "mese": None, "retribuzione": None, "variazione": "occupied", "rowspan_r": None, "rowspan_v": None,} # retribuzioni if retribuzioni.exists(): for index, ret_cur in enumerate(retribuzioni): obj = {"anno": None, "mese": None, "retribuzione": None, "variazione": None, "rowspan_r": None, "rowspan_v": None,} obj["retribuzione"] = ret_cur if ret_cur.data_fine: row = (data_max - ret_cur.data_fine).days obj["rowspan_r"] = (ret_cur.data_fine - ret_cur.data_inizio).days + 1 else: row = 0 obj["rowspan_r"] = (data_max - ret_cur.data_inizio).days + 1 if row in objs: objs[row]["retribuzione"] = obj["retribuzione"] objs[row]["rowspan_r"] = obj["rowspan_r"] else: objs[row] = obj for i in xrange(row + 1, row + obj["rowspan_r"]): if i in objs: objs[i]["retribuzione"] = "occupied" else: objs[i] = {"anno": None, "mese": None, "retribuzione": "occupied", "variazione": None, "rowspan_r": None, "rowspan_v": None,} # creiamo la lista di righe di dati da inserire nella tabella. rows = [] data_cur = data_max y_cur = data_cur.year m_cur = data_cur.month for i in xrange(days + 1): data_cur -= timedelta(1) if y_cur != data_cur.year: year = data_cur.year y_cur = year month = (m_cur, ) else: year = None if m_cur != data_cur.month: month = (m_cur, ) year = data_cur.year m_cur = data_cur.month else: month = None if i in objs: objs[i]["anno"] = year objs[i]["mese"] = month rows.append(objs[i]) del objs[i] else: rows.append({"anno": year, "mese": month, "retribuzione": None, "variazione": None, "rowspan_r": None, "rowspan_v": None,}) # aggiungiamo la data iniziale e finale rows[0]["anno"] = data_max.year rows[0]["mese"] = (data_max.month, data_max) rows[len(rows)-1]["anno"] = data_min.year rows[len(rows)-1]["mese"] = (data_min.month, data_min) if request.is_ajax(): template = TMP_PROV_TABLE data = {"rows": rows, "days": range(days), "period": (data_min, data_max)} return render_to_response(template, data, context_instance=RequestContext(request)) data = {"dipendente": dipendente, "rows": rows, "period": (data_min, data_max)} 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 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 send_report_mail(request): default_options = get_default_options() email = default_options["email_titolare"] if email: today = datetime.today().date() # spediamo nel testo dell'email, alcune informazioni: # incasso della giornata: entrate/uscite contratti = ( models.Contratto.objects.filter(data_stipula=today) .order_by("data_stipula") .select_related("piano_tariffario") ) # Finanze finances = get_daily_totals(contratti, today) # Classifiche period = u.get_current_quarter() contratti = models.Contratto.objects.filter(data_stipula__gte=period[0], data_stipula__lte=period[1]) contratti_tim_telecom = contratti.exclude(pianotariffario__tariffa__gestore="edison") dipendenti_tim_telecom = ( models.Dipendente.objects.filter(contratto__pk__in=contratti_tim_telecom).distinct().iterator() ) ranking_tim_telecom = get_tim_telecom_ranking(contratti_tim_telecom, dipendenti_tim_telecom) contratti_edison = contratti.exclude(pianotariffario__tariffa__gestore="tim").exclude( pianotariffario__tariffa__gestore="telecom" ) dipendenti_edison = models.Dipendente.objects.filter(contratto__pk__in=contratti_edison).distinct().iterator() ranking_edison = get_edison_ranking(contratti_edison, dipendenti_edison) # Obiettivi obiettivi = models.Obiettivo.objects.filter(data_inizio__lte=period[0]) contratti_inviati = ( models.Contratto.objects.filter(data_inviato__gte=period[0], data_inviato__lte=period[1], inviato=True) .order_by("data_inviato") .select_related("piano_tariffario") ) ignore, goals = get_points(obiettivi, contratti_inviati) data = { "finanze": finances, "ranking_tim_telecom": ranking_tim_telecom, "ranking_edison": ranking_edison, "obiettivi": goals, } html_content = render_to_string("email.html", data) text_content = strip_tags(html_content) # this strips the html, so people will have the text as well. # create the email, and attach the HTML version as well. subject = "Riepilogo Mobiltime {}".format(today.strftime("%d/%m/%Y")) from_email = "agenzia" to_email = email msg = EmailMultiAlternatives(subject, text_content, from_email, [to_email]) msg.attach_alternative(html_content, "text/html") msg.send() logger.debug("{}: Email riepilogativa inviata".format(request.user)) messages.add_message(request, messages.SUCCESS, "Email riepilogativa iniviata a {}".format(email)) else: logger.debug("{}: modificate le opzioni iniziali".format(request.user)) messages.add_message( request, messages.ERROR, "Email non iniviata: " "Inserire la password del titolare nella pagina delle opzioni", ) return HttpResponseRedirect(reverse("home"))