Exemplo n.º 1
0
 def report(self, date, step, length, **kwargs):
     gr = self.group_report(date, step, length, **kwargs)
     max_date = date if date else latest_entry_date()
     return {
         self.pk: self.group_report(date, step, length, **kwargs),
         'max_date': max_date,
         'length': length,
         'step': step,
         'pk': self.pk,
     }
Exemplo n.º 2
0
    def report(self, date, step, length, **kwargs):
        result = self.group_report(date, step, length, **kwargs)
        roots = self.groups.values_list('pk', flat=True)
        monthly_result = {
            'group_id': None,
            'level': 0,
            'name': self.name,
            'parent_id': None,
            'lft': 0,
            'json': {}
            }


        if roots:
            root_results = {pk: result[pk]['json'] for pk in roots}
            for group, group_result in root_results.items():
                for _date, data in group_result.items():
                    date_dict = monthly_result['json'].get(_date, {
                        'billed_cons': 0.0,
                        'billed_corp': 0.0,
                        'billed': 0.0,
                        'total': 0.0,})

                    date_dict['billed_cons'] += data['billed_cons']
                    date_dict['billed_corp'] += data['billed_corp']
                    date_dict['billed'] += data['billed_cons'] + data['billed_corp']
                    date_dict['total'] += data['total']

                    monthly_result['json'][_date] = date_dict


        # generate corp/cons etc for the monthly dict
        json = monthly_result['json']
        for _date, data in json.items():
            try:
                cons_index = data['billed_cons'] / data['billed']
            except ZeroDivisionError:
                cons_index = 0.5
            corp_index = 1 - cons_index
            json[_date]['cons'] = data['total'] * cons_index
            json[_date]['corp'] = data['total'] * corp_index
            json[_date]['corp_index'] = corp_index
            json[_date]['cons_index'] = cons_index


            result.update({'total': monthly_result})

        return {
            'total': result,
            'max_date': date if date else latest_entry_date(),
            'length': length,
            'step': step,
            'pk': 'total',
        }
Exemplo n.º 3
0
    def report(self, date, step, length, **kwargs):
        from pannel.report import Report
        date = date if date else latest_entry_date()
        result = Report(Account.objects.filter(pk=self.pk)).report(date, step, length, **kwargs)

        result[self.pk].update({
            'name': self.name,
            })

        return {
            self.pk: result,
            'step': step,
            'length': length,
            'max_date': date,
            'pk': self.pk,
            'name': self.name,
        }
Exemplo n.º 4
0
    def group_report(self, date, step, length, **kwargs):
        date = date if date else latest_entry_date()
        qs = kwargs.get('queryset', self.report_queryset())
        reporting = kwargs.get('reporting', self.reporting())
        if not kwargs.get('fields', None):
            kwargs['fields'] = {'group_id': F('group_id'),
                                'parent_id': F('group_id'),
                                'lft': 9000,
                                'name': F('name'),
                                'id': F('pk')}

        kwargs.update({'queryset': qs})
        report = self.accounts_report(date, step, length, **kwargs)
        groups = list(qs.values('name', 'id', 'level', 'parent_id', 'lft'))

        result = {}
        for g in groups:
            g['json'] = {}
            g['group_id'] = g['id']
            result[g['id']] = g

        # for every account, insert elements into group
        # this part of the code must be wrong, because we don't need
        # an O(n) operation, so we could probably skip the reporting() bit.
        for code, values in report.items():
            result[code] = values
            group_id = report[code]['group_id']
            for contributor, parent in self.reporting():
                if group_id == parent:
                    for _date, data in values['json'].items():
                        date_dict = result[group_id]['json'].get(_date, {
                            'billed_cons': 0.0,
                            'billed_corp': 0.0,
                            'billed': 0.0,
                            'total': 0.0,})

                        date_dict['billed_cons'] += data['billed_cons']
                        date_dict['billed_corp'] += data['billed_corp']
                        date_dict['billed'] += data['billed_cons'] + data['billed_corp']
                        date_dict['total'] += data['total']

                        result[group_id]['json'][_date] = date_dict

        for group, values in result.items():
            json = values['json']
            for _date, d in json.items():
                try:
                    cons_index = d['billed_cons'] / d['billed']
                except ZeroDivisionError:
                    cons_index = 0.5
                corp_index = 1 - cons_index
                json[_date]['cons'] = d['total'] * cons_index
                json[_date]['corp'] = d['total'] * corp_index
                json[_date]['cons_index'] = cons_index
                json[_date]['corp_index'] = corp_index

        result.update(**report)

        final_result = result.copy()
        # now, for every group, insert elements into parent_id json dict
        for contributor, parent in self.reporting():
            if contributor != parent:
                for _date, data in result[contributor]['json'].items():
                    date_dict = final_result[parent]['json'].get(_date, {
                        'billed_cons': 0.0,
                        'billed_corp': 0.0,
                        'billed': 0.0,
                        'total': 0.0,})

                    date_dict['billed_cons'] += data['billed_cons']
                    date_dict['billed_corp'] += data['billed_corp']
                    date_dict['billed'] += data['billed_cons'] + data['billed_corp']
                    date_dict['total'] += data['total']

                    final_result[parent]['json'][_date] = date_dict

            else:
                # At this point we're done inheriting from subgroups,
                # so we can build the final corp and cons values from billed
                for _date, data in final_result[parent]['json'].items():
                    date_dict = final_result[parent]['json'].get(_date)
                    try:
                        cons_index = date_dict['billed_cons'] / date_dict['billed']
                    except ZeroDivisionError:
                        cons_index = 0.5
                    corp_index = 1 - cons_index
                    final_result[parent]['json'][_date]['cons'] = date_dict['total'] * cons_index
                    final_result[parent]['json'][_date]['corp'] = date_dict['total'] * corp_index
                    final_result[parent]['json'][_date]['cons_index'] = cons_index
                    final_result[parent]['json'][_date]['corp_index'] = corp_index

        return final_result
Exemplo n.º 5
0
 def accounts_report(self, date, step, length, **kwargs):
     from pannel.report import Report
     qs = kwargs.pop('queryset', self.report_queryset())
     pks = qs.values('pk')
     date = date if date else latest_entry_date()
     return Report(Account.objects.filter(group_id__in=pks)).report(date, step, length, **kwargs)