diff --git a/migrations/0114.sql b/migrations/0114.sql index 25f1bf53..b4b19351 100644 --- a/migrations/0114.sql +++ b/migrations/0114.sql @@ -1,22 +1,92 @@ CREATE VIEW users_dto AS -SELECT id, - username, - first_name, - last_name, - row_created_timestamp, - (CASE - WHEN first_name = '' AND last_name != '' THEN last_name - WHEN last_name = '' AND first_name != '' THEN first_name - WHEN last_name != '' AND first_name != '' THEN first_name + ' ' + last_name - ELSE username - END - ) AS display_name +SELECT + id, + username, + first_name, + last_name, + row_created_timestamp, + (CASE + WHEN IFNULL(first_name, '') = '' AND IFNULL(last_name, '') != '' THEN last_name + WHEN IFNULL(last_name, '') = '' AND IFNULL(first_name, '') != '' THEN first_name + WHEN IFNULL(last_name, '') != '' AND IFNULL(first_name, '') != '' THEN first_name + ' ' + last_name + ELSE username + END + ) AS display_name FROM users; -CREATE VIEW uihelper_chores_current AS -SELECT chores_current.*, chores.name AS chore_name -from chores_current - join chores on chores_current.chore_id = chores.id; -CREATE VIEW uihelper_batteries_current AS - SELECT battery_id AS id, * FROM batteries_current; +DROP VIEW chores_current; +CREATE VIEW chores_current +AS +SELECT + x.chore_id AS id, -- Dummy, LessQL needs an id column + x.chore_id, + x.chore_name, + x.last_tracked_time, + CASE WHEN x.rollover = 1 AND DATETIME('now', 'localtime') > x.next_estimated_execution_time THEN + DATETIME(STRFTIME('%Y-%m-%d', DATETIME('now', 'localtime')) || ' ' || STRFTIME('%H:%M:%S', x.next_estimated_execution_time)) + ELSE + x.next_estimated_execution_time + END AS next_estimated_execution_time, + x.track_date_only, + x.next_execution_assigned_to_user_id +FROM ( + +SELECT + h.id AS chore_id, + h.name AS chore_name, + MAX(l.tracked_time) AS last_tracked_time, + CASE h.period_type + WHEN 'manually' THEN '2999-12-31 23:59:59' + WHEN 'dynamic-regular' THEN DATETIME(MAX(l.tracked_time), '+' || CAST(h.period_days AS TEXT) || ' day') + WHEN 'daily' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' day') + WHEN 'weekly' THEN ( + SELECT next + FROM ( + SELECT 'sunday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 0') AS next + UNION + SELECT 'monday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 1') AS next + UNION + SELECT 'tuesday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 2') AS next + UNION + SELECT 'wednesday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 3') AS next + UNION + SELECT 'thursday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 4') AS next + UNION + SELECT 'friday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 5') AS next + UNION + SELECT 'saturday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 6') AS next + ) + WHERE INSTR(period_config, day) > 0 + ORDER BY next + LIMIT 1 + ) + WHEN 'monthly' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' month', 'start of month', '+' || CAST(h.period_days - 1 AS TEXT) || ' day') + WHEN 'yearly' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' years') + END AS next_estimated_execution_time, + h.track_date_only, + h.rollover, + h.next_execution_assigned_to_user_id +FROM chores h +LEFT JOIN chores_log l + ON h.id = l.chore_id + AND l.undone = 0 +GROUP BY h.id, h.name, h.period_days + +) x; + +DROP VIEW batteries_current; +CREATE VIEW batteries_current +AS +SELECT + b.id, -- Dummy, LessQL needs an id column + b.id AS battery_id, + MAX(l.tracked_time) AS last_tracked_time, + CASE WHEN b.charge_interval_days = 0 + THEN '2999-12-31 23:59:59' + ELSE datetime(MAX(l.tracked_time), '+' || CAST(b.charge_interval_days AS TEXT) || ' day') + END AS next_estimated_charge_time +FROM batteries b +LEFT JOIN battery_charge_cycles l + ON b.id = l.battery_id +GROUP BY b.id, b.charge_interval_days; diff --git a/services/BatteriesService.php b/services/BatteriesService.php index f6157bdc..62ee2042 100644 --- a/services/BatteriesService.php +++ b/services/BatteriesService.php @@ -26,7 +26,7 @@ class BatteriesService extends BaseService public function GetCurrent() { - return $this->getDatabase()->uihelper_batteries_current(); + return $this->getDatabase()->batteries_current(); } public function TrackChargeCycle(int $batteryId, string $trackedTime) diff --git a/services/ChoresService.php b/services/ChoresService.php index bd7387b2..ddd485e3 100644 --- a/services/ChoresService.php +++ b/services/ChoresService.php @@ -152,7 +152,7 @@ class ChoresService extends BaseService public function GetCurrent() { - return $this->getDatabase()->uihelper_chores_current(); + return $this->getDatabase()->chores_current(); } public function TrackChore(int $choreId, string $trackedTime, $doneBy = GROCY_USER_ID)