Skip to content

Commit

Permalink
Merge pull request #2879 from prefeiturasp/release/9.3.0
Browse files Browse the repository at this point in the history
Release/9.3.0
  • Loading branch information
ollyvergithub authored Apr 17, 2024
2 parents a513e30 + 50b003f commit 518cf9e
Show file tree
Hide file tree
Showing 37 changed files with 739 additions and 101 deletions.
4 changes: 4 additions & 0 deletions config/api_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from sme_ptrf_apps import __version__
from sme_ptrf_apps.core.api.views import (
AssociacoesViewSet,
ParametrizacoesAssociacoesViewSet,
AtasViewSet,
DemonstrativoFinanceiroViewSet,
MembroAssociacaoViewSet,
Expand All @@ -26,6 +27,7 @@
TiposContaViewSet,
ComentariosAnalisesPrestacoesViewSet,
AcaoAssociacaoViewSet,
ParametrizacoesAcoesAssociacaoViewSet,
AcoesViewSet,
ArquivoViewSet,
TagsViewSet,
Expand Down Expand Up @@ -127,6 +129,7 @@ def teste_flag_view(request):
router.register("receitas", ReceitaViewSet)
router.register("fornecedores", FornecedoresViewSet)
router.register("associacoes", AssociacoesViewSet)
router.register("parametrizacoes-associacoes", ParametrizacoesAssociacoesViewSet)
router.register("repasses", RepasseViewSet, basename='repasses-pendentes')
router.register("periodos", PeriodosViewSet)
router.register("prestacoes-contas", PrestacoesContasViewSet)
Expand All @@ -153,6 +156,7 @@ def teste_flag_view(request):
router.register("motivos-aprovacao-ressalva", MotivoAprovacaoRessalvaViewSet)
router.register("motivos-reprovacao", MotivoReprovacaoViewSet)
router.register("acoes-associacoes", AcaoAssociacaoViewSet)
router.register("parametrizacoes-acoes-associacoes", ParametrizacoesAcoesAssociacaoViewSet)
router.register("acoes", AcoesViewSet)
router.register("arquivos", ArquivoViewSet)
router.register("tags", TagsViewSet)
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__ = "9.2.1"
__version__ = "9.3.0"

__version_info__ = tuple(
[
Expand Down
2 changes: 1 addition & 1 deletion sme_ptrf_apps/core/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ class ProcessoAssociacaoAdmin(admin.ModelAdmin):
list_display = ('associacao', 'numero_processo', 'ano', 'periodos_str')
search_fields = ('uuid', 'numero_processo', 'associacao__nome')
list_filter = ('ano', 'associacao', 'associacao__unidade__tipo_unidade', 'associacao__unidade__dre')
readonly_fields = ('uuid', 'id')
readonly_fields = ('uuid', 'id', 'criado_em', 'alterado_em')
filter_horizontal = ('periodos',)
raw_id_fields = ('associacao',)

Expand Down
4 changes: 4 additions & 0 deletions sme_ptrf_apps/core/api/serializers/ata_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ def create(self, validated_data):
presentes_lista.append(presentes_object)

ata.presentes_na_ata.set(presentes_lista)
ata.arquivo_pdf = None
ata.arquivo_pdf_nao_gerado()
ata.save()

return ata
Expand Down Expand Up @@ -183,6 +185,8 @@ def update(self, instance, validated_data):

update_instance_from_dict(instance, validated_data)
instance.presentes_na_ata.set(presentes_lista)
instance.arquivo_pdf = None
instance.arquivo_pdf_nao_gerado()
instance.save()

return instance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,21 @@ def validate(self, data):

associacao = data.get('associacao')
periodos = data.get('periodos', [])
numero_processo = data.get('numero_processo')

# Verifica se já existe na associação no mesmo ano o mesmo numero
if numero_processo and associacao and ano_processo:
processos_existentes = ProcessoAssociacao.objects.filter(
associacao=associacao, numero_processo=numero_processo, ano=ano_processo
)

if self.instance:
processos_existentes = processos_existentes.exclude(pk=self.instance.pk)

if processos_existentes.exists():
raise serializers.ValidationError({
"numero_processo": f"Este número de processo SEI já existe para o ano informado."
})

# Verifica se os períodos estão sendo reutilizados na mesma associação
for periodo in periodos:
Expand Down
2 changes: 2 additions & 0 deletions sme_ptrf_apps/core/api/views/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .associacoes_viewset import AssociacoesViewSet
from .parametrizacoes_associacoes import ParametrizacoesAssociacoesViewSet
from .atas_viewset import AtasViewSet
from .conciliacoes_viewset import ConciliacoesViewSet
from .demonstrativo_financeiro_viewset import DemonstrativoFinanceiroViewSet
Expand Down Expand Up @@ -32,3 +33,4 @@
from .solicitacao_encerramento_conta_associacao_viewset import SolicitacaoEncerramentoContaAssociacaoViewset
from .motivo_rejeicao_encerramento_conta_associacao_viewset import MotivoRejeicaoEncerramentoContaAssociacaoViewset
from .feature_flags_view import feature_flags
from .parametrizacoes_acoes_associacoes import ParametrizacoesAcoesAssociacaoViewSet
48 changes: 48 additions & 0 deletions sme_ptrf_apps/core/api/views/parametrizacoes_acoes_associacoes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from django.db.models import Q
from django_filters import rest_framework as filters

from rest_framework import mixins
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import GenericViewSet

from sme_ptrf_apps.core.api.serializers import AcaoAssociacaoRetrieveSerializer
from sme_ptrf_apps.core.api.utils.pagination import CustomPagination
from sme_ptrf_apps.core.choices.filtro_informacoes_associacao import FiltroInformacoesAssociacao
from sme_ptrf_apps.core.models import AcaoAssociacao
from sme_ptrf_apps.users.permissoes import PermissaoApiUe


class ParametrizacoesAcoesAssociacaoViewSet(mixins.ListModelMixin, GenericViewSet):
permission_classes = [IsAuthenticated & PermissaoApiUe]
lookup_field = 'uuid'
queryset = AcaoAssociacao.objects.all()
serializer_class = AcaoAssociacaoRetrieveSerializer
filter_backends = (filters.DjangoFilterBackend,)
filter_fields = ('acao__uuid', 'status', 'associacao__uuid')
pagination_class = CustomPagination

def get_queryset(self):
qs = AcaoAssociacao.objects.all().order_by('associacao__nome', 'acao__nome')

nome = self.request.query_params.get('nome')
filtro_informacoes = self.request.query_params.get('filtro_informacoes')
filtro_informacoes_list = filtro_informacoes.split(',') if filtro_informacoes else []

encerradas = FiltroInformacoesAssociacao.FILTRO_INFORMACOES_ENCERRADAS
nao_encerradas = FiltroInformacoesAssociacao.FILTRO_INFORMACOES_NAO_ENCERRADAS

if nome is not None:
qs = qs.filter(Q(associacao__nome__unaccent__icontains=nome) | Q(
associacao__unidade__nome__unaccent__icontains=nome) | Q(
associacao__unidade__codigo_eol__icontains=nome))

if filtro_informacoes_list:
if encerradas in filtro_informacoes_list and nao_encerradas in filtro_informacoes_list:
qs = qs
elif nao_encerradas in filtro_informacoes_list:
qs = qs.filter(associacao__data_de_encerramento__isnull=True)

elif encerradas in filtro_informacoes_list:
qs = qs.filter(associacao__data_de_encerramento__isnull=False)

return qs.order_by('associacao__nome', 'acao__nome')
58 changes: 58 additions & 0 deletions sme_ptrf_apps/core/api/views/parametrizacoes_associacoes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from rest_framework.permissions import IsAuthenticated

from sme_ptrf_apps.users.permissoes import (
PermissaoApiUe,
)

from sme_ptrf_apps.core.models import Associacao
from django_filters import rest_framework as filters
from django.db.models import Q
from rest_framework.filters import SearchFilter

from ..serializers.associacao_serializer import (
AssociacaoListSerializer
)

from sme_ptrf_apps.core.api.utils.pagination import CustomPagination
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet

from ...choices import FiltroInformacoesAssociacao


class ParametrizacoesAssociacoesViewSet(mixins.ListModelMixin, GenericViewSet):
permission_classes = [IsAuthenticated & PermissaoApiUe]
lookup_field = 'uuid'
queryset = Associacao.objects.all()
serializer_class = AssociacaoListSerializer
filter_backends = (filters.DjangoFilterBackend, SearchFilter,)
filter_fields = ('unidade__dre__uuid', 'unidade__tipo_unidade')
pagination_class = CustomPagination

def get_queryset(self):
qs = Associacao.objects.all().order_by('unidade__tipo_unidade', 'unidade__nome')

uuid_dre = self.request.query_params.get('unidade__dre__uuid')
if uuid_dre is not None and uuid_dre != "":
qs = qs.filter(unidade__dre__uuid=uuid_dre)

nome = self.request.query_params.get('nome')
if nome is not None:
qs = qs.filter(Q(unidade__codigo_eol=nome) | Q(nome__unaccent__icontains=nome) | Q(
unidade__nome__unaccent__icontains=nome))

filtro_informacoes = self.request.query_params.get('filtro_informacoes')
filtro_informacoes_list = filtro_informacoes.split(',') if filtro_informacoes else []

encerradas = FiltroInformacoesAssociacao.FILTRO_INFORMACOES_ENCERRADAS
nao_encerradas = FiltroInformacoesAssociacao.FILTRO_INFORMACOES_NAO_ENCERRADAS

if filtro_informacoes_list:
if encerradas in filtro_informacoes_list and nao_encerradas in filtro_informacoes_list:
qs = qs
elif nao_encerradas in filtro_informacoes_list:
qs = qs.filter(data_de_encerramento__isnull=True)
elif encerradas in filtro_informacoes_list:
qs = qs.filter(data_de_encerramento__isnull=False)

return qs
2 changes: 1 addition & 1 deletion sme_ptrf_apps/core/fixtures/factories/unidade_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class Meta:
nome = Sequence(lambda n: f"DIRETORIA REGIONAL DE EDUCACAO {fake.unique.name().upper()}")
tipo_unidade = "DRE"
codigo_eol = Sequence(lambda n: str(fake.unique.random_int(min=100000, max=999999)))
sigla = Sequence(lambda n: fake.unique.lexify(text="??", letters="ABCDEFGHIJK"))
sigla = Sequence(lambda n: fake.unique.lexify(text="??", letters="ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
dre_cnpj = Sequence(lambda n: fake.unique.cnpj())
dre_diretor_regional_rf = Sequence(lambda n: str(fake.unique.random_int(min=1000000, max=9999999)))
dre_diretor_regional_nome = Sequence(lambda n:fake.unique.name().upper())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 4.2.7 on 2024-04-04 09:01

from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
("core", "0383_merge_20240322_1517"),
]

operations = [
migrations.AlterModelOptions(
name="funcsmepainelparametrizacoes",
options={
"default_permissions": (),
"managed": False,
"permissions": (
(
"access_painel_parametrizacoes",
"[SME] Pode acessar o Painel de parametrizações.",
),
(
"change_painel_parametrizacoes",
"[SME] Pode atualizar o Painel de parametrizações ",
),
),
"verbose_name": "[SME] Painel de Parametrizacoes",
"verbose_name_plural": "[SME] Painel de Parametrizacoes",
},
),
]
15 changes: 15 additions & 0 deletions sme_ptrf_apps/core/migrations/0385_delete_funcsmefornecedores.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Generated by Django 4.2.11 on 2024-04-10 12:20

from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
("core", "0384_alter_funcsmepainelparametrizacoes_options"),
]

operations = [
migrations.DeleteModel(
name="FuncSmeFornecedores",
),
]
22 changes: 22 additions & 0 deletions sme_ptrf_apps/core/migrations/0386_ata_pdf_gerado_previamente.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 4.2.7 on 2024-04-15 11:20

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("core", "0385_delete_funcsmefornecedores"),
]

operations = [
migrations.AddField(
model_name="ata",
name="pdf_gerado_previamente",
field=models.BooleanField(
blank=True,
default=False,
help_text="O PDF já foi gerado previamente, foi apagado e precisa ser regerado quando editado/apagado",
verbose_name="PDF gerado previamente",
),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 4.2.7 on 2024-04-15 11:25

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("core", "0386_ata_pdf_gerado_previamente"),
]

operations = [
migrations.AlterField(
model_name="ata",
name="pdf_gerado_previamente",
field=models.BooleanField(
blank=True,
default=False,
help_text="O PDF já foi gerado, foi apagado e precisa ser regerado quando a ata é editada/apagada",
verbose_name="PDF gerado previamente",
),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 4.2.7 on 2024-04-15 11:29

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("core", "0387_alter_ata_pdf_gerado_previamente"),
]

operations = [
migrations.AlterField(
model_name="ata",
name="pdf_gerado_previamente",
field=models.BooleanField(
blank=True,
default=False,
help_text="O PDF já foi gerado e precisa ser regerado quando a ata é editada/apagada",
verbose_name="PDF gerado previamente",
),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 4.2.7 on 2024-04-15 12:16

from django.db import migrations

def migrar_campo_pdf_gerado_previamente(apps, schema_editor):
model_ata = apps.get_model('core', 'Ata')
atas_com_pdf = model_ata.objects.exclude(arquivo_pdf='')
for ata in atas_com_pdf:
ata.pdf_gerado_previamente = True
ata.save()


class Migration(migrations.Migration):
dependencies = [
("core", "0388_alter_ata_pdf_gerado_previamente"),
]

operations = [
migrations.RunPython(migrar_campo_pdf_gerado_previamente, reverse_code=migrations.RunPython.noop)
]
3 changes: 3 additions & 0 deletions sme_ptrf_apps/core/models/ata.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@ class Ata(ModeloBase):
previa = models.BooleanField("É prévia?", default=False)

justificativa_repasses_pendentes = models.TextField('Justificativa repasses pendentes', blank=True, default='')

pdf_gerado_previamente = models.BooleanField("PDF gerado previamente", blank=True, default=False, help_text="O PDF já foi gerado e precisa ser regerado quando a ata é editada/apagada")

@property
def nome(self):
Expand Down Expand Up @@ -290,6 +292,7 @@ def arquivo_pdf_iniciar(self):
self.save()

def arquivo_pdf_concluir(self):
self.pdf_gerado_previamente = True
self.status_geracao_pdf = self.STATUS_CONCLUIDO
self.save()

Expand Down
Loading

0 comments on commit 518cf9e

Please sign in to comment.