Skip to content

Commit

Permalink
Merge pull request #2946 from prefeiturasp/release/9.6.0
Browse files Browse the repository at this point in the history
Release 9.6.0
  • Loading branch information
alcfernandes authored Jun 6, 2024
2 parents 909e7d0 + bd0904d commit 5e8b5a7
Show file tree
Hide file tree
Showing 26 changed files with 521 additions and 91 deletions.
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.5.0"
__version__ = "9.6.0"

__version_info__ = tuple(
[
Expand Down
7 changes: 7 additions & 0 deletions sme_ptrf_apps/core/api/serializers/arquivo_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from sme_ptrf_apps.core.models import Arquivo
from sme_ptrf_apps.core.models.periodo import Periodo
from sme_ptrf_apps.core.models.tipo_conta import TipoConta


class ArquivoSerializer(serializers.ModelSerializer):
Expand All @@ -10,6 +11,12 @@ class ArquivoSerializer(serializers.ModelSerializer):
required=False,
queryset=Periodo.objects.all()
)

tipo_de_conta = serializers.SlugRelatedField(
slug_field='uuid',
required=False,
queryset=TipoConta.objects.all()
)
class Meta:
model = Arquivo
fields = '__all__'
2 changes: 1 addition & 1 deletion sme_ptrf_apps/core/api/views/arquivo_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class ArquivoViewSet(ModelViewSet):
filter_fields = ('status', 'tipo_carga')

def get_queryset(self):
qs = Arquivo.objects.all()
qs = self.queryset

data_execucao = self.request.query_params.get('data_execucao')
if data_execucao is not None:
Expand Down
12 changes: 12 additions & 0 deletions sme_ptrf_apps/core/choices/tipos_carga.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,15 @@
CARGA_DEVOLUCAO_TESOURO: False,
CARGA_MATERIAIS_SERVICOS: False
}

CARGA_REQUER_TIPO_CONTA = {
CARGA_REPASSE_REALIZADO: False,
CARGA_PERIODO_INICIAL: False,
CARGA_REPASSE_PREVISTO: True,
CARGA_ASSOCIACOES: False,
CARGA_USUARIOS: False,
CARGA_CENSO: False,
CARGA_REPASSE_PREVISTO_SME: False,
CARGA_DEVOLUCAO_TESOURO: False,
CARGA_MATERIAIS_SERVICOS: False
}
25 changes: 25 additions & 0 deletions sme_ptrf_apps/core/migrations/0395_arquivo_tipo_de_conta.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 4.2.7 on 2024-05-22 01:10

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
dependencies = [
("core", "0394_alter_arquivo_periodo"),
]

operations = [
migrations.AddField(
model_name="arquivo",
name="tipo_de_conta",
field=models.ForeignKey(
blank=True,
help_text="Tipo de conta associado ao arquivo (opcional dependendo do tipo de carga)",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="core.tipoconta",
verbose_name="Tipo de conta",
),
),
]
15 changes: 14 additions & 1 deletion sme_ptrf_apps/core/models/arquivo.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.db import models

from sme_ptrf_apps.core.models_abstracts import ModeloBase
from sme_ptrf_apps.core.choices.tipos_carga import CARGA_CHOICES, CARGA_REPASSE_REALIZADO, CARGA_REQUER_PERIODO
from sme_ptrf_apps.core.choices.tipos_carga import CARGA_CHOICES, CARGA_REPASSE_REALIZADO, CARGA_REQUER_PERIODO, CARGA_REQUER_TIPO_CONTA

from auditlog.models import AuditlogHistoryField
from auditlog.registry import auditlog
Expand Down Expand Up @@ -78,6 +78,15 @@ class Arquivo(ModeloBase):
verbose_name='Período',
help_text='Período associado ao arquivo (opcional dependendo do tipo de carga)'
)

tipo_de_conta = models.ForeignKey(
'TipoConta',
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name='Tipo de conta',
help_text='Tipo de conta associado ao arquivo (opcional dependendo do tipo de carga)'
)

