示例#1
0
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))
示例#2
0
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))