fix: fix some bugs
diff --git a/models/domainlayer/ticket/issue.go b/models/domainlayer/ticket/issue.go
index 9fcbf99..ec977d0 100644
--- a/models/domainlayer/ticket/issue.go
+++ b/models/domainlayer/ticket/issue.go
@@ -23,6 +23,7 @@
 	ParentIssueId           string
 	Priority                string
 	OriginalEstimateMinutes int64
+	TimeSpentMinutes        int64
 	TimeRemainingMinutes    int64
 	CreatorId               string
 	AssigneeId              string
diff --git a/plugins/jira/tasks/jira_issue_converter.go b/plugins/jira/tasks/jira_issue_converter.go
index bdc606c..6f51222 100644
--- a/plugins/jira/tasks/jira_issue_converter.go
+++ b/plugins/jira/tasks/jira_issue_converter.go
@@ -59,6 +59,7 @@
 			CreatedDate:             &jiraIssue.Created,
 			UpdatedDate:             &jiraIssue.Updated,
 			LeadTimeMinutes:         jiraIssue.LeadTimeMinutes,
+			TimeSpentMinutes:        jiraIssue.SpentMinutes,
 		}
 		if jiraIssue.AssigneeAccountId != "" {
 			issue.AssigneeId = userIdGen.Generate(sourceId, jiraIssue.AssigneeAccountId)
diff --git a/plugins/jira/tasks/jira_sprint_issues_converter.go b/plugins/jira/tasks/jira_sprint_issues_converter.go
index f65cabd..5a37a63 100644
--- a/plugins/jira/tasks/jira_sprint_issues_converter.go
+++ b/plugins/jira/tasks/jira_sprint_issues_converter.go
@@ -18,6 +18,7 @@
 type SprintIssuesConverter struct {
 	sprintIdGen    *didgen.DomainIdGenerator
 	issueIdGen     *didgen.DomainIdGenerator
+	userIdGen      *didgen.DomainIdGenerator
 	sprints        map[string]*models.JiraSprint
 	sprintIssue    map[string]*ticket.SprintIssue
 	status         map[string]*ticket.IssueStatusHistory
@@ -29,6 +30,7 @@
 	return &SprintIssuesConverter{
 		sprintIdGen:    didgen.NewDomainIdGenerator(&models.JiraSprint{}),
 		issueIdGen:     didgen.NewDomainIdGenerator(&models.JiraIssue{}),
+		userIdGen:      didgen.NewDomainIdGenerator(&models.JiraUser{}),
 		sprints:        make(map[string]*models.JiraSprint),
 		sprintIssue:    make(map[string]*ticket.SprintIssue),
 		status:         make(map[string]*ticket.IssueStatusHistory),
@@ -157,6 +159,7 @@
 	if item, ok := c.sprintIssue[key]; ok {
 		if item != nil && (item.RemovedDate == nil || item.RemovedDate != nil && item.RemovedDate.Before(cl.Created)) {
 			item.RemovedDate = &cl.Created
+			item.IsRemoved = true
 		}
 	} else {
 		c.sprintIssue[key] = &ticket.SprintIssue{
@@ -164,6 +167,7 @@
 			IssueId:     c.issueIdGen.Generate(sourceId, cl.IssueId),
 			AddedDate:   nil,
 			RemovedDate: &cl.Created,
+			IsRemoved:   true,
 		}
 	}
 	k := fmt.Sprintf("%d:%d", sprintId, cl.IssueId)
@@ -186,20 +190,23 @@
 			item.AddedStage, _ = c.getStage(cl.Created, sourceId, sprintId)
 		}
 	} else {
+		addedStage, _ := c.getStage(cl.Created, sourceId, sprintId)
 		c.sprintIssue[key] = &ticket.SprintIssue{
 			SprintId:    domainSprintId,
 			IssueId:     c.issueIdGen.Generate(sourceId, cl.IssueId),
 			AddedDate:   &cl.Created,
+			AddedStage:  addedStage,
 			RemovedDate: nil,
 		}
 		c.sprintIssue[key].AddedStage, _ = c.getStage(cl.Created, sourceId, sprintId)
 	}
 	k := fmt.Sprintf("%d:%d", sprintId, cl.IssueId)
+	now := time.Now()
 	c.sprintsHistory[k] = &ticket.IssueSprintsHistory{
 		IssueId:   c.issueIdGen.Generate(sourceId, cl.IssueId),
 		SprintId:  domainSprintId,
 		StartDate: cl.Created,
-		EndDate:   nil,
+		EndDate:   &now,
 	}
 	return nil
 }
@@ -243,16 +250,19 @@
 	issueId := c.issueIdGen.Generate(sourceId, cl.IssueId)
 	if statusHistory := c.status[issueId]; statusHistory != nil {
 		statusHistory.EndDate = &cl.Created
-		err := lakeModels.Db.Create(statusHistory).Error
-		if err != nil {
-			return err
-		}
 	}
+	now := time.Now()
 	c.status[issueId] = &ticket.IssueStatusHistory{
 		IssueId:   issueId,
 		Status:    cl.ToString,
 		StartDate: cl.Created,
-		EndDate:   nil,
+		EndDate:   &now,
+	}
+	err := lakeModels.Db.Clauses(clause.OnConflict{
+		UpdateAll: true,
+	}).Create(c.status[issueId]).Error
+	if err != nil {
+		return err
 	}
 	return nil
 }
@@ -261,16 +271,19 @@
 	issueId := c.issueIdGen.Generate(sourceId, cl.IssueId)
 	if assigneeHistory := c.assignee[issueId]; assigneeHistory != nil {
 		assigneeHistory.EndDate = &cl.Created
-		err := lakeModels.Db.Create(assigneeHistory).Error
-		if err != nil {
-			return err
-		}
 	}
+	now := time.Now()
 	c.assignee[issueId] = &ticket.IssueAssigneeHistory{
 		IssueId:   issueId,
-		Assignee:  cl.To,
+		Assignee:  c.userIdGen.Generate(sourceId, cl.To),
 		StartDate: cl.Created,
-		EndDate:   nil,
+		EndDate:   &now,
+	}
+	err := lakeModels.Db.Clauses(clause.OnConflict{
+		UpdateAll: true,
+	}).Create(c.assignee[issueId]).Error
+	if err != nil {
+		return err
 	}
 	return nil
 }
diff --git a/plugins/jira/tasks/jira_worklog_converter.go b/plugins/jira/tasks/jira_worklog_converter.go
index 8280b2b..78ddd9f 100644
--- a/plugins/jira/tasks/jira_worklog_converter.go
+++ b/plugins/jira/tasks/jira_worklog_converter.go
@@ -34,9 +34,11 @@
 			return err
 		}
 		worklog := &ticket.Worklog{
-			DomainEntity:domainlayer.DomainEntity{Id: worklogIdGen.Generate(jiraWorklog.SourceId, jiraWorklog.IssueId, jiraWorklog.WorklogId)},
+			DomainEntity:     domainlayer.DomainEntity{Id: worklogIdGen.Generate(jiraWorklog.SourceId, jiraWorklog.IssueId, jiraWorklog.WorklogId)},
 			IssueId:          issueIdGen.Generate(jiraWorklog.SourceId, jiraWorklog.IssueId),
 			TimeSpentMinutes: jiraWorklog.TimeSpentSeconds / 60,
+			StartedDate:      &jiraWorklog.Started,
+			LoggedDate:       &jiraWorklog.Updated,
 		}
 		if jiraWorklog.AuthorId != "" {
 			worklog.AuthorId = userIdGen.Generate(sourceId, jiraWorklog.AuthorId)