Exemplo n.º 1
0
 def do_map(value, choices):
     if value is None:
         return '?'
     elif isinstance(value, Model):
         return str(value)
     else:
         return _g(str(choices.get(value, value)))
def parse_time_strings(time_string):
    '''Accepts comma separated string of datetimes and converts it into a list of datetimes'''
    result_list = []
    if time_string == "":
        return None
    time_list = time_string.replace(' ','').split(',')
    for time_piece in time_list:
        if len(time_piece) != 18:
            raise ValidationError(_g('Invalid date/time, please format as: "DD-MM-YYYY HH:MM:SS"'))
        day, month, year = [int(x) for x in time_piece[:10].split('-')]
        hour, minute, second = [int(x) for x in time_piece[-8:].split(':')]
        result_list.append(datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second))
    return result_list
class DateListField(models.Field):
    '''Field for multiple dates. Accepts list of datetimes'''

    description = _g('String of datetimes')

    def __init__(self, dates=[], *args, **kwargs):
        self.dates = dates
        #self.max_length = 2048
        #kwargs['max_length'] = self.max_length
        super().__init__(*args, **kwargs)

    def __str__(self):
        return ','.join([x.strftime('%d-%m-%Y %H:%M:%S') for x in self.dates])

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        # Must return arguments to pass to __init__ for reconstruction
        if self.dates != []:
            kwargs['dates'] = self.dates
        #del kwargs['max_length']
        return name, path, args, kwargs

    def db_type(self, connection):
        return 'CharField'

    def rel_db_type(self, connection):
        return 'CharField'

    def get_prep_value(self, value):
        # Return comma separated string of datetimes
        if value is not None:
            return ','.join(
                [x.strftime('%d-%m-%Y %H:%M:%S') for x in (value, )])

    def from_db_value(self, value, expression, connection):
        if value is None:
            return value
        return parse_time_strings(value)

    def to_python(self, value):
        if isinstance(value, dict):
            return value
        if value is None:
            return value
        return parse_time_strings(value)

    def value_to_string(self, obj):
        value = self.value_from_object(obj)
        return self.get_prep_value(value)
