Skip to content

Commit

Permalink
Merge branch 'release/1.4.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
alcfernandes committed Jan 8, 2021
2 parents 835a87a + 9634563 commit 4c49336
Show file tree
Hide file tree
Showing 89 changed files with 1,892 additions and 346 deletions.
16 changes: 14 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,23 @@ API da aplicação *SIG.Escola* da Secretaria de Educação da cidade de São Pa

License: MIT

Versão: 1.3.0

Versão: 1.4.0

## Release Notes

### 1.4.0 - 07/01/2021 - Entregas da Sprint 13
* Visão SME
* SME > Painel de parâmetros do sistema
* SME > Acompanhamento de prestações de conta > Resumo Geral
* SME > Acompanhamento de prestações de conta > Resumo por DRE (lista)
* Lançamento de Créditos não relativos ao PTRF
* Melhorias na área de administração do sistema
* Melhorias na Ata de Retificação
* Seleção de repasses ao cadastrar créditos
* Recurso de exclusão de membros da associação
* Melhorias no acompanhamento de prestações de contas da DRE
* 🐞 Correção de alguns poucos bugs ;-)

### 1.3.0 - 08/12/2020 - Entregas da Sprint 12
* Carga de previsões de repasse da SME;
* Carga de quantidade de alunos do último celso;
Expand Down
2 changes: 1 addition & 1 deletion sme_ptrf_apps/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "1.3.0"
__version__ = "1.4.0"
__version_info__ = tuple(
[
int(num) if num.isdigit() else num
Expand Down
19 changes: 17 additions & 2 deletions sme_ptrf_apps/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ def acao_role_cultural():

@pytest.fixture
def dre():
return baker.make('Unidade', codigo_eol='99999', tipo_unidade='DRE', nome='DRE teste')
return baker.make('Unidade', codigo_eol='99999', tipo_unidade='DRE', nome='DRE teste', sigla='TT')


@pytest.fixture
Expand Down Expand Up @@ -406,7 +406,8 @@ def prestacao_conta(periodo, associacao):
data_recebimento=date(2020, 10, 1),
data_ultima_analise=date(2020, 10, 1),
devolucao_tesouro=True,
ressalvas_aprovacao='Texto ressalva'
ressalvas_aprovacao='Texto ressalva',
motivos_reprovacao="Motivo reprovação"
)


Expand Down Expand Up @@ -1185,6 +1186,20 @@ def parametros():
)


@pytest.fixture
def parametro_fique_de_olho_pc():
return baker.make(
'ParametroFiqueDeOlhoPc',
fique_de_olho='',
)

@pytest.fixture
def parametro_fique_de_olho_pc_texto_abc():
return baker.make(
'ParametroFiqueDeOlhoPc',
fique_de_olho='abc',
)

@pytest.fixture
def parametros_aceita_saldo_negativo_em_conta():
return baker.make(
Expand Down
122 changes: 118 additions & 4 deletions sme_ptrf_apps/core/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,16 @@
DevolucaoAoTesouro,
ComentarioAnalisePrestacao,
PrevisaoRepasseSme,
Censo
Censo,
ParametroFiqueDeOlhoPc,
)

admin.site.register(TipoNotificacao)
admin.site.register(Acao)
admin.site.register(Categoria)
admin.site.register(DemonstrativoFinanceiro)
admin.site.register(Parametros)
admin.site.register(RelacaoBens)
admin.site.register(Remetente)
admin.site.register(MembroAssociacao)
admin.site.register(ParametroFiqueDeOlhoPc)


@admin.register(Associacao)
Expand Down Expand Up @@ -385,3 +384,118 @@ class TipoContaAdmin(admin.ModelAdmin):
class CensoAdmin(admin.ModelAdmin):
list_display = ['uuid', 'unidade', 'quantidade_alunos', 'ano']
list_filter = ['ano', ]


