From 04da51b3e4ad48c2c7143edf17aa709a3c2ac17e Mon Sep 17 00:00:00 2001
From: Andreas Romeyke <andreas.romeyke@slub-dresden.de>
Date: Thu, 3 Apr 2025 13:24:19 +0200
Subject: [PATCH] - bugfix, handling of delete/purge events using extended
 sorting

---
 perl/exit_strategy.pl | 41 ++++++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/perl/exit_strategy.pl b/perl/exit_strategy.pl
index 603dae0..f8cce7f 100644
--- a/perl/exit_strategy.pl
+++ b/perl/exit_strategy.pl
@@ -616,23 +616,30 @@ sub check_if_file_is_readable($filename) {
 
 sub _handle_deleted_or_purged_aips($xp, $ret) {
   my $amdsec_ie = $xp->findnodes($compiled_xpath_amdSec_ie)->[0];
-  my $latest_ctx = (
-      sort {
-        my $adate = get_anydelete_date($xp, $a);
-        my $bdate = get_anydelete_date($xp, $b);
-        $bdate cmp $adate
-      } $xp->findnodes($xpath_if_anydelete_event_expr, $amdsec_ie)
-  )[0]; # first element of list
-  my $is_deleted = has_anydelete_entries($xp, $latest_ctx);
-  if ($is_deleted) {
-    my $state = get_anydelete_state($xp, $latest_ctx);
-    $ret->{$state}->{state} = $state;
-    $ret->{$state}->{reason} = get_anydelete_reason($xp, $latest_ctx);
-    $ret->{$state}->{note} = get_anydelete_note($xp, $latest_ctx);
-    $ret->{$state}->{date} = get_anydelete_date($xp, $latest_ctx);
-    $ret->{$state}->{authorized_by} = get_anydelete_authorized_by($xp, $latest_ctx);
-  }
-  return $is_deleted;
+  my @ctxs = $xp->findnodes($xpath_if_anydelete_event_expr, $amdsec_ie);
+  my $cmp_by_date_and_state = sub ($a, $b) {
+    my $adate = get_anydelete_date($xp, $a);
+    my $bdate = get_anydelete_date($xp, $b);
+    my $dateres = $bdate cmp $adate;
+    if (0 == $dateres) {
+      my $astate = get_anydelete_state($xp, $a);
+      my $bstate = get_anydelete_state($xp, $b);
+      return $bstate cmp $astate # "purged" > "delete"
+    }
+    return $dateres; # newer > older
+  };
+  my $latest_ctx = (sort { $cmp_by_date_and_state->($a, $b) } @ctxs)[0];
+  # check if latest entry is either deleted or purged, only than add entry
+  my $is_deleted_or_purged = has_anydelete_entries($xp, $latest_ctx);
+  if ($is_deleted_or_purged) {
+      my $state = get_anydelete_state($xp, $latest_ctx);
+      $ret->{$state}->{state} = $state;
+      $ret->{$state}->{reason} = get_anydelete_reason($xp, $latest_ctx);
+      $ret->{$state}->{note} = get_anydelete_note($xp, $latest_ctx);
+      $ret->{$state}->{date} = get_anydelete_date($xp, $latest_ctx);
+      $ret->{$state}->{authorized_by} = get_anydelete_authorized_by($xp, $latest_ctx);
+    }
+  return $is_deleted_or_purged;
 }
 
 sub parse_iexml($filename, $recovery_flag) {
-- 
GitLab