Example #1
0
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))  
Example #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))