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 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))