pl-commerce 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/Manifest.txt +11 -0
- data/README.txt +37 -0
- data/Rakefile +17 -0
- data/lib/pl-commerce.rb +3 -0
- data/lib/pl-commerce/ir_codes.rb +737 -0
- data/lib/pl-commerce/nip.rb +122 -0
- data/lib/pl-commerce/pesel.rb +169 -0
- data/test/test_ir_codes.rb +19 -0
- data/test/test_nip.rb +66 -0
- data/test/test_pesel.rb +137 -0
- metadata +66 -0
@@ -0,0 +1,122 @@
|
|
1
|
+
# Copyright: mati@sz.home.pl
|
2
|
+
# License: LGPL
|
3
|
+
# Date: 12-02-2007
|
4
|
+
# Version 0.1
|
5
|
+
# http://pl.wikipedia.org/wiki/NIP
|
6
|
+
module PLCommerce
|
7
|
+
class Nip
|
8
|
+
|
9
|
+
CONTROL_CODE_POSITION = 9;
|
10
|
+
WAGES = [6,5,7,2,3,4,5,6,7];
|
11
|
+
|
12
|
+
#constructor
|
13
|
+
def initialize(nipL, opts = {:lenient => false})
|
14
|
+
raise ArgumentError, 'nip argument must be either of type String or Bignum' unless nipL.instance_of? String or nipL.instance_of? Bignum
|
15
|
+
@lenient = opts[:lenient];
|
16
|
+
#puts nip
|
17
|
+
@nip = strip_NIP(nipL);
|
18
|
+
if not @lenient
|
19
|
+
pre_validate_NIP(@nip);
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def valid?
|
24
|
+
#if lenient and validation produces problems
|
25
|
+
#it means that this number is not correct
|
26
|
+
begin
|
27
|
+
pre_validate_NIP(@nip)
|
28
|
+
rescue Exception => e
|
29
|
+
if @lenient
|
30
|
+
return false;
|
31
|
+
end
|
32
|
+
|
33
|
+
raise e;
|
34
|
+
end
|
35
|
+
|
36
|
+
sum = 0;
|
37
|
+
for i in 0..(@nip.length-2)
|
38
|
+
sum += @nip[i, 1].to_i * WAGES[i].to_i;
|
39
|
+
end
|
40
|
+
|
41
|
+
iControlCode = sum % 11;
|
42
|
+
iControlCode = iControlCode % 10;
|
43
|
+
|
44
|
+
iControlNIPValue = @nip[CONTROL_CODE_POSITION, 1].to_i;
|
45
|
+
|
46
|
+
return (iControlCode == iControlNIPValue);
|
47
|
+
end
|
48
|
+
|
49
|
+
#gets the code of Inland Revenue
|
50
|
+
def get_ir_code
|
51
|
+
begin
|
52
|
+
pre_validate_NIP(@nip, true, false, false)
|
53
|
+
#3 characters is minimum to get IR code
|
54
|
+
if @nip.length < 3
|
55
|
+
return '?';
|
56
|
+
end
|
57
|
+
rescue Exception => e
|
58
|
+
if @lenient
|
59
|
+
return '?';
|
60
|
+
end
|
61
|
+
|
62
|
+
raise e;
|
63
|
+
end
|
64
|
+
|
65
|
+
return @nip[0, 3].to_i;
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_ir_code_desc
|
69
|
+
begin
|
70
|
+
pre_validate_NIP(@nip, true, false, false)
|
71
|
+
rescue Exception => e
|
72
|
+
if @lenient
|
73
|
+
return '?';
|
74
|
+
end
|
75
|
+
|
76
|
+
raise e;
|
77
|
+
end
|
78
|
+
|
79
|
+
return PLCommerce::IRCodes.get_ir_code_dsc(get_ir_code);
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.valid?(nip, lenient = false)
|
83
|
+
return Nip.new(nip, lenient).valid?;
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_s
|
87
|
+
return @nip;
|
88
|
+
end
|
89
|
+
|
90
|
+
def pre_validate_NIP(nip, val_nil_and_empty = true, val_size = true, val_numeric = true)
|
91
|
+
raise ArgumentError, 'Must provide NIP' if (nip.nil? || nip.empty?) && val_nil_and_empty
|
92
|
+
raise ArgumentError, 'Must be 10 digit' if ((not nip.length == 10) && val_size)
|
93
|
+
if (Regexp.compile('(\d{3}-\d{3}-\d{2}-\d{2})|(\d{3}-\d{2}-\d{2}-\d{3})|(\d{10})').match(nip) == nil && val_numeric)
|
94
|
+
raise ArgumentError, 'NIP should be numeric and have format of xxx-xxx-xx-xx or xxx-xx-xx-xxx'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
#removed dashed and whitespaces, tabs from a string number
|
99
|
+
def strip_NIP(nip)
|
100
|
+
#first sub replaces all dash characters with empty string
|
101
|
+
#second sub replaced all whitespaced, tabs with empty string
|
102
|
+
|
103
|
+
sStrippedNIP = String.new(nip.to_s)
|
104
|
+
for i in 1..nip.to_s.count(' -')
|
105
|
+
sStrippedNIP = sStrippedNIP.sub(/[-]/, '')
|
106
|
+
sStrippedNIP = sStrippedNIP.sub(/[\s]/, '')
|
107
|
+
end
|
108
|
+
|
109
|
+
return sStrippedNIP
|
110
|
+
end
|
111
|
+
|
112
|
+
alias ir_code get_ir_code;
|
113
|
+
alias ir_code_desc get_ir_code_desc;
|
114
|
+
private(:strip_NIP, :pre_validate_NIP);
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
#aFile = File.new('src/nip_ir_codes.yml')
|
120
|
+
#aFile.each_line do |line|
|
121
|
+
# puts line[0,3] + " => '" + line[5,line.length-(5+1)] + "',";
|
122
|
+
#end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# Copyright: mati@sz.home.pl
|
2
|
+
# License: LGPL
|
3
|
+
# Date: 12-02-2007
|
4
|
+
# Version 0.1.0
|
5
|
+
#
|
6
|
+
# http://chemeng.p.lodz.pl/zylla/ut/pesel.html
|
7
|
+
# http://pl.wikipedia.org/wiki/PESEL
|
8
|
+
require 'date'
|
9
|
+
module PLCommerce
|
10
|
+
class Pesel
|
11
|
+
|
12
|
+
SEX_POSITION = 9;
|
13
|
+
CONTROL_CODE_POSITION = 10;
|
14
|
+
|
15
|
+
WAGES = [1,3,7,9,1,3,7,9,1,3];
|
16
|
+
|
17
|
+
# Constructor
|
18
|
+
# It takes pesel as first argument
|
19
|
+
# first argument can be either number or string
|
20
|
+
def initialize(pesel, opts = {:lenient => false})
|
21
|
+
raise ArgumentError, 'pesel argument must be either of type String or Bignum' unless pesel.instance_of? String or pesel.instance_of? Bignum
|
22
|
+
|
23
|
+
@lenient = opts[:lenient];
|
24
|
+
@pesel = strip_PESEL(pesel);
|
25
|
+
if not @lenient
|
26
|
+
pre_validate_PESEL(@pesel);
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def sex
|
31
|
+
begin
|
32
|
+
#to get sex we don't need all characters to be numeric but we need the same length
|
33
|
+
pre_validate_PESEL(@pesel, true, true, false)
|
34
|
+
rescue Exception => e
|
35
|
+
return '?'
|
36
|
+
end
|
37
|
+
|
38
|
+
iSexValue = @pesel[SEX_POSITION, 1].to_i
|
39
|
+
if (iSexValue % 2) == 0
|
40
|
+
return 'F'
|
41
|
+
end
|
42
|
+
|
43
|
+
return 'M'
|
44
|
+
end
|
45
|
+
|
46
|
+
def male?
|
47
|
+
return sex == 'M'
|
48
|
+
end
|
49
|
+
|
50
|
+
def female?
|
51
|
+
return sex == 'F'
|
52
|
+
end
|
53
|
+
|
54
|
+
def valid?
|
55
|
+
#if lenient, it means we will not be throwing exceptions if pesel is incorrect
|
56
|
+
# we will simply return false in that case
|
57
|
+
if @lenient
|
58
|
+
begin
|
59
|
+
pre_validate_PESEL(@pesel)
|
60
|
+
rescue Exception => e
|
61
|
+
return false
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
sum = 0
|
66
|
+
for i in 0..(@pesel.length-2)
|
67
|
+
sum += @pesel[i, 1].to_i * WAGES[i].to_i
|
68
|
+
end
|
69
|
+
|
70
|
+
iControlCode = sum % 10;
|
71
|
+
|
72
|
+
iControlCode = 10 - iControlCode;
|
73
|
+
if iControlCode == 10
|
74
|
+
iControlCode = 0;
|
75
|
+
end
|
76
|
+
|
77
|
+
iControlPESELValue = @pesel[CONTROL_CODE_POSITION, 1].to_i;
|
78
|
+
|
79
|
+
return (iControlPESELValue == iControlCode);
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_date_of_birth
|
83
|
+
begin
|
84
|
+
pre_validate_PESEL(@pesel, true, false, false)
|
85
|
+
#we need at least first 6 numbers
|
86
|
+
if @pesel.length < 6
|
87
|
+
return '?';
|
88
|
+
end
|
89
|
+
|
90
|
+
rescue Exception => e
|
91
|
+
if @lenient
|
92
|
+
return '?'
|
93
|
+
end
|
94
|
+
|
95
|
+
raise e
|
96
|
+
end
|
97
|
+
|
98
|
+
sYearLow = '19';
|
99
|
+
sYearHigh = @pesel[0, 2];
|
100
|
+
iMonth = @pesel[2, 2].to_i;
|
101
|
+
iDay = @pesel[4, 2].to_i;
|
102
|
+
|
103
|
+
iMileniumCode = @pesel[2, 1].to_i;
|
104
|
+
case iMileniumCode
|
105
|
+
#(1900 - 1999) 20 century
|
106
|
+
when 0..1
|
107
|
+
sYearLow = '19';
|
108
|
+
#(2000 - 2099) 21st century
|
109
|
+
when 2..3
|
110
|
+
sYearLow = '20';
|
111
|
+
iMonth = iMonth - 20;
|
112
|
+
#(2100 - 2199) 22nd century
|
113
|
+
when 4..5
|
114
|
+
begin
|
115
|
+
sYearLow = '21';
|
116
|
+
iMonth = iMonth - 40;
|
117
|
+
end
|
118
|
+
#(2200 - 2299) 23rd century
|
119
|
+
when 6..7
|
120
|
+
sYearLow = '22';
|
121
|
+
iMonth = iMonth - 60;
|
122
|
+
|
123
|
+
#(1800 - 1899) 19th century
|
124
|
+
when 8..9
|
125
|
+
sYearLow = '18';
|
126
|
+
iMonth = iMonth - 80;
|
127
|
+
end
|
128
|
+
|
129
|
+
sYear = sYearLow + sYearHigh;
|
130
|
+
iYear = sYear.to_i;
|
131
|
+
|
132
|
+
return Date.new(iYear, iMonth, iDay)
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.valid?(pesel, lenient = false)
|
136
|
+
return Pesel.new(pesel, lenient).valid?
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.sex?(pesel, lenient = false)
|
140
|
+
return Pesel.new(pesel, lenient).sex?
|
141
|
+
end
|
142
|
+
|
143
|
+
def to_s
|
144
|
+
return @pesel;
|
145
|
+
end
|
146
|
+
|
147
|
+
def pre_validate_PESEL(pesel, val_nil_and_empty = true, val_size = true, val_numeric = true)
|
148
|
+
raise ArgumentError, 'Must provide PESEL' if ((pesel.nil? || pesel.empty?) && val_nil_and_empty);
|
149
|
+
raise ArgumentError, 'Pesel size should be exacly eleven characters' if ((not pesel.length == 11) && val_size);
|
150
|
+
raise ArgumentError, 'Pesel should be numeric' if (Regexp.compile('(\d{11})').match(pesel) == nil && val_numeric);
|
151
|
+
end
|
152
|
+
|
153
|
+
##removes whitespaces, tabs from a string pesel number
|
154
|
+
def strip_PESEL(pesel)
|
155
|
+
sStrippedPESEL = String.new(pesel.to_s)
|
156
|
+
for i in 1..sStrippedPESEL.count(' ')
|
157
|
+
sStrippedPESEL = sStrippedPESEL.sub(/[\s]/, '')
|
158
|
+
end
|
159
|
+
|
160
|
+
return sStrippedPESEL
|
161
|
+
end
|
162
|
+
|
163
|
+
alias dob get_date_of_birth
|
164
|
+
alias date_of_birth get_date_of_birth
|
165
|
+
|
166
|
+
private(:pre_validate_PESEL, :strip_PESEL)
|
167
|
+
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'lib/pl-commerce'
|
3
|
+
|
4
|
+
class IRCodesTest < Test::Unit::TestCase
|
5
|
+
#def setup
|
6
|
+
#end
|
7
|
+
|
8
|
+
#def teardown
|
9
|
+
#end
|
10
|
+
|
11
|
+
def test_ir_code1
|
12
|
+
assert('Urząd Skarbowy Poznań-Nowe Miasto' == PLCommerce::IRCodes.get_ir_code_dsc(362));
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_ir_code2
|
16
|
+
assert('Urząd Skarbowy we Wrześni' == PLCommerce::IRCodes.get_ir_code_dsc(369));
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/test/test_nip.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'date'
|
3
|
+
require 'lib/pl-commerce'
|
4
|
+
|
5
|
+
class NipTest < Test::Unit::TestCase
|
6
|
+
#def setup
|
7
|
+
#end
|
8
|
+
|
9
|
+
#def teardown
|
10
|
+
#end
|
11
|
+
|
12
|
+
def test_nip1
|
13
|
+
n = PLCommerce::Nip.new('362-398-12-30');
|
14
|
+
assert(n.valid?, 'Nip should be valid');
|
15
|
+
assert(n.ir_code == 362, 'IR code should be 362');
|
16
|
+
assert(n.ir_code_desc == 'Urząd Skarbowy Poznań-Nowe Miasto', 'Should not be null');
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_nip2
|
20
|
+
n = PLCommerce::Nip.new('123-456-32-18');
|
21
|
+
assert(n.valid?, 'NIP should be valid');
|
22
|
+
assert(n.to_s == '1234563218');
|
23
|
+
assert(n.ir_code_desc == 'Urząd Skarbowy w Piasecznie', 'Should not be null');
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_nip3
|
27
|
+
n = PLCommerce::Nip.new('120-456-33-17');
|
28
|
+
assert(!n.valid?, 'NIP should not be valid');
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_nip4
|
32
|
+
n = PLCommerce::Nip.new('1234563218');
|
33
|
+
assert(n.valid?, 'NIP should be valid');
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_nip5
|
37
|
+
n = PLCommerce::Nip.new(' 1 2 3 4 5 6 3 2 1 8');
|
38
|
+
assert(n.valid?, 'NIP should be valid');
|
39
|
+
assert(n.to_s == '1234563218');
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_nip6
|
43
|
+
n = PLCommerce::Nip.new('123-4 5 6 3 2-18');
|
44
|
+
assert(n.valid?, 'NIP should be valid');
|
45
|
+
assert(n.to_s == '1234563218');
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_nip7
|
49
|
+
n = PLCommerce::Nip.new(1234563218);
|
50
|
+
assert(n.valid?, 'NIP should be valid');
|
51
|
+
assert(n.to_s == '1234563218');
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_nip8
|
55
|
+
n = PLCommerce::Nip.new('123456321x', :lenient => true);
|
56
|
+
assert(n.valid? == false, 'NIP should be invalid');
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_nip9
|
60
|
+
n = PLCommerce::Nip.new('362', :lenient => true);
|
61
|
+
assert(n.valid? == false, 'NIP should be invalid');
|
62
|
+
assert(n.ir_code == 362);
|
63
|
+
assert(n.ir_code_desc == 'Urząd Skarbowy Poznań-Nowe Miasto');
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
data/test/test_pesel.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'date'
|
3
|
+
require 'lib/pl-commerce'
|
4
|
+
|
5
|
+
class PeselTest < Test::Unit::TestCase
|
6
|
+
#def setup
|
7
|
+
#end
|
8
|
+
|
9
|
+
#def teardown
|
10
|
+
#end
|
11
|
+
|
12
|
+
def test_pesel1
|
13
|
+
p = PLCommerce::Pesel.new('49040501580');
|
14
|
+
assert(p.valid?, 'Pesel should be valid');
|
15
|
+
assert(p.female?, 'Should be female');
|
16
|
+
assert(p.sex == 'F', 'Should be F');
|
17
|
+
assert(p.dob == Date.new(1949, 4, 5), 'Date should match');
|
18
|
+
assert(p.to_s == '49040501580', 'to_s method should return pesel');
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_pesel2
|
22
|
+
p = PLCommerce::Pesel.new('79082203573');
|
23
|
+
assert(p.valid?, 'Pesel should be valid');
|
24
|
+
assert(p.male?, 'Should be male');
|
25
|
+
assert(p.sex == 'M', 'Should be M');
|
26
|
+
assert(p.dob == Date.new(1979, 8, 22), 'Date should match');
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_pesel2a
|
30
|
+
p = PLCommerce::Pesel.new(79082203573);
|
31
|
+
assert(p.valid?, 'Pesel should be valid');
|
32
|
+
assert(p.male?, 'Should be male');
|
33
|
+
assert(p.sex == 'M', 'Should be M');
|
34
|
+
assert(p.dob == Date.new(1979, 8, 22), 'Date should match');
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_pesel3
|
38
|
+
p = PLCommerce::Pesel.new('76101105382');
|
39
|
+
assert(p.valid?, 'Pesel should be valid');
|
40
|
+
assert(p.female?, 'Should be female');
|
41
|
+
assert(p.sex == 'F', 'Should be F');
|
42
|
+
assert(p.dob == Date.new(1976, 10, 11), 'Date should match');
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_pesel3a
|
46
|
+
p = PLCommerce::Pesel.new('7 6 1 0 1 1 0 5 3 8 2');
|
47
|
+
assert(p.valid?, 'Pesel should be valid');
|
48
|
+
assert(p.female?, 'Should be female');
|
49
|
+
assert(p.sex == 'F', 'Should be F');
|
50
|
+
assert(p.dob == Date.new(1976, 10, 11), 'Date should match');
|
51
|
+
assert(p.to_s == '76101105382', 'to string method should return pesel');
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_pesel4
|
55
|
+
p = PLCommerce::Pesel.new('76101105381');
|
56
|
+
assert(!p.valid?, 'Pesel should be invalid');
|
57
|
+
begin
|
58
|
+
assert(p.female?, 'Should be female');
|
59
|
+
assert(false, 'should not happen');
|
60
|
+
rescue Exception => e
|
61
|
+
end
|
62
|
+
|
63
|
+
begin
|
64
|
+
assert(p.sex == 'F', 'Should be F');
|
65
|
+
assert(false, 'should not happen');
|
66
|
+
rescue Exception => e
|
67
|
+
end
|
68
|
+
|
69
|
+
begin
|
70
|
+
assert(p.dob == Date.new(1976, 10, 11));
|
71
|
+
assert(false, 'should not happen');
|
72
|
+
rescue Exception => e
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_pesel5
|
77
|
+
p = PLCommerce::Pesel.new('4904050158x', :lenient => true);
|
78
|
+
assert(p.valid? == false, 'Pesel should be invalid');
|
79
|
+
assert(p.dob == Date.new(1949, 4, 5), 'Date should match even pesel is invalid');
|
80
|
+
assert(p.female?, 'We should be able to find out that it is female');
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_pesel6
|
84
|
+
p = PLCommerce::Pesel.new('', :lenient => true);
|
85
|
+
assert(p.valid? == false, 'Pesel should be invalid');
|
86
|
+
assert(p.sex == '?', 'We have no idea of sex');
|
87
|
+
assert(p.female? == false, 'We have no idea of sex');
|
88
|
+
assert(p.male? == false, 'We have no idea of sex');
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_pesel7
|
92
|
+
p = PLCommerce::Pesel.new('790822', :lenient => true);
|
93
|
+
assert(p.valid? == false, 'Pesel should be invalid');
|
94
|
+
assert(p.sex == '?', 'We have no idea of sex');
|
95
|
+
assert(p.female? == false, 'We have no idea of sex');
|
96
|
+
assert(p.male? == false, 'We have no idea of sex');
|
97
|
+
assert(p.dob == Date.new(1979, 8, 22), 'Date should match, enough date fields');
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_pesel8
|
101
|
+
p = PLCommerce::Pesel.new('79082', :lenient => true);
|
102
|
+
assert(p.valid? == false, 'Pesel should be invalid');
|
103
|
+
assert(p.sex == '?', 'We have no idea of sex');
|
104
|
+
assert(p.female? == false, 'We have no idea of sex');
|
105
|
+
assert(p.male? == false, 'We have no idea of sex');
|
106
|
+
assert(p.dob == '?', 'Not enough of date fields');
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_pesel9
|
110
|
+
p = PLCommerce::Pesel.new('49240501586');
|
111
|
+
assert(p.valid?, 'Pesel should be valid');
|
112
|
+
assert(p.female?, 'Should be female');
|
113
|
+
assert(p.sex == 'F', 'Should be F');
|
114
|
+
assert(p.dob == Date.new(2049, 4, 5), 'Date should match');
|
115
|
+
assert(p.to_s == '49240501586', 'to_s method should return pesel');
|
116
|
+
end
|
117
|
+
|
118
|
+
#year 2149
|
119
|
+
def test_pesel10
|
120
|
+
p = PLCommerce::Pesel.new('49440501582');
|
121
|
+
assert(p.valid?, 'Pesel should be valid');
|
122
|
+
assert(p.female?, 'Should be female');
|
123
|
+
assert(p.sex == 'F', 'Should be F');
|
124
|
+
assert(p.dob == Date.new(2149, 4, 5), 'Date should match');
|
125
|
+
assert(p.to_s == '49440501582', 'to_s method should return pesel');
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_pesel11
|
129
|
+
p = PLCommerce::Pesel.new('49520501583');
|
130
|
+
assert(p.valid?, 'Pesel should be valid');
|
131
|
+
assert(p.female?, 'Should be female');
|
132
|
+
assert(p.sex == 'F', 'Should be F');
|
133
|
+
assert(p.dob == Date.new(2149, 12, 5), 'Date should match');
|
134
|
+
assert(p.to_s == '49520501583', 'to_s method should return pesel');
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|