Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Income tax calculator - Calculadora IRPF
class TaxCalc
TABLAS = {
retenciones_es: {
5151 => 0,
12450 => 19,
20200 => 24,
35200 => 30,
60000 => 37,
999999 => 45
},
rentas_ahorro_es: {
6000 => 19,
50000 => 21,
999999 => 23
},
tax_rates_uk: {
11000 => 0, # personal minimum
43000 => 20,
150000 => 40,
999999 => 45
},
}
def initialize(retenciones, bruto)
@retenciones = TABLAS[retenciones]
puts "Disponibles: #{TABLAS.keys}"
@bruto = bruto
end
def call
tope_horquilla_anterior = 0
total = 0
@retenciones.each do |tope_horquilla, porcentaje|
cantidad_gravable = (@bruto >= tope_horquilla) ? tope_horquilla - tope_horquilla_anterior : @bruto - tope_horquilla_anterior
if cantidad_gravable > 0
impuesto = cantidad_gravable * porcentaje / 100.0
puts "Hasta #{n tope_horquilla} hay #{n cantidad_gravable} gravados al #{n porcentaje}. Impuestos: #{n impuesto}"
total += impuesto
end
tope_horquilla_anterior = tope_horquilla
end
puts "Impuestos #{n total} a un tipo de equivalente #{n(total / @bruto * 100.0)} %"
puts "Neto: #{n (@bruto - total)}"
total
end
private
def n(valor)
valor.round(2)
end
end
#### Usage / Uso
TaxCalc.new(:tax_rates_uk, 70000).call
TaxCalc.new(:retenciones_es, 30000).call
#### Sample result / Resultado de ejemplo
#Hasta 5151 hay 5151 gravados al 0. Impuestos: 0.0
#Hasta 12450 hay 7299 gravados al 19. Impuestos: 1386.81
#Hasta 20200 hay 7750 gravados al 24. Impuestos: 1860.0
#Hasta 35200 hay 9800 gravados al 30. Impuestos: 2940.0
#Impuestos 6186.8099999999995 a un tipo de equivalente 20.6227 %
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment