diff --git a/sigi/apps/servidores/forms.py b/sigi/apps/servidores/forms.py index a497286..89dd31a 100644 --- a/sigi/apps/servidores/forms.py +++ b/sigi/apps/servidores/forms.py @@ -1,11 +1,17 @@ # -*- coding: utf-8 -*- +from collections import namedtuple + from django import forms from django.utils.translation import ugettext as _ from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor -from sigi.apps.utils.validators import valida_data, valida_periodo_data +def valida_data_inicial_menor_que_final(data, chave_ini, chave_fim): + if data.get(chave_ini) >= data.get(chave_fim): + raise forms.ValidationError(_( + u"A data de início deve ser menor que a data final. Verifique novamente")) + class FeriasForm(forms.ModelForm): class Meta: @@ -14,9 +20,7 @@ class FeriasForm(forms.ModelForm): def clean(self): data = self.cleaned_data - if valida_data(data.get('inicio_ferias'), data.get('fim_ferias')): - raise forms.ValidationError(_(u"""A data de início deve ser menor - que a data final. Verifique novamente""")) + valida_data_inicial_menor_que_final(data, 'inicio_ferias', 'fim_ferias') return data @@ -28,12 +32,17 @@ class LicencaForm(forms.ModelForm): def clean(self): data = self.cleaned_data - if valida_data(data.get('inicio_licenca'), data.get('fim_licenca')): - raise forms.ValidationError(_(u"""A data de início deve ser menor - que a data final. Verifique novamente""")) + valida_data_inicial_menor_que_final(data, 'inicio_licenca', 'fim_licenca') return data +Periodo = namedtuple('Periodo', ['ini', 'fim']) + + +def periodos_se_sobrepoe(periodo1, periodo2): + return not (periodo1.fim < periodo2.ini or periodo2.fim < periodo1.ini) + + class FuncaoForm(forms.ModelForm): class Meta: @@ -42,24 +51,15 @@ class FuncaoForm(forms.ModelForm): def clean(self): data = self.cleaned_data - if valida_data(data.get('inicio_funcao'), data.get('fim_funcao')): - raise forms.ValidationError(_(u"""A data de início deve ser menor - que a data final. Verifique - novamente""")) + valida_data_inicial_menor_que_final(data, 'inicio_funcao', 'fim_funcao') # Verifica na função anterior, se o seu período é igual # ou está entre o período da função atual. servidor = Servidor.objects.get(nome_completo=data.get('servidor')) - if len(servidor.funcao_set.all()): - if len(servidor.funcao_set.all()) > 1: - funcao_anterior = servidor.funcao_set.all()[1] - elif len(servidor.funcao_set.all()) == 1: - funcao_anterior = servidor.funcao_set.all()[0] - - if valida_periodo_data(funcao_anterior.inicio_funcao, - funcao_anterior.fim_funcao, data.get('inicio_funcao'), - data.get('fim_funcao')): - raise forms.ValidationError(_(u"""Você não pode exercer - uma função no mesmo período que a anterior, como também, - não pode ser entre o período da mesma.""")) + for funcao in servidor.funcao_set.all(): + if periodos_se_sobrepoe( + Periodo(funcao.inicio_funcao, funcao.fim_funcao), + Periodo(data.get('inicio_funcao'), data.get('fim_funcao'))): + raise forms.ValidationError(_( + u"Este período coincide com o de outra função exercida.")) return data diff --git a/sigi/apps/servidores/test_servidores_forms.py b/sigi/apps/servidores/test_servidores_forms.py new file mode 100644 index 0000000..cbbd838 --- /dev/null +++ b/sigi/apps/servidores/test_servidores_forms.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from django import forms +import pytest +from datetime import date + +from sigi.apps.servidores.forms import valida_data_inicial_menor_que_final, Periodo, periodos_se_sobrepoe + + +@pytest.mark.parametrize('data', [ + dict(ini=1, fim=2), + pytest.mark.xfail(raises=forms.ValidationError)(dict(ini=2, fim=1)), + pytest.mark.xfail(raises=forms.ValidationError)(dict(ini=1, fim=1)), +]) +def test_valida_data_inicial_menor_que_final(data): + valida_data_inicial_menor_que_final(data, 'ini', 'fim') + + +periodos = [ + [Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2001, 1, 1), date(2002, 2, 2)), True], # um dia de interseção + [Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2001, 1, 2), date(2002, 2, 2)), False], # exatamente um dia após + [Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2000, 12, 2), date(2002, 2, 2)), True], + [Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2014, 1, 1), date(2014, 2, 2)), False], +] + +# para testar que a ordem dos parametros nao importa +periodos_trocados = [[b, a, res] for [a, b, res] in periodos] + + +@pytest.mark.parametrize('periodo1, periodo2, resultado', periodos + periodos_trocados) +def test_periodos_se_sobrepoe(periodo1, periodo2, resultado): + assert periodos_se_sobrepoe(periodo1, periodo2) == resultado diff --git a/sigi/apps/utils/validators.py b/sigi/apps/utils/validators.py deleted file mode 100644 index 30d84da..0000000 --- a/sigi/apps/utils/validators.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - - -def valida_data(data_inicio, data_final): - """Função responsável por validar se o intervalo das - datas estão erradas, ou seja, se a data de início está - maior ou igual a data final. - - Caso seja maior ou igual retornará ``True``, caso contrário - retornará ``False``. - """ - if data_inicio >= data_final: - return True - else: - return False - - -def valida_periodo_data(di01, df01, di02, df02): - """Função responsável por validar dois períodos de datas. - Isso é usado para verificar se determinado servidor exerceu - mais de uma função dentro de determinados períodos descritos - abaixo: - - 1 - A segunda função não pode ter exercido ao mesmo tempo que - a primeira função. Exemplo: - - Primeiro Função: 01/05/2011 -- 01/11/2011 - Segundo Função: 01/05/2011 -- 01/11/2011 - - 2 - A segunda função não pode ter exercido, dentro do período - da primeira função. Exemplo: - - Primeira Função: 01/05/2011 -- 01/11/2011 - Segunda Função: 02/05/2011 -- 30/10/2011 - """ - # Verificando a primeira situação - if di01 == di02 and df01 == df02: - return True - elif ((di01 >= di02) or (di02 <= df01)) and df01 <= df02: - return True - else: - return False