From b5923ed0721a86e3b348392f03879d8ede8aff87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Thu, 6 Dec 2012 12:03:23 -0200 Subject: [PATCH] Ajustes no sistema de metas --- sigi/apps/metas/admin.py | 16 +++------ sigi/apps/metas/models.py | 70 ++++++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/sigi/apps/metas/admin.py b/sigi/apps/metas/admin.py index 1bd4f02..bea6408 100644 --- a/sigi/apps/metas/admin.py +++ b/sigi/apps/metas/admin.py @@ -3,20 +3,12 @@ from django.contrib import admin from sigi.apps.metas.models import Meta, PlanoDiretor class MetaAdmin(admin.ModelAdmin): - list_display = ('projeto', 'titulo', 'data_inicio', 'data_fim', 'valor_meta', 'hora_ultimo_calculo', 'valor_ultimo_calculo', - 'percentual_concluido', 'saude',) + list_display = ('projeto', 'titulo', 'data_inicio', 'data_fim', 'valor_meta', 'valor_executado', 'percentual_concluido',) fields = ('projeto', 'titulo', 'descricao', 'data_inicio', 'data_fim', 'algoritmo', 'valor_meta',) list_filter = ('projeto',) - actions = ['recalcular',] - - def recalcular(self, request, queryset): - for meta in queryset: - meta.calcular() - return None - recalcular.short_description = u"Recalcular Metas BID selecionados" - + class PlanoDiretorAdmin(admin.ModelAdmin): - list_display = ('projeto', 'casa_legislativa', 'status', 'data_elaboracao', 'data_assinatura', 'data_rejeicao',) - fields = ('projeto', 'casa_legislativa', 'status', 'data_elaboracao', 'data_assinatura', 'data_rejeicao',) + list_display = ('projeto', 'casa_legislativa', 'status', 'data_entrega', 'data_implantacao',) + fields = ('projeto', 'casa_legislativa', 'status', 'data_entrega', 'data_implantacao',) raw_id_fields = ('casa_legislativa',) list_filter = ('projeto', 'status',) \ No newline at end of file diff --git a/sigi/apps/metas/models.py b/sigi/apps/metas/models.py index 9033031..38879b0 100644 --- a/sigi/apps/metas/models.py +++ b/sigi/apps/metas/models.py @@ -22,10 +22,6 @@ class Meta(models.Model): data_fim = models.DateField(u'Data final', help_text=u'Prazo final para cumprimento da meta') algoritmo = models.CharField(u'Algoritmo de cálculo', max_length=10, choices=ALGORITMO_CHOICES) valor_meta = models.FloatField(u'Valor da meta', help_text=u'Valor que deve ser atingido até o prazo final da meta') - hora_ultimo_calculo = models.DateTimeField(u'Data último calculo', blank=True, null=True, editable=False, - help_text=u'Momento em que a meta foi calculada pela última vez') - valor_ultimo_calculo = models.FloatField(u'Valor último cálculo', blank=True, null=True, editable=False, - help_text=u'Valor do último calculo da meta') class Meta: verbose_name = 'Meta BID' @@ -34,39 +30,53 @@ class Meta(models.Model): def __unicode__(self): return self.titulo; + @property + def valor_executado(self): + """ + Calcula o valor executado da meta + """ + algoritmo = self.algoritmo.lower() + valor = getattr(self, algoritmo)() + return valor + @property def percentual_concluido(self): - return round(self.valor_ultimo_calculo / self.valor_meta * 100.0, 2) + return round(float(self.valor_executado) / float(self.valor_meta) * 100.0, 2) + + @property + def valor_desejado(self): + total_meses = (self.data_fim - self.data_inicio).days / 30 + meses_gastos = (date.today() - self.data_inicio).days / 30 + meta_mensal = self.valor_meta / total_meses + return meta_mensal * meses_gastos + + @property + def valor_desejado_high(self): + return self.valor_desejado * 1.1 + + @property + def valor_desejado_low(self): + return self.valor_desejado * 0.9 @property def saude(self): - if self.valor_ultimo_calculo >= self.valor_meta: - return 'green' + valor_executado = self.valor_executado + if valor_executado >= self.valor_meta: + return 'A2BBED' # Blue total_meses = (self.data_fim - self.data_inicio).days / 30 meses_gastos = (date.today() - self.data_inicio).days / 30 meta_mensal = self.valor_meta / total_meses valor_desejado = meta_mensal * meses_gastos - if self.valor_ultimo_calculo > (valor_desejado * 1.1): - return 'green' + if valor_executado > (valor_desejado * 1.1): + return '89D7AF' # Green - if self.valor_ultimo_calculo > (valor_desejado * 0.9): - return 'orange' + if valor_executado > (valor_desejado * 0.9): + return 'FFDB6E' # Orange - return 'red' + return 'E74A69' # Red - - def calcular(self): - """ - Calcula o valor da meta e salva o resultado para uso futuro - """ - algoritmo = self.algoritmo.lower() - valor = getattr(self, algoritmo)() - self.hora_ultimo_calculo = datetime.now() - self.valor_ultimo_calculo = valor - self.save() - def sum_gastos(self): #TODO: Para fazer este algoritmo, precisamos criar registro de desembolsos no sistema financeiro valor = Desembolso.objects.filter(projeto=self.projeto, data__gte=self.data_inicio, data__lte=self.data_fim) \ @@ -89,8 +99,8 @@ class Meta(models.Model): return valor def count_pdir(self): - valor = PlanoDiretor.objects.filter(projeto=self.projeto, status='A', data_assinatura__gte=self.data_inicio, - data_assinatura__lte=self.data_fim).exclude(data_assinatura=None).count() + valor = PlanoDiretor.objects.filter(projeto=self.projeto, data_entrega__gte=self.data_inicio, + data_entrega__lte=self.data_fim).count() return valor def count_conv(self): @@ -100,16 +110,14 @@ class Meta(models.Model): class PlanoDiretor(models.Model): STATUS_CHOICE = ( - ('E', u'Em elaboração'), - ('A', u'Aceito'), - ('R', u'Rejeitado'), + ('E', u'Entregue'), + ('I', u'Implantado'), ) projeto = models.ForeignKey(Projeto, verbose_name=u'Projeto') casa_legislativa = models.ForeignKey(CasaLegislativa, verbose_name=u'Casa legislativa') status = models.CharField(u'Status', max_length=1, choices=STATUS_CHOICE, default='E') - data_elaboracao = models.DateField(u'Data de elaboração') - data_assinatura = models.DateField(u'Data de assinatura', blank=True, null=True) - data_rejeicao = models.DateField(u'Data da rejeição', blank=True, null=True) + data_entrega = models.DateField(u'Data de entrega', blank=True, null=True) + data_implantacao = models.DateField(u'Data de implantação', blank=True, null=True) class Meta: verbose_name = 'Plano Diretor'