Exemplo n.º 4
0
def cliente_detalhe_financeiro(request, id_cliente):
    # Busca todos os dados do cliente
    cliente = Cliente.objects.get(pk=id_cliente)
    contas_cliente = ContasReceber.objects.filter(
        cliente=id_cliente).values_list('pk')
    parcelas_cliente = ParcelasContasReceber.objects.filter(
        contas_receber__cliente=id_cliente).values_list('pk')
    recebimentos_cliente = Recebimento.objects.filter(
        parcelas_contas_receber__contas_receber__cliente=id_cliente).order_by(
            'data').values()

    # filtra os itens financeiros pelo parâmetro Ano caso o filtro seja utilizado
    f_ano = None
    if request.GET.get('ano'):
        f_ano = int(request.GET.get('ano'))
        contas_cliente = contas_cliente.filter(data__year=f_ano)
        parcelas_cliente = parcelas_cliente.filter(vencimento__year=f_ano)
        recebimentos_cliente = recebimentos_cliente.filter(data__year=f_ano)

    # Início do bloco - Manipula os dados que serão exibidos na tabela dos itens financeiros gerados
    #----------------------------------------------------------------------------------------------
    encargos_recebidos = encargos_a_receber = totais_recebidos = totais_a_receber = \
    totais_encargos = totais_sem_encargos = totais_a_pagar_sem_encargos = totais_cobrados = 0
    for i in range(len(contas_cliente)):
        c = ContasReceber.objects.get(cliente=id_cliente,
                                      pk=contas_cliente[i][0])
        encargos_recebidos += c.valor_total_encargos_pagos()
        encargos_a_receber += c.valor_total_encargos_a_pagar()
        totais_recebidos += c.valor_total_recebido()
        totais_a_receber += c.valor_total_a_receber()
        totais_encargos += c.valor_total_encargos()
        totais_sem_encargos += c.valor_total
        totais_cobrados += c.valor_total_cobrado()

    totais_recebidos_sem_encargos = totais_recebidos - encargos_recebidos
    totais_a_pagar_sem_encargos = totais_a_receber - encargos_a_receber
    #----------------------------------------------------------------------------------------------
    # Fim do bloco

    # Início do bloco
    #----------------------------------------------------------------------------------------------
    status_parcelas = []
    for i in range(len(parcelas_cliente)):
        p = ParcelasContasReceber.objects.get(
            contas_receber__cliente=id_cliente, pk=parcelas_cliente[i][0])
        status_parcelas.append(
            (p.status_parcela()[2], _g(p.status_parcela()[1]),
             p.status_parcela()[0], p.quant_dias_vencidos()))

    df_parcelas = pd.DataFrame(status_parcelas)
    df_parcelas = df_parcelas.rename(columns={
        0: 'id_status',
        1: 'status',
        2: 'cor',
        3: 'dias_vencidos',
    })

    df_parcelas_agrupados = df_parcelas.groupby(
        ['id_status', 'status', 'cor'], as_index=False
    ).agg(
        ['count', 'mean']
    )  # Agrupa pelo status, e obtém a média de dias atrasados, e a quantidade de parcelas
    df_parcelas_agrupados.columns = df_parcelas_agrupados.columns.droplevel(0)
    df_parcelas_agrupados = df_parcelas_agrupados.reset_index()
    df_parcelas_agrupados['hist_quant_parc_total'] = df_parcelas.count(
    )[0].astype(int)
    df_parcelas_agrupados['hist_quant_parc_venc'] = df_parcelas[
        df_parcelas['dias_vencidos'] > 0].count()[0]
    df_parcelas_agrupados['hist_quant_parc_dias_venc_total'] = df_parcelas[
        df_parcelas['dias_vencidos'] > 0]['dias_vencidos'].sum()
    df_parcelas_agrupados['hist_perc_parc_venc'] = df_parcelas_agrupados[
        'hist_quant_parc_venc'] * 100 / df_parcelas_agrupados[
            'hist_quant_parc_total']
    df_parcelas_agrupados['hist_media_dias_parc_venc'] = df_parcelas_agrupados[
        'hist_quant_parc_dias_venc_total'] / df_parcelas_agrupados[
            'hist_quant_parc_venc']

    df_parcelas_agrupados['status_percentual'] = df_parcelas_agrupados[
        'count'] * 100 / df_parcelas_agrupados['hist_quant_parc_total']
    df_parcelas_agrupados['status_percentual_total'] = df_parcelas_agrupados[
        'status_percentual'].sum()

    df_parcelas_agrupados['option_selected'] = df_parcelas_agrupados[
        'id_status'] == 1
    df_parcelas_agrupados['option_selected'] = df_parcelas_agrupados[
        'option_selected'].map({
            True: 'true',
            False: ''
        })

    list_p = df_parcelas_agrupados.values.tolist()
    lista_status_parcelas = [{
        'name': i[1],
        'color': i[2],
        'y': float(i[10]),
        'sliced': i[12],
        'selected': i[12]
    } for i in list_p]
    #----------------------------------------------------------------------------------------------
    # Fim do bloco

    lista_meses = [(i, calendar.month_abbr[i], calendar.month_name[i])
                   for i in range(1, 13)]  # busca lista de meses
    df_meses = pd.DataFrame(lista_meses)  # gera o DataFrame ds lista de meses
    df_meses = df_meses.rename(columns={
        0: 'mes',
        1: 'mes_nome_abr',
        2: 'mes_nome',
    })  # renomeia as colunas

    df_recebimentos = pd.DataFrame.from_records(recebimentos_cliente)
    df_recebimentos = df_recebimentos.get(['data', 'valor'])
    df_recebimentos['mes'] = df_recebimentos['data'].dt.month
    df_recebimentos_agrupados = df_recebimentos.groupby(
        [
            'mes',
        ], as_index=True
    ).agg(
        ['sum', 'count']
    )  # função agg permite que seja aplicado uma lista com vários métodos de agregação de uma só vez.
    df_recebimentos_agrupados.columns = df_recebimentos_agrupados.columns.droplevel(
        0)  # Deleta o nível mais externo do índice de coluna hierárquica
    df_recebimentos_agrupados = df_recebimentos_agrupados.reset_index(
    )  # Gera uma nova coluna de índice

    df_meses_recebimentos = pd.merge(df_meses,
                                     df_recebimentos_agrupados,
                                     on='mes',
                                     how='left')
    df_meses_recebimentos['sum'] = df_meses_recebimentos['sum'].fillna(
        0)  # substitui valores nulos por 0
    df_meses_recebimentos['count'] = df_meses_recebimentos['count'].fillna(
        0)  # substitui valores nulos por 0
    df_meses_recebimentos['count'] = df_meses_recebimentos['count'].astype(
        int)  # converte tipo do dado para int

    dict_mr = df_meses_recebimentos.to_dict()
    list_mr = df_meses_recebimentos.values.tolist()
    lista_meses_recebimentos = list(dict_mr['mes_nome_abr'].values())
    # lista_valor_recebimentos = [ float(i) for i in list(dict_mr['sum'].values()) ]
    lista_valor_recebimentos = [{
        'y': float(i[3]),
        'mes_nome': i[2]
    } for i in list_mr]

    perm_visualizacao = cliente._meta.app_label + '.' + 'change_' + cliente._meta.model_name
    if perm_visualizacao in request.user.get_all_permissions():
        has_change_permission = True
    else:
        has_change_permission = False

    data = {
        'title': _(u"Detalhes Financeiros - Cliente"),
        'app_name': cliente._meta.app_label,
        'opts': cliente._meta,
        'has_change_permission': has_change_permission,
        'original': cliente,
        'encargos_recebidos': encargos_recebidos,
        'encargos_a_receber': encargos_a_receber,
        'totais_recebidos': totais_recebidos,
        'totais_a_receber': totais_a_receber,
        'totais_encargos': totais_encargos,
        'totais_sem_encargos': totais_sem_encargos,
        'totais_cobrados': totais_cobrados,
        'totais_recebidos_sem_encargos': totais_recebidos_sem_encargos,
        'totais_a_pagar_sem_encargos': totais_a_pagar_sem_encargos,
        'opcoes': Opcoes(initial=request.GET),
        'f_ano': f_ano,
        'lista_status_parcelas': lista_status_parcelas,
        'list_p': list_p,
        'list_mr': list_mr,
        'lista_meses_recebimentos': lista_meses_recebimentos,
        'lista_valor_recebimentos': lista_valor_recebimentos,
    }

    return render_to_response('admin/cliente_detalhes_financeiros.html',
                              data,
                              context_instance=RequestContext(request))
