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)
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))
def gettext(str_i18n): return _g(str_i18n)
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))