From 983c2af2efd4cac40fbc2f7cb29dd5f3dc3aecbf Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Wed, 13 Nov 2024 16:48:37 +0100
Subject: [PATCH] clean up orphaned entries, fixes #75 and #77

---
 migrations/007_cleanup_timesheets.php   | 39 +++++++++++++++++++++++++
 models/StundenzettelContract.class.php  |  6 ++++
 models/StundenzettelRecord.class.php    |  3 +-
 models/StundenzettelTimesheet.class.php |  6 ++++
 4 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 migrations/007_cleanup_timesheets.php

diff --git a/migrations/007_cleanup_timesheets.php b/migrations/007_cleanup_timesheets.php
new file mode 100644
index 0000000..01d6f74
--- /dev/null
+++ b/migrations/007_cleanup_timesheets.php
@@ -0,0 +1,39 @@
+<?php
+
+class CleanupTimesheets extends Migration
+{
+    public function description()
+    {
+        return 'remove orphaned entries from stundenzettel_timesheets';
+    }
+
+    public function up()
+    {
+        $db = DBManager::get();
+
+        $sql = 'ALTER TABLE stundenzettel_contracts ADD KEY inst_id (inst_id)';
+        $db->exec($sql);
+
+        $sql = 'ALTER TABLE stundenzettel_timesheets ADD KEY contract_id (contract_id)';
+        $db->exec($sql);
+
+        $sql = 'DELETE FROM stundenzettel_timesheets
+                WHERE contract_id NOT IN (SELECT id FROM stundenzettel_contracts)';
+        $db->exec($sql);
+
+        $sql = 'DELETE FROM stundenzettel_records
+                WHERE timesheet_id NOT IN (SELECT id FROM stundenzettel_timesheets)';
+        $db->exec($sql);
+    }
+
+    public function down()
+    {
+        $db = DBManager::get();
+
+        $sql = 'ALTER TABLE stundenzettel_contracts DROP KEY inst_id';
+        $db->exec($sql);
+
+        $sql = 'ALTER TABLE stundenzettel_timesheets DROP KEY contract_id';
+        $db->exec($sql);
+    }
+}
diff --git a/models/StundenzettelContract.class.php b/models/StundenzettelContract.class.php
index 7237488..7900eea 100644
--- a/models/StundenzettelContract.class.php
+++ b/models/StundenzettelContract.class.php
@@ -36,6 +36,12 @@ class StundenzettelContract extends \SimpleORMap
             'foreign_key' => 'inst_id'
         ];
 
+        $config['has_many']['timesheets'] = [
+            'class_name'        => 'StundenzettelTimesheet',
+            'assoc_foreign_key' => 'contract_id',
+            'on_delete'         => 'delete'
+        ];
+
         $config['additional_fields']['default_workday_time']['get'] = function ($item) {
             $workday_hours = $item->contract_hours / 4.348 / 5;
             $hours = floor($workday_hours);
diff --git a/models/StundenzettelRecord.class.php b/models/StundenzettelRecord.class.php
index fa13dc8..74a8553 100644
--- a/models/StundenzettelRecord.class.php
+++ b/models/StundenzettelRecord.class.php
@@ -26,7 +26,8 @@ class StundenzettelRecord extends \SimpleORMap
 
         $config['belongs_to']['timesheet'] = [
             'class_name'  => 'StundenzettelTimesheet',
-            'foreign_key' => 'timesheet_id',];
+            'foreign_key' => 'timesheet_id'
+        ];
 
         $config['registered_callbacks']['before_store'][] = 'before_store';
 
diff --git a/models/StundenzettelTimesheet.class.php b/models/StundenzettelTimesheet.class.php
index a988f3c..b452db3 100644
--- a/models/StundenzettelTimesheet.class.php
+++ b/models/StundenzettelTimesheet.class.php
@@ -29,6 +29,12 @@ class StundenzettelTimesheet extends \SimpleORMap
             'foreign_key' => 'approver_id'
         ];
 
+        $config['has_many']['records'] = [
+            'class_name'        => 'StundenzettelRecord',
+            'assoc_foreign_key' => 'timesheet_id',
+            'on_delete'         => 'delete'
+        ];
+
         $config['additional_fields']['timesheet_balance']['get'] = function ($item) {
             if ($item->month_completed) {
                 return $item->sum - ($item->contract->contract_hours * 3600);
-- 
GitLab