+}
+
+# ILL module checks
+if ( C4::Context->preference('ILLModule') ) {
+ my $warnILLConfiguration = 0;
+ my $ill_config_from_file = C4::Context->config("interlibrary_loans");
+ my $ill_config = Koha::Illrequest::Config->new;
+
+ my $available_ill_backends =
+ ( scalar @{ $ill_config->available_backends } > 0 );
+
+ # Check backends
+ if ( !$available_ill_backends ) {
+ $template->param( no_ill_backends => 1 );
+ $warnILLConfiguration = 1;
+ }
+
+ # Check partner_code
+ if ( !Koha::Patron::Categories->find($ill_config->partner_code) ) {
+ $template->param( ill_partner_code_doesnt_exist => $ill_config->partner_code );
+ $warnILLConfiguration = 1;
+ }
+
+ if ( !$ill_config_from_file->{partner_code} ) {
+ # partner code not defined
+ $template->param( ill_partner_code_not_defined => 1 );
+ $warnILLConfiguration = 1;
+ }
+
+
+ if ( !$ill_config_from_file->{branch} ) {
+ # branch not defined
+ $template->param( ill_branch_not_defined => 1 );
+ $warnILLConfiguration = 1;
+ }
+
+ $template->param( warnILLConfiguration => $warnILLConfiguration );
+}
+
+if ( C4::Context->preference('SearchEngine') eq 'Elasticsearch' ) {
+ # Check ES configuration health and runtime status
+
+ my $es_status;
+ my $es_config_error;
+ my $es_running = 1;
+
+ my $es_conf;
+ try {
+ $es_conf = Koha::SearchEngine::Elasticsearch::_read_configuration();
+ }
+ catch {
+ if ( ref($_) eq 'Koha::Exceptions::Config::MissingEntry' ) {
+ $template->param( elasticsearch_fatal_config_error => $_->message );
+ $es_config_error = 1;
+ }
+ };
+ if ( !$es_config_error ) {
+
+ my $biblios_index_name = $es_conf->{index_name} . "_" . $Koha::SearchEngine::BIBLIOS_INDEX;
+ my $authorities_index_name = $es_conf->{index_name} . "_" . $Koha::SearchEngine::AUTHORITIES_INDEX;
+
+ my @indexes = ($biblios_index_name, $authorities_index_name);
+ # TODO: When new indexes get added, we could have other ways to
+ # fetch the list of available indexes (e.g. plugins, etc)
+ $es_status->{nodes} = $es_conf->{nodes};
+ my $es = Search::Elasticsearch->new({ nodes => $es_conf->{nodes} });
+
+ foreach my $index ( @indexes ) {
+ my $count;
+ try {
+ $count = $es->indices->stats( index => $index )
+ ->{_all}{primaries}{docs}{count};
+ }
+ catch {
+ if ( ref($_) eq 'Search::Elasticsearch::Error::Missing' ) {
+ push @{ $es_status->{errors} }, "Index not found ($index)";
+ $count = -1;
+ }
+ elsif ( ref($_) eq 'Search::Elasticsearch::Error::NoNodes' ) {
+ $es_running = 0;
+ }
+ else {
+ # TODO: when time comes, we will cover more use cases
+ die $_;
+ }
+ };
+
+ push @{ $es_status->{indexes} },
+ {
+ index_name => $index,
+ count => $count
+ };
+ }
+ $es_status->{running} = $es_running;
+
+ $template->param( elasticsearch_status => $es_status );
+ }
+}
+
+if ( C4::Context->preference('RESTOAuth2ClientCredentials') ) {
+ # Do we have the required deps?
+ unless ( can_load( modules => { 'Net::OAuth2::AuthorizationServer' => undef }) ) {
+ $template->param( oauth2_missing_deps => 1 );
+ }
+}
+
+# Sco Patron should not contain any other perms than circulate => self_checkout
+if ( C4::Context->preference('WebBasedSelfCheck')
+ and C4::Context->preference('AutoSelfCheckAllowed')
+) {
+ my $userid = C4::Context->preference('AutoSelfCheckID');
+ my $all_permissions = C4::Auth::get_user_subpermissions( $userid );
+ my ( $has_self_checkout_perm, $has_other_permissions );
+ while ( my ( $module, $permissions ) = each %$all_permissions ) {
+ if ( $module eq 'self_check' ) {
+ while ( my ( $permission, $flag ) = each %$permissions ) {
+ if ( $permission eq 'self_checkout_module' ) {
+ $has_self_checkout_perm = 1;
+ } else {
+ $has_other_permissions = 1;
+ }
+ }
+ } else {
+ $has_other_permissions = 1;
+ }
+ }
+ $template->param(
+ AutoSelfCheckPatronDoesNotHaveSelfCheckPerm => not ( $has_self_checkout_perm ),
+ AutoSelfCheckPatronHasTooManyPerm => $has_other_permissions,
+ );
+}
+
+# Test YAML system preferences
+# FIXME: This is list of current YAML formatted prefs, should by type of preference
+my @yaml_prefs = (
+ "UpdateNotForLoanStatusOnCheckin",
+ "OpacHiddenItems",
+ "BibtexExportAdditionalFields",
+ "RisExportAdditionalFields",
+ "UpdateItemWhenLostFromHoldList",
+ "MarcFieldsToOrder",
+ "MarcItemFieldsToOrder",
+ "UpdateitemLocationOnCheckin",
+ "ItemsDeniedRenewal"
+);
+my @bad_yaml_prefs;
+foreach my $syspref (@yaml_prefs) {
+ my $yaml = C4::Context->preference( $syspref );
+ if ( $yaml ) {
+ eval { YAML::Load( "$yaml\n\n" ); };
+ if ($@) {
+ push @bad_yaml_prefs, $syspref;
+ }
+ }
+}
+$template->param( 'bad_yaml_prefs' => \@bad_yaml_prefs ) if @bad_yaml_prefs;
+
+{
+ my $dbh = C4::Context->dbh;
+ my $patrons = $dbh->selectall_arrayref(
+ q|select b.borrowernumber from borrowers b join deletedborrowers db on b.borrowernumber=db.borrowernumber|,
+ { Slice => {} }
+ );
+ my $biblios = $dbh->selectall_arrayref(
+ q|select b.biblionumber from biblio b join deletedbiblio db on b.biblionumber=db.biblionumber|,
+ { Slice => {} }
+ );
+ my $items = $dbh->selectall_arrayref(
+ q|select i.itemnumber from items i join deleteditems di on i.itemnumber=di.itemnumber|,
+ { Slice => {} }
+ );
+ my $checkouts = $dbh->selectall_arrayref(
+ q|select i.issue_id from issues i join old_issues oi on i.issue_id=oi.issue_id|,
+ { Slice => {} }
+ );
+ my $holds = $dbh->selectall_arrayref(
+ q|select r.reserve_id from reserves r join old_reserves o on r.reserve_id=o.reserve_id|,
+ { Slice => {} }
+ );
+ if ( @$patrons or @$biblios or @$items or @$checkouts or @$holds ) {
+ $template->param(
+ has_ai_issues => 1,
+ ai_patrons => $patrons,
+ ai_biblios => $biblios,
+ ai_items => $items,
+ ai_checkouts => $checkouts,
+ ai_holds => $holds,
+ );