From 126c913b2d14e9a8874f6fc05cf9b88513d7e3cd Mon Sep 17 00:00:00 2001 From: kemuel Date: Fri, 14 Aug 2026 14:52:58 -0300 Subject: [PATCH] Fix(Reconciliacao): inventario devolve a materia de cada tramitacao AB#1480 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O hub nao guarda referencia por tramitacao — ele guarda a referencia da MATERIA. Devolvendo so o id, o hub comparava id de tramitacao com id de materia e contava o acervo inteiro como lacuna: em 14/08 foram 500 "ausentes" que eram historico que a v1 decidiu nao integrar. A materia e o que diz se aquela tramitacao pertence a algo que o hub deveria ter integrado. Sem ela a conferencia nao tem como distinguir lacuna de fora-de-escopo. Co-Authored-By: Claude Opus 5 --- sapl/integracao_hub/tests/test_reconciliacao.py | 16 +++++++++++++++- sapl/integracao_hub/views.py | 12 +++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/sapl/integracao_hub/tests/test_reconciliacao.py b/sapl/integracao_hub/tests/test_reconciliacao.py index 75b1ff84b..d0e1a945c 100644 --- a/sapl/integracao_hub/tests/test_reconciliacao.py +++ b/sapl/integracao_hub/tests/test_reconciliacao.py @@ -73,7 +73,21 @@ def test_inventario_cursores_independentes_para_tramitacao(cliente_hub): INVENTARIO, {'id_gt': proposicao.pk - 1, 'tramitacao_id_gt': tramitacao.pk}) assert proposicao.pk in resposta.data['proposicoes'] - assert tramitacao.pk not in resposta.data['tramitacoes'] + assert tramitacao.pk not in [t['id'] for t in resposta.data['tramitacoes']] + + +@pytest.mark.django_db(transaction=False) +def test_inventario_traz_a_materia_de_cada_tramitacao(cliente_hub): + # Sem a materia o hub compara id de tramitacao com id de materia e conta o + # acervo inteiro como lacuna (incidente de 14/08). A materia e o que diz se + # aquela tramitacao pertence a algo que o hub deveria ter integrado. + tramitacao = baker.make(Tramitacao) + + resposta = cliente_hub.get(INVENTARIO, {'id_gt': 0, 'tramitacao_id_gt': 0}) + + entrada = next(t for t in resposta.data['tramitacoes'] + if t['id'] == tramitacao.pk) + assert entrada['materia'] == tramitacao.materia_id @pytest.mark.django_db(transaction=False) diff --git a/sapl/integracao_hub/views.py b/sapl/integracao_hub/views.py index 0aed2df09..91f076cfb 100644 --- a/sapl/integracao_hub/views.py +++ b/sapl/integracao_hub/views.py @@ -277,9 +277,15 @@ class InventarioView(PollView): proposicoes = list( Proposicao.objects.filter(id__gt=id_gt, cancelado=False) .order_by('id').values_list('id', flat=True)[:limite]) - tramitacoes = list( - Tramitacao.objects.filter(id__gt=tramitacao_id_gt) - .order_by('id').values_list('id', flat=True)[:limite]) + # Tramitacao vem com a materia junto porque a conferencia do hub NAO e por + # id de tramitacao: o hub so integra tramitacao de materia que ele conhece + # (proposicao que virou materia depois do marco). Devolver so o id fazia o + # hub contar como lacuna toda tramitacao do acervo — falso positivo eterno, + # visto em 14/08: 500 "ausentes" que na verdade eram historico. + tramitacoes = [ + {'id': t['id'], 'materia': t['materia_id']} + for t in Tramitacao.objects.filter(id__gt=tramitacao_id_gt) + .order_by('id').values('id', 'materia_id')[:limite]] return Response({ 'proposicoes': proposicoes,