@admin.register(Parametros)
class ParametrosAdmin(admin.ModelAdmin):
exclude = ('fique_de_olho', 'fique_de_olho_relatorio_dre')
list_display = ['permite_saldo_conta_negativo', 'tempo_notificar_nao_demonstrados', ]
list_display_links = ['permite_saldo_conta_negativo', 'tempo_notificar_nao_demonstrados', ]


@admin.register(DemonstrativoFinanceiro)
class DemonstrativoFinanceiroAdmin(admin.ModelAdmin):
def get_nome_acao(self, obj):
return obj.acao_associacao.acao.nome if obj and obj.acao_associacao else ''

get_nome_acao.short_description = 'Ação'

def get_nome_conta(self, obj):
return obj.conta_associacao.tipo_conta.nome if obj and obj.conta_associacao else ''

get_nome_conta.short_description = 'Conta'

def get_nome_associacao(self, obj):
return obj.prestacao_conta.associacao.nome if obj and obj.prestacao_conta else ''

get_nome_associacao.short_description = 'Associação'

def get_periodo(self, obj):
return obj.prestacao_conta.periodo.referencia if obj and obj.prestacao_conta and obj.prestacao_conta.periodo else ''

get_periodo.short_description = 'Periodo'

def get_nome_dre(self, obj):
return obj.prestacao_conta.associacao.unidade.dre.nome if obj and obj.prestacao_conta and obj.prestacao_conta.associacao and obj.prestacao_conta.associacao.unidade and obj.prestacao_conta.associacao.unidade.dre else ''

get_nome_dre.short_description = 'DRE'

list_display = (
'get_nome_associacao',
'get_periodo',
'get_nome_acao',
'get_nome_conta',
'get_nome_dre',
'criado_em'
)

list_filter = (
'prestacao_conta__associacao',
'acao_associacao__acao',
'conta_associacao__tipo_conta',
'prestacao_conta__periodo',
'prestacao_conta__associacao__unidade__dre',
)

list_display_links = ('get_nome_associacao',)

readonly_fields = ('uuid', 'id',)

search_fields = (
'prestacao_conta__associacao__unidade__codigo_eol',
'prestacao_conta__associacao__unidade__nome',
'prestacao_conta__associacao__nome'
)

autocomplete_fields = ['conta_associacao', 'acao_associacao']


@admin.register(RelacaoBens)
class RelacaoBensAdmin(admin.ModelAdmin):

def get_nome_conta(self, obj):
return obj.conta_associacao.tipo_conta.nome if obj and obj.conta_associacao else ''

get_nome_conta.short_description = 'Conta'

def get_nome_associacao(self, obj):
return obj.prestacao_conta.associacao.nome if obj and obj.prestacao_conta else ''

get_nome_associacao.short_description = 'Associação'

def get_periodo(self, obj):
return obj.prestacao_conta.periodo.referencia if obj and obj.prestacao_conta and obj.prestacao_conta.periodo else ''

get_periodo.short_description = 'Periodo'

def get_nome_dre(self, obj):
return obj.prestacao_conta.associacao.unidade.dre.nome if obj and obj.prestacao_conta and obj.prestacao_conta.associacao and obj.prestacao_conta.associacao.unidade and obj.prestacao_conta.associacao.unidade.dre else ''

get_nome_dre.short_description = 'DRE'

list_display = (
'get_nome_associacao',
'get_periodo',
'get_nome_conta',
'get_nome_dre',
'criado_em'
)

list_filter = (
'prestacao_conta__associacao',
'conta_associacao__tipo_conta',
'prestacao_conta__periodo',
'prestacao_conta__associacao__unidade__dre',
)

list_display_links = ('get_nome_associacao',)

readonly_fields = ('uuid', 'id',)

search_fields = (
'prestacao_conta__associacao__unidade__codigo_eol',
'prestacao_conta__associacao__unidade__nome',
'prestacao_conta__associacao__nome'
)

autocomplete_fields = ['conta_associacao',]
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,14 @@ class Meta:

