File Coverage

blib/lib/Person/ID/CZ/RC.pm
Criterion Covered Total %
statement 87 108 80.5
branch 20 24 83.3
condition 5 6 83.3
subroutine 13 19 68.4
pod 11 11 100.0
total 136 168 80.9


line stmt bran cond sub pod time code
1             package Person::ID::CZ::RC;
2              
3             # Pragmas.
4 8     8   57948 use strict;
  8         18  
  8         276  
5 8     8   104 use warnings;
  8         15  
  8         241  
6              
7             # Modules.
8 8     8   8634 use Class::Utils qw(set_params);
  8         147728  
  8         206  
9 8     8   17170 use DateTime;
  8         1651270  
  8         395  
10 8     8   94 use English qw(-no_match_vars);
  8         16  
  8         72  
11 8     8   4190 use Error::Pure qw(err);
  8         18  
  8         8944  
12              
13             # Version.
14             our $VERSION = 0.03;
15              
16             # Constructor.
17             sub new {
18 18     18 1 12893 my ($class, @params) = @_;
19              
20             # Create object.
21 18         58 my $self = bless {}, $class;
22              
23             # RC number.
24 18         69 $self->{'rc'} = undef;
25              
26             # Process parameters.
27 18         74 set_params($self, @params);
28              
29             # Check RC.
30 16 100       176 if (! defined $self->{'rc'}) {
31 1         4 err "Parameter 'rc' is required.";
32             }
33              
34             # Parse.
35 15         52 $self->_parse;
36              
37             # Object.
38 15         47 return $self;
39             }
40              
41             # Get alternate flag.
42             sub alternate {
43 3     3 1 20 my $self = shift;
44 3         8 return $self->{'alternate'};
45             }
46              
47             # Get checksum.
48             sub checksum {
49 3     3 1 19 my $self = shift;
50 3         9 return $self->{'checksum'};
51             }
52              
53             # Get day.
54             sub day {
55 3     3 1 25 my $self = shift;
56 3         10 return $self->{'day'};
57             }
58              
59             # Get error.
60             sub error {
61 5     5 1 31 my $self = shift;
62 5         12 return $self->{'error'};
63             }
64              
65             # Check validity.
66             sub is_valid {
67 0     0 1 0 my $self = shift;
68 0         0 return $self->{'validity'};
69             }
70              
71             # Get month.
72             sub month {
73 0     0 1 0 my $self = shift;
74 0         0 return $self->{'month'};
75             }
76              
77             # Get rc.
78             sub rc {
79 0     0 1 0 my $self = shift;
80 0         0 return $self->{'rc'};
81             }
82              
83             # Get serial.
84             sub serial {
85 0     0 1 0 my $self = shift;
86 0         0 return $self->{'serial'};
87             }
88              
89             # Get sex.
90             sub sex {
91 0     0 1 0 my $self = shift;
92 0         0 return $self->{'sex'};
93             }
94              
95             # Get year.
96             sub year {
97 0     0 1 0 my $self = shift;
98 0         0 return $self->{'year'};
99             }
100              
101             # Check validity.
102             sub _check_validity {
103 9     9   14 my $self = shift;
104 9         17 my $number = $self->{'rc'};
105 9         29 $number =~ s/\///ms;
106 9         22 $number = substr $number, 0, 9;
107 9         21 my $checksum = $number % 11;
108 9 100       38 if ($checksum == 10) {
109 4         11 $checksum = 0;
110             }
111 9 100       28 if ($self->{'checksum'} == $checksum) {
112 8         20 $self->{'validity'} = 1;
113             } else {
114 1         2 $self->{'error'} = "Checksum isn't valid.";
115 1         3 $self->{'validity'} = 0;
116             }
117 9         18 return;
118             }
119              
120             # Parse.
121             sub _parse {
122 15     15   24 my $self = shift;
123 15 100 100     180 if ($self->{'rc'} =~ m/^(\d\d)(\d\d)(\d\d)\/(\d\d\d)(\d)$/ms
    100 66        
124             || $self->{'rc'} =~ m/^(\d\d)(\d\d)(\d\d)(\d\d\d)(\d)$/ms) {
125              
126 9         41 $self->{'year'} = 1900 + $1;
127 9 50       61 if ($2 > 70) {
    50          
    100          
128 0         0 $self->{'alternate'} = 1;
129 0         0 $self->{'month'} = $2 - 70;
130 0         0 $self->{'sex'} = 'female';
131             } elsif ($2 > 50) {
132 0         0 $self->{'month'} = $2 - 50;
133 0         0 $self->{'sex'} = 'female';
134 0         0 $self->{'alternate'} = 0;
135             } elsif ($2 > 20) {
136 3         10 $self->{'month'} = $2 - 20;
137 3         7 $self->{'alternate'} = 1;
138 3         11 $self->{'sex'} = 'male';
139             } else {
140 6         13 $self->{'alternate'} = 0;
141 6         15 $self->{'month'} = $2;
142 6         14 $self->{'sex'} = 'male';
143             }
144 9         25 $self->{'day'} = $3;
145 9         28 $self->{'serial'} = $4;
146 9         30 $self->{'checksum'} = $5;
147              
148             # Check validity.
149 9         31 $self->_check_validity;
150              
151             # To 31. 12.1953.
152             } elsif ($self->{'rc'} =~ m/^(\d\d)(\d\d)(\d\d)\/(\d\d\d)$/ms
153             || $self->{'rc'} =~ m/^(\d\d)(\d\d)(\d\d)(\d\d\d)$/ms) {
154              
155 1         4 $self->{'year'} = 1900 + $1;
156 1 50       5 if ($2 > 50) {
157 0         0 $self->{'month'} = $2 - 50;
158 0         0 $self->{'sex'} = 'female';
159             } else {
160 1         3 $self->{'month'} = $2;
161 1         3 $self->{'sex'} = 'male';
162             }
163 1         2 $self->{'day'} = $3;
164 1         2 $self->{'serial'} = $4;
165 1         2 $self->{'checksum'} = '-';
166 1 50       4 if ($self->{'year'} <= 1953) {
167 0         0 $self->{'validity'} = 1;
168             } else {
169 1         3 $self->{'error'} = "Format of rc identification ".
170             "hasn't checksum.";
171 1         3 $self->{'validity'} = 0;
172             }
173 1         1 $self->{'alternate'} = 0;
174              
175             # Not valid.
176             } else {
177 5         67 $self->{'alternate'} = '-';
178 5         14 $self->{'checksum'} = '-';
179 5         12 $self->{'year'} = '-';
180 5         32 $self->{'month'} = '-';
181 5         13 $self->{'day'} = '-';
182 5         10 $self->{'serial'} = '-';
183 5         15 $self->{'sex'} = '-';
184 5         13 $self->{'error'} = "Format of rc identification isn't valid.";
185 5         11 $self->{'validity'} = 0;
186             }
187              
188             # Check date.
189 15 100       84 if ($self->{'validity'}) {
190 8         11 eval {
191 8         68 DateTime->new(
192             'year' => $self->{'year'},
193             'month' => $self->{'month'},
194             'day' => $self->{'day'},
195             );
196             };
197 8 100       2491 if ($EVAL_ERROR) {
198 1         2 $self->{'error'} = "Date isn't valid.";
199 1         2 $self->{'validity'} = 0;
200             }
201             }
202              
203 15         26 return;
204             }
205              
206             1;
207              
208             __END__