Exemplo n.º 5
0
def gettext(str_i18n):
    return _g(str_i18n)
def gettext(str_i18n):
    return _g(str_i18n)
Exemplo n.º 7
0
def cliente_detalhe_financeiro(request, id_cliente):
    # Busca todos os dados do cliente
    cliente = Cliente.objects.get(pk=id_cliente)
    contas_cliente = ContasReceber.objects.filter(cliente=id_cliente).values_list('pk')
    parcelas_cliente = ParcelasContasReceber.objects.filter(contas_receber__cliente=id_cliente).values_list('pk')
    recebimentos_cliente = Recebimento.objects.filter(parcelas_contas_receber__contas_receber__cliente=id_cliente).order_by('data').values() 
    
    # filtra os itens financeiros pelo parâmetro Ano caso o filtro seja utilizado
    f_ano = None
    if request.GET.get('ano'):
        f_ano = int(request.GET.get('ano'))
        contas_cliente = contas_cliente.filter(data__year=f_ano)
        parcelas_cliente = parcelas_cliente.filter(vencimento__year=f_ano)
        recebimentos_cliente = recebimentos_cliente.filter(data__year=f_ano)

    # Início do bloco - Manipula os dados que serão exibidos na tabela dos itens financeiros gerados
    #----------------------------------------------------------------------------------------------
    encargos_recebidos = encargos_a_receber = totais_recebidos = totais_a_receber = \
    totais_encargos = totais_sem_encargos = totais_a_pagar_sem_encargos = totais_cobrados = 0
    for i in range(len(contas_cliente)):
        c = ContasReceber.objects.get(cliente=id_cliente, pk=contas_cliente[i][0])
        encargos_recebidos += c.valor_total_encargos_pagos()
        encargos_a_receber += c.valor_total_encargos_a_pagar()
        totais_recebidos += c.valor_total_recebido()
        totais_a_receber += c.valor_total_a_receber()
        totais_encargos += c.valor_total_encargos()
        totais_sem_encargos += c.valor_total
        totais_cobrados += c.valor_total_cobrado()

    totais_recebidos_sem_encargos = totais_recebidos - encargos_recebidos
    totais_a_pagar_sem_encargos = totais_a_receber - encargos_a_receber
    #----------------------------------------------------------------------------------------------
    # Fim do bloco


    # Início do bloco
    #----------------------------------------------------------------------------------------------
    status_parcelas = []
    for i in range(len(parcelas_cliente)):
        p = ParcelasContasReceber.objects.get(contas_receber__cliente=id_cliente, pk=parcelas_cliente[i][0])
        status_parcelas.append((p.status_parcela()[2], 
                                _g(p.status_parcela()[1]), 
                                p.status_parcela()[0], 
                                p.quant_dias_vencidos()
                                ))

    df_parcelas = pd.DataFrame(status_parcelas)
    df_parcelas = df_parcelas.rename(columns = {0:'id_status', 1:'status', 2:'cor', 3:'dias_vencidos',})

    df_parcelas_agrupados = df_parcelas.groupby(['id_status','status','cor'], as_index=False).agg(['count', 'mean'])    # Agrupa pelo status, e obtém a média de dias atrasados, e a quantidade de parcelas
    df_parcelas_agrupados.columns = df_parcelas_agrupados.columns.droplevel(0)
    df_parcelas_agrupados = df_parcelas_agrupados.reset_index()
    df_parcelas_agrupados['hist_quant_parc_total'] = df_parcelas.count()[0].astype(int)
    df_parcelas_agrupados['hist_quant_parc_venc'] = df_parcelas[df_parcelas['dias_vencidos'] > 0].count()[0]
    df_parcelas_agrupados['hist_quant_parc_dias_venc_total'] = df_parcelas[df_parcelas['dias_vencidos'] > 0]['dias_vencidos'].sum()
    df_parcelas_agrupados['hist_perc_parc_venc'] = df_parcelas_agrupados['hist_quant_parc_venc'] * 100 / df_parcelas_agrupados['hist_quant_parc_total']
    df_parcelas_agrupados['hist_media_dias_parc_venc'] = df_parcelas_agrupados['hist_quant_parc_dias_venc_total'] / df_parcelas_agrupados['hist_quant_parc_venc']

    df_parcelas_agrupados['status_percentual'] = df_parcelas_agrupados['count'] * 100 / df_parcelas_agrupados['hist_quant_parc_total']
    df_parcelas_agrupados['status_percentual_total'] = df_parcelas_agrupados['status_percentual'].sum()

    df_parcelas_agrupados['option_selected'] = df_parcelas_agrupados['id_status'] == 1
    df_parcelas_agrupados['option_selected'] = df_parcelas_agrupados['option_selected'].map({True:'true', False:''})

    list_p = df_parcelas_agrupados.values.tolist()
    lista_status_parcelas = [ {'name':i[1], 'color':i[2], 'y':float(i[10]), 'sliced':i[12], 'selected':i[12]} for i in list_p ]
    #----------------------------------------------------------------------------------------------
    # Fim do bloco


    lista_meses = [ (i, calendar.month_abbr[i], calendar.month_name[i]) for i in range(1,13) ]              # busca lista de meses
    df_meses = pd.DataFrame(lista_meses)                                                                    # gera o DataFrame ds lista de meses
    df_meses = df_meses.rename(columns = {0:'mes', 1:'mes_nome_abr', 2:'mes_nome',})                        # renomeia as colunas    

    df_recebimentos = pd.DataFrame.from_records(recebimentos_cliente)
    df_recebimentos = df_recebimentos.get(['data', 'valor'])
    df_recebimentos['mes'] = df_recebimentos['data'].dt.month
    df_recebimentos_agrupados = df_recebimentos.groupby(['mes',], as_index=True).agg(['sum', 'count'])      # função agg permite que seja aplicado uma lista com vários métodos de agregação de uma só vez.
    df_recebimentos_agrupados.columns = df_recebimentos_agrupados.columns.droplevel(0)                      # Deleta o nível mais externo do índice de coluna hierárquica
    df_recebimentos_agrupados = df_recebimentos_agrupados.reset_index()                                     # Gera uma nova coluna de índice

    df_meses_recebimentos = pd.merge(df_meses, df_recebimentos_agrupados, on='mes', how='left')                        
    df_meses_recebimentos['sum'] = df_meses_recebimentos['sum'].fillna(0)                                   # substitui valores nulos por 0
    df_meses_recebimentos['count'] = df_meses_recebimentos['count'].fillna(0)                               # substitui valores nulos por 0
    df_meses_recebimentos['count'] = df_meses_recebimentos['count'].astype(int)                             # converte tipo do dado para int
    
    dict_mr = df_meses_recebimentos.to_dict()
    list_mr = df_meses_recebimentos.values.tolist()
    lista_meses_recebimentos = list(dict_mr['mes_nome_abr'].values())
    # lista_valor_recebimentos = [ float(i) for i in list(dict_mr['sum'].values()) ]
    lista_valor_recebimentos = [ {'y':float(i[3]), 'mes_nome':i[2]} for i in list_mr ]


    perm_visualizacao = cliente._meta.app_label+'.'+'change_'+cliente._meta.model_name
    if perm_visualizacao in request.user.get_all_permissions():
        has_change_permission = True
    else:
        has_change_permission = False

    data = {
        'title': _(u"Detalhes Financeiros - Cliente"),
        'app_name': cliente._meta.app_label,
        'opts': cliente._meta,
        'has_change_permission': has_change_permission,
        'original': cliente,

        'encargos_recebidos': encargos_recebidos,
        'encargos_a_receber': encargos_a_receber,
        'totais_recebidos': totais_recebidos,
        'totais_a_receber': totais_a_receber,
        'totais_encargos': totais_encargos,
        'totais_sem_encargos': totais_sem_encargos,
        'totais_cobrados': totais_cobrados,
        'totais_recebidos_sem_encargos': totais_recebidos_sem_encargos,
        'totais_a_pagar_sem_encargos': totais_a_pagar_sem_encargos,

        'opcoes': Opcoes(initial=request.GET),
        'f_ano': f_ano,
        
        'lista_status_parcelas': lista_status_parcelas,
        'list_p': list_p,

        'list_mr': list_mr,
        'lista_meses_recebimentos': lista_meses_recebimentos,
        'lista_valor_recebimentos': lista_valor_recebimentos,
    }

    return render_to_response('admin/cliente_detalhes_financeiros.html', data, context_instance=RequestContext(request))