class Meta:
verbose_name = "arquivo de carga"
Expand All @@ -92,6 +101,9 @@ def inicia_processamento(self):

def requer_periodo(self):
return CARGA_REQUER_PERIODO.get(self.tipo_carga, False)

def requer_tipo_de_conta(self):
return CARGA_REQUER_TIPO_CONTA.get(self.tipo_carga, False)

@classmethod
def status_to_json(cls):
Expand All @@ -107,6 +119,7 @@ def tipos_cargas_to_json(cls):
'id': choice[0],
'nome': choice[1],
'requer_periodo': CARGA_REQUER_PERIODO.get(choice[0], False),
'requer_tipo_de_conta': CARGA_REQUER_TIPO_CONTA.get(choice[0], False),
}
for choice in CARGA_CHOICES]

Expand Down
11 changes: 11 additions & 0 deletions sme_ptrf_apps/core/services/prestacao_conta_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,15 @@ def resolve_registros_falha(self):
)
registra_falha_service.marcar_como_resolvido()

def set_despesa_anterior_ao_uso_do_sistema_pc_concluida(self):
despesas_anteriores_ao_uso_do_sistema = self.associacao.despesas.filter(
despesa_anterior_ao_uso_do_sistema=True,
despesa_anterior_ao_uso_do_sistema_pc_concluida=False,
)

for despesa in despesas_anteriores_ao_uso_do_sistema:
despesa.set_despesa_anterior_ao_uso_do_sistema_pc_concluida()

def terminar_processo_pc(self):
if not self._prestacao:
raise Exception(f"Não existe PC para o período {self._periodo} e associação {self._associacao}.")
Expand Down Expand Up @@ -369,6 +378,8 @@ def terminar_processo_pc(self):
self._prestacao.status = PrestacaoConta.STATUS_DEVOLVIDA_RETORNADA if self.e_retorno_devolucao else PrestacaoConta.STATUS_NAO_RECEBIDA
self._prestacao.save()

self.set_despesa_anterior_ao_uso_do_sistema_pc_concluida()

self.resolve_registros_falha()

self.logger.info(f'PC {self._prestacao} concluída.')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ def test_retrieve_arquivo(
"identificador": arquivo_carga.identificador,
"conteudo": 'http://testserver/media/arquivo.csv',
"tipo_carga": "CARGA_ASSOCIACOES",
'tipo_de_conta': None,
"tipo_delimitador": "DELIMITADOR_VIRGULA",
"status": "PENDENTE",
"log": None,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def test_lista_arquivos(jwt_authenticated_client, arquivo_carga):
'identificador': 'carga_previsao_repasse',
'conteudo': 'http://testserver/media/arquivo.csv',
'tipo_carga': 'CARGA_REPASSE_PREVISTO_SME',
'tipo_de_conta': None,
'tipo_delimitador': 'DELIMITADOR_PONTO_VIRGULA',
'status': 'PENDENTE',
'log': None,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ def test_lista_arquivos_por_identificador(jwt_authenticated_client, arquivo_carg
'identificador': 'carga_previsao_repasse',
'conteudo': 'http://testserver/media/arquivo.csv',
'tipo_carga': 'CARGA_REPASSE_PREVISTO_SME',
'tipo_de_conta': None,
'tipo_delimitador': 'DELIMITADOR_PONTO_VIRGULA',
'status': 'PENDENTE',
'log': None,
Expand All @@ -66,6 +67,7 @@ def test_lista_arquivos_por_status(jwt_authenticated_client, arquivo_carga):
'identificador': 'carga_previsao_repasse',
'conteudo': 'http://testserver/media/arquivo.csv',
'tipo_carga': 'CARGA_REPASSE_PREVISTO_SME',
'tipo_de_conta': None,
'tipo_delimitador': 'DELIMITADOR_PONTO_VIRGULA',
'status': 'PENDENTE',
'log': None,
Expand All @@ -90,6 +92,7 @@ def test_lista_arquivos_por_data_execucao(jwt_authenticated_client, arquivo_carg
'identificador': 'carga_associacao',
'conteudo': 'http://testserver/media/arquivo.csv',
'tipo_carga': tipo_carga,
'tipo_de_conta': None,
'tipo_delimitador': 'DELIMITADOR_PONTO_VIRGULA',
'status': 'PENDENTE',
'log': None,
Expand Down
4 changes: 3 additions & 1 deletion sme_ptrf_apps/despesas/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def queryset(self, request, queryset):
class DespesaAdmin(admin.ModelAdmin):
list_display = (
'tipo_documento', 'numero_documento', 'data_documento', 'nome_fornecedor', 'valor_total', 'status',
'associacao', 'retem_imposto')
'associacao', 'retem_imposto', 'despesa_anterior_ao_uso_do_sistema', 'despesa_anterior_ao_uso_do_sistema_pc_concluida')
ordering = ('-data_documento',)
search_fields = (
'numero_documento',
Expand All @@ -120,6 +120,8 @@ class DespesaAdmin(admin.ModelAdmin):
'eh_despesa_sem_comprovacao_fiscal',
'eh_despesa_reconhecida_pela_associacao',
'retem_imposto',
'despesa_anterior_ao_uso_do_sistema',
'despesa_anterior_ao_uso_do_sistema_pc_concluida',
)
inlines = [RateioDespesaInLine, ]
readonly_fields = ('uuid', 'id', 'criado_em', 'alterado_em')
Expand Down
24 changes: 24 additions & 0 deletions sme_ptrf_apps/despesas/api/serializers/despesa_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,19 @@ class DespesaSerializer(serializers.ModelSerializer):
despesas_impostos = DespesaImpostoSerializer(many=True, required=False, allow_null=True)
despesa_geradora_do_imposto = serializers.SerializerMethodField(method_name="get_despesa_de_imposto", required=False, allow_null=True)
motivos_pagamento_antecipado = MotivoPagamentoAntecipadoSerializer(many=True)
despesa_anterior_ao_uso_do_sistema_editavel = serializers.SerializerMethodField(method_name="get_despesa_anterior_ao_uso_do_sistema_editavel", required=False, allow_null=True)

def get_despesa_anterior_ao_uso_do_sistema_editavel(self, despesa):
associacao = despesa.associacao
pcs_da_associacao = associacao.prestacoes_de_conta_da_associacao.all().exists()
editavel = True

if not pcs_da_associacao:
editavel = True
elif despesa.despesa_anterior_ao_uso_do_sistema and despesa.despesa_anterior_ao_uso_do_sistema_pc_concluida and pcs_da_associacao:
editavel = False

return editavel

def get_despesa_de_imposto(self, despesa):
despesa_geradora_do_imposto = despesa.despesa_geradora_do_imposto.first()
Expand Down Expand Up @@ -219,6 +232,11 @@ def create(self, validated_data):

log.info("Criação de despesa de imposto finalizada!")

# Setando despesa_anterior_ao_uso_do_sistema
data_transacao = validated_data['data_transacao'] if validated_data['data_transacao'] else None
if data_transacao:
despesa.set_despesa_anterior_ao_uso_do_sistema()

return despesa

def update(self, instance, validated_data):
Expand Down Expand Up @@ -400,6 +418,11 @@ def update(self, instance, validated_data):
despesa_imposto.verifica_data_documento_vazio()
despesa_imposto.atualiza_status()

# Setando despesa_anterior_ao_uso_do_sistema
data_transacao = validated_data['data_transacao'] if validated_data['data_transacao'] else None
if data_transacao:
despesa.set_despesa_anterior_ao_uso_do_sistema()

return despesa

class Meta:
Expand Down Expand Up @@ -451,6 +474,7 @@ def get_recurso_externo(self, despesa):

def get_informacoes(self, despesa):
return despesa.tags_de_informacao

class Meta:
model = Despesa
fields = (
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 4.2.11 on 2024-05-20 10:08

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("despesas", "0053_rateiodespesa_nao_exibir_em_rel_bens"),
]

operations = [
migrations.AddField(
model_name="despesa",
name="despesa_anterior_ao_uso_do_sistema",
field=models.BooleanField(
default=False, verbose_name="É despesa anterior ao uso do sistema?"
),
),
migrations.AddField(
model_name="despesa",
name="despesa_anterior_ao_uso_do_sistema_pc_concluida",
field=models.BooleanField(
default=False,
verbose_name="Essa Despesa anterior ao uso do sistema já teve alguma PC concluída?",
),
),
]
61 changes: 61 additions & 0 deletions sme_ptrf_apps/despesas/models/despesa.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@
from .validators import cpf_cnpj_validation
from ..status_cadastro_completo import STATUS_CHOICES, STATUS_COMPLETO, STATUS_INCOMPLETO, STATUS_INATIVO
from ...core.models import Associacao
from waffle import get_waffle_flag_model
import logging

logger = logging.getLogger(__name__)


class DespesasCompletasManager(models.Manager):
Expand Down Expand Up @@ -89,9 +93,66 @@ class Despesa(ModeloBase):

data_e_hora_de_inativacao = models.DateTimeField("Inativado em", blank=True, null=True)

despesa_anterior_ao_uso_do_sistema = models.BooleanField('É despesa anterior ao uso do sistema?', default=False)

despesa_anterior_ao_uso_do_sistema_pc_concluida = models.BooleanField('Essa Despesa anterior ao uso do sistema já teve alguma PC concluída?', default=False)

objects = models.Manager() # Manager Padrão
completas = DespesasCompletasManager()

def set_despesa_anterior_ao_uso_do_sistema_pc_concluida(self):

logger.info("Método set_despesa_anterior_ao_uso_do_sistema_pc_concluida. Verificando se a flag <ajustes-despesas-anteriores> está ativa...")

flags = get_waffle_flag_model()
flag_ajustes_despesas_anteriores_ativa = flags.objects.filter(
name='ajustes-despesas-anteriores',
everyone=True
).exists()

if flag_ajustes_despesas_anteriores_ativa:
logger.info("A flag <ajustes-despesas-anteriores> está ativa...")
logger.info(f"Setando despesa {self} como despesa_anterior_ao_uso_do_sistema_pc_concluida")
self.despesa_anterior_ao_uso_do_sistema_pc_concluida = True
self.save()

return

def set_despesa_anterior_ao_uso_do_sistema(self):
logger.info("Método set_despesa_anterior_ao_uso_do_sistema. Verificando se a flag <ajustes-despesas-anteriores> está ativa...")

flags = get_waffle_flag_model()
flag_ajustes_despesas_anteriores_ativa = flags.objects.filter(
name='ajustes-despesas-anteriores',
everyone=True
).exists()

if flag_ajustes_despesas_anteriores_ativa:

logger.info("A flag <ajustes-despesas-anteriores> está ativa...")

data_transacao = self.data_transacao

data_inicio_realizacao_despesas = self.associacao.periodo_inicial.data_inicio_realizacao_despesas if self.associacao and self.associacao.periodo_inicial and self.associacao.periodo_inicial.data_inicio_realizacao_despesas else None
data_fim_realizacao_despesas = self.associacao.periodo_inicial.data_fim_realizacao_despesas if self.associacao and self.associacao.periodo_inicial and self.associacao.periodo_inicial.data_fim_realizacao_despesas else None

if data_fim_realizacao_despesas:
if data_transacao <= data_fim_realizacao_despesas:
self.despesa_anterior_ao_uso_do_sistema = True
else:
self.despesa_anterior_ao_uso_do_sistema = False
elif data_inicio_realizacao_despesas:
if data_transacao <= data_inicio_realizacao_despesas:
self.despesa_anterior_ao_uso_do_sistema = True
else:
self.despesa_anterior_ao_uso_do_sistema = False

logger.info(f"Setando despesa {self} como despesa_anterior_ao_uso_do_sistema")

self.save()

return

@property
def valor_ptrf(self):
return self.valor_total - self.valor_recursos_proprios
Expand Down
Loading

0 comments on commit 5e8b5a7

Please sign in to comment.