class AcaoAssociacaoLookUpSerializer(serializers.ModelSerializer):
nome = serializers.SerializerMethodField('get_nome_acao')
e_recursos_proprios = serializers.SerializerMethodField('get_recurso_proprio')

def get_nome_acao(self, obj):
return obj.acao.nome

def get_recurso_proprio(self, obj):
return obj.acao.e_recursos_proprios

class Meta:
model = AcaoAssociacao
fields = ('uuid', 'id', 'nome')
fields = ('uuid', 'id', 'nome', 'e_recursos_proprios')
2 changes: 1 addition & 1 deletion sme_ptrf_apps/core/api/serializers/acao_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@
class AcaoSerializer(serializers.ModelSerializer):
class Meta:
model = Acao
fields = ('id', 'nome')
fields = ('id', 'nome', 'e_recursos_proprios')
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class Meta:
model = PrestacaoConta
fields = ('uuid', 'status', 'associacao', 'periodo_uuid', 'tecnico_responsavel', 'data_recebimento',
'devolucoes_da_prestacao', 'processo_sei', 'data_ultima_analise', 'devolucao_ao_tesouro',
'analises_de_conta_da_prestacao', 'ressalvas_aprovacao', 'devolucoes_ao_tesouro_da_prestacao')
'analises_de_conta_da_prestacao', 'ressalvas_aprovacao', 'motivos_reprovacao', 'devolucoes_ao_tesouro_da_prestacao')


def _str_devolucao_ao_tesouro(obj):
Expand Down
5 changes: 3 additions & 2 deletions sme_ptrf_apps/core/api/views/associacoes_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
PermissaoDadosUnidadeDre,
PermissaoExportarDadosAssociacao,
PermissaoRegularidadeDre,
PermissaoSituacaoFinanceira
PermissaoSituacaoFinanceira,
PermissaoVerConciliacaoBancaria
)

from ....dre.services import (
Expand Down Expand Up @@ -60,7 +61,7 @@ class AssociacoesViewSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
GenericViewSet, ):
permission_classes = [IsAuthenticated & (PermissaoAssociacao | PermissaoAssociacaoDre | PermissaoDadosUnidadeDre | PermissaoSituacaoFinanceira)]
permission_classes = [IsAuthenticated & (PermissaoAssociacao | PermissaoAssociacaoDre | PermissaoDadosUnidadeDre | PermissaoSituacaoFinanceira | PermissaoVerConciliacaoBancaria)]
lookup_field = 'uuid'
queryset = Associacao.objects.all()
serializer_class = AssociacaoSerializer
Expand Down
4 changes: 2 additions & 2 deletions sme_ptrf_apps/core/api/views/conciliacoes_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet

from sme_ptrf_apps.users.permissoes import PermissaoPrestacaoConta
from sme_ptrf_apps.users.permissoes import PermissaoPrestacaoConta, PermissaoVerConciliacaoBancaria, PermissaoEditarConciliacaoBancaria

from ....despesas.api.serializers.rateio_despesa_serializer import RateioDespesaListaSerializer
from ....receitas.api.serializers.receita_serializer import ReceitaListaSerializer
Expand All @@ -23,7 +23,7 @@


class ConciliacoesViewSet(GenericViewSet):
permission_classes = [IsAuthenticated & PermissaoPrestacaoConta]
permission_classes = [IsAuthenticated & (PermissaoPrestacaoConta | PermissaoVerConciliacaoBancaria | PermissaoEditarConciliacaoBancaria)]
queryset = ObservacaoConciliacao.objects.all()

@action(detail=False, methods=['get'], url_path='tabela-valores-pendentes')
Expand Down
46 changes: 43 additions & 3 deletions sme_ptrf_apps/core/api/views/prestacoes_contas_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
reabrir_prestacao_de_contas,
lista_prestacoes_de_conta_nao_recebidas,
)
from ....dre.services import (dashboard_sme)
from ..serializers import (
AtaLookUpSerializer,
PrestacaoContaListSerializer,
Expand Down Expand Up @@ -407,6 +408,17 @@ def concluir_analise(self, request, uuid):
}
return Response(response, status=status.HTTP_400_BAD_REQUEST)

