interlegis / sapl

Sistema de Apoio ao Processo Legislativo
GNU General Public License v3.0
85 stars 82 forks source link

Numeração Normas Jurídicas - uso do dígito 0 #2747

Open lizianem opened 5 years ago

lizianem commented 5 years ago

Numeração Normas Jurídicas - uso do dígito 0

Comportamento Esperado Na versão 3.1.153 não conseguimos pesquisar ou cadastrar normas que apresenta o dígito zero (0) na NUMERAÇÃO (campo NÚMERO). Ex.: Resolução SMAMS 001.

Precisamos voltar a cadastrar com o dígito 0 (zero), pois esse número faz parte da nomenclatura oficial da Norma. Sem o cadastro e a pesquisa, não localizaremos todas as normas cadastradas até momento e perderemos o histórico. Também não se pode ignorar a nomenclatura oficial das normas jurídicas do Município, pois muitas iniciam com 0 ou 00.

Seu Ambiente

edwardoliveira commented 5 years ago

O problema é que isso vai fazer voltar esse problema aqui: https://github.com/interlegis/sapl/issues/2072

Existem uma série de questões técnicas pelo fato desse campo número ser texto (o que foi feito por conta de numerações do tipo 139-A, 3151, 3151-A, 3151-B, etc). Isso gerou uma série de problemas para inserção e recuperação destes números. Temos que estudar a melhor forma de fazer isso.

LeandroJatai commented 5 years ago

Uma ideia, que deve ser construída e aprimorada, é criar um campo estruturado paralelo do tipo ArrayField, por exemplo numero_search = ArrayField()

os procedimentos envolveria três alterações: 1) criar o campo, gerar o migrate, e incluir um RunPython gerando o numero_search=ArrayField a partir do numero=CharField 2) implementar em NormaJuridica.save o algoritmo de conversão para as futuras edições e inserções 3) implementar em NormaFilterSet a customização do campo número com um method filter onde o conteudo seja transformado em Array e aplicado ao queryset do django-filter 3.1) o queryset deverá, possívelmente usar o lookup contain e não o overlap: veja aqui

código de conversão de string para array, produzido pelo @edwardoliveira em tempo de diálogo pelo telegram sobre essa issue:

In [4]: x = '000.10.000-9/A'                                                   
In [5]: list(map(lambda x: int(x) if x.isnumeric() else x , re.compile('[-/.]').split(x)))                        
Out[5]: [0, 10, 0, 9, 'A']
lizianem commented 4 years ago

@LeandroJatai esta ideia já foi implementada?

https://github.com/interlegis/sapl/issues/2747#issuecomment-486383777