Repository: interlegis/sapl

Issue:
Tramitar os Documentos Administrativos anexados ao Doc Adm principal
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
<!--- Se você está descrevendo um _bug_, conte-nos o que deveria acontecer. -->
<!--- Se você está sugerindo uma mudança/melhoria, conte-nos como deve funcionar. -->
Ao realizar uma tramitação de DocAdm, seus documentos administrativos anexados também devem ser tramitados, se possível. Isso é o que ocorre nas tramitações de Materia Legislativa e também deve ocorrer em Doc Adm.

## Comportamento Atual
<!--- Se está descrevendo um bug, conte-nos o que acontece em vez do comportamento esperado. -->
<!--- Se está sugerindo uma mudança/melhoria, explique a diferença com o comportamento atual. -->
Apenas o Documento principal é tramitado.

## Contexto
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->
Inconsistência.


Discussion:

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -553,21 +553,29 @@ def clean(self):
     def save(self, commit=True):
         tramitacao = super(TramitacaoForm, self).save(commit)
         materia = tramitacao.materia
-        
         materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True
         materia.save()
-
-        anexadas = lista_anexadas(materia)
-        for anexada in anexadas:
-            if not anexada.tramitacao_set.all() \
-                    or anexada.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local:
-                tramitacao_nova = tramitacao
-                tramitacao_nova.pk = None
-                tramitacao_nova.materia = anexada
-                tramitacao_nova.save()
-
-                anexada.em_tramitacao = False if tramitacao.status.indicador == "F" else True
-                anexada.save()        
+        lista_tramitacao = []
+        for ma in materia.anexadas.all():
+            if not ma.tramitacao_set.all() \
+                    or ma.tramitacao_set.last().unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local:
+                ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True
+                ma.save()
+                lista_tramitacao.append(Tramitacao(
+                                            status=tramitacao.status,
+                                            materia=ma,
+                                            data_tramitacao=tramitacao.data_tramitacao,
+                                            unidade_tramitacao_local=tramitacao.unidade_tramitacao_local,
+                                            data_encaminhamento=tramitacao.data_encaminhamento,
+                                            unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino,
+                                            urgente=tramitacao.urgente,
+                                            turno=tramitacao.turno,
+                                            texto=tramitacao.texto,
+                                            data_fim_prazo=tramitacao.data_fim_prazo,
+                                            user=tramitacao.user,
+                                            ip=tramitacao.ip
+                                        ))
+        Tramitacao.objects.bulk_create(lista_tramitacao)
 
         return tramitacao
 
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -7,7 +7,7 @@
 from django import forms
 from django.core.exceptions import (MultipleObjectsReturned,
                                     ObjectDoesNotExist, ValidationError)
-from django.db import models
+from django.db import models, transaction
 from django.db.models import Max
 from django.forms import ModelForm
 from django.utils import timezone
@@ -745,6 +745,32 @@ def clean(self):
 
         return self.cleaned_data
 
+    @transaction.atomic
+    def save(self, commit=True):
+        tramitacao = super(TramitacaoAdmForm, self).save(commit)
+        documento = tramitacao.documento
+        lista_tramitacao = []
+        for da in documento.anexados.all():
+            if not da.tramitacaoadministrativo_set.all() \
+                or da.tramitacaoadministrativo_set.last() \
+                .unidade_tramitacao_destino == tramitacao.unidade_tramitacao_local:
+                lista_tramitacao.append(TramitacaoAdministrativo(
+                                        status=tramitacao.status,
+                                        documento=da,
+                                        data_tramitacao=tramitacao.data_tramitacao,
+                                        unidade_tramitacao_local=tramitacao.unidade_tramitacao_local,
+                                        data_encaminhamento=tramitacao.data_encaminhamento,
+                                        unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino,
+                                        urgente=tramitacao.urgente,
+                                        texto=tramitacao.texto,
+                                        data_fim_prazo=tramitacao.data_fim_prazo,
+                                        user=tramitacao.user,
+                                        ip=tramitacao.ip
+                                        ))
+        TramitacaoAdministrativo.objects.bulk_create(lista_tramitacao)     
+
+        return tramitacao
+
 
 class TramitacaoAdmEditForm(TramitacaoAdmForm):
 
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -1103,6 +1103,10 @@ class CreateView(MasterDetailCrud.CreateView):
         form_class = TramitacaoAdmForm
         logger = logging.getLogger(__name__)
 
+        def get_success_url(self):
+            return reverse('sapl.protocoloadm:tramitacaoadministrativo_list', kwargs={
+                'pk': self.kwargs['pk']})
+
         def get_initial(self):
             initial = super(CreateView, self).get_initial()
             local = DocumentoAdministrativo.objects.get(


Test patch: