Index: src/main/java/com/db/finki/www/build_board/DemoApplication.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/DemoApplication.java	(revision 2d8568267783d8ee6988430f8e43a3e027311558)
+++ src/main/java/com/db/finki/www/build_board/DemoApplication.java	(revision dee9e0e8b4a8609d9bdc173c4c160a756a79c385)
@@ -4,8 +4,10 @@
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
 
 @SpringBootApplication
+@EnableScheduling
 public class DemoApplication {
 
Index: src/main/java/com/db/finki/www/build_board/config/CronJob.java
===================================================================
--- src/main/java/com/db/finki/www/build_board/config/CronJob.java	(revision dee9e0e8b4a8609d9bdc173c4c160a756a79c385)
+++ src/main/java/com/db/finki/www/build_board/config/CronJob.java	(revision dee9e0e8b4a8609d9bdc173c4c160a756a79c385)
@@ -0,0 +1,31 @@
+package com.db.finki.www.build_board.config;
+
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.transaction.Transactional;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CronJob {
+
+    @PersistenceContext
+    private EntityManager em;
+
+    //    @Scheduled(cron = "0 * * * * ?")
+    @Transactional
+    @Scheduled(cron = "0 0 0 1 * ?")
+    public void markRejectedPendingPrRequests() {
+        em
+                .createNativeQuery("CALL mark_denied_pr_requests_older_than_1month();")
+                .executeUpdate();
+    }
+
+    @Transactional
+    @Scheduled(cron = "0 0 0 1 * ?")
+    public void markRejectedPendingReports() {
+        em
+                .createNativeQuery("CALL mark_denied_reports_older_than_1month();")
+                .executeUpdate();
+    }
+}
Index: src/main/resources/db/migration/V4__procedures.sql
===================================================================
--- src/main/resources/db/migration/V4__procedures.sql	(revision dee9e0e8b4a8609d9bdc173c4c160a756a79c385)
+++ src/main/resources/db/migration/V4__procedures.sql	(revision dee9e0e8b4a8609d9bdc173c4c160a756a79c385)
@@ -0,0 +1,80 @@
+CREATE OR REPLACE PROCEDURE mark_denied_reports_older_than_1month()
+LANGUAGE plpgsql
+AS $$
+DECLARE
+    older_reports RECORD;
+    user_id int;
+BEGIN
+    FOR older_reports IN
+        SELECT
+            r.id AS submission_id,
+            r.thread_id as topic
+        FROM report r
+                 JOIN submission s ON s.id = r.id
+        WHERE s.status = 'PENDING' and now() - s.created_at >= INTERVAL '1 month'
+    LOOP
+        BEGIN
+            UPDATE submission
+            SET status = 'DENIED'
+            WHERE id = older_reports.submission_id;
+
+            select u.id
+            into user_id
+            from thread t
+            join users u
+            on t.user_id = u.id
+            where t.id = older_reports.thread_id;
+
+
+            INSERT INTO feedback(description, submission_type, created_at, submission_id, created_by)
+            VALUES (
+                       'Stale report. Closing due to inactivity.',
+                       'R',
+                       now(),
+                       older_reports.submission_id,
+                       user_id
+                   );
+        END;
+    END LOOP;
+END;
+$$;
+
+CREATE OR REPLACE PROCEDURE mark_denied_pr_requests_older_than_1month()
+LANGUAGE plpgsql
+AS $$
+DECLARE
+older_reports RECORD;
+user_id int;
+BEGIN
+    FOR older_reports IN
+        SELECT
+            pr.id AS submission_id,
+            pr.project_id as thread_id
+        FROM project_request pr
+                 JOIN submission s ON s.id = pr.id
+        WHERE s.status = 'PENDING' and now() - s.created_at >= INTERVAL '1 month'
+            LOOP
+        BEGIN
+            UPDATE submission
+            SET status = 'DENIED'
+            WHERE id = older_reports.submission_id;
+
+            select u.id
+            into user_id
+            from thread t
+                     join users u
+                          on t.user_id = u.id
+            where older_reports.thread_id = t.id;
+
+            INSERT INTO feedback(description, submission_type, created_at, submission_id, created_by)
+            VALUES (
+                       'Stale report. Closing due to inactivity.',
+                       'P',
+                       now(),
+                       older_reports.submission_id,
+                       user_id
+                   );
+        END;
+    END LOOP;
+END;
+$$;
