mirror of https://github.com/interlegis/sapl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
546 lines
17 KiB
546 lines
17 KiB
{% extends "base.html" %}
|
|
{% load i18n common_tags %}
|
|
{% load tz %}
|
|
|
|
{% block title %}{% endblock title %}
|
|
|
|
{% block webpack_loader_chunks_css %}
|
|
{{ block.super }}
|
|
<style>
|
|
.prop-detail {
|
|
max-width: 1200px;
|
|
margin: 0 auto;
|
|
padding: 20px 0;
|
|
}
|
|
|
|
.prop-detail-header {
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
.prop-back {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
color: #666;
|
|
text-decoration: none;
|
|
font-size: 0.9rem;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.prop-back:hover {
|
|
color: #333;
|
|
}
|
|
|
|
.prop-title-row {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: flex-start;
|
|
gap: 16px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.prop-title {
|
|
font-size: 1.1rem;
|
|
font-weight: 500;
|
|
color: #333;
|
|
margin: 0;
|
|
}
|
|
|
|
.prop-title-tipo {
|
|
color: #666;
|
|
font-weight: 400;
|
|
}
|
|
|
|
.prop-status-badge {
|
|
padding: 6px 14px;
|
|
border-radius: 20px;
|
|
font-size: 0.8rem;
|
|
font-weight: 500;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.prop-status-badge.elaboracao { background: #f0f0f0; color: #666; }
|
|
.prop-status-badge.aguardando { background: #e3f2fd; color: #1976d2; }
|
|
.prop-status-badge.incorporada { background: #e8f5e9; color: #388e3c; }
|
|
.prop-status-badge.devolvida { background: #fff3e0; color: #f57c00; }
|
|
.prop-status-badge.cancelada { background: #f5f5f5; color: #999; }
|
|
.prop-status-badge.aguardando-setor { background: #f3e5f5; color: #7b1fa2; }
|
|
.prop-status-badge.revisada-setor { background: #e0f2f1; color: #00695c; }
|
|
|
|
.prop-alert {
|
|
padding: 14px 18px;
|
|
border-radius: 8px;
|
|
margin-bottom: 20px;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.prop-alert.warning {
|
|
background: #fff8e1;
|
|
border: 1px solid #ffe082;
|
|
color: #8d6e00;
|
|
}
|
|
|
|
.prop-alert.info {
|
|
background: #e3f2fd;
|
|
border: 1px solid #90caf9;
|
|
color: #1565c0;
|
|
}
|
|
|
|
.prop-alert.danger {
|
|
background: #ffebee;
|
|
border: 1px solid #ef9a9a;
|
|
color: #c62828;
|
|
}
|
|
|
|
.prop-alert strong {
|
|
display: block;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.prop-section {
|
|
background: #fff;
|
|
border: 1px solid #e5e5e5;
|
|
border-radius: 8px;
|
|
padding: 20px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.prop-section-title {
|
|
font-size: 0.75rem;
|
|
font-weight: 500;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
color: #999;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.prop-ementa {
|
|
font-size: 1rem;
|
|
line-height: 1.7;
|
|
color: #333;
|
|
}
|
|
|
|
.prop-meta {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
|
gap: 16px;
|
|
}
|
|
|
|
.prop-meta-item label {
|
|
display: block;
|
|
font-size: 0.75rem;
|
|
font-weight: 500;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
color: #999;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.prop-meta-item span {
|
|
font-size: 0.95rem;
|
|
color: #333;
|
|
}
|
|
|
|
.prop-meta-item a {
|
|
color: #1976d2;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.prop-meta-item a:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.prop-actions-bar {
|
|
display: flex;
|
|
gap: 12px;
|
|
flex-wrap: wrap;
|
|
padding: 16px 20px;
|
|
background: #fafafa;
|
|
border: 1px solid #e5e5e5;
|
|
border-radius: 8px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.prop-actions-bar .btn {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
.prop-document-section {
|
|
background: #f8f9fa;
|
|
border: 2px dashed #dee2e6;
|
|
border-radius: 8px;
|
|
padding: 30px;
|
|
text-align: center;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.prop-document-section.has-document {
|
|
background: #fff;
|
|
border: 1px solid #e5e5e5;
|
|
border-style: solid;
|
|
}
|
|
|
|
.prop-document-section i {
|
|
font-size: 2.5rem;
|
|
color: #adb5bd;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.prop-document-section.has-document i {
|
|
color: #28a745;
|
|
}
|
|
|
|
.prop-document-section h4 {
|
|
font-size: 1rem;
|
|
font-weight: 500;
|
|
color: #333;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.prop-document-section p {
|
|
font-size: 0.9rem;
|
|
color: #666;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.prop-document-actions {
|
|
display: flex;
|
|
gap: 10px;
|
|
justify-content: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.prop-vinculo {
|
|
background: #f8f9fa;
|
|
border-radius: 6px;
|
|
padding: 12px 16px;
|
|
}
|
|
|
|
.prop-vinculo a {
|
|
color: #1976d2;
|
|
text-decoration: none;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.prop-vinculo a:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.prop-no-access {
|
|
text-align: center;
|
|
padding: 60px 20px;
|
|
color: #999;
|
|
}
|
|
|
|
.prop-no-access i {
|
|
font-size: 3rem;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.prop-observacao {
|
|
font-size: 0.9rem;
|
|
color: #666;
|
|
font-style: italic;
|
|
}
|
|
|
|
@media (max-width: 640px) {
|
|
.prop-title-row {
|
|
flex-direction: column;
|
|
}
|
|
|
|
.prop-actions-bar {
|
|
flex-direction: column;
|
|
}
|
|
|
|
.prop-actions-bar .btn {
|
|
width: 100%;
|
|
justify-content: center;
|
|
}
|
|
}
|
|
</style>
|
|
{% endblock webpack_loader_chunks_css %}
|
|
|
|
{% block base_content %}
|
|
<div class="prop-detail">
|
|
{% if user in object.autor.operadores.all or user.is_superuser or perms.materia.detail_proposicao %}
|
|
<!-- Header -->
|
|
<div class="prop-detail-header">
|
|
<a href="{% url 'sapl.materia:proposicao_list' %}" class="prop-back">
|
|
<i class="fa fa-arrow-left"></i> {% trans "Voltar para lista" %}
|
|
</a>
|
|
|
|
<div class="prop-title-row">
|
|
<h1 class="prop-title">
|
|
<span class="prop-title-tipo">{{ object.tipo }} —</span>
|
|
{% if object.numero_proposicao %}#{{ object.numero_proposicao }}/{{ object.ano }}{% else %}{% trans "Rascunho" %}{% endif %}
|
|
</h1>
|
|
|
|
{% if object.cancelado %}
|
|
<span class="prop-status-badge cancelada">Cancelada</span>
|
|
{% elif object.data_devolucao %}
|
|
<span class="prop-status-badge devolvida">Devolvida</span>
|
|
{% elif object.data_recebimento %}
|
|
<span class="prop-status-badge incorporada">Incorporada</span>
|
|
{% elif object.data_envio %}
|
|
<span class="prop-status-badge aguardando">Aguardando Recebimento</span>
|
|
{% elif revisao_setor_legislativo and object.data_envio_setor and not object.data_retorno_setor %}
|
|
<span class="prop-status-badge aguardando-setor">Aguardando Revisão do Setor</span>
|
|
{% elif revisao_setor_legislativo and object.data_retorno_setor %}
|
|
<span class="prop-status-badge revisada-setor">Revisada pelo Setor</span>
|
|
{% else %}
|
|
<span class="prop-status-badge elaboracao">Em Elaboração</span>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Alertas -->
|
|
{% if object.data_devolucao %}
|
|
<div class="prop-alert danger">
|
|
<strong><i class="fa fa-exclamation-circle"></i> {% trans "Proposição Devolvida" %}</strong>
|
|
{{ object.justificativa_devolucao }}
|
|
</div>
|
|
{% elif object.data_envio and not object.data_recebimento %}
|
|
<div class="prop-alert info">
|
|
<i class="fa fa-clock-o"></i> {% trans "Proposição enviada e aguardando recebimento pela Mesa Diretora." %}
|
|
</div>
|
|
{% elif not object.data_envio and not object.texto_original and not object.texto_articulado.exists %}
|
|
<div class="prop-alert warning">
|
|
<strong><i class="fa fa-file-text-o"></i> {% trans "Documento não criado" %}</strong>
|
|
{% trans "Use o botão 'Editar Documento' abaixo para criar o texto da proposição." %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if revisao_setor_legislativo and object.data_retorno_setor and not object.data_envio %}
|
|
<div class="prop-alert info">
|
|
<strong><i class="fa fa-check-circle"></i> {% trans "Proposição revisada pelo Setor Legislativo" %}</strong>
|
|
{% if object.observacao_setor %}
|
|
{{ object.observacao_setor }}
|
|
{% else %}
|
|
{% trans "O setor legislativo revisou esta proposição. Você pode agora enviar ao protocolo ou reenviar ao setor." %}
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if revisao_setor_legislativo and object.data_envio_setor and not object.data_retorno_setor and not object.data_envio %}
|
|
<div class="prop-alert info">
|
|
<i class="fa fa-clock-o"></i> {% trans "Proposição enviada ao Setor Legislativo e aguardando revisão." %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Ações principais -->
|
|
<div class="prop-actions-bar">
|
|
{% if not object.data_envio %}
|
|
{% if object.data_envio_setor and not object.data_retorno_setor %}
|
|
{# Proposição está com o setor - autor pode retirar #}
|
|
{% if user in object.autor.operadores.all or user.is_superuser %}
|
|
<a href="{{ view.detail_url }}?action=return_from_setor" class="btn btn-outline-warning">
|
|
<i class="fa fa-undo"></i> {% trans "Retirar do Setor" %}
|
|
</a>
|
|
{% endif %}
|
|
{# Setor Legislativo pode revisar #}
|
|
{% if is_setor_legislativo %}
|
|
<a href="{% url 'sapl.materia:revisao-proposicao-setor' object.pk %}" class="btn btn-primary">
|
|
<i class="fa fa-pencil-square-o"></i> {% trans "Revisar Proposição" %}
|
|
</a>
|
|
{% endif %}
|
|
{% else %}
|
|
{# Proposição em elaboração ou revisada pelo setor #}
|
|
{% if user in object.autor.operadores.all or user.is_superuser %}
|
|
<a href="{% url 'sapl.materia:onlyoffice_editor' object.pk %}" class="btn btn-primary">
|
|
<i class="fa fa-edit"></i> {% trans "Editar Documento" %}
|
|
</a>
|
|
{% if object.texto_original or object.texto_articulado.exists %}
|
|
<a href="{{ view.detail_url }}?action=send" class="btn btn-success">
|
|
<i class="fa fa-paper-plane"></i> {% trans "Enviar Proposição" %}
|
|
</a>
|
|
{% if revisao_setor_legislativo %}
|
|
<a href="{{ view.detail_url }}?action=send_setor" class="btn btn-info">
|
|
<i class="fa fa-building"></i> {% trans "Enviar ao Setor Legislativo" %}
|
|
</a>
|
|
{% endif %}
|
|
{% endif %}
|
|
<a href="{{ view.update_url }}" class="btn btn-outline-secondary">
|
|
<i class="fa fa-pencil"></i> {% trans "Editar Dados" %}
|
|
</a>
|
|
<a href="{{ view.delete_url }}" class="btn btn-outline-danger">
|
|
<i class="fa fa-trash"></i> {% trans "Excluir" %}
|
|
</a>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% else %}
|
|
<a href="#" onclick="window.open('{% url 'sapl.materia:recibo-proposicao' object.pk %}','Recibo','width=1100, height=600, scrollbars=yes'); return false;" class="btn btn-outline-primary">
|
|
<i class="fa fa-file-text-o"></i> {% trans "Ver Recibo" %}
|
|
</a>
|
|
{% if not object.data_recebimento %}
|
|
<a href="{% url 'sapl.materia:retornar-proposicao' object.pk %}" class="btn btn-outline-warning">
|
|
<i class="fa fa-undo"></i> {% trans "Retornar Proposição" %}
|
|
</a>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% if object.texto_original %}
|
|
<a href="{% url 'sapl.materia:proposicao_texto' object.pk %}" class="btn btn-outline-secondary" target="_blank">
|
|
<i class="fa fa-download"></i> {% trans "Baixar Documento" %}
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<!-- Ementa -->
|
|
<div class="prop-section">
|
|
<div class="prop-section-title">{% trans "Ementa" %}</div>
|
|
<div class="prop-ementa">{{ object.descricao }}</div>
|
|
</div>
|
|
|
|
<!-- Informações -->
|
|
<div class="prop-section">
|
|
<div class="prop-section-title">{% trans "Informações" %}</div>
|
|
<div class="prop-meta">
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Tipo" %}</label>
|
|
<span>{{ object.tipo }}</span>
|
|
</div>
|
|
{% if object.numero_proposicao %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Número" %}</label>
|
|
<span>{{ object.numero_proposicao }}/{{ object.ano }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% if object.data_envio %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Data de Envio" %}</label>
|
|
<span>{{ object.data_envio|date:"d/m/Y H:i" }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% if object.data_recebimento %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Data de Recebimento" %}</label>
|
|
<span>{{ object.data_recebimento|date:"d/m/Y H:i" }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% if object.data_devolucao %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Data de Devolução" %}</label>
|
|
<span>{{ object.data_devolucao|date:"d/m/Y H:i" }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% if revisao_setor_legislativo and object.data_envio_setor %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Envio ao Setor" %}</label>
|
|
<span>{{ object.data_envio_setor|date:"d/m/Y H:i" }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% if revisao_setor_legislativo and object.data_retorno_setor %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Retorno do Setor" %}</label>
|
|
<span>{{ object.data_retorno_setor|date:"d/m/Y H:i" }}</span>
|
|
</div>
|
|
{% endif %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Documento" %}</label>
|
|
<span>
|
|
{% if object.texto_original %}
|
|
<i class="fa fa-check-circle" style="color: #28a745;"></i> {% trans "Criado" %}
|
|
{% elif object.texto_articulado.exists %}
|
|
<i class="fa fa-check-circle" style="color: #28a745;"></i> {% trans "Texto Eletrônico" %}
|
|
{% else %}
|
|
<i class="fa fa-times-circle" style="color: #dc3545;"></i> {% trans "Não criado" %}
|
|
{% endif %}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Observação -->
|
|
{% if object.observacao %}
|
|
<div class="prop-section">
|
|
<div class="prop-section-title">{% trans "Observação" %}</div>
|
|
<div class="prop-observacao">{{ object.observacao }}</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Co-autores -->
|
|
{% if object.coautores.exists %}
|
|
<div class="prop-section">
|
|
<div class="prop-section-title">{% trans "Co-autores" %}</div>
|
|
<div class="prop-meta">
|
|
{% for coautoria in object.coautores.all %}
|
|
<div class="prop-meta-item" style="flex: 0 0 auto; min-width: 200px;">
|
|
<label>{{ coautoria.autor.tipo }}</label>
|
|
<span><i class="fa fa-user"></i> {{ coautoria.autor.nome }}</span>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Conteúdo Gerado / Vínculo -->
|
|
{% if object.conteudo_gerado_related or object.materia_de_vinculo %}
|
|
<div class="prop-section">
|
|
<div class="prop-section-title">{% trans "Vínculos" %}</div>
|
|
{% if object.conteudo_gerado_related %}
|
|
<div class="prop-vinculo" style="margin-bottom: 10px;">
|
|
<label style="font-size: 0.8rem; color: #666;">{% trans "Matéria Gerada:" %}</label>
|
|
<a href="{% url object|urldetail_content_type:object.conteudo_gerado_related object.conteudo_gerado_related.id %}">
|
|
{{ object.conteudo_gerado_related }}
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
{% if object.materia_de_vinculo %}
|
|
<div class="prop-vinculo">
|
|
<label style="font-size: 0.8rem; color: #666;">{% trans "Matéria Anexadora:" %}</label>
|
|
<a href="{% url object.materia_de_vinculo|urldetail object.materia_de_vinculo.id %}">
|
|
{{ object.materia_de_vinculo }}
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
<!-- Info para superusuário -->
|
|
{% if user.is_superuser %}
|
|
<div class="prop-section" style="background: #f8f9fa;">
|
|
<div class="prop-section-title">{% trans "Informações do Sistema" %}</div>
|
|
<div class="prop-meta">
|
|
{% if proposicao.user %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Usuário" %}</label>
|
|
<span><a href="{% url 'sapl.base:user_update' proposicao.user.pk %}">{{ proposicao.user }}</a></span>
|
|
</div>
|
|
{% endif %}
|
|
{% if proposicao.ip %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "IP" %}</label>
|
|
<span>{{ proposicao.ip }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% if proposicao.ultima_edicao %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Última Edição" %}</label>
|
|
<span>{{ proposicao.ultima_edicao }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% if object.hash_code %}
|
|
<div class="prop-meta-item">
|
|
<label>{% trans "Hash" %}</label>
|
|
<span style="font-size: 0.75rem; word-break: break-all;">{{ object.hash_code }}</span>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% else %}
|
|
<!-- Sem acesso -->
|
|
<div class="prop-no-access">
|
|
<i class="fa fa-lock"></i>
|
|
<h3>{% trans "Acesso Negado" %}</h3>
|
|
<p>{% trans "Você não tem permissão para visualizar esta proposição." %}</p>
|
|
<a href="{% url 'sapl.materia:proposicao_list' %}" class="btn btn-outline-primary">
|
|
{% trans "Voltar para lista" %}
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endblock base_content %}
|
|
|