Sistema de Apoio ao Processo Legislativo
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.
 
 
 
 
 

191 lines
6.8 KiB

"""
This file is part of SAPL.
Copyright (C) 2016 Interlegis
"""
from uuid import uuid4
from django.db import models
from django.utils.translation import ugettext_lazy as _
from model_utils import Choices
from materia.models import Autor, TipoMateriaLegislativa, UnidadeTramitacao
from sapl.utils import YES_NO_CHOICES
class TipoDocumentoAdministrativo(models.Model):
sigla = models.CharField(max_length=5, verbose_name=_('Sigla'))
descricao = models.CharField(max_length=50, verbose_name=_('Descrição'))
class Meta:
verbose_name = _('Tipo de Documento Administrativo')
verbose_name_plural = _('Tipos de Documento Administrativo')
def __str__(self):
return self.descricao
def texto_upload_path(instance, filename):
return '/'.join([instance._meta.model_name, str(uuid4()), filename])
class DocumentoAdministrativo(models.Model):
tipo = models.ForeignKey(
TipoDocumentoAdministrativo, verbose_name=_('Tipo Documento'))
numero = models.PositiveIntegerField(verbose_name=_('Número'))
ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'))
data = models.DateField(verbose_name=_('Data'))
numero_protocolo = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Núm. Protocolo'))
interessado = models.CharField(
max_length=50, blank=True, verbose_name=_('Interessado'))
autor = models.ForeignKey(Autor, blank=True, null=True)
dias_prazo = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Dias Prazo'))
data_fim_prazo = models.DateField(
blank=True, null=True, verbose_name=_('Data Fim Prazo'))
tramitacao = models.BooleanField(
verbose_name=_('Em Tramitação?'),
choices=YES_NO_CHOICES)
assunto = models.TextField(verbose_name=_('Assunto'))
observacao = models.TextField(
blank=True, verbose_name=_('Observação'))
texto_integral = models.FileField(
blank=True,
null=True,
upload_to=texto_upload_path,
verbose_name=_('Texto Integral'))
class Meta:
verbose_name = _('Documento Administrativo')
verbose_name_plural = _('Documentos Administrativos')
def __str__(self):
return _('%(tipo)s - %(assunto)s') % {
'tipo': self.tipo, 'assunto': self.assunto
}
class DocumentoAcessorioAdministrativo(models.Model):
documento = models.ForeignKey(DocumentoAdministrativo)
tipo = models.ForeignKey(
TipoDocumentoAdministrativo, verbose_name=_('Tipo'))
nome = models.CharField(max_length=30, verbose_name=_('Nome'))
arquivo = models.FileField(
blank=True,
null=True,
upload_to=texto_upload_path,
verbose_name=_('Arquivo'))
data = models.DateField(blank=True, null=True, verbose_name=_('Data'))
autor = models.CharField(
max_length=50, blank=True, verbose_name=_('Autor'))
assunto = models.TextField(
blank=True, verbose_name=_('Assunto'))
indexacao = models.TextField(blank=True)
class Meta:
verbose_name = _('Documento Acessório')
verbose_name_plural = _('Documentos Acessórios')
def __str__(self):
return self.nome
class Protocolo(models.Model):
numero = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Número do Protocolo'))
ano = models.PositiveSmallIntegerField()
data = models.DateField()
hora = models.TimeField()
timestamp = models.DateTimeField()
tipo_protocolo = models.PositiveIntegerField(
verbose_name=_('Tipo de Protocolo'))
tipo_processo = models.PositiveIntegerField()
interessado = models.CharField(
max_length=60, blank=True, verbose_name=_('Interessado'))
autor = models.ForeignKey(Autor, blank=True, null=True)
assunto_ementa = models.TextField(blank=True)
tipo_documento = models.ForeignKey(
TipoDocumentoAdministrativo,
blank=True,
null=True,
verbose_name=_('Tipo de documento'))
tipo_materia = models.ForeignKey(
TipoMateriaLegislativa,
blank=True,
null=True,
verbose_name=_('Tipo Matéria'))
numero_paginas = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Número de Páginas'))
observacao = models.TextField(
blank=True, verbose_name=_('Observação'))
anulado = models.BooleanField()
user_anulacao = models.CharField(max_length=20, blank=True)
ip_anulacao = models.CharField(max_length=15, blank=True)
justificativa_anulacao = models.CharField(
max_length=60, blank=True)
timestamp_anulacao = models.DateTimeField(blank=True, null=True)
class Meta:
verbose_name = _('Protocolo')
verbose_name_plural = _('Protocolos')
class StatusTramitacaoAdministrativo(models.Model):
INDICADOR_CHOICES = Choices(
('F', 'fim', _('Fim')),
('R', 'retorno', _('Retorno')),
)
sigla = models.CharField(max_length=10, verbose_name=_('Sigla'))
descricao = models.CharField(max_length=60, verbose_name=_('Descrição'))
# TODO make specific migration considering both ind_fim_tramitacao,
# ind_retorno_tramitacao
indicador = models.CharField(
max_length=1, verbose_name=_('Indicador da Tramitação'),
choices=INDICADOR_CHOICES)
class Meta:
verbose_name = _('Status de Tramitação')
verbose_name_plural = _('Status de Tramitação')
def __str__(self):
return self.descricao
class TramitacaoAdministrativo(models.Model):
status = models.ForeignKey(
StatusTramitacaoAdministrativo,
blank=True,
null=True,
verbose_name=_('Status'))
documento = models.ForeignKey(DocumentoAdministrativo)
data_tramitacao = models.DateField(
blank=True, null=True, verbose_name=_('Data Tramitação'))
unidade_tramitacao_local = models.ForeignKey(
UnidadeTramitacao,
blank=True,
null=True,
related_name='+',
verbose_name=_('Unidade Local'))
data_encaminhamento = models.DateField(
blank=True, null=True, verbose_name=_('Data Encaminhamento'))
unidade_tramitacao_destino = models.ForeignKey(
UnidadeTramitacao,
blank=True,
null=True,
related_name='+',
verbose_name=_('Unidade Destino'))
ultima = models.BooleanField()
texto = models.TextField(
blank=True, verbose_name=_('Texto da Ação'))
data_fim_prazo = models.DateField(
blank=True, null=True, verbose_name=_('Data Fim do Prazo'))
class Meta:
verbose_name = _('Tramitação de Documento Administrativo')
verbose_name_plural = _('Tramitações de Documento Administrativo')
def __str__(self):
return _('%(documento)s - %(status)s') % {
'documento': self.documento, 'status': self.status
}