// Creates ScheduledTaskDefinitions table if not exists // Public endpoint for setup function apiAbort(required struct payload) { writeOutput(serializeJSON(payload)); abort; } try { // Create ScheduledTaskDefinitions table queryExecute(" CREATE TABLE IF NOT EXISTS ScheduledTaskDefinitions ( ScheduledTaskID INT AUTO_INCREMENT PRIMARY KEY, ScheduledTaskBusinessID INT NOT NULL, ScheduledTaskName VARCHAR(100) NOT NULL, ScheduledTaskCategoryID INT NULL, ScheduledTaskTypeID INT NULL, ScheduledTaskTitle VARCHAR(255) NOT NULL, ScheduledTaskDetails TEXT NULL, ScheduledTaskCronExpression VARCHAR(100) NOT NULL, ScheduledTaskScheduleType VARCHAR(20) DEFAULT 'cron', ScheduledTaskIntervalMinutes INT NULL, ScheduledTaskIsActive BIT(1) DEFAULT b'1', ScheduledTaskLastRunOn DATETIME NULL, ScheduledTaskNextRunOn DATETIME NULL, ScheduledTaskCreatedOn DATETIME DEFAULT CURRENT_TIMESTAMP, ScheduledTaskCreatedByUserID INT NULL, INDEX idx_business (ScheduledTaskBusinessID), INDEX idx_active_next (ScheduledTaskIsActive, ScheduledTaskNextRunOn) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ", [], { datasource: "payfrit" }); // Add new columns if they don't exist (for existing tables) try { queryExecute(" ALTER TABLE ScheduledTaskDefinitions ADD COLUMN ScheduledTaskScheduleType VARCHAR(20) DEFAULT 'cron' AFTER ScheduledTaskCronExpression ", [], { datasource: "payfrit" }); } catch (any e) { // Column likely already exists } try { queryExecute(" ALTER TABLE ScheduledTaskDefinitions ADD COLUMN ScheduledTaskIntervalMinutes INT NULL AFTER ScheduledTaskScheduleType ", [], { datasource: "payfrit" }); } catch (any e) { // Column likely already exists } apiAbort({ "OK": true, "MESSAGE": "ScheduledTaskDefinitions table created/verified with interval support" }); } catch (any e) { apiAbort({ "OK": false, "ERROR": "server_error", "MESSAGE": e.message }); }