def form_valid(self, form):
        """
        Metodo chamado apos o form ser corretamente validado.
        O form ja se valida automaticamente de acordo com a declaracao de cada um.
        ex: DateField exige uma data valida.. o mesmo para os outros...
        """
        #acumuladores gerais
        db = {}
        db_espec = {}
        db_tipo = {}
        db_servico = {}
        db_pacote = {}

        #busca todos os servicos SIMPLES
        if form.cleaned_data['servicos']:
            qs_pss = PrestacaoServicoServico.objects.filter(pagamento__isnull=False)
            qs_pss = qs_pss.filter(servico__in=form.cleaned_data['servicos'])
            qs_pss = self.filtra_de(form.cleaned_data['de'], qs_pss)
            qs_pss = self.filtra_ate(form.cleaned_data['ate'], qs_pss)

            for pss in qs_pss:
                valor = pss.servico.valor
                comissao = pss.servico.comissao
                custo = pss.servico.custo_material + valor * (comissao / 100)

                self.update(db_tipo, PrestacaoServico.SERVICO, custo, valor)
                self.update(db_servico, pss.servico, custo, valor)
                self.update(db_espec, pss.servico.especialidade, custo, valor)
                self.update(db, 'Geral', custo, valor)

        #busca todos os servicos de PACOTE
        if form.cleaned_data['pacote_servicos']:
            qs_psp = PrestacaoServicoPacote.objects.filter(pacoteServico_cliente__pagamento__isnull=False)
            qs_psp = qs_psp.filter(pacoteServico_cliente__pacote_servico__in=form.cleaned_data['pacote_servicos'])
            qs_psp = self.filtra_de(form.cleaned_data['de'], qs_psp)
            qs_psp = self.filtra_ate(form.cleaned_data['ate'], qs_psp)

            for psp in qs_psp:
                valor = psp.servico_pacoteservico.valor_rateado
                comissao = psp.servico_pacoteservico.servico.comissao
                custo = psp.servico_pacoteservico.servico.custo_material + valor * (comissao / 100)

                self.update(db_tipo, PrestacaoServico.PACOTE, custo, valor)
                self.update(db_pacote, psp.servico_pacoteservico.servico, custo, valor)
                self.update(db_espec, psp.servico_pacoteservico.servico.especialidade, custo, valor)
                self.update(db, 'Geral', custo, valor)

        if len(db)>0:
            self.atualiza_share(db_tipo, db['Geral'])
            self.atualiza_share(db_espec, db['Geral'])
            self.atualiza_share(db_servico, db['Geral'])
            self.atualiza_share(db_pacote, db['Geral'])
            self.atualiza_share(db, db['Geral'])

        #coloca todos os dbs em lista
        db_list = (("Visão Geral",db),
                   ("Visão por Especialidade",db_espec),
                   ("Visão por Tipo", db_tipo),
                   ("Visão por Serviços",db_servico),
                   ("Visão por Pacotes",db_pacote))

        #chama o template resultado enviando o form, a lista_final,
        # a data atual e a informacao se imprime ou nao o form
        return render_to_response('cadastro/cbv/relatoriototalacumuladoresultado.html', {
            'form': form,
            'now': timezone.datetime.now(),
            'db_list': db_list,
            'object_count': safe_list_get(db, 'geral', Item()).qtd_acum,
            'imprime_filtro': form.cleaned_data['imprime_filtro']
        }, context_instance=RequestContext(self.request))
 def update(self, dict, key, custo, valor):
     dict[key] = safe_list_get(dict, key, Item())
     dict[key].qtd_acum += 1
     dict[key].custo_acum += custo
     dict[key].valor_acum += valor
     dict[key].diferenca_acum += (valor - custo)