App-CPRReporter
view release on metacpan or search on metacpan
lib/App/CPRReporter.pm view on Meta::CPAN
my $self = shift;
# Certificates are here
my $certificate_count = 0;
my $certs = $self->{_certificates};
foreach my $date ( sort keys %{$certs} ) {
foreach my $certuser ( @{ $certs->{$date} } ) {
my $fullname = $self->_resolve_name( $certuser->{familyname},
$certuser->{givenname} );
#say "Certificate found for $fullname";
$certificate_count++;
# TODO Check if certificate date is already filled in and of is it keep the most recent one.
# Might not be required because we sort the date keys.
if ( defined $self->{_employees}->{$fullname} ) {
# Fill in certificate
$self->{_employees}->{$fullname}->{cert} = $date;
} else {
lib/App/CPRReporter.pm view on Meta::CPAN
#carp "Warning: employee '$fullname' not found in employee database"
if ( ref($fullname) ) {
carp "Fullname is reference, this should not be the case!";
}
push( @{ $self->{_not_in_hr}->{cert} }, $fullname );
}
}
}
say "$certificate_count certificates found";
my $training_count = 0;
my $training = $self->{_training};
foreach my $traininguser ( @{$training} ) {
my $fullname = $self->_resolve_name( $traininguser->{familyname},
$traininguser->{givenname} );
#say "Training found for $fullname";
# TODO deduplicate this code with a local function, see above
if ( defined $self->{_employees}->{$fullname} ) {
# Fill in training if there is no certificate yet, otherwise notify!
if ( !defined $self->{_employees}->{$fullname}->{cert} ) {
$self->{_employees}->{$fullname}->{cert} = 'training';
$training_count++;
} else {
#carp "Warning: employee '$fullname' is both in training and has a certificate from $self->{_employees}->{$fullname}->{cert}";
}
} else {
# Oops: user not found in personel database
#carp "Warning: employee '$fullname' not found in employee database";
push( @{ $self->{_not_in_hr}->{training} }, $fullname );
$training_count++;
}
}
say "$training_count people are in training";
# Check people who are in training and that have a certificate
# now run the stats, for every dienst separately report
my $stats;
foreach my $employee ( keys %{$self->{_employees}} ) {
my $dienst = $self->{_employees}->{$employee}->{dienst};
my $cert = $self->{_employees}->{$employee}->{cert} || 'none';
my $course = $self->{_employees}->{$employee}->{course} || 'none';
$stats->{employee_count} += 1;
lib/App/CPRReporter.pm view on Meta::CPAN
if ( !( $course eq 'none' ) ) {
$stats->{$dienst}->{'course'}->{count} += 1;
}
}
#print Dumper($stats);
# Display the results
say "Dienst;Certificaat;Training;Niet gestart;Theorie";
foreach my $dienst ( sort keys %{$stats} ) {
next if ( $dienst eq 'employee_count' );
if ( !defined $stats->{$dienst}->{certified}->{count} ) {
$stats->{$dienst}->{certified}->{count} = 0;
}
if ( !defined $stats->{$dienst}->{training}->{count} ) {
$stats->{$dienst}->{training}->{count} = 0;
}
if ( !defined $stats->{$dienst}->{not_started}->{count} ) {
$stats->{$dienst}->{not_started}->{count} = 0;
}
if ( !defined $stats->{$dienst}->{course}->{count} ) {
$stats->{$dienst}->{course}->{count} = 0;
}
say "$dienst;"
. $stats->{$dienst}->{certified}->{count} . ";"
. $stats->{$dienst}->{training}->{count} . ";"
. $stats->{$dienst}->{not_started}->{count} . ";"
. $stats->{$dienst}->{course}->{count};
}
if ( defined $self->{_not_in_hr}->{cert} ) {
say "";
say "Not found in the HR database while parsing certificates: "
. scalar( @{ $self->{_not_in_hr}->{cert} } );
foreach ( @{ $self->{_not_in_hr}->{cert} } ) {
say;
}
}
if ( defined $self->{_not_in_hr}->{training} ) {
say "Not found in the HR database while parsing in training: "
. scalar( @{ $self->{_not_in_hr}->{training} } );
foreach ( @{ $self->{_not_in_hr}->{training} } ) {
say;
}
}
if ( defined $self->{_not_in_hr}->{theory} ) {
say "Not found in the HR database while parsing theory: "
. scalar( @{ $self->{_not_in_hr}->{theory} } );
foreach ( @{ $self->{_not_in_hr}->{theory} } ) {
say;
}
}
#say "";
#say "Resolved names";
#print Dumper($self->{_resolve});
}
# Parse the employee database to extract the names and the group they are in
sub _parse_employees {
my $self = shift;
#my $converter = Text::Iconv -> new ("utf-8", "windows-1251");
my $excel = Spreadsheet::XLSX->new( $self->{employees} );
lib/App/CPRReporter.pm view on Meta::CPAN
my $e_gname = $2;
if ( $e_fname =~ /$f_fname/ && $e_gname =~ /$f_gname/ ) {
$self->_fixlog( 'partial', $name, $employee );
return $employee;
}
}
}
# Report no match found
#say "No match in employee database for '$name'";
$self->{_resolve}->{nomatch} += 1;
return $name;
}
# Log resolved names so that they can be used for later reference
sub _fixlog {
my ( $self, $type, $original, $fixed ) = @_;
#say "$type match for '$original', replaced by '$fixed'";
$self->{_resolve}->{$type} += 1;
push(
@{ $self->{_resolve_list} },
{ $original => { fixed => $fixed, type => $type } }
);
}
# Speed up the Moose object construction
__PACKAGE__->meta->make_immutable;
( run in 0.723 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )