2019-10-04 11:14:11 +02:00
ALTER TABLE chores
ADD period_interval INTEGER NOT NULL DEFAULT 1 CHECK ( period_interval > 0 );
DROP VIEW chores_current ;
CREATE VIEW chores_current
AS
SELECT
x . chore_id ,
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 ,
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
CASE
WHEN period_config LIKE '%sunday%' THEN DATETIME ( IFNULL ( MAX ( l . tracked_time ), DATETIME ( 'now' , 'localtime' )), '1 days' , '+' || CAST (( h . period_interval - 1 ) * 7 AS TEXT ) || ' days' , 'weekday 0' )
WHEN period_config LIKE '%monday%' THEN DATETIME ( IFNULL ( MAX ( l . tracked_time ), DATETIME ( 'now' , 'localtime' )), '1 days' , '+' || CAST (( h . period_interval - 1 ) * 7 AS TEXT ) || ' days' , 'weekday 1' )
WHEN period_config LIKE '%tuesday%' THEN DATETIME ( IFNULL ( MAX ( l . tracked_time ), DATETIME ( 'now' , 'localtime' )), '1 days' , '+' || CAST (( h . period_interval - 1 ) * 7 AS TEXT ) || ' days' , 'weekday 2' )
WHEN period_config LIKE '%wednesday%' THEN DATETIME ( IFNULL ( MAX ( l . tracked_time ), DATETIME ( 'now' , 'localtime' )), '1 days' , '+' || CAST (( h . period_interval - 1 ) * 7 AS TEXT ) || ' days' , 'weekday 3' )
WHEN period_config LIKE '%thursday%' THEN DATETIME ( IFNULL ( MAX ( l . tracked_time ), DATETIME ( 'now' , 'localtime' )), '1 days' , '+' || CAST (( h . period_interval - 1 ) * 7 AS TEXT ) || ' days' , 'weekday 4' )
WHEN period_config LIKE '%friday%' THEN DATETIME ( IFNULL ( MAX ( l . tracked_time ), DATETIME ( 'now' , 'localtime' )), '1 days' , '+' || CAST (( h . period_interval - 1 ) * 7 AS TEXT ) || ' days' , 'weekday 5' )
WHEN period_config LIKE '%saturday%' THEN DATETIME ( IFNULL ( MAX ( l . tracked_time ), DATETIME ( 'now' , 'localtime' )), '1 days' , '+' || CAST (( h . period_interval - 1 ) * 7 AS TEXT ) || ' days' , 'weekday 6' )
END
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' )
2019-10-04 11:24:51 +02:00
WHEN 'yearly' THEN DATETIME ( IFNULL ( MAX ( l . tracked_time ), DATETIME ( 'now' , 'localtime' )), '+' || CAST ( h . period_interval AS TEXT ) || ' years' )
2019-10-04 11:14:11 +02:00
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 . period_days
) x ;