From 249b651692dfe6ab1afd6097a380e0cc65b5519c Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 23 Feb 2026 14:46:11 +0100 Subject: [PATCH] fix: treat archived TickTick tasks as done during import TickTick uses status "2" (Archived) for completed tasks that were subsequently archived. The import only checked for status "1" (Completed), causing archived tasks to be imported as open despite having a completion timestamp. Closes go-vikunja/vikunja#2278 --- pkg/modules/migration/ticktick/ticktick.go | 2 +- .../migration/ticktick/ticktick_test.go | 30 ++++++++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/pkg/modules/migration/ticktick/ticktick.go b/pkg/modules/migration/ticktick/ticktick.go index 6984ed5d7..04772ede4 100644 --- a/pkg/modules/migration/ticktick/ticktick.go +++ b/pkg/modules/migration/ticktick/ticktick.go @@ -118,7 +118,7 @@ func convertTickTickToVikunja(tasks []*tickTickTask) (result []*models.ProjectWi StartDate: t.StartDate.Time, EndDate: t.DueDate.Time, DueDate: t.DueDate.Time, - Done: t.Status == "1", + Done: t.Status == "1" || t.Status == "2", DoneAt: t.CompletedTime.Time, Position: t.Order, Labels: labels, diff --git a/pkg/modules/migration/ticktick/ticktick_test.go b/pkg/modules/migration/ticktick/ticktick_test.go index aa8c3015e..937f3e559 100644 --- a/pkg/modules/migration/ticktick/ticktick_test.go +++ b/pkg/modules/migration/ticktick/ticktick_test.go @@ -82,12 +82,21 @@ func TestConvertTicktickTasksToVikunja(t *testing.T) { Order: -109951627776, }, { - TaskID: 4, + TaskID: 4, + ParentID: 0, + ProjectName: "Project 1", + Title: "Test task 4 - archived", + Status: "2", + CompletedTime: time3, + Order: -109951627777, + }, + { + TaskID: 5, ParentID: 0, ProjectName: "Project 2", - Title: "Test task 4", + Title: "Test task 5", Status: "0", - Order: -109951627777, + Order: -109951627778, }, } @@ -98,7 +107,7 @@ func TestConvertTicktickTasksToVikunja(t *testing.T) { assert.Equal(t, vikunjaTasks[1].ParentProjectID, vikunjaTasks[0].ID) assert.Equal(t, vikunjaTasks[2].ParentProjectID, vikunjaTasks[0].ID) - assert.Len(t, vikunjaTasks[1].Tasks, 3) + assert.Len(t, vikunjaTasks[1].Tasks, 4) assert.Equal(t, vikunjaTasks[1].Title, tickTickTasks[0].ProjectName) assert.Equal(t, vikunjaTasks[1].Tasks[0].Title, tickTickTasks[0].Title) @@ -142,11 +151,16 @@ func TestConvertTicktickTasksToVikunja(t *testing.T) { assert.Equal(t, vikunjaTasks[1].Tasks[2].Position, tickTickTasks[2].Order) assert.False(t, vikunjaTasks[1].Tasks[2].Done) - assert.Len(t, vikunjaTasks[2].Tasks, 1) - assert.Equal(t, vikunjaTasks[2].Title, tickTickTasks[3].ProjectName) + assert.Equal(t, vikunjaTasks[1].Tasks[3].Title, tickTickTasks[3].Title) + assert.Equal(t, vikunjaTasks[1].Tasks[3].Position, tickTickTasks[3].Order) + assert.True(t, vikunjaTasks[1].Tasks[3].Done) + assert.Equal(t, vikunjaTasks[1].Tasks[3].DoneAt, tickTickTasks[3].CompletedTime.Time) - assert.Equal(t, vikunjaTasks[2].Tasks[0].Title, tickTickTasks[3].Title) - assert.Equal(t, vikunjaTasks[2].Tasks[0].Position, tickTickTasks[3].Order) + assert.Len(t, vikunjaTasks[2].Tasks, 1) + assert.Equal(t, vikunjaTasks[2].Title, tickTickTasks[4].ProjectName) + + assert.Equal(t, vikunjaTasks[2].Tasks[0].Title, tickTickTasks[4].Title) + assert.Equal(t, vikunjaTasks[2].Tasks[0].Position, tickTickTasks[4].Order) } func TestLinesToSkipBeforeHeader(t *testing.T) {