lib/elfproef_plan.rb in elfproef_plan-0.0.3 vs lib/elfproef_plan.rb in elfproef_plan-0.0.5

- old
+ new

@@ -11,44 +11,58 @@ def validate_each(record,attribute,value) record.errors.add(attribute, options[:message] || "ongeldig rekening nr", options) unless ElfproefPlan::ElfProef.new(value).validRekening end end + class LoonheffingennummerValidator < ActiveModel::EachValidator + + def validate_each(record,attribute,value) + record.errors.add(attribute, options[:message] || "ongeldig loonheffingennummer nr", options) unless ElfproefPlan::ElfProef.new(value).validLoonheffingennummer + end + end + module ElfproefPlan class ElfProef - attr_accessor :nr, :nrs + attr_accessor :nr, :nrs, :letter, :subnr - def initialize(nr) - @nr = nr.to_s.scan(/./).map{|x| x.to_i} if nr.to_s.scan(/[\d+$]/)==nr.to_s.scan(/./) + def initialize(input) @nrs = (2..9).to_a.reverse + + @nr, @letter, @subnr = input.to_s.scan(/[0-9a-zA-Z+$]/).join().upcase().match(/([0-9]*)([A-Z]*)([0-9]*)/i).captures.map{|x| x.scan(/./)} + @nr, @subnr = @nr.map{|x| x.to_i}, @subnr.map{|x| x.to_i} + end def validRekening - return false unless @nr return false unless [9, 10].include? @nr.length - nrs.unshift 10 if @nr.length == 10 + @nrs.unshift 10 if @nr.length == 10 elfproef(1) end def validBsn - return false unless @nr return false if @nr.length > 9 @nr.unshift 0 while @nr.length < 9 return false if @nr[0,3].sum < 1 elfproef(-1) end + def validLoonheffingennummer + return false unless validBsn + return false unless @letter==["L"] + return false unless @subnr.reduce(:+)>0 + true + + end + private def elfproef(b) - - som=0 - @nrs.push b reeks = @nr.zip(@nrs) - reeks.each{|x| som+= x[0]*x[1]} + @nrs.pop + som = reeks.inject(0){|som, x| som + (x[0]*x[1]) } som.remainder(11)==0 && som>0 end end