Skip to content

Commit

Permalink
Merge pull request #2397 from prefeiturasp/hotfix/8.10.1
Browse files Browse the repository at this point in the history
Hotfix/8.10.1
  • Loading branch information
rayanemsantos authored Oct 10, 2023
2 parents 5a43ae8 + 414f8ba commit 615796e
Show file tree
Hide file tree
Showing 12 changed files with 172 additions and 60 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__ = "8.10.0"
__version__ = "8.10.1"

__version_info__ = tuple(
[
Expand Down
15 changes: 15 additions & 0 deletions sme_ptrf_apps/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ def tipo_conta_cheque(tipo_conta):
def tipo_conta_cartao():
return baker.make('TipoConta', nome='Cartão')

@pytest.fixture
def tipo_conta_teste():
return baker.make('TipoConta', nome='Teste')

@pytest.fixture
def acao():
Expand Down Expand Up @@ -532,6 +535,18 @@ def conta_associacao_tipo_cheque(associacao, tipo_conta_cheque):
numero_conta='123456-x',
numero_cartao='534653264523'
)
@pytest.fixture
def conta_associacao_tipo_teste(associacao, tipo_conta_teste, periodo_2020_1):
return baker.make(
'ContaAssociacao',
associacao=associacao,
tipo_conta=tipo_conta_teste,
banco_nome='Banco do Brasil',
agencia='12345',
numero_conta='123456-x',
numero_cartao='534653264523',
data_inicio=periodo_2020_1.data_inicio_realizacao_despesas
)

@pytest.fixture
def conta_associacao_incompleta(associacao_cadastro_incompleto, tipo_conta_cartao):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ class AnaliseDocumentoPrestacaoConta(ModeloBase):
default=STATUS_REALIZACAO_PENDENTE
)

@property
def requer_ajuste(self):
return self.resultado == AnaliseDocumentoPrestacaoConta.RESULTADO_AJUSTE

