My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# ----------------------------------------------------------------------------
# Calcula o número de dias úteis entre duas datas, inclusive ambas.
# Obs.: Não leva em conta feriados.
# Uso: zzdiasuteis data-inicial data-final
# Ex.: zzdiasuteis 01/01/2011 31/01/2011 # Retorna: 21
#
# Autor: Aurelio Marinho Jargas, www.aurelio.net
# Desde: 2011-05-20
# Versão: 1
# Licença: GPL
# Requisitos: zzdata zzdiadasemana
# Tags: data, cálculo
# ----------------------------------------------------------------------------
zzdiasuteis ()
{
zzzz -h diasuteis "$1" && return

local data dias dia1 semanas avulsos ini fim
local avulsos_uteis=0
local uteis="0111110" # D S T Q Q S S
local data1="$1"
local data2="$2"

# Verificação dos parâmetros
if test $# -ne 2
then
zztool uso diasuteis
return 1
fi

# Valida o formato das datas
zztool -e testa_data "$data1" || return 1
zztool -e testa_data "$data2" || return 1

# Quantos dias há entre as duas datas?
dias=$(zzdata $data2 - $data1)

# O usuário inverteu a ordem das datas?
if test $dias -lt 0
then
# Tudo bem, a gente desinverte.
dias=$((0 - $dias)) # abs()
data=$data1
data1=$data2
data2=$data
fi

# A zzdata conta a diferença, então precisamos fazer +1 para incluir
# ambas as datas no resultado.
dias=$((dias + 1))

# Qual dia da semana cai a data inicial?
dia1=$(zzdiadasemana -n $data1) # 1=domingo

# Quantas semanas e quantos dias avulsos?
semanas=$((dias / 7))
avulsos=$((dias % 7))

# Dos avulsos, quantos são úteis?
#
# Montei uma matriz de 14 posições ($uteis * 2) que contém 0's
# e 1's, sendo que os 1's marcam os dias úteis. Faço um recorte
# nessa matriz que inicia no $dia1 e tem o tamanho do total de
# dias avulsos ($avulsos, max=6). As variáveis $ini e $fim são
# usadas no cut e traduzem este recorte. Por fim, removo os
# zeros e conto quantos 1's sobraram, que são os dias úteis.
#
if test $avulsos -gt 0
then
ini=$dia1
fim=$(($dia1 + $avulsos - 1))
avulsos_uteis=$(
echo "$uteis$uteis" |
cut -c $ini-$fim |
tr -d 0)
avulsos_uteis=${#avulsos_uteis} # wc -c
fi

# Com os dados na mão, basta calcular
echo $(($semanas * 5 + $avulsos_uteis))
}

Change log

r710 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: $1 colocado entre aspas na
chamada padrão zzzz -h de todas as
funções.
Go to: 
Sign in to write a code review

Older revisions

r667 by aureliojargas on Mar 28, 2012   Diff
Ajustes nos comentários, nada demais.
r655 by aureliojargas on Mar 23, 2012   Diff
s/Aurélio/Aurelio/ *
r540 by aureliojargas on May 24, 2011   Diff
COMBO: Removidos espaços e tabs
inúteis do fim das linhas, verificados
por utils/alinhamento
All revisions of this file

File info

Size: 2211 bytes, 81 lines
Powered by Google Project Hosting