Module: Billing

Extended by:
Billing
Included in:
Billing
Defined in:
lib/billing.rb,
lib/billing/version.rb

Constant Summary collapse

VERSION =
"0.3.2"

Instance Method Summary collapse

Instance Method Details

#call_type(tpserv) ⇒ Object

Método que define o tipo de serviço.



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/billing.rb', line 27

def call_type tpserv
  type = nil
  case tpserv
  when "Chamadas Locais para Celulares TIM", "Chamadas Locais para Outros Celulares", "Chamadas Locais para Outros Telefones Fixos", "Chamadas Tarifa Zero"
     type = :local
   when "Chamadas Longa Distância: TIM LD 41", "Chamadas Longa Distância: Brasil Telecom", "Chamadas Longa Distância: Telemar", "Chamadas Longa Distância: Embratel", "Chamadas Longa Distância: Telefônica"
     type = :long_distance
   when "TIM Torpedo", "TIM VideoMensagem/FotoMensagem para Celular"
     type = :sms
   when "TIM Wap Fast", "TIM Connect Fast"
     type = :internet
  end
end

#execute(arq = "#{ARGV[0]}", tel = "#{ARGV[1]}") ⇒ Object

Método de execução do sistema



89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/billing.rb', line 89

def execute (arq = "#{ARGV[0]}", tel = "#{ARGV[1]}")
  # Executando método para validação do arquivo.
  validate arq
  if validate == true
    # Encontrando as words relacionadas ao numero
    rows_number = find_by_number arq, tel
    # Fazendo os calculos
    total = sum_bill rows_number
    # Imprimindo
    show_formated_result total
  else
    puts "Arquivo inválido - Só é aceito arquivos que tenham delimitadores."
  end
end

#find_by_number(arq = "#{ARGV[0]}", number = "#{ARGV[1]}") ⇒ Object

Método que encontra os resultados no arquivo passado como parâmetro.



16
17
18
19
20
21
22
23
24
# File 'lib/billing.rb', line 16

def find_by_number (arq = "#{ARGV[0]}", number = "#{ARGV[1]}")
  results = []
  CSV.foreach(arq, {:col_sep => ';'}) do |row|
    if row[3] == number
      results << row
    end
  end
  results
end

#show_formated_result(total) ⇒ Object

Método para exibir o resultado formatado ao cliente.



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/billing.rb', line 74

def show_formated_result total
  puts "============ Resultados de sua conta telefônica ========================"
  sleep 1
  puts "Total de minutos em chamadas locais: #{total[:local].round(2)} minutos"
  sleep 1
  puts "Total de minutos em chamadas de longa distância: #{total[:long_distance].round(2)} minutos"
  sleep 1
  puts "Total de SMS enviados: #{total[:sms]}"
  sleep 1
  puts "Total de bytes trafegados de Internet: #{total[:internet].round()} bytes"
  sleep 1
  puts "============ Obrigado por usar o Billing - By Pery Lemke ==============="
end

#string_to_bytes(byte_string) ⇒ Object

Método que converte string para float e realiza o cálculo de bytes.



66
67
68
69
70
71
# File 'lib/billing.rb', line 66

def string_to_bytes byte_string
  return 0 if byte_string.nil?
    byte = byte_string.split(" ")
    byte_float = byte[0].to_f
    byte_float * 1000
end

#string_to_minutes(time_string) ⇒ Object

Método que converte string para float e realiza o cálculo de minutos.



58
59
60
61
62
63
# File 'lib/billing.rb', line 58

def string_to_minutes time_string
  return 0 if time_string.nil?
    minutes = time_string.split("m").first.to_f
    seconds = time_string.split("m").last.split("s").last.to_f
    minutes + seconds / 60
end

#sum_bill(calls) ⇒ Object

Método que realiza as somas para exibição na tela do usuário.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/billing.rb', line 42

def sum_bill calls
  results = {local: 0, long_distance: 0, sms: 0, internet: 0}
  calls.each do |call|
    type = call_type call[6]
    if type == :local or type == :long_distance
      results[type] += string_to_minutes call[13]
    elsif type == :sms
      results[type] += 1
    elsif type == :internet
      results[type] += string_to_bytes call[13]
    end
  end
  results
end

#validate(arq = "#{ARGV[0]}") ⇒ Object

Método para validação do arquivo.



10
11
12
13
# File 'lib/billing.rb', line 10

def validate (arq = "#{ARGV[0]}")
  validator = Csvlint::Validator.new( File.new("#{arq}" ))
  validator.valid?
end