64 |
|
|
65 |
column hrEduPersonUniqueNumber => |
column hrEduPersonUniqueNumber => |
66 |
# is mandatory, |
# is mandatory, |
67 |
label is _('JMBG'); |
label is _('Unique number'); |
68 |
|
|
69 |
column hrEduPersonDateOfBirth => |
column hrEduPersonDateOfBirth => |
70 |
type is 'date', |
type is 'date', |
341 |
return ( 1, 'OK' ); |
return ( 1, 'OK' ); |
342 |
} |
} |
343 |
|
|
344 |
|
=head2 hrEduPersonUniqueNumber |
345 |
|
|
346 |
|
Check if JMBG is valid |
347 |
|
|
348 |
|
=cut |
349 |
|
|
350 |
|
sub validate_hrEduPersonUniqueNumber { |
351 |
|
my ( $self, $value ) = @_; |
352 |
|
|
353 |
|
if ( $value =~ m/^JMBG:\s+(\d+)$/ ) { |
354 |
|
|
355 |
|
my $jmbg = $1; |
356 |
|
|
357 |
|
return ( 0, _('JMBG must have 13 digits') ) unless length($jmbg) == 13; |
358 |
|
|
359 |
|
sub digit_at { |
360 |
|
my ($jmbg,$pos) = @_; |
361 |
|
return ord(substr($jmbg,$pos,1)) - ord('0'); |
362 |
|
} |
363 |
|
|
364 |
|
my $sum; |
365 |
|
my $fact = 7; |
366 |
|
|
367 |
|
foreach my $i ( 0 .. 11 ) { |
368 |
|
my $c = digit_at( $jmbg, $i ); |
369 |
|
$sum += $c * $fact; |
370 |
|
# warn "## $c * $fact => $sum\n"; |
371 |
|
$fact--; |
372 |
|
$fact = 7 if $fact == 1; |
373 |
|
} |
374 |
|
|
375 |
|
my $ost = $sum % 11; |
376 |
|
$ost = 11 - $ost if $ost > 1; |
377 |
|
|
378 |
|
return ( 0, _("JMBG is invalid") ) if $ost != digit_at( $jmbg, 12 ); |
379 |
|
} |
380 |
|
|
381 |
|
return ( 1, 'OK' ); |
382 |
|
} |
383 |
|
|
384 |
=head2 canonicalize_hrEduPersonExpireDate |
=head2 canonicalize_hrEduPersonExpireDate |
385 |
|
|
386 |
Support NONE as 2042-12-30 |
Support NONE as 2042-12-30 |
390 |
sub canonicalize_hrEduPersonExpireDate { |
sub canonicalize_hrEduPersonExpireDate { |
391 |
my ( $self, $value ) = @_; |
my ( $self, $value ) = @_; |
392 |
|
|
393 |
if ( $value eq 'NONE' ) { |
if ( lc($value) eq 'none' ) { |
394 |
$self->log->warn("fixed hrEduPersonExpireDate"); |
$self->log->warn("fixed hrEduPersonExpireDate"); |
395 |
$value = '2042-12-30'; |
$value = '2042-12-30'; |
396 |
} |
} |