@property
def requer_edicao_informacao_conciliacao(self):
requer = self.solicitacoes_de_ajuste_da_analise.filter(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@ def __str__(self):
def status_realizacao_choices_to_json(cls):
return choices_to_json(cls.STATUS_REALIZACAO_CHOICES)

@property
def requer_ajuste(self):
return self.resultado == AnaliseLancamentoPrestacaoConta.RESULTADO_AJUSTE

@property
def requer_atualizacao_devolucao_ao_tesouro(self):
from . import TipoAcertoLancamento
Expand Down
4 changes: 2 additions & 2 deletions sme_ptrf_apps/core/models/conta_associacao.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def get_queryset(self):

class ContasComSolicitacaoDeEncerramento(models.Manager):
def get_queryset(self):
return super(ContasAtivasComSolicitacaoEmAberto, self).get_queryset().filter(solicitacao_encerramento__isnull=False)
return super(ContasComSolicitacaoDeEncerramento, self).get_queryset().filter(solicitacao_encerramento__isnull=False)

class ContasEncerradas(models.Manager):
def get_queryset(self):
Expand Down Expand Up @@ -60,7 +60,7 @@ class ContaAssociacao(ModeloBase):

objects = models.Manager()
ativas_com_solicitacao_em_aberto = ContasAtivasComSolicitacaoEmAberto()
com_solicitacao_de_encerramento = ContasAtivasComSolicitacaoEmAberto()
com_solicitacao_de_encerramento = ContasComSolicitacaoDeEncerramento()
encerradas = ContasEncerradas()

def __str__(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,9 @@ def copia_analises_de_lancamento():
# Todas as solicitações foram consideradas corretas automaticamente então passa a análise para correta
nova_analise_lancamento.resultado = AnaliseLancamentoPrestacaoConta.RESULTADO_CORRETO
nova_analise_lancamento.save()

# Verifica se não há solicitações de acerto e, se não houver, exclui a nova_analise_lancamento
if not analise_lancamento.solicitacoes_de_ajuste_da_analise.exists():
if analise_lancamento.requer_ajuste and not analise_lancamento.solicitacoes_de_ajuste_da_analise.exists():
nova_analise_lancamento.delete()

def copia_analise_documento(analise_documento_origem):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import logging
from sme_ptrf_apps.users.services import SmeIntegracaoService
from sme_ptrf_apps.users.services import SmeIntegracaoService, SmeIntegracaoException
from sme_ptrf_apps.users.tasks import enviar_email_nova_notificacao_async

from django.contrib.auth import get_user_model
Expand All @@ -12,14 +12,19 @@
def enviar_email_nova_notificacao(usuario=None, titulo=None, descricao=None):
logger.info(f'Iniciando envio de email nova notificação service para o usuário: {usuario}')

result = SmeIntegracaoService.informacao_usuario_sgp(usuario.username)
try:
result = SmeIntegracaoService.informacao_usuario_sgp(usuario.username)
except SmeIntegracaoException as err:
result = None
logger.info("SmeIntegracaoService.informacao_usuario_sgp: Não foi possível enviar e-mail: %s", err)

if result['email']:
try:
enviar_email_nova_notificacao_async(email=result['email'], username=usuario.username, nome=usuario.name,
titulo=titulo, descricao=descricao)
logger.info(f'Enviado email de notificação para o usuário: {usuario}')
except Exception as err:
logger.error("Erro ao enviar email: %s", str(err))
else:
logger.warning(f'O usuário {usuario} não tem e-mail cadastrado no CoreSSO. E-mail de notificação não enviado.')
if result:
if result['email']:
try:
enviar_email_nova_notificacao_async(email=result['email'], username=usuario.username, nome=usuario.name,
titulo=titulo, descricao=descricao)
logger.info(f'Enviado email de notificação para o usuário: {usuario}')
except Exception as err:
logger.error("Erro ao enviar email: %s", str(err))
else:
logger.warning(f'O usuário {usuario} não tem e-mail cadastrado no CoreSSO. E-mail de notificação não enviado.')
Original file line number Diff line number Diff line change
Expand Up @@ -388,4 +388,19 @@ def test_status_periodo_com_conta_encerrada_com_saldo(
assert 'tem_conta_encerrada_com_saldo' in result
assert result['tem_conta_encerrada_com_saldo'] == True

@freeze_time('2020-07-10 10:20:00')
def test_status_periodo_com_conta_encerrada_sem_saldo(
jwt_authenticated_client_a,
periodo_2020_1,
conta_associacao_encerramento_conta,
solicitacao_encerramento_conta_aprovada,
):
response = jwt_authenticated_client_a.get(f'/api/associacoes/{conta_associacao_encerramento_conta.associacao.uuid}/status-periodo/?data={periodo_2020_1.data_inicio_realizacao_despesas}',
content_type='application/json')
result = json.loads(response.content)

assert response.status_code == status.HTTP_200_OK
assert 'tem_conta_encerrada_com_saldo' in result
assert result['tem_conta_encerrada_com_saldo'] == False


25 changes: 25 additions & 0 deletions sme_ptrf_apps/core/tests/tests_notificacoes_services/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,31 @@ def usuario_notificavel(
return user


@pytest.fixture
def usuario_notificavel_nao_encontrado_sme_integracao(
unidade_a,
grupo_notificavel,
unidade_encerramento_conta,
visao_ue,
visao_dre
):
from django.contrib.auth import get_user_model

senha = 'Sgp0418'
login = '0000000'
email = '[email protected]'

User = get_user_model()
user = User.objects.create_user(username=login, password=senha, email=email)
user.unidades.add(unidade_a)
user.unidades.add(unidade_encerramento_conta)
user.groups.add(grupo_notificavel)
user.visoes.add(visao_ue)
user.visoes.add(visao_dre)
user.save()
return user


@pytest.fixture
def usuario_notificavel_que_nao_pertence_a_comissao_contas(
unidade_a,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
from unittest.mock import patch

from ....core.models import Notificacao
from ....core.services.notificacao_services.enviar_email_notificacao import enviar_email_nova_notificacao

pytestmark = pytest.mark.django_db

def test_notificar_deve_enviar_email(usuario_notificavel, monkeypatch):
monkeypatch.setenv('SERVER_NAME', 'sig-escola.sme.prefeitura.sp.gov.br')

path = 'sme_ptrf_apps.core.services.notificacao_services.enviar_email_notificacao.enviar_email_nova_notificacao'

with patch(path) as mock_enviar_email:
Expand All @@ -26,7 +26,6 @@ def test_notificar_deve_enviar_email(usuario_notificavel, monkeypatch):

def test_nao_notificar_deve_enviar_email_se_estiver_fora_de_ambiente_de_producao(usuario_notificavel, monkeypatch):
monkeypatch.setenv('SERVER_NAME', 'um_server_name_qualquer')

path = 'sme_ptrf_apps.core.services.notificacao_services.enviar_email_notificacao.enviar_email_nova_notificacao'

with patch(path) as mock_enviar_email:
Expand All @@ -40,4 +39,9 @@ def test_nao_notificar_deve_enviar_email_se_estiver_fora_de_ambiente_de_producao
renotificar=False,
enviar_email=True,
)
mock_enviar_email.assert_not_called()
mock_enviar_email.assert_not_called()

def test_enviar_email_nova_notificacao_usuario_nao_encontrado_sem_excecao(usuario_notificavel_nao_encontrado_sme_integracao):
enviar_email_nova_notificacao(usuario=usuario_notificavel_nao_encontrado_sme_integracao, titulo='Notificacao teste', descricao="Descricao teste")
with pytest.raises(Exception) as exc_info:
assert exc_info.value is None
89 changes: 48 additions & 41 deletions sme_ptrf_apps/dre/services/relatorio_consolidado_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
FechamentoPeriodo,
PrevisaoRepasseSme,
DevolucaoAoTesouro, TipoConta,
ContaAssociacao
)
from sme_ptrf_apps.dre.models import RelatorioConsolidadoDRE, ObsDevolucaoRelatorioConsolidadoDRE, \
JustificativaRelatorioConsolidadoDRE, ConsolidadoDRE
Expand Down Expand Up @@ -71,7 +72,6 @@ def status_de_geracao_do_relatorio(dre, periodo, tipo_conta):

def retorna_informacoes_execucao_financeira_todas_as_contas(dre, periodo, consolidado_dre=None):
from .consolidado_dre_service import verificar_se_status_parcial_ou_total_e_retornar_sequencia_de_publicacao

eh_retificacao = True if consolidado_dre and consolidado_dre.eh_retificacao else False

dre_uuid = dre.uuid
Expand Down Expand Up @@ -135,63 +135,70 @@ def retorna_informacoes_execucao_financeira_todas_as_contas(dre, periodo, consol
# TODO Tratativa dos Bugs: 91797, 93549 e 93018 da Sprint 65
# totais = informacoes_execucao_financeira(dre, periodo, tipo_conta, apenas_nao_publicadas=True, consolidado_dre=consolidado_dre)
# Foi adicionado and consolidado_dre.versao == "FINAL" para verificar se passa ou não o consolidado

if consolidado_dre and consolidado_dre.versao == "FINAL":
totais = informacoes_execucao_financeira(dre, periodo, tipo_conta, apenas_nao_publicadas=True,
consolidado_dre=consolidado_dre)
if periodo.data_fim_realizacao_despesas:
existem_contas_criadas_no_periodo_ou_anterior = ContaAssociacao.objects.filter(Q(data_inicio__isnull=True) | Q(data_inicio__lte=periodo.data_fim_realizacao_despesas),
tipo_conta=tipo_conta).exists()
else:
totais = informacoes_execucao_financeira(dre, periodo, tipo_conta, apenas_nao_publicadas=True)
existem_contas_criadas_no_periodo_ou_anterior = True

if consolidado_dre and consolidado_dre.eh_retificacao:
if consolidado_dre.laudas_do_consolidado_dre.all():
# foi gerado
if existem_contas_criadas_no_periodo_ou_anterior:

if consolidado_dre and consolidado_dre.versao == "FINAL":
totais = informacoes_execucao_financeira(dre, periodo, tipo_conta, apenas_nao_publicadas=True,
consolidado_dre=consolidado_dre)
else:
totais = informacoes_execucao_financeira(dre, periodo, tipo_conta, apenas_nao_publicadas=True)

if consolidado_dre and consolidado_dre.eh_retificacao:
if consolidado_dre.laudas_do_consolidado_dre.all():
# foi gerado

justificativa = JustificativaRelatorioConsolidadoDRE.objects.filter(
dre=dre,
tipo_conta=tipo_conta,
periodo=periodo,
consolidado_dre=consolidado_dre,
eh_retificacao=True
).last()

else:
justificativa = JustificativaRelatorioConsolidadoDRE.objects.filter(
dre=dre,
tipo_conta=tipo_conta,
periodo=periodo,
consolidado_dre__isnull=True,
eh_retificacao=True
).last()

elif consolidado_dre and consolidado_dre.versao == 'FINAL':
# Justificativa
justificativa = JustificativaRelatorioConsolidadoDRE.objects.filter(
dre=dre,
tipo_conta=tipo_conta,
periodo=periodo,
consolidado_dre=consolidado_dre,
eh_retificacao=True
eh_retificacao=False
).last()

else:
justificativa = JustificativaRelatorioConsolidadoDRE.objects.filter(
dre=dre,
tipo_conta=tipo_conta,
periodo=periodo,
consolidado_dre__isnull=True,
eh_retificacao=True
eh_retificacao=False
).last()

elif consolidado_dre and consolidado_dre.versao == 'FINAL':
# Justificativa
justificativa = JustificativaRelatorioConsolidadoDRE.objects.filter(
dre=dre,
tipo_conta=tipo_conta,
periodo=periodo,
consolidado_dre=consolidado_dre,
eh_retificacao=False
).last()
else:
justificativa = JustificativaRelatorioConsolidadoDRE.objects.filter(
dre=dre,
tipo_conta=tipo_conta,
periodo=periodo,
consolidado_dre__isnull=True,
eh_retificacao=False
).last()

objeto_tipo_de_conta.append({
'tipo_conta': tipo_conta.nome if tipo_conta.nome else '',
'valores': totais,
'justificativa_texto': justificativa.texto if justificativa else '',
'justificativa_uuid': justificativa.uuid if justificativa else None,
'consolidado_dre': consolidado_dre.uuid if justificativa and justificativa.consolidado_dre and justificativa.consolidado_dre.uuid else None,
'tipo_conta_uuid': tipo_conta.uuid,
'eh_retificacao': consolidado_dre.eh_retificacao if consolidado_dre else False
})

dados['por_tipo_de_conta'] = objeto_tipo_de_conta
objeto_tipo_de_conta.append({
'tipo_conta': tipo_conta.nome if tipo_conta.nome else '',
'valores': totais,
'justificativa_texto': justificativa.texto if justificativa else '',
'justificativa_uuid': justificativa.uuid if justificativa else None,
'consolidado_dre': consolidado_dre.uuid if justificativa and justificativa.consolidado_dre and justificativa.consolidado_dre.uuid else None,
'tipo_conta_uuid': tipo_conta.uuid,
'eh_retificacao': consolidado_dre.eh_retificacao if consolidado_dre else False
})

dados['por_tipo_de_conta'] = objeto_tipo_de_conta

return dados

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,39 @@ def test_api_get_info_execucao_financeira_relatorio(
assert result == resultado_esperado


def test_api_get_info_execucao_financeira_relatorio_tipos_com_contas_criadas_no_periodo_ou_anterior(
jwt_authenticated_client_relatorio_consolidado,
dre,
periodo,
tipo_conta_cheque,
tipo_conta_cartao,
tipo_conta_teste,
prestacao_conta,
fechamento_conta_cartao,
fechamento_conta_cheque,
fechamento_conta_cheque_anterior,
devolucao_ao_tesouro,
receita_rendimento,
conta_associacao_cheque,
conta_associacao_tipo_teste,
acao_associacao,
previsao_repasse_sme_conta_cartao,
previsao_repasse_sme_conta_cheque,
):
response = jwt_authenticated_client_relatorio_consolidado.get(
f'/api/relatorios-consolidados-dre/info-execucao-financeira/?dre={dre.uuid}&periodo={periodo.uuid}&tipo_conta={tipo_conta_cheque.uuid}',
content_type='application/json')
result = json.loads(response.content)

result_uuids = []
for item in result['por_tipo_de_conta']:
result_uuids.append(item['tipo_conta_uuid'])

resultado_esperado = [f'{tipo_conta_cheque.uuid}', f'{tipo_conta_cartao.uuid}']

assert response.status_code == status.HTTP_200_OK
assert result_uuids == resultado_esperado

def test_api_get_info_execucao_financeira_relatorio_sem_passa_dre(jwt_authenticated_client_relatorio_consolidado, dre,
periodo, tipo_conta):
response = jwt_authenticated_client_relatorio_consolidado.get(
Expand Down

0 comments on commit 615796e

Please sign in to comment.