motivos_reprovacao = request.data.get('motivos_reprovacao', '')

if resultado_analise == PrestacaoConta.STATUS_REPROVADA and not motivos_reprovacao:
response = {
'uuid': f'{uuid}',
'erro': 'falta_de_informacoes',
'operacao': 'concluir-analise',
'mensagem': 'Para concluir como Reprovada é necessário informar o campo motivos_reprovacao.'
}
return Response(response, status=status.HTTP_400_BAD_REQUEST)

data_limite_ue = request.data.get('data_limite_ue', None)

if resultado_analise == PrestacaoConta.STATUS_DEVOLVIDA and not data_limite_ue:
Expand All @@ -424,6 +436,7 @@ def concluir_analise(self, request, uuid):
analises_de_conta_da_prestacao=analises_de_conta_da_prestacao,
ressalvas_aprovacao=ressalvas_aprovacao,
data_limite_ue=data_limite_ue,
motivos_reprovacao=motivos_reprovacao,
devolucoes_ao_tesouro_da_prestacao=devolucoes_ao_tesouro_da_prestacao
)

Expand Down Expand Up @@ -520,8 +533,8 @@ def iniciar_ata_retificacao(self, request, uuid):

@action(detail=False, methods=['get'], url_path='fique-de-olho')
def fique_de_olho(self, request, uuid=None):
from sme_ptrf_apps.core.models import Parametros
fique_de_olho = Parametros.get().fique_de_olho
from sme_ptrf_apps.core.models import ParametroFiqueDeOlhoPc
fique_de_olho = ParametroFiqueDeOlhoPc.get().fique_de_olho

return Response({'detail': fique_de_olho}, status=status.HTTP_200_OK)

Expand Down Expand Up @@ -616,11 +629,38 @@ def nao_recebidas(self, _):
logger.info('Erro: %r', erro)
return Response(erro, status=status.HTTP_400_BAD_REQUEST)


result = lista_prestacoes_de_conta_nao_recebidas(dre=dre,
periodo=periodo,
filtro_nome=nome,
filtro_tipo_unidade=tipo_unidade,
filtro_status=status_pc
)
return Response(result)

@action(detail=False, methods=['get'], url_path="dashboard-sme")
def dashboard_sme(self, request):
# Determina o período
periodo_uuid = self.request.query_params.get('periodo')

if not periodo_uuid:
erro = {
'erro': 'falta_de_informacoes',
'operacao': 'dashboard-sme',
'mensagem': 'Faltou informar o uuid do período. ?periodo=uuid_do_periodo'
}
logger.info('Erro: %r', erro)
return Response(erro, status=status.HTTP_400_BAD_REQUEST)

try:
periodo = Periodo.objects.get(uuid=periodo_uuid)
except Periodo.DoesNotExist:
erro = {
'erro': 'Objeto não encontrado.',
'mensagem': f"O objeto período para o uuid {periodo_uuid} não foi encontrado na base."
}
logger.info('Erro: %r', erro)
return Response(erro, status=status.HTTP_400_BAD_REQUEST)

dashboard = dashboard_sme(periodo=periodo)

return Response(dashboard)
18 changes: 18 additions & 0 deletions sme_ptrf_apps/core/migrations/0125_acao_e_recursos_proprios.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.2.10 on 2020-12-10 15:00

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('core', '0124_auto_20201202_1929'),
]

operations = [
migrations.AddField(
model_name='acao',
name='e_recursos_proprios',
field=models.BooleanField(default=False, verbose_name='Aceita recursos próprios?'),
),
]
Loading

0 comments on commit 4c49336

Please sign in to comment.