@ -1,10 +1,11 @@
from datetime import date , timedelta , datetime
from datetime import date , timedelta
from django . core . urlresolvers import reverse
from django . core . urlresolvers import reverse
from django . utils import timezone
from django . utils import timezone
from django . utils . encoding import force_text
from django . utils . encoding import force_text
from django . utils . translation import ugettext_lazy as _
from django . utils . translation import ugettext_lazy as _
from model_mommy import mommy
from model_mommy import mommy
from urllib . parse import urlencode
import pytest
import pytest
from sapl . base . models import AppConfig
from sapl . base . models import AppConfig
@ -15,7 +16,8 @@ from sapl.protocoloadm.forms import (AnularProtocoloAdmForm,
MateriaLegislativa , ProtocoloDocumentForm ,
MateriaLegislativa , ProtocoloDocumentForm ,
ProtocoloMateriaForm , TramitacaoAdmForm ,
ProtocoloMateriaForm , TramitacaoAdmForm ,
TramitacaoAdmEditForm ,
TramitacaoAdmEditForm ,
compara_tramitacoes_doc )
compara_tramitacoes_doc ,
TramitacaoEmLoteAdmForm )
from sapl . protocoloadm . models import ( DocumentoAdministrativo , Protocolo ,
from sapl . protocoloadm . models import ( DocumentoAdministrativo , Protocolo ,
StatusTramitacaoAdministrativo ,
StatusTramitacaoAdministrativo ,
TipoDocumentoAdministrativo ,
TipoDocumentoAdministrativo ,
@ -703,3 +705,338 @@ def test_tramitacoes_documentos_anexados(admin_client):
response = admin_client . post ( url , { ' confirmar ' : ' confirmar ' } , follow = True )
response = admin_client . post ( url , { ' confirmar ' : ' confirmar ' } , follow = True )
assert TramitacaoAdministrativo . objects . filter ( id = tramitacao_anexada . pk ) . count ( ) == 0
assert TramitacaoAdministrativo . objects . filter ( id = tramitacao_anexada . pk ) . count ( ) == 0
assert TramitacaoAdministrativo . objects . filter ( id = tramitacao_anexada_anexada . pk ) . count ( ) == 0
assert TramitacaoAdministrativo . objects . filter ( id = tramitacao_anexada_anexada . pk ) . count ( ) == 0
@pytest . mark . django_db ( transaction = False )
def test_tramitacao_lote_documentos_form ( admin_client ) :
tipo_documento = mommy . make (
TipoDocumentoAdministrativo ,
descricao = " Tipo_Teste "
)
documento = mommy . make (
DocumentoAdministrativo ,
numero = 20 ,
ano = 2018 ,
data = " 2019-05-16 " ,
tipo = tipo_documento
)
unidade_tramitacao_local_1 = make_unidade_tramitacao ( descricao = " Teste 1 " )
unidade_tramitacao_destino_1 = make_unidade_tramitacao ( descricao = " Teste 2 " )
status = mommy . make (
StatusTramitacaoAdministrativo ,
indicador = ' R ' )
# Form sem campos obrigatórios
documentos = [ ]
form = TramitacaoEmLoteAdmForm ( initial = { ' documentos ' : documentos } , data = { } )
errors = form . errors
assert errors [ ' data_tramitacao ' ] == [ ' Este campo é obrigatório. ' ]
assert errors [ ' unidade_tramitacao_local ' ] == [ ' Este campo é obrigatório. ' ]
assert errors [ ' status ' ] == [ ' Este campo é obrigatório. ' ]
assert errors [ ' unidade_tramitacao_destino ' ] == [ ' Este campo é obrigatório. ' ]
assert errors [ ' texto ' ] == [ ' Este campo é obrigatório. ' ]
assert not form . is_valid ( )
# Tramitar apenas um documento sem anexados
documentos = [ documento . id ]
now = timezone . now ( ) . date ( )
form = TramitacaoEmLoteAdmForm ( initial = { ' documentos ' : documentos } , data = { } )
form . data = { ' data_tramitacao ' : now + timedelta ( days = 5 ) ,
' unidade_tramitacao_local ' : unidade_tramitacao_local_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_1 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' }
assert form . errors [ ' __all__ ' ] == \
[ " A data de tramitação deve ser menor ou igual a data de hoje! " ]
assert not form . is_valid ( )
form = TramitacaoEmLoteAdmForm ( initial = { ' documentos ' : documentos } , data = { } )
form . data = { ' data_tramitacao ' : ' 2019-05-14 ' ,
' data_encaminhamento ' : ' 2019-05-09 ' ,
' unidade_tramitacao_local ' : unidade_tramitacao_local_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_1 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' }
assert form . errors [ ' __all__ ' ] == \
[ " A data de encaminhamento deve ser maior que a data de tramitação! " ]
assert not form . is_valid ( )
form = TramitacaoEmLoteAdmForm ( initial = { ' documentos ' : documentos } , data = { } )
form . data = { ' data_tramitacao ' : ' 2019-05-14 ' ,
' data_encaminhamento ' : ' 2019-05-15 ' ,
' data_fim_prazo ' : ' 2019-05-09 ' ,
' unidade_tramitacao_local ' : unidade_tramitacao_local_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_1 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' }
assert form . errors [ ' __all__ ' ] == \
[ " A data fim de prazo deve ser maior que a data de tramitação! " ]
assert not form . is_valid ( )
form = TramitacaoEmLoteAdmForm ( initial = { ' documentos ' : documentos } , data = { } )
form . data = { ' data_tramitacao ' : ' 2019-05-14 ' ,
' data_encaminhamento ' : ' 2019-05-15 ' ,
' data_fim_prazo ' : ' 2019-05-18 ' ,
' unidade_tramitacao_local ' : unidade_tramitacao_local_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_local_1 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' }
assert form . errors [ ' __all__ ' ] == \
[ " Unidade tramitação local deve ser diferente da unidade tramitação destino. " ]
assert not form . is_valid ( )
form = TramitacaoEmLoteAdmForm ( initial = { ' documentos ' : documentos } , data = { } )
form . data = { ' data_tramitacao ' : ' 2019-05-14 ' ,
' data_encaminhamento ' : ' 2019-05-15 ' ,
' data_fim_prazo ' : ' 2019-05-18 ' ,
' unidade_tramitacao_local ' : unidade_tramitacao_local_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_1 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' }
assert form . is_valid ( )
@pytest . mark . django_db ( transaction = False )
def test_tramitacao_lote_documentos_views ( admin_client ) :
tipo_documento = mommy . make (
TipoDocumentoAdministrativo ,
descricao = " Tipo_Teste "
)
documento_principal = mommy . make (
DocumentoAdministrativo ,
numero = 20 ,
ano = 2018 ,
data = " 2018-01-04 " ,
tipo = tipo_documento
)
documento_anexado = mommy . make (
DocumentoAdministrativo ,
numero = 21 ,
ano = 2019 ,
data = " 2019-05-04 " ,
tipo = tipo_documento
)
documento_anexado_anexado = mommy . make (
DocumentoAdministrativo ,
numero = 22 ,
ano = 2020 ,
data = " 2020-01-05 " ,
tipo = tipo_documento
)
documento_sem_anexados = mommy . make (
DocumentoAdministrativo ,
numero = 23 ,
ano = 2020 ,
data = " 2021-01-05 " ,
tipo = tipo_documento
)
mommy . make (
Anexado ,
documento_principal = documento_principal ,
documento_anexado = documento_anexado ,
data_anexacao = " 2019-05-11 "
)
mommy . make (
Anexado ,
documento_principal = documento_anexado ,
documento_anexado = documento_anexado_anexado ,
data_anexacao = " 2020-11-05 "
)
unidade_tramitacao_local_1 = make_unidade_tramitacao ( descricao = " Teste 1 " )
unidade_tramitacao_destino_1 = make_unidade_tramitacao ( descricao = " Teste 2 " )
unidade_tramitacao_destino_2 = make_unidade_tramitacao ( descricao = " Teste 3 " )
unidade_tramitacao_destino_3 = make_unidade_tramitacao ( descricao = " Teste 4 " )
status = mommy . make (
StatusTramitacaoAdministrativo ,
indicador = ' R ' )
url = reverse ( ' sapl.protocoloadm:primeira_tramitacao_em_lote_docadm ' )
url = url + ' ? ' + urlencode ( { ' tipo ' : tipo_documento . id , ' data_0 ' : ' ' , ' data_1 ' : ' ' } )
response = admin_client . post ( url , { ' salvar ' : ' salvar ' } , follow = True )
assert response . status_code == 200
msgs = [ m . message for m in response . context [ ' messages ' ] ]
assert len ( msgs ) == 1
assert msgs [ 0 ] == ' Escolha algum Documento para ser tramitado. '
documentos = [ documento_sem_anexados . id , documento_anexado_anexado . id ]
response = admin_client . post ( url , { ' documentos ' : documentos , ' salvar ' : ' salvar ' } , follow = True )
msgs = [ m . message for m in response . context [ ' messages ' ] ]
assert ' Data Tramitação: Este campo é obrigatório. ' in msgs
assert ' Unidade Local: Este campo é obrigatório. ' in msgs
assert ' Status: Este campo é obrigatório. ' in msgs
assert ' Unidade Destino: Este campo é obrigatório. ' in msgs
assert ' Texto da Ação: Este campo é obrigatório. ' in msgs
# Primeira tramitação em lote
response = admin_client . post ( url ,
{ ' documentos ' : documentos ,
' data_tramitacao ' : date ( 2019 , 5 , 15 ) ,
' unidade_tramitacao_local ' : unidade_tramitacao_local_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_1 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' ,
' salvar ' : ' salvar ' } ,
follow = True )
assert response . status_code == 200
assert TramitacaoAdministrativo . objects . all ( ) . count ( ) == 2
assert documento_sem_anexados . tramitacaoadministrativo_set . all ( ) . count ( ) == 1
assert documento_anexado_anexado . tramitacaoadministrativo_set . all ( ) . count ( ) == 1
# Segunda tramitação em lote
url_lote = reverse ( ' sapl.protocoloadm:tramitacao_em_lote_docadm ' )
url_lote = url_lote + ' ? ' + urlencode (
{ ' tipo ' : tipo_documento . id ,
' tramitacaoadministrativo__unidade_tramitacao_destino ' : unidade_tramitacao_destino_1 . id ,
' tramitacaoadministrativo__status ' : status . id ,
' data_0 ' : ' ' ,
' data_1 ' : ' ' } )
response = admin_client . post ( url_lote , { ' salvar ' : ' salvar ' } , follow = True )
assert response . status_code == 200
assert response . context_data [ ' object_list ' ] . count ( ) == 2
msgs = [ m . message for m in response . context [ ' messages ' ] ]
assert len ( msgs ) == 1
assert msgs [ 0 ] == ' Escolha algum Documento para ser tramitado. '
response = admin_client . post ( url_lote , { ' documentos ' : documentos , ' salvar ' : ' salvar ' } , follow = True )
assert response . status_code == 200
msgs = [ m . message for m in response . context [ ' messages ' ] ]
assert ' Data Tramitação: Este campo é obrigatório. ' in msgs
assert ' Unidade Local: Este campo é obrigatório. ' in msgs
assert ' Status: Este campo é obrigatório. ' in msgs
assert ' Unidade Destino: Este campo é obrigatório. ' in msgs
assert ' Texto da Ação: Este campo é obrigatório. ' in msgs
response = admin_client . post ( url_lote ,
{ ' documentos ' : documentos ,
' data_tramitacao ' : date ( 2019 , 5 , 15 ) ,
' unidade_tramitacao_local ' : unidade_tramitacao_destino_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_1 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' ,
' salvar ' : ' salvar ' } ,
follow = True )
assert response . status_code == 200
msgs = [ m . message for m in response . context [ ' messages ' ] ]
assert ' Unidade tramitação local deve ser diferente da unidade tramitação destino. ' in msgs
response = admin_client . post ( url_lote ,
{ ' documentos ' : documentos ,
' data_tramitacao ' : date ( 2019 , 5 , 15 ) ,
' unidade_tramitacao_local ' : unidade_tramitacao_destino_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_2 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' ,
' salvar ' : ' salvar ' } ,
follow = True )
assert response . status_code == 200
msgs = [ m . message for m in response . context [ ' messages ' ] ]
assert ' Tramitação completa. ' in msgs
assert TramitacaoAdministrativo . objects . all ( ) . count ( ) == 4
assert documento_sem_anexados . tramitacaoadministrativo_set . all ( ) . count ( ) == 2
assert documento_anexado_anexado . tramitacaoadministrativo_set . all ( ) . count ( ) == 2
# Tramitar documentos com anexados
# O documento anexado ao anexado não deve tramitar junto porque já está com tramitação diferente
documentos = [ documento_principal . id ]
response = admin_client . post ( url ,
{ ' documentos ' : documentos ,
' data_tramitacao ' : date ( 2019 , 5 , 15 ) ,
' unidade_tramitacao_local ' : unidade_tramitacao_local_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_1 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' ,
' salvar ' : ' salvar ' } ,
follow = True )
assert response . status_code == 200
assert TramitacaoAdministrativo . objects . all ( ) . count ( ) == 6
assert documento_principal . tramitacaoadministrativo_set . all ( ) . count ( ) == 1
assert documento_anexado . tramitacaoadministrativo_set . all ( ) . count ( ) == 1
# Segunda tramitação com documentos anexados
response = admin_client . post ( url_lote ,
{ ' documentos ' : documentos ,
' data_tramitacao ' : date ( 2019 , 5 , 15 ) ,
' unidade_tramitacao_local ' : unidade_tramitacao_destino_1 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_2 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' ,
' salvar ' : ' salvar ' } ,
follow = True )
assert response . status_code == 200
msgs = [ m . message for m in response . context [ ' messages ' ] ]
assert ' Tramitação completa. ' in msgs
assert TramitacaoAdministrativo . objects . all ( ) . count ( ) == 8
assert documento_principal . tramitacaoadministrativo_set . all ( ) . count ( ) == 2
assert documento_anexado . tramitacaoadministrativo_set . all ( ) . count ( ) == 2
# Terceira tramitação em lote
# Agora, o documento anexado ao anexado deve tramitar junto com o documento principal,
# pois suas tramitações convergiram
response = admin_client . post ( url_lote ,
{ ' documentos ' : documentos ,
' data_tramitacao ' : date ( 2019 , 5 , 15 ) ,
' unidade_tramitacao_local ' : unidade_tramitacao_destino_2 . id ,
' unidade_tramitacao_destino ' : unidade_tramitacao_destino_3 . id ,
' status ' : status . id ,
' urgente ' : False ,
' texto ' : ' aaaa ' ,
' salvar ' : ' salvar ' } ,
follow = True )
assert response . status_code == 200
msgs = [ m . message for m in response . context [ ' messages ' ] ]
assert ' Tramitação completa. ' in msgs
assert TramitacaoAdministrativo . objects . all ( ) . count ( ) == 11
assert documento_principal . tramitacaoadministrativo_set . all ( ) . count ( ) == 3
assert documento_anexado . tramitacaoadministrativo_set . all ( ) . count ( ) == 3
assert documento_anexado_anexado . tramitacaoadministrativo_set . all ( ) . count ( ) == 3