from pprint import pprint

from django.db import connections
from django.db.models import Exists, OuterRef

from utils.views import totalize_data
from base.views import O2BaseGetView

import comercial.models


class AProduzir(O2BaseGetView):

    def __init__(self, *args, **kwargs):
        super(AProduzir, self).__init__(*args, **kwargs)
        self.template_name = 'lotes/a_produzir.html'
        self.title_name = 'A produzir por modelo'

    def mount_context(self):
        self.cursor = connections['so'].cursor()

        data = []

        metas = comercial.models.MetaEstoque.objects
        metas = metas.annotate(antiga=Exists(
            comercial.models.MetaEstoque.objects.filter(
                modelo=OuterRef('modelo'),
                data__gt=OuterRef('data')
            )
        ))
        metas = metas.filter(antiga=False)
        metas = metas.exclude(multiplicador=0)
        metas = metas.exclude(venda_mensal=0)
        metas = metas.order_by('-meta_estoque').values()

        for row in metas:
            data_row = next(
                (dr for dr in data if dr['modelo'] == row['modelo']),
                False)
            if not data_row:
                data_row = {
                    'modelo': row['modelo'],
                }
                data.append(data_row)
            data_row['meta_giro'] = row['meta_giro']
            data_row['meta_estoque'] = row['meta_estoque']
            data_row['meta'] = row['meta_giro'] + row['meta_estoque']

        totalize_data(data, {
            'sum': ['meta_giro', 'meta_estoque', 'meta'],
            'count': [],
            'descr': {'modelo': 'Totais:'}})
        data[-1]['|STYLE'] = 'font-weight: bold;'

        self.context.update({
            'headers': ['Modelo', 'Meta de giro', 'Meta de estoque', 'Meta'],
            'fields': ['modelo', 'meta_giro', 'meta_estoque', 'meta'],
            'data': data,
            'style': {
                2: 'text-align: right;',
                3: 'text-align: right;',
                4: 'text-align: right;',
            },
        })

@@ -964,34 +964,8 @@
 tas.
-order_by('-meta_estoque').
 valu
@@ -1460,16 +1460,71 @@
 oque'%5D%0A%0A
+        data = sorted(data, key=lambda i: -i%5B'meta'%5D)%0A%0A
         

ordena por meta